Java Web学习系列(三) HttpServlet的请求与响应

针对Servlet的每次请求,WEB服务器在调用service()方法之前,都会创建HttpServletRequestHttpServletResponse对象,分别进行HTTP请求和HTTP响应的封装

HttpServletResponse对象

发送状态码

  • setStatus(int status):用于设置HTTP响应消息的状态码

  • sendError(int code):用于发送表示错误信息的状态码,有个重载可以增加用于提示说明的文本信息:sendError(int code, String msg)

使用setStatus,正常返回页面:

使用sendError,网页显示错误:

发送响应消息头

  • addHeader(String name, String value):可以增加同名的头字段
  • setHeader(String name, String value):会覆盖同名的头字段
  • addIntHeader(String name, Int value):用于设置包含整数值的响应头
  • setIntHeader(String name, Int value):同上
  • setContentLength(int len):设置响应消息的实体内容大小,单位为字节
  • setContentType(String type):设置MIME类型
  • setCharacterEncoding(String charset):设置输出内容使用的字符编码

解决中文乱码

response对象的字符输出流在编码时,采用的是ISO-8859-1的字符码表。

解决方法,在输出前加上:

1
response.setContentType("text/html;charset=utf-8");

实现定时刷新

每隔2s自动刷新

1
response.setHeader("Refresh", "2");

实现定时刷新后跳转

1
response.setHeader("Refresh", "2;URL=https://www.baidu.com");

发送响应消息体

  • getOutputStream():直接输出字节数组中的二进制数据

  • getWriter():直接输出字符文本内容

注意:getOutputStream()和getWriter()方法互相排斥,不可同时使用

请求重定向

Servlet1接收到请求后可以调用sendRedirect方法将请求重定向到Servlet2或其他路径

例如一个简单的登录跳转demo:

1
2
3
4
5
6
7
8
9
10
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
String username = request.getParameter("name");
String password = request.getParameter("password");
if(("admin").equals(username) && ("password".equals(password))){
response.sendRedirect("./success.html");
}else{
response.sendRedirect("./error.html");
}
}

数据传递

在index.jsp的body标签写入:

1
you are ${username}

doGet方法:

1
2
request.setAttribute("username", "admin");//向转发的资源传递参数
request.getRequestDispatcher("index.jsp").forward(request, response);//将请求转发到服务器上的另一个资源

访问网址,显示:

sendRedirect是在客户端跳转,跳转后网址会发生改变,而getRequestDispatcher是在服务器端跳转,跳转后网址不会变

HttpServletRequest对象

获取请求信息

  • getMethod():获取请求方法,GET、POST等

  • getRequestURI():获取请求资源名称的部分

  • getQueryString():获取请求参数

  • getProtocol():获取协议名和版本

  • getContextPath():获取请求URL中属于Web应用程序的路径

  • getServletPath():获取Servlet的名称或Servlet所映射的路径

  • getRemoteAddr():获取请求客户端的IP地址

  • getRemoteHost():获取请求客户端的完整主机名

  • getRemotePort():获取请求客户端网络连接的端口号

  • getLocalAddr():获取Web服务器上接收当前网络连接的IP地址

  • getLocalName():获取Web服务器上接收当前网络连接的IP地址所对应的主机名

  • getLocalPort():获取Web服务器上接收当前网络连接的端口号

  • getServerName():获取当前请求所指向的主机名

  • getServerPort():获取当前请求所连接的服务器端口号

  • getScheme():获取请求的协议名

  • getRequestURI():获取客户端发出的请求时的完整URL

获取请求头信息

  • getHeader(String name):获取指定头字段的值

  • Enumeration getHeaders(String name):返回一个Enumeration集合对象,该集合对象由所有指定头字段值组成(头字段名可能出现多次)

  • Enumeration getHeaderNames():获取包含所有请求头字段的Enumeration对象

  • int getIntHeader(String name):获取指定名称头字段值并转为int型,不存在返回-1

  • long getDateHeader(String name):获取指定头字段的值并按GMT时间格式转换成一个代表日期的长整数

  • String getContentType():获取Content-Type值

  • int getContentLength():获取Content-Length

  • String getCharacterEncoding():获取字符集编码

获取所有请求头信息

获取请求参数

  • String getParameter(String name)
  • String[] getParameterValues(String name):可获取多个同名参数,返回String类型的数组
  • Enumeration getParameterNames():返回包含所有请求参数名的Enumeration对象
  • Map getParameterMap():将所有请求参数名和值装进一个Map对象中返回