问题 #71

在浏览器里打开一个网站,然后去吃了一顿饭,花了一个小时。那么回来的时候,这个网站后台的会话对象还在吗?

共 422 次阅读

答案

1 Tomcat 会话的超时默认为30分钟

如果此网站将会话设为了1小时以上,那会话应没有超时,等吃完饭回来还在。

2 如果Tomcat会话设为30分钟

(1) 如果页面内没有 JS 定时器自动刷新,那由于长时间不与后台交互,会话超时。

(2) 如果页面内有 JS 定时器在与后台交互 (AJAX) ,那虽然人不在操作,但浏览器与后台还是有HTTP交互的,所以会话一直刷机,不会超时。

12

问题 #72

HttpSession 什么时候被创建? 打开一个网站上的图片,后台会创建会话吗?

1 打开一个静态网页,会不会创建会话?

2 打开一个静态图片,会不会创建会话?

3 打开一个 Servlet 网址,会不会创建会话?

共 355 次阅读

答案

1 打开一个静态网页,会不会创建会话?

不一定。

2 打开一个静态图片,会不会创建会话?

不一定。

3 打开一个 Servlet 网址,会不会创建会话?

不一定。

具体参考《网站中级篇》的讲解。

HttpSession 对象是由 request.getSession() 创建的,若后台处理过程中没有调用此方法,就没有创建会话对象。

因此一个用户在访问网站时,也可能不产生会话对象。

当访问一个静态文件时,如果前面经过了过滤器的处置,而在过滤器中如何调用了 getSession() ,则会创建一个会话。

另外,getSesion() 重载了两个版本:getSession() 或 getSession( boolean create ) 。

HttpSession getSession()

Returns the current session associated with this request, or if the request does not have a session, creates one.

HttpSession getSession(boolean create)

Returns the current HttpSession associated with this request or, if there is no current session and create is true, returns a new session.

官方文档地址: https://tomcat.apache.org/tomcat-8.5-doc/servletapi/index.html

问题 #73

String对象的内容可以修改吗?

String a = “afanihao”;

a = “阿发你好”;

这样算是修改了String对象的内容吗?

共 297 次阅读

答案

怎样才叫修改对象的值?

​ Student s = new Student(2019, “shaofa”);

​ s.id = 2020; // 修改了s的属性,这叫修改内容

​ s.setId (2021) ; // 调用了set方法,这个也是修改内容

​ s = other; // 这就没有修改s的值,而是把s指向了另一个Student对象

同样道理 ,

String a = “afanihao”;

a = “阿发你好”; // a又指向了另一个对象, 内容为 “阿发你好”

在此例中,并没有改变对象a的内容,只是把a指向了另一个String对象。

实际上,String对象的内容是不可修改的,因为它没有提供什么set方法用于修改内容。

String 的方法都是创建一个新的String对象并返回的,比如,replace(), substring()

例如,

​ String s = “shao,fa”;

​ String s2 = s.replace(“,”, “-“);

s2是一个新创建的String对象,原来的s的内容不变。

再看这个例子,有点迷惑力

​ String s = “shaofa”; // s指向一个对象, 内容为 “shaofa”

​ s += “你好”; // s指向一个另一个对象,内容为 “shaofa你好”

相当于

​ String s = “shaofa”;

​ s = s + “你好”; // 等号右侧将创建一个新的String对象

这个可以单调调试来验证,在变量Variable窗口里观察变量s的值,有类似如下的显示:

​ “shaofa” ( id=19)

​ “shaofa你好” ( id=26)

小括号里的就实例ID (instance ID) ,每个对象都有不同的ID。这里的ID由19变成了26,说明s原先指向19号对象,后来指向了 26号对象。

问题 #74

什么叫流式访问 Stream ?什么叫随机访问?

共 269 次阅读

答案

Java 里的流概念很重见,各种 InputStream 和 OutputStream ,那么,什么叫流呢?

设想一个自来水笼头 (InputStream) ,你可以从它里接水 (read ),但只能顺序接。你只有先把外面的水接了,依次接受里面的水;不能跳过外面的,直接到水管里面去接。

这个在网络通信篇中很容易理解。在Socket通信中,一方发,另一方收。显然,接收方必须按顺序来接收字节数据,而不能跳着接收。

(收) < OOOOOOOOOOO <(发)

就像从水笼头里接水一样,称为流式访问。

除此之外,还有所谓的随机访问。比如,RandAccessFile 在读取文件的时候,就可以跳过头部,到指定位置去读取。这种能来回跳的访问方式,就是随机访问。

问题 #80

request.getServletPath() 返回值是什么?

比如,http://your.com/demo/a/b/c.html

其中,webapp的映射路径为 /demo

共 511 次阅读

答案

比如,http://your.com/demo/a/b/c.html

这个 ServletPath 其实有点问题,不一定时 /a/b/c.html

第一种:

@WebServlet (“*.html”)

如果是这种URL Pattern,则 ServletPath 就是 /a/b/c.html

第二种:

@WebServlet (“/a/*”)

如果是这种URL Pattern,则 ServletPath 就是 /a

显然,这样是不符合我们要求的。无论是 Servlet,还是 Filter ,都无法得到正确的 ServletPath

所以,还是自己解析一下吧。

​ String contextPath = request.getServletContext().getContextPath(); // 例如 /demo

​ String requestUri = request.getRequestURI(); // 例如 /demo/a/b/c.html

​ String servletPath = requestUri.substring(contextPath.length()); // 例如 /a/b/c.html


一个好奇的人