一:请求转发、重定向
1. 转发(forward):
I.页面跳转:request.getRequestDispatcher("目标url-pattern").forward(request,response);
II.forward跳转时,在服务器内部跳转,地址栏不变,属于同一次请求
III. 数据传递://forward表示一次请求,地址栏不变,在服务器内部跳转 可共享request作用域中的数据。
1).request作用域:拥有存储数据的空间,作用范围是一次请求有效(一次请求可以经过多次转发,一旦响应,则结束)。
a.可以将数据存入request后,在一次请求过程中的任何位置进行获取。
b.可传递任何数据(基本数据类型、对象、集合、数组)。
2).存数据:request.setAttribute("key" , value); //以键值对形式存储在request作用域中key为String类型,value为Object类型。
3).取数据:request.getAttribute("key"); //通过String类型的key访问Object类型的value。
2. 重定向(redirect):
I. 页面跳转:response.sendRedirect("目标URI");
II. redirect跳转时,地址栏改变,代表客户端重新发送请求到服务器,属于两次请求,数据无法共享。
III. 数据传递:
1). response没有作用域,可以通过URL拼接的形式传递一些简单的文本数据。
2). 传数据:response.sendRedirect("项目名+资源名?key="+value); //必须为本文
3). 取数据:request.getParameter("key");
3. 使用依据:根据两个Servlet之间是否需要传递数据为依据,如需传递数据,选择转发;无需传递数据,选择重定向。
二:服务器记录用户状态
1. 概念:Web应用(网站)可以识别用户。
2. 常见应用:
I. 免登录。
II. 记录用户名和密码。
III. 识别购物车的所属用户。
3. Cookie技术
I. 概念:由服务器向客户端发送文本数据、并存储在用户的本地计算机中(浏览器、本地文件)。可辨识用户身份。
II. 创建Cookie:
Cookie c = new Cookie("key" , "value");
III. 设置最大存活时间:
c.setMaxAge(60*60*24*7);
//设置Cookie生命周期(负数:不创建)、(零:浏览器关闭)、(正数:秒)
IV. 设置路径:
c.setPath("/cookie的访问路径");
//默认路径为,创建此Cookie的Servlet路径。
V. 发送Cookie:
response.addCookie(c);
VI. 获取Cookie:
Cookie[] cks = request.getCookies();
//获取该网站发送过的所有Cookie
VII. 问题:
1). 明文存储、不安全(不能存储重要数据)。
2). 可以被Client禁用。
3). 存储容量4KB。
4). 默认不支持中文(使用如下方法对Cookie中的中文进行解码与编码)
java.net.URLEncoder.encode();解码。
java.net.URLDecoder.decode();编码
VIII.使用场景:辅助功能。
4.HttpSession
①. javax.servlet.http.HttpSession接口,由Tomcat提供实现。
②. 更安全的记录用户的状态。
③. Session原理:服务器会为每一次会话,分配一个HttpSession对象;同一个浏览器发起的多次请求,同属于一次会话(HttpSession)。
④.session作用域:拥有存储数据的空间,作用范围是一次会话有效(使用同一浏览器发出的多次请求,一旦关闭浏览器,则结束)。
I.可以将数据存入session中,在一次会话的所有请求中进行获取。
II.可传递任何数据(基本数据类型、对象、集合、数组)。
⑤. 数据存取:
I.获得HttpSession对象:HttpSession session = request.getSession();
II.存数据:session.setAttribute("key" , value); //以键值对形式存储在request作用域中key为String类型,value为Object类型。
III.取数据:session.getAttribute("key"); //通过String类型的key访问Object类型的value。
⑥. Session对比Request:
I. request一次请求有效,请求改变,则request改变。
II. session一次会话有效,浏览器改变,则session改变。
⑦. Session的生命周期:
I. 开始:第一次使用到Session的请求产生,则创建Session。
II. 结束:
1). 浏览器关闭,则失效。
2). Session超时,则失效。
session.setMaxInactiveInterval( seconds ); // [ ɪn'æktɪv ] 设置最大存活时间(单位:秒)
3). 手工销毁,则失效。
session.invalidate(); //登录退出、注销
⑧.Session的实现原理【重点】:首次使用到HttpSession时,会自动创建Session,并创建Cookie将SessionId发送回客户端。
注意:Cookie被禁用的话,无法保存JSESSIONID,也就无法找到原有的Session对象。
⑨url重写:(客户端禁用Cookie时,我们可以使用URL重写的方式找到Session)
1.response.encodeURL("url"); //会在原有的url后面以拼接特殊参数,由tomcat识别。
2.重写方式:
<a href="response.encodeURL('url')"></a>
<form action="response.encodeURL('url')"></form>
3.注意:url重写是嵌套了一段Java代码,和标签一并动态生成,无法使用HTML静态页面完成,必须使用Servlet或JSP。
4.转发无需URL重写、重定向必须URL重写。
5. 资源访问:
①. URL:在整个互联网中定位一个资源
(protocol://ip:port/app/source)地址栏、外部超链接
http://localhost:8088/AccountSystem/showAllAction
http://localhost:8088/AccountSystem/login.html
②. URI:在一台服务器中定位一个资源(/app/source)
内部超链接、表单、sendRedirect();
/AccountSystem/showAllAction
/AccountSystem/login.html
③. url-pattern:在一个项目中定位一个资源
(/source)request.getRequestDispatcher(url-pattern)
/showAllAction
/login.html
六:Session和Cookie实战
①用户第二次登录时,Cookie自动为表单添加存储在本地的ID和PWD
public class ManagerLoginJsp extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String id ="";
String pwd ="";
//获取Cookie中的值 ->实现记录登录账号的密码
Cookie[] cookie=request.getCookies();
if(cookie!=null && cookie.length>0){
for(Cookie c:cookie){
if(c.getName().equals("id"))
id=c.getValue();
if(c.getName().equals("pwd"))
pwd=c.getValue();
}
}
//设置响应页面
Writer out=response.getWriter();
out.write("<html>");
out.write("<body>");
out.write("<form action='/BankManager/managerLogin' method='post'> ");
out.write("id:<input type='text' name='id' value='" +id + "'/><br/>");
out.write("pwd<input type='password' name='pwd' value='" + pwd + "'/><br/>");
out.write("<img src='code' />");
//指向绘制验证码的Servlet
out.write("<input type='submit' value='提交'/>");
out.write("</form>");
out.write("</body>");
out.write("</html>");
out.close();
}
}
②:Cookie记录用户登录密码和Session用户登录状态
public class ManagerLoginAction extends HttpServlet {
private static final ManagerService service=new ManagerServiceImpl();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8");
/*
* 1:设置请求数据的解码方式和响应页面的编码方式
* (必要时设置请求的urIEncoding->TomCat的配置文件)
* 2:获取请求的参数
* 3:调用Service层方法处理业务。一个业务对应一个功能。
* 4:页面跳转根据是否需要传值 选择请求转发或请求重定向。
*
*/
String id=request.getParameter("id");
String pwd=request.getParameter("pwd");
Manager manager=service.login(id);
if(manager!=null && pwd.equals(manager.getPwd())){
Cookie cook1=new Cookie("id",id);
Cookie cook2=new Cookie("pwd",pwd);
cook1.setMaxAge(60*60*24*7);
cook2.setMaxAge(60*60*24*7);
response.addCookie(cook1);
response.addCookie(cook2);
//通过请求获取Session、Cookie
//登陆成功后记录用户的登录状态
HttpSession session=request.getSession();
session.setAttribute("admin", manager);
response.sendRedirect("/BankManager/showAllAction");
}else{
response.sendRedirect("/BankManager/Login.html");
}
}
}