2.【HttpServletRequest类】、【HttpServletResponce类】常用方法总结

HttpServletRequest:含客户端的所有信息

不常用方法可参考博客:Servlet基础之HttpServletRequest详解

代表客户端的请求,用户通过HTTP访问服务器;http请求中的所有信息会被封装到httpservletrequest,通过这个httpservletrequest的方法,获得客户端的所有信息

1、常用的方法:getParameter()、getParameterValues()

在这里插入图片描述
为了展示上述方法的使用,我们创建一个PersonalMessage.html的页面,页面代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<body>
	<form action="RequestTestServlet" method="post">
		姓名: <input type="text" name="name" style="width: 150px" />
		<p />
		年龄: <input type="text" name="age" style="width: 150px" />
		<p />
		爱好:
 	 	<input type="checkbox" name="hobby" value="sing">篮球
 	 	<input type="checkbox" name="hobby" value="dance">羽毛球
 	 	<input type="checkbox" name="hobby" value="football">足球
 	 	<p />
		<input type="submit" value="提交" />
		<p />
	</form>
</body>
</html>

RequestTestServlet中对应的doPost方法如下:

protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
	  
	  // 设置request对象的解码方式
	  request.setCharacterEncoding("utf-8");
	  String name = request.getParameter("name");
	  String age = request.getParameter("age");
	  System.out.println("姓  名:" + name);
	  System.out.println("年  龄:" + age);
	  
	  // 获取参数名为“hobby”的值
	  String[] hobbys = request.getParameterValues("hobby");
	  System.out.print("爱  好: ");
	  for (int i = 0; i < hobbys.length; i++) {
	    System.out.print(hobbys[i] + ",");
	  }


	  Map<String, String[]> paramMap = request.getParameterMap();
	  //...
}

其运行结果如下图所示:
在这里插入图片描述

2、 设置为utf-8

 // 设置request对象的解码方式
 request.setCharacterEncoding("utf-8");

3、请求转发,请求包含

  req.getRequestDispatcher("/success.jsp").forward(req,resp);

  req.getRequestDispatcher("/success.jsp").include(req,resp);




HttpServletResponce:给客户端响应一些信息

更多可以参考博客:Servlet基础之HttpServletResponse详解

1、两种方法,设置响应编码为utf-8

//这个更好
response.setContentType(“text/html; charset=UTF-8);  

//这两句等价于上面
response.setContentType("text/html");
response.setCharacterEncoding("charset=UTF-8")

2、设置响应的状态码 setStatus()、sendError()

Http错误码总共分为5类,即
1xx:通知信息
2xx:成功信息
3xx:重定向信息
4xx:客户端错误
5xx:服务端错误

下面列举一些常见的错误码:
在这里插入图片描述
在我们程序正常执行(完整的处理了Http请求,没发生bug)的时候,Web服务器会默认产生一个状态码为200。还有,在我们url路径输错的时返回的404错误,调用servelt发生异常直接抛出返回的500错误等,都是web服务器帮我们默认产生的。

在开发的过程中,500错误是我们遇到最多的错误了,如空指针异常、sql异常、状态异常等导致的请求中断,对于这些异常,如果直接将报错信息暴露给用户,那么我们的系统的体验就会非常的差。为了增加系统的用户友好程序,我们必须对异常进行处理,但是也需要将错误信息正确的提示给用户,让其可以有下一步处理或者联系客服。

​ 这样我们就需要来设置状态码,让前端可以根据状态码及其他返回信息进行相应的页面处理了。那么问题来了,我们如何手动的设置状态码呢?HttpServletResponse中为我们提供了一下几个方法:
在这里插入图片描述
其中比较重要的方法为setStatus(int sc),我们可以通过其方便的设置给客户端响应的状态码;

