每个request对象都封装着一次用户请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取请求参数的重要途径。
一.获取请求参数和请求头
Web应用是请求/响应架构的应用,浏览器发送请求时通常总会附带一些请求头,还可能包含一些请求参数发送给服务器,服务器端负责解析请求头/请求参数的就是JSP或Servlet,而JSP或者Servlet取得请求参数的途径就是request。request是HttpServletRequest接口的实例,它提供了如下几个方法来获取请求参数。
(1)String getParameter(String paramName) 获取paramName请求参数的值。
(2) Map getParameterMap() 获取所有请求参数名和参数值组成的Map对象。
(3)Enumeration getParameterNames() 获取所有请求参数名所组成的Enumeration对象
(4) String[] getParameterValues(String paramName) paramName请求参数的值,当该请求参数有多个值时,该方法将返回多个值所组成的数组。
HttpServletRequest提供了如下方法来访问请求头
(1)String getHeader(String name) 获取指定请求头的值
(2)java.util.Enumeration<String>getHeaderNames 获取所有请求头的名称
(3)java.util.Enumeration<String>getHeaders(String name) 获取指定请求头的多个值
(4)int getIntHeader(String name) 获取指定请求头的值,并将该值转换为整数值.
对于developder来说,请求头和请求参数都由用户发送到服务器的数据,区别在于请求头通常由浏览器自动添加,因此一次请求总是包含若干请求头;而请求参数则通常需要开发人员控制添加,让客户端发送请求参数通常有两种方式
1.GET方式的请求:直接在浏览器地址栏输入访问地址所发送的请求或提交表单发送的请求时,该表单对应的form元素没有设置设置method属性,或设置method属性为get,这几种请求都是GET方式的请求。GET方式的请求会将请求参数的名和值转换成字符串,并且附加在原URL之后,因此可以在地址栏中看到请求参数名和值。且GET请求传送的数据量较少,一般不能大于2KB
2.POST方式的请求:这种方式通常使用提交表单(由form HTML元素表示)的方式来发送,且需要设置form元素的method属性为post。POST方式传送的数据量较大,通常认为POST请求参数的大小不受限制,但往往取决于服务器的限制,POST请求传输的数据量总比GET传输的数据量大。而且POST方式发送的请求参数以及对应的值放在HTML HEADER中传输,用户不能在地址栏里看到请求参数值,安全性相对较高。
表单提交的案例,获取请求头和请求参数
<form if="form1" method="post" action="request1.jsp"> 用户名:<br> <input type="text" name="name"><hr> 性别:<br> 男<input type="radio" name="gender" value="男"> 女<input type="radio" name="gender" value="女"><hr> 喜欢的颜色: 红:<input type="checkbox" name="color" value="红"> 绿:<input type="checkbox" name="color" value="绿"> 蓝:<input type="checkbox" name="color" value="蓝"><hr> 来自的国家: <select name="country"> <option value="中国">中国</option> <option value="美国">美国</option> <option value="俄罗斯">俄罗斯</option> </select> <hr> <input type="submit" value="提交"> <input type="reset" value="重置"> </form>---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
<body> <% //获取所有请求头/请求参数名称 Enumeration<String> HeaderNames=request.getHeaderNames(); while(HeaderNames.hasMoreElements()){ String headerName=HeaderNames.nextElement(); out.println(headerName+"--->"+request.getHeader(headerName)+"<br>"); } out.print("<hr>"); //设置解码方式,对于简体中文,使用utf解码,编译页面用什么字符格式,就用相应的格式解码 request.setCharacterEncoding("utf-8"); //一次获取表单的值 String username=request.getParameter("name"); String gender=request.getParameter("gender"); String[] color=request.getParameterValues("color"); String national=request.getParameter("country"); %> <%-- 下面依次输出表单的值 --%> 您的姓名:<%=username %><hr> 您的性别:<%=gender %><hr> 您喜欢的颜色: <% for(String c:color){ %> <%=c %><hr> <% } %> 您来自的国家:<%=national %><hr> </body>
注:并不是每个表单域都会生成请求参数,而是有name属性的表单域才会生成请求参数,关于表单域和请求参数的关系遵循如下4点:
1.每个有name属性的表单域对应一个请求参数
2.如果有多个表单域有相同的那么属性,则多个表单域只生成一个请求参数。只是该参数有多个值。
3.表单域的name属性指定参数名,value指定请求参数值。
4.如果某个表单域设置了disabled=“disabled”属性,则该表单域不再生成请求参数。
二.获取GET请求头里的中文字符
<%
//获取请求头里面的查询字符串
String rawQueryStr=request.getQueryString();
//使用URLDecoder进行解码字符串
String queryStr=URLDecoder.decode(rawQueryStr,"utf-8");
%>
三.执行forward或include
request还有一个功能就是执行forward和include,也就是代替JSP所提供的forward和include动作指令。
HttpServletRequest类提供了一个getRequestDispatcher(String path),其中path就是希望forward或者include的目标路径,该方法返回RequestDispatcher,该对象提供了如下两个方法
1.forward(ServletQuest request,ServletResponse reponse) 执行forward
2.include(ServletQuest request,ServletResponse reponse) 执行include
eg------getRequestDispatcher("/a.jsp").forward(request,reponse)