003请求乱码问题解决+流程总结+请求转发+Request 对象作用域+重定向+Cookie 学习

一.请求乱码问题解决

使用 String 进行重新编码:uname=new String(uname.getBytes("iso8859-1"),"utf-8");

Get 方式请求:service 方法中使用: req.setCharacterEncoding(“utf-8”);tomcat 服务器目录下的 conf 文件下找到 server.xml 文件,打开进行如下配置。

Post 方式请求:service 方法中使用: req.setCharacterEncoding(“utf-8”);

二.流程总结

1.数据流转流程

浏览器------>服务器------->数据库

浏览器<------服务器<-------数据库

2.servlet的使用流程

 * 浏览器发起请求到服务器(请求)
 * 服务器接受浏览器的请求,进行解析,创建request对象存储请求数据
 * 服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
 * servlet的方法执行进行请求处理
 *      //设置请求编码格式
 *      //设置响应编码格式
 *      //获取请求信息
 *      //处理请求信息
 *      	//创建业务层对象
 *      	//调用业务层对象的方法
 *      //响应处理结果

三.请求转发

问题:服务器在接收到浏览器的请求后,仅仅使用一个 Servlet 进行请求处理,会造成不同的 Servlet 逻辑代码冗余,Servlet 的职责不明确。

解决:使用请求转发。

特点:一次请求,地址栏信息不改变。

 *作用:
 *	实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。
 *使用:
 *	req.getRequestDispatcher("要转发的地址").forward(req, resp);
 *	地址:相对路径,直接书写servlet的别名即可。
 *注意:
 *	请求转发后直接return结束即可。

四.Request 对象作用域

问题:使用请求转发后,不同的 Servlet 之间怎么进行数据的共享呢?或者说数据怎么从一个 servlet 流转给另外一个 Servlet 呢?

解决:使用 request 对象的作用域。

使用:request.setAttribute(object name,Object value);request.getAttribute(Object obj);

作用:解决了一次请求内的不同 Servlet 的数据(请求数据+其他数据)共享问题。

作用域:基于请求转发,一次请求中的所有 Servlet 共享。

注意:使用 Request 对象进行数据流转,数据只在一次请求内有效。

特点:服务器创建,每次请求都会创建,生命周期一次请求。

五.重定向

问题:如果当前的请求,Servlet 无法进行处理怎么办?如果使用请求转发,造成表单数据重复提交怎么办?

解决:使用重定向。

使用:response.sendRedirect(“路径”);本地路径为uri,网络路径为定向资源的 URL 信息。

特点:两次请求,浏览器地址栏信息改变,避免表单重复提交。

时机:如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源。

六.Cookie 学习

问题:HTTP 协议是没有记忆功能的,一次请求结束后,相关数据会被销毁。如果第二次的请求需要使用相同的请求数据怎么办呢?难道是让用户再次请求书写吗?

解决:使用 Cookie 技术。

作用:解决了发送的不同请求的数据共享问题。

解释:Cookie 技术其实是浏览器端的数据存储技术,解决了不同请求需要使用相同的请求数据的问题。我们把请求需要共享的请求数据,存储在浏览器端,避免用户进行重复的书写请求数据。但是哪些数据需要使用 Cookie 技术存储起来是一个主观问题,需要在后台进行响应的时候来告诉浏览器,有些数据其他请求还会使用,需要存储起来。

特点:浏览器端的数据存储技术,存储的数据声明在服务器端。适合少量数据,键值对不安全。

使用:

 *Cookie的创建和存储
 * 	//创建Cookie对象
 * 		Cookie c=new Cookie(String name, String value);
 * 	//设置cookie(可选)
 * 		//设置有效期
 * 		c.setMaxAge(int seconds);
 *		//设置有效路径
 *		c.setPath(String uri)
 *	//响应Cookie信息给客户端
 *		resp.addCookie(c);
 *Cookie的获取
 *	//获取Cookie信息数组
 *	Cookie[] cks=req.getCookies();
 *	//遍历数组获取Cookie信息
 *		使用for循环遍历即可,示例:
	 		if(cks!=null){
				for(Cookie c:cks){
					String name=c.getName();
					String value=c.getValue();
					System.out.println(name+":"+value);
				}
			}
 *注意:
 *	 一个Cookie对象存储一条数据。多条数据,可以多创建几个Cookie对象进行存储。

Cookie 数据存储

临时存储:不设置 cookie 信息的存储时间,周期为一次会话,存储在浏览器运行内存中,浏览器关闭即失效。

定时存储:设置了Cookie的有效期,存储在客户端的硬盘中,在有效期内符合路径要求的请求都会附带该信息。默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径。

 

发布了45 篇原创文章 · 获赞 7 · 访问量 2472

猜你喜欢

转载自blog.csdn.net/weixin_44145972/article/details/90543525