Servlet深入学习(二)——请求转发、重定向、乱码问题、Servelt流程总结

本文详细介绍了Servlet的请求转发和重定向,包括它们的区别和使用场景。此外,针对请求乱码问题,文章提出了两种解决方案:通过String编码和配置服务器。最后,对Servlet的处理流程进行了总结,包括请求接收、处理和响应的过程。
摘要由CSDN通过智能技术生成

请求转发

实现多个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 false.

     <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方法进行请求处理:

  • 设置请求编码格式
  • 设置响应编码格式
  • 获取请求信息
  • 处理请求信息
  • 响应处理结果

数据流转流程:

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

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值