javaweb复习——request和response

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");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值