​ 我们简单的对setStatus、sendError进行测试,这里我们新建个Servelt,命名为ResponseTestServlet,其doGet代码如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  //设置返回客户端的contentType
  response.setContentType("text/html;charset=utf-8");
  //设置状态码
  response.setStatus(500);
  //response.sendError(500);
  //获取输出流
  PrintWriter out = response.getWriter();
  out.println("虽然我的状态为500,但是信息正常输出了");
}

我们直接在浏览器中调用ResponseTestServlet,其运行结果如下图所示:

在这里插入图片描述

对于sendError()的两个方法,会将Servlet之前写入缓冲区的数据全部清除,但是其也有较好的使用场景,就是对同一种异常设置专门的错误提示页面,比如用户未登录,可以在过滤器(Filter)中判断出此种情况,并直接调用sendError跳转至相应的页面,在此页面上友好的向用户提示错误信息,but此功能完全可以使用重定向来完成,且重定向可以获取更多的请求和响应信息,因此算是一个比较鸡肋的功能吧。

<error-page>
  <error-code>500</error-code>
  <location>/index.jsp</location>
</error-page>

​ 在此在浏览器上执行,其运行结果如下图所示

在这里插入图片描述

3、设置响应头中对应的信息:addHeader()、addIntHeader()、addDateHeader()、addCookie() && setxxxxxxxxxxxxx

主要相关方法如下:
在这里插入图片描述
需要注意的是,addHeader、addIntHeader、addDateHeader都有一个对应的setxxxx方法,两者的区别就如同集合和列表,setxxxx方法不允许出现重复的header,而addxxxx方法可以;

setContentType、setCharacterEncoding方法皆是是指返回给客户端的内容的编码方式的,推荐直接使用setContentType设置客户端内容的MIME类型及编码方式,比如setContentType("text/html; charset=UTF-8")等价于setContentType("text/html");setCharacterEncoding("charset=UTF-8")两条语句同时执行。

​ 这里,为了演示上面这些方法,我们将ResponseTestServlet中的doGet方法修改如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws            				ServletException, IOException {
  //设置返回客户端的contentType
  response.setContentType("text/html;charset=utf-8");
  
  PrintWriter out = response.getWriter();
  
  //添加类型为String的header
  response.addHeader("Location", "#");
  //添加类型为long的header
  response.addDateHeader("Date", new Date().getTime());
  //创建一个Cookie
  Cookie cookie = new Cookie("name", "李子树");
  //添加一个cookie
  response.addCookie(cookie);
}

在这里插入图片描述

4、负责向浏览器发送数据的方法:getOutputStream()、getWriter()

在这里插入图片描述

  • getOutputStream()方法返回ServletOutputStream对象,更适合向客户端写入二进制数据,并且Servlet容器不会对这些二进制数据进行编码,因此我们常用ServletOutputStream来向客户端发送如图片、文件等内容
  • 对于getWriter()方法返回的PrintWriter对象,里面封装了更多的写入字符文本的函数,并且我们上文提到的setContentType()方法设置的MIME类型对其输出内容有效,因此也可以很好地解决中文乱码问题。

​ 还有一点需要注意的是,这两个方法在一个response对象中不可以同时调用,否则会抛出一个IllegalStateException,也就是非法状态异常,因为输出流只能有一个(如果可以多次获取的话,客户端又如何确认哪个Http响应是最后一个呢)

------------------------------------ServletOutputStream getOutputStream() throws IOException;

//设置返回客户端的contentType
response.setContentType("text/html;charset=utf-8");
  
//...

ServletOutputStream out = response.getOutputStream();

//通过ServletOutputStream向客户端输出值,通过getBytes获取字节数组,并指定编码方式
out.print("我们不一样!".getBytes("UTF-8"));




------------------------------------PrintWriter getWriter() throws IOException;
例如:
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");

Properties properties = new Properties();
properties.load(is);

String username = properties.getProperty("username");
String pwd = properties.getProperty("password");
resp.getWriter().print(username);
resp.getWriter().print(pwd);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你说的白是什么白_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值