请求对象request和响应对象response

1. HttpServletRequest基本功能

1.1 HttpServletRequest的功能

HttpServletRequest在JavaWeb中非常重要的一个类。它是Servlet的service()方法的参数之一!所以必须必须要掌握它!request的功能可以分为以下几种:

  • 封装了请求头数据;
  • 封装了请求正文数据,如果是GET请求,那么就没有正文;
  • request是一个域对象,可以把它当成Map来添加获取数据;
  • 做请求的转发

1.2 request获取请求头数据

String value = request.getHeader(“请求头名称”);

request对象可以用来获取请求头数据,当然,这些请求数据都是Tomcat封装到request中去的。我们在service()方法中可以直接来获取!

request与请求头相关的方法有:

  • String getHeader(String name):获取指定名称的请求头;
  • Enumeration getHeaderNames():获取所有请求头名称;
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/>");
}

1.3 request获取请求相关的其它方法

request中还提供了与请求相关的其他方法,有些方法是为了我们更加便捷的方法请求头数据而设计,有些是与请求URL相关的方法。

方法 说明
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

在这里插入图片描述

System.out.println("request.getContentLength(): " + request.getContentLength());
System.out.println("request.getContentType(): " + request.getContentType());
System.out.println("request.getContextPath(): " + request.getContextPath());
System.out.println("request.getMethod(): " + request.getMethod());
System.out.println("request.getLocale(): " + request.getLocale());
System.out.println("request.getQueryString(): " + request.getQueryString());
System.out.println("request.getRequestURI(): " + request.getRequestURI());
System.out.println("request.getRequestURL(): " + request.getRequestURL());
System.out.println("request.getServletPath(): " + request.getServletPath());
System.out.println("request.getRemoteAddr(): " + request.getRemoteAddr());
System.out.println("request.getRemoteHost(): " + request.getRemoteHost());
System.out.println("request.getRemotePort(): " + request.getRemotePort());
System.out.println("request.getScheme(): " + request.getScheme());
System.out.println("request.getServerName(): " + request.getServerName());
System.out.println("request.getServerPort(): " + request.getServerPort());

2. HttpServletRequest获取参数

2.1 传递参数的方式

传递参数的方式:GET和POST。

GET:

  • 地址栏中直接给出参数:http://localhost/param/ParamServlet?p1=v1&p2=v2;
  • 超链接中给出参数:
    <a href=” http://localhost/param/ParamServlet?p1=v1&p2=v2”>点一下</a>
  • 表单中给出参数:<form method=”GET” action=”ParamServlet”>…</form>
  • Ajax

POST:

  • 表单中给出参数:<form method=”POST” action=”ParamServlet”>…</form>
  • Ajax

2.2 HttpServletRequest获取参数方法

可以使用HttpServletRequest获取客户端的请求参数,相关方法如下:

  • String getParameter(String name):通过指定名称获取参数值;
  • String[] getParameterValues(String name):通过指定名称获取参数值数组,有可能一个名字对应多个值,例如表单中的多个复选框使用相同的name时;
  • Enumeration getParameterNames():获取所有参数的名字;
  • Map getParameterMap():获取所有参数对应的Map,其中key为参数名,value为参数值。

2.3 单值参数的接收

单值参数包括单选,单值下拉框,文本,隐藏域…

无论是GET还是POST,获取参数的方法是相同的。

String s1 = request.getParameter(“p1”);//返回v1
String s2 = request.getParameter(“p2”);//返回v2

前台页面:

<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);
}

Map<String, String[]> map = request.getParameterMap();
Set<String> keySet = map.keySet();
for(String key : keySet){
    String[] vals = map.get(key);
    System.out.print(key+" :");
    System.out.println(key+" :" + Arrays.toString(vals));
    System.out.println();
}

2.4 多值参数接收

多值参数主要就是多选checkbox

例如在注册表单中,如果让用户填写爱好,那么爱好可能就是多个。那么hobby参数就会对应多个值:

<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>

后台接收:

String[] hobbies = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));

Map<String, String[]> map = request.getParameterMap();
Set<String> keySet = map.keySet();
for(String key : keySet){
    String[] vals = map.get(key);
    System.out.println(key+" :" + Arrays.toString(vals));
}

2.5 HttpServletRequest的中文乱码处理

Request接收参数时有get和post两种请求方式,但是处理中文的编码却不一样,我们在做项目时会全站都采用统一的编码,最常用的就是UTF-8,在UTF-8编码的项目中的乱码处理方法如下:

2.5.1 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:"+name);

因为在获取参数时已经被错误的编码了,但因为我们知道,乱码的两个原因:本来是使用UTF-8编码的,还错误的使用了ISO-8859-1编码。所以我们可以先使用ISO-8859-1获取字节数组,然后再使用正确的UTF-8编码得到字符串,这样就没问题了。

