16. 请求分派和重定向
a) 请求分派
RequestDispatcher view=request.getRequestDispatcher(“***.jsp”);// 为 JSP 实例化一个请求分派器
view.forward(request , response);// 使用请求分派器要求容器准备好 JSP ,并向 JSP 发送请求和响应
b) 重定向
response.sendRedirect(“URL”);
其中 URL 是相对的 URL ,有两种类型:前面有斜线和没有斜线
例: 客户原来的请求是 http://www.wick.com/myApp/cool/bar.do ,请求到达名为“ bar.do ”的 Servlet 时,该 Servlet 中会基于一个相对的 URL 来调用 sendRedirect() 。 不带斜线: sendRedirect(“foo/stuff.html”); 容器会相对于原先的请求 URL 建立完整的 URL ,即 http://www.wick.com/myApp/cool/foo/stuff.html
带斜线的: sendRedirect(“/foo/stuff.html”); 容器会相对于 Web 应用本身建立完整的 URL ,而不是相对于原来的请求 URL ,即: http://www.wick.com/foo/stuff.html
请求分派是在服务器端发生,浏览器地址上的 URL 没有改变 ( 相当于被请求的 Servlet 把请求传递给服务器上的另一个组件,而客户并不知道 ) ;重定向是在客户端进行,用户会在浏览器地址栏中看到新的 URL( 相当于服务器又告诉浏览器去访问另一个 URL) 。
17. HttpSession
http://www.blogjava.net/cheneyfree/archive/2007/05/26/120168.html
可以跨多个请求保存会话状态,与一个特定可和的整个会话期间, HttpSession 对象会持久存储。
在响应中发送一个会话:
HttpSession session=request.getSession();// 等价于 request.getSession(true)
//HttpSession session=request.getSession(false); 返回一个已经存在的会话,如果没有与此客户相关联的会话,返回 null
Web 容器会自己生成会话 ID 、建立新的 Cookie 对象、把会话 ID 放到 cookie 中、在响应中设置 Cookie ( set-Cookie )首部。在后续的请求中,容器会从请求中的 cookie 得到会话 ID ,将这个 ID 与一个现有的会话匹配,并把会话与当前请求关联。
如果用户浏览器禁止使用 Cookie ,则在客户的请求首部中就不会含有 ID Cookie 。这时可重写 URL 让客户和容器交换会话 ID 信息。容器总是默认地先使用 cookie ,如果 cookie 不能工作,容器就会求助于 URL 重写。 URL 重写是自动的,但是必须对 URL 完成了编码它才凑效。如:
out.println(“<a href=\””+response.encodeURL(“/beerTest.do”)+”\”>click </a>”)
重新定向时对 URL 的重编码: response.encodeRedirectURL(“/beerTest.do”);
URL 编码只与响应有关,不能在请求中和上下文调用这个方法。
URL重定向是服务器自动完成的,对开发人员来说是透明的。(经测,iteye使用Cookie保存用户通行证的,禁用Cookie后,iteye登陆后,无法正常访问)
实验步骤:
1.两个页面 hello1.jsp,hello2.jsp
hello1.jsp
<body>
<%
String num ="100";
session.setAttribute("num",num);
//String url =response.encodeUrl("hello2.jsp");
//String url =("hello2.jsp");
%>
<a href=<%=url%>>hello2.jsp</a>
</body>
hello2.jsp
<body>
<%=session.getAttribute("num")%>
</body>
浏览器Cookie禁用,
打开hello1.jsp中的String url=response.encodeUrl("hello2.jsp");注释
访问http://localhost:8080/SessionTest/hello1.jsp,点击hello2.jsp
会跳转至hello2.jsp,浏览器地址栏显示为:
http://localhost:8080/SessionTest/hello2.jsp;jsessionid=85227A80E09D4443B0A037576B3270AF
页面结果显示为 100
关闭hello1.jsp中的String url=response.encodeUrl("hello2.jsp");打开String url="hello2.jsp";注释
访问http://localhost:8080/SessionTest/hello1.jsp,点击hello2.jsp
会跳转至hello2.jsp,浏览器地址栏显示为:
http://localhost:8080/SessionTest/hello2.jsp
页面结果显示为 null
2. 新建测试页面index.jsp、test.jsp和SessionTestServlet.java
index.jsp页面
<body>
<a href="servlet/SesstionTest?userName=zzqrj">test1</a>
</body>
SessionTestServlet.java
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String userName = request.getParameter("userName");
HttpSession session = request.getSession();
session.setAttribute("userName", userName);
//String url=response.encodeRedirectUrl("../test.jsp");
//String url="../test.jsp";
System.out.println(url);
response.sendRedirect(url);
//RequestDispatcher view=request.getRequestDispatcher(url);
//view.forward(request, response);
}
test.jsp
<body>
<%=session.getAttribute("userName") %>
<a href="<%=response.encodeUrl("servlet/SesstionTest") %>">test1</a>
</body>
测试方法同1,结果也同1.
3. 打开浏览器Cookie,分别对1,2中的页面进行测试
不管是String url=response.encodeUrl("hello2.jsp");打开或是String url="hello2.jsp";打开,浏览器地址栏均不显示" ;jsessionid=***** "。并且结果页面总不为null。
18. 删除会话
a) 超时设置
程序: session.setMaxInactiveInterval(20*60);
// 改变特定会话实例的 session-timeout 值,不会影响应用中其他会话的超时时间。
DD 描述: 相当于在每个会话上调用 setMaxInactiveInterval() 方法
< session-config >
< session-timeout > 15 </ session-timeout > 单位是分钟
</ session-config >
b) 在会话对象上调用 invalidate() : session.invalidate();
c) 应用程序结束
19. Cookie
Cookie 的作用
a) 支持会话状态 。
b) 可以使用 cookie 在服务器和客户之间交换名 / 值对 。
服务器把 cookie 发送给客户,客户再在以后的每个请求中把 cookie 发回,当客户的浏览器退出时,会话 cookie 会自动消失,但是可以设置 cookie 在客户端持久保存 。
使用 Cookie
( 1 )可以从 HTTP 请求和响应中得到与 Cookie 相关的首部 。
( 2 )利用 ServletAPI 使用 Cookie
创建新 Cookie : Cookie cookie=new Cookie(“username”,name);
设置 cookie 在客户端存活时间: cookie.setMaxAge(30*60);
把 cookie 发送到客户: response.addCookie(cookie);
从客户请求得到 cookie :
Cookie[] cookies=request.getCookies();
for(int i=0;i<cookies.length;i++){
Cookie cookie=cookies[i];
if(cookie.getName().equals(“username”)){out.println(cookie.getValue());}
}
20. 会话生命周期
21. Servlet
是一种跨平台语言的服务器端技术, 采用 Servlet 开发的应用,不用考虑平台,多线程等让人头疼的问题,使得开发人员专注于业务逻辑的实现,大大解放了生产力。
Servlet 中嵌入 HTML 代码是开发人员的噩梦
Java 是跨平台的?