Servlet-request对象

HttpServletRequest和HttpServletResponse

Web服务器收到一个http请求,会针对每个请求创建一个HttpServletRequest和HttpServletResponse对象,向客户端发送数据找HttpServletResponse,从客户端取数据找HttpServletRequest.

HTTP 协议是基于请求-响应的协议,客户端请求一个文件,服务器对该请求进行响应。HTTP 使用 TCP 协议,默认使用 80 端口。最初的
HTTP 协议版本是 HTTP/0.9,后被 HTTP/1.0 替代。目前使用的版本是 HTTP/1.1,在 HTTP
协议中,总是由主动建立连接、发送 HTTP
请求的客户端来初始化一个事务。服务器不负责连接客户端,或创建一个到客户端的回调连接(callback connection)。

HttpServletRequest

公共接口类HttpServletRequest继承自ServletRequest.客户端浏览器发出的请求被封装成为一个HttpServletRequest对象。所有的信息包括请求的地址,请求的参数,提交的数据,上传的文件客户端的ip甚至客户端操作系统都包含在其内。

常用方法

1.获得客户机信息

getRequestURL方法返回客户端发出请求时的完整URL。

getRequestURI方法返回请求行中的资源名部分。

getQueryString 方法返回请求行中的参数部分。

getRemoteAddr方法返回发出请求的客户机的IP地址

getRemoteHost方法返回发出请求的客户机的完整主机名

getRemotePort方法返回客户机所使用的网络端口号

getLocalAddr方法返回WEB服务器的IP地址。

getLocalName方法返回WEB服务器的主机名

getMethod得到客户机请求方式

getServerPath()获取请求的文件的路径

2.获得客户机请求头

getHeader(string name)方法
getHeaders(String name)方法
getHeaderNames方法

3.获得客户机请求参数(客户端提交的数据)

getParameter(name)方法 获取请求中的参数,该参数是由name指定的 getParameterValues(String
name)方法 获取指定名称参数的所有值数组。它适用于一个参数名对应多个值的情况。如页面表单中的复选框,多选列表提交的值。

getParameterNames方法
返回一个包含请求消息中的所有参数名的Enumeration对象。通过遍历这个Enumeration对象,就可以获取请求消息中所有的参数名。

getCharacterEncoding() 返回请求的字符编码方式

getAttributeNames()返回当前请求的所有属性的名字集合赋值:setAttribute()

getAttribute(String name) 返回name指定的属性值

getsession()返回和客户端相关的session,如果没有给客户端分配session,则返回null

getParameterMap():返回一个保存了请求消息中的所有参数名和值的Map对象。Map对象的key是字符串类型的参数名,value是这个参数所对应的Object类型的值数组

RequestDispatcher.forward
方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。

request.setCharacterEncoding(“utf-8”);

getReader() 获取请求体的数据流

getInputStream() 获取请求的输入流中的数据

通过输入输出流获取 :getInputStream() 和 getReader()

在读取的时候通过流对象.read()方法读取

出现乱码的原因和解决

1.Java程序中默认的是中文字符----unicode

2.系统会把在java程序中的unicode字符按照某种字符集编码的方式转换成字节数组,再通过浏览器输出,浏览器在输出的时候要进行解码,只有在这两种方式一样的情况下,才不会出现乱码。

注:

(1)某种字符编码是用reponse对象去设置的,而且必须是在out.println之前使用,要不会出现错误,会抛找不到
设置的字符编码而出错。

设置编码的两种方式:

response.setContentType(“text/html;charset=utf-8”);
request.setCharacterEncoding(“utf-8”);

(2)浏览器会把字节数组转换成字符

系统默认的编码方式为ISO8859-1,如果没有指定字符编码,则输出的都是乱码,而且ISO8859-1不支持中文,所以不管浏览器在解码的时候用的是什么字符集编码,在浏览器上的都是乱码。

Post方式提交出现乱码

请求中之所以会产生乱码,就是因为服务器和客户端沟通的编码不一致造成的,因此解决的办法是:在客户端和服务器之间设置一个统一的编码,之后就按照此编码进行数据的传输和接收。

解决办法:由于客户端是以UTF-8字符编码将表单数据传输到服务器端的,因此服务器也需要设置以UTF-8字符编码进行接收,要想完成此操作,服务器可以直接使用从ServletRequest接口继承而来的"setCharacterEncoding(charset)"方法进行统一的编码设置。使用request.setCharacterEncoding(“UTF-8”);设置服务器以UTF-8的编码接收数据后,此时就不会产生中文乱码问题了

request.setCharacterEncoding("UTF-8");
Get方式提交出现乱码

对于以get方式传输的数据,request即使设置了以指定的编码接收数据也是无效的,默认的还是使用ISO8859-1这个字符编码来接收数据,客户端以UTF-8的编码传输数据到服务器端,而服务器端的request对象使用的是ISO8859-1这个字符编码来接收数据,服务器和客户端沟通的编码不一致因此才会产生中文乱码的。

解决办法:在接收到数据后,先获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题。

//接收数据 
String name = request.getParameter("name");
//获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题 
name =new String(name.getBytes("ISO8859-1"), "UTF-8") ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值