request(javax.servlet.http.HttpServletRequest的实例 )
request是JSP中非常常用的对象之一,每个request对象封装着一次用户请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取请求参数的重要途径。而且还可以用于操作request范围的属性。request的继承关系如下图:
1. 获取请求头/请求参数
Web应用是请求/响应架构应用,浏览器发送请求时通常会附带一些请求头,还可能包含一些请求参数给服务器,服务器端负责解析请求头/请求参数的就是JSP/Servlet,而二者取得请求参数的途径就是request。request是HttpServletRequest接口的实例。
request提供了如下几个方法获取请求参数:
(1) String getParameter(StringparameterName):获取paramName请求参数的值
(2) Map getParameterMap():获取所有请求参数名和参数值所组成的Map对象。
(3) Enumeration getParameterNames():获取所有请求参数名所组成的Enumeration对象。
(4) String[] getParameterValues(String name):parameterName请求参数的值,当请求参数有多个值时,该方法返回多个值所组成的数组。常用来获取多选框的值。
(5) request.getMethod():取得提交方式
(6) request.getRemoteAddr():取得访问的IP地址
(7) request.getContextPath():取得上下文路径(工程名),用于解决跳转问题
(8) request.getServletPath():取得访问路径
request提供了如下方法来访问请求头。
(1) String getHeader(String name):根据指定请求头的值。
(2) java.util.Enumeration<String>getHeaderNames():获取所有请求头的名称。
具体使用时可以使用:
Enumeration enu =request.getHeaderNames();
while(enu.hasMoreElements()){
String str =(String) enu.nextElements();
}
(3) java.util.Enumeration<String>getHeaders(String name):获取指定请求头的多个值。
(4) int getIntHeader(String name):获取指定请求头的值,并将该值转换成整数值。
对于开发者来讲,请求头和请求参数都是由用户发送到服务器的数据,它们的区别在请求头是浏览器自动添加,因此一次请求总是包含着若干个请求头,请求头包括客户点IP地址、Cookie、语言什么的;而请求参数则通常需要开发人员控制添加,让客户端发送请求参数通常分为两种情况:
- GET方式的请求:直接在浏览器地址栏输入访问的地址所发送的请求或提交表单发送时以XX.jsp?name=123&sex=man 形式发送的。表单默认为get提交。get方式请求会将请求参数的名和值转换成字符串,并附在原URl之后,因此可以在地址栏上看见请求参数的名和值。且get请求的数据量比较小,一般不能大于2KB。如果在get请求中包含了非西欧字符,使用setCharacterEncoding()设置request编码的字符集是不好使的,如果含有中文字符我们需要借助java.net.URLDecoder类
<% String name =request.getParameter("name"); //使用URLDecoder解析字符串 String correct = java.net.URLDecoder.decode(name, "gbk"); //也可以先转换成字符数组,然后再重新解码成字符串 //将请求参数值使用ISO-8859-1字符串分解成字节数组 byte [] temp =name.getBytes("ISO-8859-1"); String correct1 =new String(temp);//将字节数组重新解码成字符串 %>
- POST方式的请求:这种方式通常用于提交表单的方式发送,post传递的数据量比较大,通常认为请求参数大小不受限制,但往往取决于服务器端的限制,而且POST方式发送的请求参数以及对应的值放在html header中传输,安全性相对较高。
值得注意的是并不是每个表单域都会生成请求参数的,而是由name属性的表单域才会生成请求参数,每个有name属性的表单域对应一个请求参数;如果多个表单域有相同的name属性,则多个表单域只生成一个请求参数,只是该参数有多个值;表单域的name属性指定请求参数的名字,value指定请求参数的值;如果某个表单域设置了disabled=”disabled”属性,则该表单域不再生成请求参数。
值得一提的是request还可以做一个类似设置家用路由器访问时用户验证的那种用户角色验证,这个验证的框使用了request.isUserINRole(String Role)àboolean类型返回值。这个应用是在李兴华老师的java Web开发实战经典上看到的,虽然我没用过,但是为了知识的完整性就简单提一下。
2. 操作request范围的属性
HttpServletRequest提供了两个方法用来设置和获取request范围的属性。
- setAttribute(String attName,Object attValue):将attValue设置成request范围的属性。
- Object getAttribute(String attName):获取request范围的属性。
我们在最开始接触使用JSP时会遇到许多细枝末节的问题,作为纯粹的JSP开发已经很少了,因而像setAttribute()这类的方法已经使用的很少了,但是getParameter()和getAttribute()比较相似,但是两者使用方法是完全不同的:凡是能使用getAttribute(···)方法的时候在使用之前一定有一个setAttribute()方法与之对应。而我们在使用getParameter()方法时前面必有一个表单的提交、地址的重写、<jsp:include >或者<jsp:forward >