配色: 字号:
request请求参数中的乱码解决
2017-12-06 | 阅:  转:  |  分享 
  
Request对象代表Http请求的对象浏览器向服务器发送一个请求,服务器在调用Servlet的service方法处理请求之前,会创建代
表Http请求的request对象,将所有的请求信息封装在request对象中.Request的继承结构ServletReque
st–通用的Request接口,提供了一个Request对象应该具有的功能||--HttpServletRequest接口
–继承了ServletRequest接口,在父接口的基础上,HttpServletRequest增加了一些和Http协议相
关的方法.Request对象提供的功能获取客户端基本信息、获取请求头信息1.getRequestURL方法–用于获取发送请求的
完整url2.getMethod方法–用于获取发送请求时使用的请求方式,这里只用GET和POST提交3.getContext
Path方法–用于获取WEB应用对外访问的虚拟路径,这个方法非常重要在开发中,当需要书写WEB应用的虚拟路径时,最好不要
写死(比如:/day14),而是通过getContextPath方法来动态获取.4.getHeader(Stringname)
host:localhost获取请求参数(!!!)getParameter(Stringname)–通过请求参数的名字获取
对应的参数值getParameterValues(Stringname);getParameterMap();getParame
terNames();请求参数的乱码问题?问题描述:在通过request对象获取请求参数时,如果参数中有中文数据,在获取时就
会出现乱码,其原因是由于浏览器发送参数时(编码时)使用的码表和服务器在结束数据时(解码时)使用的码表不一致造成的!浏览器发送
数据时使用的码表:浏览器在发送数据时使用的码表取决于打开页面时使用的码表,即浏览器使用什么编码打开页面,就会使用相同的编码来
发送数据.这里使用的是utf-8这个码表!服务器接收数据时使用的码表:服务器在接收数据时默认使用iso8859-1来接收请求参
数解决方案:让编码时使用的码表和解码时使用的码表保持一致即可!!!可以通过手动编解码来解决乱码!!根据获取到的乱码字符串,反向编
码得回正确的二进制数据将二进制数组查询utf-8码表转成字符串,得回正确的数据如果发送请求的方式是POST提交,还可以通过re
quest提供的方法来解决乱码:request.setCharacterEncoding(“utf-8”);这行代码是通知服务器
使用utf-8来接收请求实体内容中的数据.由于POST提交的参数刚好在请求实体内容中,所以这行代码可以解决POST提交时产生乱
码问题.但是由于GET提交的参数在请求行中的请求资源路径后面拼接着,不在请求实体内容中,所有这行代码对GET提交产生的乱码不会
起作用!实现请求转发(!!!)请求重定向:实现资源的跳转请求转发:实现资源的跳转,并且是服务器内部的同一个WEB应用内部资源
的跳转实现请求转发:request.getRequestDispatcher(“转发到资源的url地址”).forward(req
uest,response);请求转发示例创建一个RequestDemo4servlet,接收客户端浏览器的请求,将请求转
发给RequestDemo5来处理RequestDemo5处理请求,将结果响应给浏览器.请求转发的细节问题:在转发时,转发时书
写资源路径是WEB应用的虚拟路径后面的路径在转发时,需要将代表请求的request对象和代表响应的response对象作为for
ward方法的参数传递给被转发的资源.原因是不管转发多少次,这些资源处理的请求始终是同一个,服务器针对同一个请求,只会创建
一个request对象和一个response对象,后面的资源在处理请求时又需要这两个对象,所有需要不断的传递这两个对象.转发可
以实现资源的跳转,但是在同一个Servlet中,不能转发多次如果转发了多次,将会报如下错误:转发不能进行多次,但是可以多重
转发(比如:Demo4转发给Demo5,Demo5处理不了转发给Demo6,Demo6转发给Demo7….)如果在转发之前,
向response缓冲区写入了数据,在转发时response中的数据会被清空(即下图中的”demo4…”内容将不会发送给浏览器
)如果在转发之前,向response缓冲区写入了数据并且强制性发送给了浏览器,这时转发将会失败!!作为域对象使用(!!!)域对
象:如果一个对象,具有一个可以被看见的范围,利用这个对象上的map集合,可以在这个范围内,实现数据的共享.request对
象就是一个域对象,request上提供了很多操作自身map集合的方法request.setAttribute(Stringna
me,Objectvalue);//存入一个属性/修改已有属性的值request.getAttribute(Stringna
me);//根据属性名获取对应的属性值request.removeAttribute(Stringname);//根据属性名删
除对应的属性request.getAttributeNames();//获取域对象中所有属性的名字组成的枚举.生命周期:一次请求
开始创建request对象,响应结束request对象就销毁了作用范围:整个请求链中主要功能:在整个范围内实现数据的共享(带
数据到目的地)需求:创建两个Servlet:分别是RequestDemo6和RequestDemo7,在RequestDem
o6中将请求转发给RequestDemo7,在转发时负责带参数到RequestDemo7中并接收打印在控制台上.创建两个Serv
let在RequestDemo6中将请求转发给RequestDemo7在RequestDemo6负责将参数带给RequestDem
o7\在RequestDemo7获取参数并打印在控制台上实现请求包含请求包含是服务器内部资源合并的效果假设浏览器发送请求访问服务器
中的Aservlet,Aservlet在处理请求的期间,发现自己不能够独立的处理这次请求,需要另外一个Servlet过来帮
忙,这时可以在Aservlet中将Bservlet包含进来,然后由Aservlet和Bservlet共同来处理这次请求,As
ervlet处理的结果将会和Bservlet处理的结果合并在一起,一起响应给浏览器.实现请求包含:request.getRequ
estDispatcher(“/Bservlet”).include(request,response);示例:编写三个Ser
vlet,分别为Aservlet,Bservlet,Cservlet,实现Servlet中的doGet方法来处理请求,在Bservlet中将Aservlet和Cservlet包含进来,共同来处理请求.创建三个Servlet编写三个Servlet中的doGet方法,处理请求在Bservlet中将Aservlet和Cservlet包含进来.测试:访问Bservlet,查询效果
献花(0)
+1
(本文系金银宝100首藏)