请求转发
实现多个servlet联动操作请求,并且可以使servlet操作更加明确。
request.getRequestDispatcher(String path).forward(request,response);
注意:
- path:转发后跳转的页面,这里不管用不用"/"开头,都是以web项目根开始,因为这是请求转发,请求转发只局限与在同一个web项目下使用,所以这里一直都是从web项目根下开始的。
- 请求转发后,直接return结束,因为已经交给转发的servlet进行请求处理。
特点:
浏览器中url不会改变,也就是浏览器不知道服务器做了什么,是服务器帮我们跳转页面的,并且在转发后的页面,能够继续使用原先的request,因为是原先的request,所以request域中的属性都可以继续获取到。
但是如果第二个要处理的servlet需要用到第一个要处理的servlet的数据则涉及到request对象的作用域,简单的说就是使用
request.setAttribute(Object name,Object value); //用来在request对象中添加数据
request.getAttribute(Object name); //获取request对象中添加的数据
重定向
什么时候使用重定向呢?
- 如果请求中有表单数据,而且数据比较重要,不能重复提交
- 如果请求被servlet接收后,无法进行处理
方式一:手动方案
response.setStatus(302); //状态码302就代表重定向
response.setHeader("location","http://www.baidu.com");
方式二:使用封装好的,通过
response.sendRedirect("http://www.baidu.com");
特点:
服务器告诉浏览器要跳转的页面,是浏览器主动去跳转的页面,浏览器知道,浏览器的地址栏中url会变,是浏览器重新发起一个请求到另外一个页面,所以request是重新发起的,跟请求转发不一样。
注意:response.sendRedirect(path);
第一种:response.sendRedirect("/test01/MyServlet01"); //使用了"/"开头,说明是从web站点根开始,所以需要写test01/MyServlet01
第二种:response.sendRedirect("MyServlet01"); //没有使用"/"开头,说明是从web项目根开始,那么就无需写test01了。
重定向没有任何局限,可以重定向web项目内的任何路径,也可以访问别的web项目中的路径,并且这里就用"/"区分开来,如果使用了"/"开头,就说明我要重新开始定位了,不访问刚才的web项目,自己写项目名,如果没有使用"/"开始,那么就知道是访问刚才那个web项目下的servlet,就可以省略项目名了。就是这样来区别。
乱码问题
之前已经介绍过在服务器将响应结果发送给浏览器时可以使用:
response.setContentType("text/html;charset=utf-8");
来解决将汉字从服务器发送给浏览器乱码的问题。
但是对于浏览器发送给服务器的汉字(如注册用户时需要汉字等),我们如何解决?
1.使用String对数据进行重新编码
无论是get方式还是post方式都可以通过在后端将数据进行重新编码
new String(xxx.getBytes("ISO-8859-1"),"UTF-8");
但是如果对每个数据都进行重新编码,当数据较多时也会十分麻烦, 有没有办法不用这么麻烦?有,配置Tomcat服务器的server.xml 中的connector
2.使用公共配置
先看一下API:http://localhost:8080/docs/config/http.html
URIEncoding | This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used. |
意思是如果不配置这个URIEncoding 那么采用默认的ISO-8859-1,所以将其改为utf-8即可。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
这样配置即可。
还有一个方法(推荐):
useBodyEncodingForURI | This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding. This setting is present for compatibility with Tomcat 4.1.x, where the encoding specified in the contentType, or explicitly set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is |
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" useBodyEncodingForURI
="true"/>
具体理解可以参考这篇文章
这样一改,那么:
request.setCharacterEncoding("UTF-8");
//这样设置客户机发来数据文字格式就不只对post方式有效了,对get方式也有效。
总结:对于request乱码问题的解决
1.配置tomcat服务器
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" useBodyEncodingForURI
="true"/>
2.无论get方式还是post方式:
使用request.setCharacterEncoding("UTF-8");即可
Servlet流程总结
操作流程:
1、浏览器发起请求到服务器(请求)
2、服务器接收浏览器的请求,进行解析,创建request对象存储请求数据
3、服务器用相应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
4、servlet方法进行请求处理:
- 设置请求编码格式
- 设置响应编码格式
- 获取请求信息
- 处理请求信息
- 响应处理结果
数据流转流程:
浏览器-->服务器-->数据库
浏览器<--服务器<--数据库