request的setCharacterEncodng()可以设置编码,当然这必须在调用所有的getParameter()方法之前调用request的setCharacterEncodng()方法来设置编码,这样,就不会使用ISO解读字节串了,而是使用你给定的编码来解读。

第二种方法,直接设置request的编码格式:

request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
System.out.println("name:"+name);

对于每个请求,只需要调用request的setCharacterEncodng()一次,然后所有getParameter()都会使用这个编码来解读参数。但要注意,只对请求正文有效,即POST参数。

2.5.2 Get请求中文乱码

Get请求是讲参数放在URL的queryString中进行提交,故此不存在请求体,所以上面处理post请求乱码的方法不再生效。

第一种方式,同样针对字符串进行单独解码:

String name = request.getParameter("name");
name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("name:"+name);

第二种方式,通过设置服务器配置来让get请求支持中文,例如我们使用tomcat服务器,则设置/conf/server.xml:

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"/>

添加URIEncoding="UTF-8"。一旦设置了这个属性,那么对于GET参数就直接是UTF-8编码的了。但是,<Connector>元素来说,对整个Tomcat都是有效的!

不建议使用get请求传递中文参数。

说明:Tomcat8.5及以上版本,无需进行设置,即可直接支持URL传递中文;

2.6 HttpServletRequest请求转发

在Servlet中请求转发是大量要使用的,因为当我们访问一个Servlet的时候通常会执行一些后台的业务逻辑,然后跳转到一个结果页面,那么跳转到结果页面的这个过程就是请求转发,举个例子我们做登录的功能,我们填写用户名密码然后提交到一个负责登录的Servlet,Servlet为我们做用户名和密码的校验,如果我们都正确的话,我们就要跳转到登录的提示页面,如果错误就要跳转到登录失败的页面。

Request的请求转发也可以叫做服务器端的跳转,虽然有页面的跳转但是我们会发现地址栏是不会有变化的。

request.getRequestDispatcher("/success.html").forward(request, response);

我们不但可以跳转到静态页面(后续主要讲解是动态页面我们通常会跳转到一个jsp(jsp在Servlet之后产生)的提示页面,因为我们要返回的是动态页面,所有html是不适合(后续讲解))。还可以跳转到Servlet,此时我们可以给request来设置当前域中的属性值,在该域之内(当前请求完成之前)都能获得到该属性值。

request.setAttribute("name", "txjava");
request.getAttribute("name");

2.7 request作用域

在上一讲我们提及过ServletContext的概念,它也是一个域的对象,它的范围非常大,是指定项目所有Servlet的公共的对象,随着服务器的启动而产生,服务器的停止而销毁,那么request的也是域对象,它的作用范围小的多,它的范围只在一次请求响应范围之内,每一个线程的请求都会新产生一个HttpServletRequest和HttpServletResponse的对象。

3. HttpServletResponse

request是请求对象,而response是响应对象。response对象用于响应client请求,向客户输出信息。他封装了JSP产生的响应,并发送到client以响应client请求。

3.1 HttpServletResponse功能介绍

response对象的功能分为以下四种:

  • 设置响应头信息:addHeader("reFresh", "5;URL=xxxx");
  • 发送状态码:sendError(404);
  • 设置响应正文:getWriter().print("fdsfdsa");
  • 重定向:sendRedirect("path");

3.2 设置状态码和其他方法

  • 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会跳转到固定的错误页面去,但可以显示错误信息。

3.3 设置响应头信息

  • response.setHeader("contentType", "text/html;charset=utf-8"):与setContentType()方法的功能相同。setContentType()方法属于便捷方法;
  • 刷新(定时重定向):
  • response.setHeader("Refresh","5; URL=http://www.baidu.com"):5秒后自动跳转到百度主页。

3.4 Response中文乱码问题

当我们使用response向页面返回带有中文的值时,可能会出现中文乱码,需要进行如下设置:

response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("UTF-8");
response.getWriter().write("张三");

3.5 Response重定向

使用response对象的sendRedirect()方法能够将网页重定向到还有一个页面。重定向支持将地址重定向到不同的主机上,这一点与转发不同。在client浏览器上将会得到跳转后的地址,并又一次发送请求链接;用户能够从浏览器的地址栏中看到跳转后的地址;重定向操作后,request中的属性将会所有失效,并開始一个新的request对象:

response.sendRedirect("/param_demo/success.html");
发布了94 篇原创文章 · 获赞 0 · 访问量 722

猜你喜欢

转载自blog.csdn.net/qq_46578181/article/details/105345976
今日推荐