(9)Servlet的请求处理

(9)Servlet的请求处理

前言

  通过前面几篇文章,我们能够创建并且成功运行一个简单的Servlet程序,完成浏览器和服务器的简单交互。

  但是呢,我们写的Servlet代码时没有对浏览器的请求进行任何处理的。这篇我们会了解导如何使用Sevlet进行浏览器的请求处理。同时我们还会学习到两个对象Request和Response。

  注意:Request 和 Response 对象的更多常用方法,和其他类的常用方法,请下载tomcat的中文文档进行查看学习。英文还不错的可以查看tomcat官网的文档。

tomcat文档下载请点击:Tomcat离线文档下载

一、Servlet请求处理

  • 问:
      浏览器发送请求到服务器,会遵循HTTP协议将请求数据发送给服务器。
      那么问题来了,服务接受到的请求数据该怎么处理呢?
  • 解决:
      服务器接收到浏览器的请求后,就会创建一个Request对象专门的存储这一次请求的请求数据(来一个请求创一个Request对象)。
      服务器在调用Servlet时,会将请求来时创建且存储请求数据的Request对象作为实参传递给Servlet的方法,比如:service 方法、doGet()方法。
      上面一段解释:服务器在调用指定的 Servlet 进行请求处理的时候,会给 Servlet 的方法传递两个实参 request 和 response(类型分别是HttpServletRequest、HttpServletResponse)。
      其中 Request对象 中封存了请求相关的请求数据,而 Response 则是用来进行响应的一个对象。

1.Request请求对象

Request对象获取客户端请求的信息:

我的Servlet访问地址:http://localhost:8080/TestServlet?username=张三

示例代码:

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("utf-8"); // 设置请求时的字符编码
		// 1.获取请求头数据
		String scheme = req.getScheme(); // 获取请求协议
		String method = req.getMethod(); // 获取请求方式
		StringBuffer requestURL = req.getRequestURL(); // 获取请求URL
		String requestURI = req.getRequestURI(); // 获取请求URI
		System.out.println("请求协议:" + scheme + "\n请求方式:" + method + "\n请求URL:" + requestURL + "\n请求URI:" + requestURI + "\n");

		// 2.获取请求行数据
		Enumeration<String> headerNames = req.getHeaderNames(); // 返回所有的本请求消息包含的头名字的集合。
		while (headerNames.hasMoreElements()) {
			String name = headerNames.nextElement(); // 获取headerNames中元素
			String header = req.getHeader(name); // 返回指定的作为字符串请求消息头的值
			System.out.println(name + ":" + header);
		}

		// 3.获取用户请求数据
		String username = req.getParameter("username"); // 获取用户请求数据
		username = new String(username.getBytes("iso8859-1"), "utf-8"); // 请求参数乱码了需要编码一下
		System.out.println("\n" + username);
	}
}

2.Response响应对象

在使用 Request 对象获取了请求数据并进行处理后,处理的结果如何显示到浏览器中呢?

此时就用到了Response响应对象,响应给浏览器

我的Servlet访问地址还是这个:http://localhost:8080/TestServlet?username=张三

示例代码:

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 设置响应编码格式,返回html
		resp.setHeader("content-type", "text/html;charset=utf-8"); 
		resp.setHeader("my-key", "my-value"); // 设置一个自定义的键和值
		
		// 设置响应状态
		// resp.sendError(404, "这是我自己设置的一个响应错误404,页面找不到");
		
		// 设置响应实体
		resp.getWriter().write("<p>我返回了一个html文本,并在<strong>p标签<strong>中写了一段话一段文字<p>"); // 获取输出流,并在输出流中写入HTML代码
	}
}

示例代码2:响应一个登录页面(等我们后面学习了JSP后就不会这样写html代码了)

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 设置响应编码格式,返回html
		resp.setHeader("content-type", "text/html;charset=utf-8"); 
		
		// 下面是即将响应的html代码(等后面学JSP后就不会这样写了)
		StringBuilder html = new StringBuilder();
		html.append("<html>")
		.append("<body>")
		.append("<h1>登录页面</h1>")
		.append("<form method=\"get\" action=\"/TestServlet\">") // 引号需要使用 \ 转换
		.append("用户名:<input type=\"text\" name=\"username\"><br>")
		.append("密码:<input type=\"text\" name=\"password\"><br>")
		.append("<input type=\"submit\" value=\"登录\">")
		.append("</form>")
		.append("</body>")
		.append("</html>");
		
		// 设置响应实体
		resp.getWriter().write(html.toString());; // 获取输出流,并在输出流中写入HTML代码
	}
}

上面示例代码2返回的页面长这样:
在这里插入图片描述

二、请求处理流程

  • 设置请求编码格式
  • 设置响应编码格式
  • 获取请求信息
  • 处理请求信息
  • 响应处理结果

示例代码:

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 设置请求编码格式
		req.setCharacterEncoding("utf-8");
		// 设置响应编码格式 
		resp.setHeader("content-type", "text/html;charset=utf-8"); 
		// 获取请求信息
		String username = req.getParameter("username"); // 获取用户请求数据
		// 处理请求信息
		username = new String(username.getBytes("iso8859-1"), "utf-8"); // 字符编码转换成utf-8,默认中文是iso8859-1格式
		username = username + ",你好!"; // 给获取到的用户请求添加个你好
		// 响应处理结果
		resp.getWriter().write(username);
	}
}

页面:
在这里插入图片描述