Servlet编程之核心篇(二)

三、HttpServletRequest

请求的生命周期

请求参数

新建一个项目,起名为12-requestParameter:

输出结果如下:

姓名—xjs

年龄—22

age::22

name::xjs

hobby::running

running

swimming

reading

name::xjs

age::22

hobby::running

域属性

创建一个项目13-requestAttribute,创建一个SomeServlet类,一个OtherServlet类:

输出结果:

学校:辽宁大学

地址:沈阳市皇姑区崇山中路66号

javax.servlet.forward.request_uri::/13-requestAttribute/some

javax.servlet.forward.context_path::/13-requestAttribute

javax.servlet.forward.servlet_path::/some

university::辽宁大学

address::沈阳市皇姑区崇山中路66号

其中javax.servlet.forward包里的这些是Tomcat服务器自带的

服务端相关信息

创建一个新项目14-requestOtherMethod,新建一个OtherServlet类,

四、中文乱码问题乱码产生的原因

我们先将之前的12-requestParameter项目复制,更名为15-characterEncoding,然后将其中部分代码删减掉,只保留研究乱码问题的必要部分:

在我们之前的那个项目中,我们输入的都是英文,因此看不出有什么问题,但现在我们输入中文发现会出现乱码。由于我们在html中设置的编码是UTF-8,因此在浏览器的输入界面编码就是UTF-8,但是提交之后的Tomcat服务器默认解析编码是ISO-8859-1,因此会出现乱码的情况。

控制台输出:

姓名—æ¸çˆªæˆ

年龄—22

浏览器是经过Http协议传输数据的,而这些数据在底层是按TCP协议字节的形式传输的。在请求中,这些字节均以%开头,并以十六进制形式出现,如%5A%3D等(一般一个UTF-8汉字占用三个字节)。

我们在Chrome浏览器中打开F12,查看请求体。

POST乱码问题的解决

注意:Tomcat9这个版本,已经可以解决GET提交方式乱码了。

对于POST提交方式,我们只需要在方法里面添加一句代码即可解决问题

我们重新提交,发现已经可以正常输出姓名了,但是对于GET提交方式还是不能解决,因为GET方式的参数是在URI中的,和POST方式不同。

GET乱码问题的解决

因为我们不可能只用Tomcat9这个版本的服务器,因此我们必须要想办法解决其它GET提交乱码的问题。

有两种方式:

方法一、修改Tomcat服务器的配置文件

对于MyEclipse,需要修改本地的Tomcat;而对于Eclipse,可以直接修改项目里的副本,但是当项目上线-部署之后,仍然要在Tomcat服务器中修改。

修改的是server.xml配置文件,大约在第63行左右

就在这里添加即可,添加后的代码如下:

我们再次重启服务器进行提交,发现可以解决GET乱码的问题。但是这种方式不能解决POST提交的问题,需要和上一个POST乱码问题的解决方案配合着使用才行;另外一个严重的问题是必须要修改Tomcat的配置文件,这就必须要重启服务器,而在真正的工作环境中,是不允许随便重启服务器的。

方法二、打碎重建

这种方式不需要更改配置文件,而且可以解决GET和POST两种提交乱码问题

五、HttpServletResponse向客户端发送数据

新建一个项目16-printWriter,创建一个Servlet

响应乱码问题解决方案

上一个例子中,都用的是英文,现在我们添加一句中文,就能发现出现乱码问题,解决方式:

注意,此时的输出没有格式了,直接是按照一行输出的。这是因为response.setContentType(“text/html”)设置了以html的形式进行输出,也就是说out输出流的内容其实是HTML的代码,如果什么也不设置则输出无格式的内容,如果输出流本身包含html代码,则最终显示是以html形式。

将上一段代码添加一句,这时就发挥了作用

六、请求转发与重定向什么是请求转发与重定向

请求转发一次请求一次响应,携带的数据信息是共通的;重定向多次请求多次响应(但用户只提交一次,其余是浏览器提交的),不同请求响应之间的数据是没有关系的。

请求转发:也称为服务器内跳转

重定向: 也称为服务器外跳转

请求转发与重定向程序举例

新建一个项目,17-requestDispatcherForward,两个servlet,一个html,内容如下:

控制台输出:

name::张三

age::26

name::::张三

age::::26

attrName—张三

attrAge—26

注意请求转发的方式下路径还是第一次提交的路径/some而不是/other;两个Servlet里的数据是共通的

然后进行更改,将请求转发方式改为重定向,将替换为直接进行重新提交会会出错,报空指针异常,因为some里的name对象在other里无法访问,这就说明两次请求的数据没有关系,而且访问路径最终是/other。

重定向时数据传递及乱码解决

难道重定向就没有办法传递数据了吗?答案是有的。

重定向的路径就在这里,这里写什么路径就是什么。因为之前说过POST提交只有两种方式,一种是表单,另一种是Ajax,所以这里的肯定是GET提交。那我们可以进行添加数据的操作,将原来这句话改为,这样就可以在OtherServlet里接收和。

我们新建一个项目18-sendRedirect

注意:这里的解决乱码的方式除了正常的GET情况下解决方案还要添加一对URLEncoder和URLDecoder。

重定向到其他应用

重定向可以跳转到其他应用中,而请求转发只能在当前应用中跳转。我们创建两个项目,进行尝试

注意:需要提前将两个项目的服务器都打开,然后地址栏输入one/some可以调到two/other

请求转发与重定向的对比选择

七、RequestDispatcher

它里面有两个方法,forward()和include(),我们看一下他们的区别。

创建一个项目20-dispatcherForward

我们分别用forward和include进行尝试,发现forward如下:

include如下:

两种不同的转发方式如下图:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180211G12BJL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券