Servlet笔记二

一:请求转发、重定向

 

 

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");
		}
		
		
	}

}

猜你喜欢

转载自blog.csdn.net/sugar_map/article/details/79979191
今日推荐