一.请求乱码问题解决
使用 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信息存储好之后,每次请求都会附带,除非设置有效路径。