Servlet--06--解决乱码问题; 请求转发; 重定向;
乱码问题:
一. 请求-乱码问题:服务器获取的请求数据,在console显示时,出现了乱码。
(1)post请求方式解决:req.serCharacterEncoding("utf-8");
(2)get请求方式解决:
方式一:每个数据都要单独的转换
String uname = req.getParameter("uname");
String uname2 = new String(uname.getBytes("iso-8859-1"),"utf-8");
方式二:req.setCharacterEncoding("utf-8");
然后在Tomcat的server.xml文件中的Connect标签中增加属性: useBodyEncodingForURI="true"
二. 响应-乱码问题:浏览器显示的服务器响应数据,出现了乱码。
(1)rep.setHeader("content-type","text/html;charest=utf-8");这句话的意思是:我给你一个HTML页面,你要用utf-8的格式去解析!
三. 我们来总结一下,新建的servlet重写service方法时的基本步骤:
service()
{
//设置请求编码格式
//设置响应编码格式
//获取请求数据
//处理请求数据
//响应处理结果
}
Servlet的请求转发:
一. 实现:req.getRequestDispatcher(" ").forward(req, rep);
二. 特点:
(1)一次请求需要多个servlet的联动操作;第一个servlet需要用到其他servlet已经声明的业务逻辑处理代码;
因为request对象--req里面封装了浏览器请求所需要的全部信息; 这个req将会传到下一个servlet中;
(2)请求转发,是服务器的行为,请求由服务器转发给另外一个页面处理,如何转发,何时转发,转发几次,客户端是不知道的。
请求转发时,从发送第一次到最后一次请求的过程中,web容器创建一次 request和response对象,新的页面继续处理同一个请求。
也可以理解为服务器将request 对象在页面之间传递。
(3)servlet的请求转发,可以降低servlet类的代码冗余;
三. 在service中实现:
一个servlet有可能是被浏览器直接访问的, 也有可能是被其他servlet请求转发访问的;
不同的访问方式,要用不同的处理方式:
(1)浏览器访问: 调用getParemeter(), getParemeterValues() 等等方法;
(2)请求转发访问: 调用getAtturebute();
但是一个Servlet在它的生命周期中, 既有可能被浏览器直接访问, 也有可能被其他servlet请求转发访问, 还有可能在他的生命周期中, 背着两种方式都访问过, 所以我们要想一个万全之策!
引入一个三目运算符:
//获取req对象中存储的请求转发数据
String str = ((req.getAttribute("str")==null?"":(string) req.getAttribute("str")
重定向:
一. 解释:
假设ServletA, servletB, servletC .
servletA作为登陆页面去访问servletB, servletB处理完req的部分信息后, 后面的信息servletB处理不好, 所以servletB通过请求转发, 访问servletC, 然后servletC处理,处理完后做出响应;
但是我们知道, 当我们在servletB页面不断刷新时,浏览器地址栏地址是不会变得, 然而,servletB不断的请求访问servletC, 这样不安全!
所以,我们采取重定向技术, servletB通过请求转发, 访问servletC, servletC处理完后,做出相应, 在响应头上添加servletD, 使得浏览器接受响应后, 需要再发送一次请求到servletD, 然后跳转
到servletD的页面, 这样, 我们就保护了servletB和servletC;
二. 实现:
req.sendRedirect();
三. 特点:
两次请求,地址栏信息改变;