1.转发
(1)什么是转发?
一个web组件将未完成的处理交给另外一个web组件继续做。
注:
web组件(servlet/jsp)
最常见的情况:一个Servlet获得数据,然后将这些数据转发给一个jsp来展现。

(2)如何转发?
step1. 将数据绑订到request对象上。
request.setAtribute(String name,Object obj);
注:底层的实现 map.put(name,obj);
step2. 获得转发器。
RequestDispatcher rd = request.getRequestDispatcher(String uri);
注:
RequestDispatcher是一个接口。
转发的本质就是一个web组件通知容器去调用另外一个web组件,
可以将RequestDispatcher(转发器)当作是一个媒介。
step3. 转发
rd.forward(request,response);
(3)特点
a.转发之后,浏览器地址栏的地址不变。
b.转发的地址有限制(要求属于同一个应用)。
2. include指令
(1)用法
<%@ include file="header.jsp"%>
注:
容器在将jsp转换成servlet时,会将file属性所指定的文件的内容插入到该指令所在的位置。
被包含的文件并没有真正执行,只是负责提供内容。
被包含的文件类型可以是其它的,比如包含一个html文件。
练习
为用户管理添加登录功能。
要求:
用户填写用户名和密码,然后提交表单,服务器进行验证,
如果有符合条件的记录,则登录成功,跳转到用户列表页面,
否则登录失败,跳转到登录页面,并给用户相应的提示
("用户名或密码错误")。
step1.添加login.jsp
step2.添加LoginServlet(处理登录请求)
读取用户名(username)和密码(pwd)
User user = UserDAO.find(username);
if(user != null &&
user.getPwd().equals(pwd)){
response.sendRedirect("list")
}else{
request.setAttribute("login_failed",
"用户名或密码错误");
request.getRequestDispatcher("login.jsp").for...
}
step3. 修改login.jsp
1.比较转发与重定向
(1)浏览器地址栏的地址有无变化?
转发之后,浏览器地址栏的地址不变,重定向会变。
(2)目的地(地址)有无限制?
转发有限制(要求属于同一个应用),重定向地址无任何限制。
(3)能否共享request对象?
转发可以,重定向不行。
注:
当容器收到请求之后,会立即创建request对象和response
对象,当容器发送响应之后,会立即销毁这两个对象。也就是,
request和response的生存时间是一次请求和响应期间存在。
(4)一件事是否做完?
转发是一件没有做完,让另外一个web组件继续做;重定向是一件 事已经完成,然后再做另外一件独立的事件。
2.状态管理
(1)什么是状态管理?
将浏览器与web服务器之间多次交互当做一个整体来处理,并且将多次交互 所涉及的数据(即状态)保存下来。
(2)如何进行状态管理?
a.将状态保存在浏览器端(Cookie)。
b.将状态保存在服务器端(Session)。
(3)Cookie
1)什么是Cookie?
服务器临时保存在浏览器端的少量数据,用于保存用户的状态。
当浏览器第一次访问服务器,服务器会将少量数据以set-cookie
消息头的形式发送给浏览器,浏览器会将这些数据临时保存下来。
当浏览器再次访问服务器时,会将这些数据以cookie消息头的形式
发送给服务器。

2)如何添加Cookie?
Cookie c = new Cookie(String name,String value);
注:Cookie必须有一个名字,值必须是一个字符串。
response.addCookie(c);
3)如何读取浏览器发送过来的Cookie?
Cookie[] request.getCookies();
注:
该方法的作用是用来获得浏览器发送过来的所有cookie,
一个Cookie对象封装了cookie的所有信息。该方法有可能返回null。
String cookie.getName();
String cookie.getValue();
4)Cookie的生存时间
默认情况下,浏览器会将cookie保存在内存里面。
注:浏览器关闭,cookie会被删除。
可以调用setMaxAge方法来设置Cookie的生存时间。
cookie.setMaxAge(int seconds);
注:
单位是秒。比如要保存一个月
cookie.setMaxAge(30 *24 * 60 * 60);
值 >0:
浏览器会将cookie保存在硬盘上,超过指定时间,cookie会被删除。
值 <0:
默认值(浏览器会将cookie保存在内存里面)
值 =0:
立即删除cookie。
比如,要删除一个名称为"username"的cookie:
Cookie c = new Cookie("username","");
c.setMaxAge(0);
response.addCookie(c);
5)Cookie的编码问题
a.什么是Cookie的编码问题?
Cookie只能存放合法的ascii字符,如果是非asicc字符(比如中文),
需要转换成合法的ascii字符的形式。
b.如何处理?
String URLEncoder.encode(String str,String charset);
String URLDecoder.decode(String str,String charset);
c.建议,在添加cookie时,统一使用encode方法来编码。
6)Cookie的路径问题
a.什么是Cookie的路径问题?
浏览器在向服务器发请求时,会比较请求路径是否与cookie的
路径匹配,只有匹配的cookie才会被发送。
b.Cookie的默认路径
默认等于添加该cookie的web组件的路径,比如
/day06/biz01/addCookie.jsp添加了一个cookie,则该cookie
的默认路径是"/day06/biz01"。
c.匹配规则
请求路径要么等于cookie的路径,要么是其子路径,符合这个条件的
cookie会被发送。
比如 cookie的路径是"/day06/biz01"
/day06/findCookie1.jsp no
/day06/biz01/findCookie2.jsp yes
/day06/biz01/aaa/findCookie3.jsp yes

d.修改cookie的路径
cookie.setPath(String path);
练习
写一个servlet,该servlet先查看有没有一个名称为"cart"的cookie,如果有,则显示该cookie的值;如果没有,则添加。
写一个servlet,统计用户访问该servlet的次数。

网友评论