HttpServletRequest
基本功能
HttpServletRequest在JavaWeb中非常重要的一个类。它是Servlet的service()方法的参数之一!所以你必须必须要掌握它!
功能如下:
- 封装了请求头数据;
- 封装了请求正文数据,如果是GET请求,那么就没有正文;
- request是一个域对象,可以把它当成Map来添加获取数据;
- 做请求的转发
request获取请求头数据
String value = request.getHeader(“请求头名称”);
request对象可以用来获取请求头数据,当然,这些请求数据都是Tomcat封装到request中去的。我们在service()方法中可以直接来获取!
相关方法:
- String getHeader(String name):获取指定名称的请求头;
- Enumeration getHeaderNames():获取所有请求头名称;
- int getIntHeader(String name):获取值为int类型的请求头。
response.setContentType("text/html;charset=utf-8");
Enumeration names = request.getHeaderNames();
while(names.hasMoreElements()) {
String name = (String)names.nextElement();
String value = request.getHeader(name);
System.out.println(name + ": " + value);
response.getWriter().println(name + ": " + value + "<br/>");
}
request获取请求相关的其它方法
方法 | 功能描述 |
---|---|
int getContentLength() | 获取请求正文的字节数,GET请求没有正文,没有正文返回-1 |
String getContentType() | 获取请求类型,如果请求是GET,那么这个方法返回null;如果是POST请求,那么默认为application/x-www-form-urlencoded(理解为字符串类型),其它类型以后再学; |
String getMethod() | 返回请求方法,例如:GET |
Locale getLocale() | 返回当前客户端浏览器支持的Locale。java.util.Locale表示国家和言语,这个东西在国际化中很有用; |
String getCharacterEncoding() | 获取请求编码,如果没有setCharacterEncoding(),那么返回null。表示使用ISO-8859-1编码; |
void setCharacterEncoding(String code) | 设置请求编码,只对正文有效!注意,对于GET而言,没有正文!!!所以此方法只能对POST请求中的参数有效! |
String getContextPath() | 返回上下文路径,例如:/项目名称 |
String getQueryString() | 返回请求URL中的参数,例如:name=zhangSan |
String getRequestURI() | 返回请求URI路径,例如:/hello/oneServlet |
StringBuffer getRequestURL() | 返回请求URL路径,例如:http://localhost/hello/oneServlet,即返回除了参数以外的路径信息; |
String getServletPath() | 返回Servlet路径,例如:/oneServlet |
String getRemoteAddr() | 返回当前客户端的IP地址; |
String getRemoteHost() | 返回当前客户端的主机名,但这个方法的实现还是获取IP地址; |
int getRemotePort() | 返回客户端的端口号,每次请求都会变; |
String getSchema() | 返回请求协议,例如:http; |
String getServerName() | 返回主机名,例如:localhost |
int getServerPort() | 返回服务器端口号,例如:80 |
HttpServletRequest获取参数
获取参数的相关方法:
方法 | 功能描述 |
---|---|
String getParameter(String name) | 通过指定名称获取参数值; |
String[] getParameterValues(String name) | 通过指定名称获取参数值数组,有可能一个名字对应多个值,例如表单中的多个复选框使用相同的name时; |
Enumeration getParameterNames() | 获取所有参数的名字; |
Map getParameterMap() | 获取所有参数对应的Map,其中key为参数名,value为参数值。 |
传递参数的方法
GET:
- 地址栏中直接给出参数:http://localhost/param/ParamServlet?p1=v1&p2=v2;
- 超链接中给出参数:<a href=” http://localhost/param/ParamServlet?p1=v1&p2=v2”>???
- 表单中给出参数:…
- Ajax
POST:
- 表单中给出参数:…
- Ajax
参数的接收
单值接收
<form action="ParamServlet" method="post">
<input type="text" name="p1"/><br/>
<input type="text" name="p2"/><br/>
<input type="submit" value="提交"/><br/>
</form>
<a href="ParamServlet?p1=v1&p2=v2">Param</a>
String s1 = request.getParameter("p1");
String s2 = request.getParameter("p2");
response.getWriter().print("p1 = " + s1 + "<br/>");
response.getWriter().print("p2 = " + s2 + "<br/>");
Enumeration names = request.getParameterNames();
while(names.hasMoreElements()) {
String name = (String)names.nextElement();
String value = request.getParameter(name);
System.out.println(name + " = " + value);
}
多值参数接收
页面checkbox
<form action="ParamServlet" method="post">
上网:<input type="checkbox" name="hobby" value="netplay" /><br/>
踢球:<input type="checkbox" name="hobby" value="football" /><br/>
看书:<input type="checkbox" name="hobby" value="read" /><br/>
编程:<input type="checkbox" name="hobby" value="programme" /><br/>
<input type="submit" value="提交"/><br/>
</form>
只会接收到勾选的
// 获取所有名为hoby的参数值
String[] hobbies = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
页面表单
<form action="ParamServlet" method="post">
姓名:<input type="text" name="name"/><br/>
年龄:<input type="text" name="age"/><br/>
性别:<input type="text" name="sex"/><br/>
<input type="submit" value="提交"/><br/>
</form>
Map<String,String[]> map = request.getParameterMap();
Set<String> keys = map.keySet();
for(String key : keys) {
String[] value = map.get(key);
System.out.println(key + " = " + value[0]);
}
Request的获得中文乱码处理
post请求解决中文乱码
我们知道,请求信息中,只有POST存在正文,所谓POST参数编码就是就是请求正文的编码。
默认情况下,使用getParameter()获取POST请求参数时,使用的是ISO-8859-1编码。
String name = request.getParameter("name");
name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
System.out.println(name);
但是这样需要一个一个转换,很麻烦,使用还可以在获取参数之前设置编码。
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
对于每个请求,都需要调用request的setCharacterEncodng()一次,然后所有getParameter()都会使用这个编码来解读参数。但要注意,只对请求正文有效,即POST参数。
get请求解决中文乱码
第一种方式:
我们可以采用字符串转码的方式来处理
String s = request.getParameter(“s”);
s = new String(s.getBytes(“iso-8859-1”), “utf-8”);
第二种方式:
GET参数不在请求正文中,而是在URL中。所以不能使用request的setCharacterEncodng()来设置GET参数的编码。
处理GET参数编码可以有两种方式:第一种是设置元素的URIEncoding属性的值为UTF-8。
即conf\server.xml中的元素的URIEncoding属性。
一旦设置了这个属性,那么对于GET参数就直接是UTF-8编码的了。
对于元素来说,对整个Tomcat都是有效的!
第三种方式:
处理这个问题的办法是把GET请求中的参数使用JavaScript做URL编码,URL编码后的内容就不再是中文了,这样IE6也就不会丢失字节了。
<a href="#" onclick="click1()">ff</a>
<script type="text/javascript">
function click1(){
var path = encodeURI(encodeURI("servlet/RequestDemo?namea=我是谁"));
location.href = path;
}
</script>
url编码后
http://localhost/encoding/EncodingServlet?name=%E5%A4%A7%E5%AE%B6%E5%A5%BD
在使用URL编码后,我是谁已经变成了%E5%A4%A7%E5%AE%B6%E5%A5%BD。这样就不会再丢失字节了。
String val = request.getParameter("namea");
val = URLDecoder.decode(val, "UTF-8");
System.out.println(val);
HttpServletRequest请求转发(服务器端跳转forward)
在Servlet中请求转发是大量要使用的,因为当我们访问一个Servlet的时候通常会执行一些后台的业务逻辑,然后跳转到一个结果页面,那么跳转到结果页面的这个过程就是请求转发,举个例子我们做登录的功能,我们填写用户名密码然后提交到一个负责登录的Servlet,Servlet为我们做用户名和密码的校验,如果我们都正确的话,我们就要跳转到登录的提示页面,如果错误就要跳转到登录失败的页面。
Request的请求转发也可以叫做服务器端的跳转,虽然有页面的跳转但是我们会发现地址栏是不会有变化的。
request.getRequestDispatcher("/success.html").forward(request, response);
我们不但可以跳转到静态页面(后续主要讲解是动态页面我们通常会跳转到一个jsp(jsp在Servlet之后产生)的提示页面,因为我们要返回的是动态页面,所有html是不适合(后续讲解))。
还可以跳转到Servlet,此时我们可以给request来设置当前域中的属性值,在该域之内(当前请求完成之前)都能获得到该属性值。
request.setAttribute("name", "zzz");
request.getAttribute("name");
request域的作用范围
在上一讲我们提及过ServletContext的概念,它也是一个域的对象,它的范围非常大,是指定项目所有Servlet的公共的对象,随着服务器的启动而产生,服务器的停止而销毁,那么request的也是域对象,它的作用范围小的多,它的范围只在一次请求响应范围之内,每一个线程的请求都会新产生一个HttpServletRequest和HttpServletResponse的对象。
HttpServletResponse
功能介绍
- 设置响应头信息;addHeader(“reFresh”, “5;URL=xxxx”);
- 发送状态码;sendError(404);
- 设置响应正文;getWriter().print(“fdsfdsa”);
- 重定向:sendRedirect(“path”);
常用方法
方法 | 方法描述 |
---|---|
response.setContentType(“text/html;charset=utf-8”) | 设置响应类型为html,编码为utf-8,处理相应页面文本显示的乱码; |
response.setCharacterEncoding(“utf-8”) | 如果响应类型为文本,那么就需要设置文本的编码类型,然后浏览器使用这个编码来解读文本。注意,如果没有设置contentType,那么浏览器会认为contentType为text/html,如果没设置编码,那么默认为ISO-8859-1编码。所以以上两点在使用response返回结果之前必须设置。 |
response.setStatus(200) | 设置状态码; |
response.sendError(404, “您要查找的资源不存在”) | 当发送错误状态码时,Tomcat会跳转到固定的错误页面去,但可以显示错误信息。 |
response.setHeader(“contentType”, “text/html;charset=utf-8”) | 与setContentType()方法的功能相同。setContentType()方法属于便捷方法; |
response.setHeader(“Refresh”,“5; URL=http://www.baidu.com”) | 5秒后自动跳转到百度主页。 |
response的中文乱码问题
在response相应之前设置编码
而且每次响应都得设置
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");