三、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如下:
两种不同的转发方式如下图:
领取专属 10元无门槛券
私享最新 技术干货