一、简介

HttpServlet是Servlet接口的一个实现类,并且它是一个抽象类,servlet.http包中定义了采用HTTP通信协议(一个无状态协议)的HttpServlet类。

二、响应流程

1.Web客户向Servlet容器发出Http请求
2.Servlet容器解析Web客户的Http请求
3.Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息
4.Servlet容器创建一个HttpResponse对象
5.Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象
6.HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息
7.HttpServlet调用HttpResponse的有关方法,生成响应数据
8.Servlet容器把HttpServlet的响应结果传给Web客户
其中HttpServlet首先必须读取Http请求的内容,Servlet容器负责创建HttpServlet对象,并把Http请求直接封装到HttpServlet对象中。

三、创建HttpServlet步骤

1.继承HttpServlet抽象类
2.重写HttpServlet的部分方法,如doGet()或doPost()方法
3.获取HTTP请求信息。通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串
4.生成HTTP响应结果。通过HttpServletResponse对象生成响应结果

四、具体实现

HttpServlet的实现由两种方式:

  • 实现方式一:.xml配置实现
    A.配置xml文件(实现方式同Servlet接口的.xml配置相同,此处不再重复)
    B.继承HttpServlet抽象类
    C.重写get()、post()方法
    代码实现如下:
  • form表单注册页面:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>注册页面</title>
	</head>
	<body>
		<a href="myservlet?a=10&b=5">测试我的servlet</a>
		<!-- 
			action:提交到服务器的路径
			method:提交的方式
		 -->
		<form action="myservlet" method="get">
			<!-- servlet通过name属性获取用户输入的数据 -->
			用户名:<input type="text" name="username"><br>
			密码:<input type="password" name="userpwd"><br>
			<input type="submit" value="注册">
		</form>
	</body>
</html>
  • 继承子类
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UserServlet extends HttpServlet{
	private static final long serialVersionUID = 1L; 
	 /* 对应form表单的get请求方式
	  * HttpServletRequest:请求对象
	  * HttpServletResponse:响应对象
	  */
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//设定请求的字符集
		req.setCharacterEncoding("utf-8");
		//设置响应的文本类型
		resp.setContentType("text/html;charset=utf-8");
		//通过请求对象获取用户输入的内容
		String username = req.getParameter("username");
		String password = req.getParameter("userpwd");
		
		System.out.println(username+" "+password);
		//如果输入的用户名是abc,密码是123,则表示注册成功,反之注册失败
		if("abc".equals(username)&&"123".equals(password)){
			//使用响应对象,重定向到成功页面
			//resp.sendRedirect("success.html");
			//请求转发
			req.getRequestDispatcher("success.html").forward(req, resp);;
		}else{
			//使用响应对象,重定向到注册页面
			resp.sendRedirect("register.html");
		}
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//设定请求的字符集
		req.setCharacterEncoding("utf-8");
		//设置响应的文本类型
		resp.setContentType("text/html;charset=utf-8");
		//通过请求对象获取用户输入的内容
		String username = req.getParameter("username");
		String password = req.getParameter("userpwd");
		System.out.println(username+" "+password);
		//如果输入的用户名是abc,密码是123,则表示注册成功,反之注册失败
		if("abc".equals(username)&&"123".equals(password)){
			//使用响应对象,重定向到成功页面
			resp.sendRedirect("success.html");
		}else{
			//使用响应对象,重定向到注册页面
			resp.sendRedirect("register.html");
		}
	}
}
  • 实现方式二:注解实现
    直接在Package包下新建Servlet
    新建Servlet
    添加类名
    直接next即可
    在这里插入图片描述
    取消构造方法,选中doGet、doPost方法后,点击Finish创建结束
    添加方法
    注解格式

五、重写doGet()和doPost()

1.具体步骤

①设置请求字符集
②设置响应对象文本类型
③通过请求对象获取用户输入的数据
④响应对象通过重定向/转发响应用户请求

2.代码实现

在分析代码之前一定知道的知识点:
①form表单中的action属性和method属性
A.action属性:值——对应数据要提交到服务器的路径
B.method属性:有get和post两个取值,表示数据提交的方式(具体内容请看:get和post提交方式的区别)
②HttpServlet通过name属性获取用户输入的数据
③通过请求对象的getParameter()方法可以获取用户提交的数据
④由HttpServlet的子类转向页面有重定向和转发两种方式(具体内容请看:重定向和转发)

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UserServlet extends HttpServlet{
	private static final long serialVersionUID = 1L; 
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//设定请求的字符集
		req.setCharacterEncoding("utf-8");
		//设置响应的文本类型
		resp.setContentType("text/html;charset=utf-8");
		//通过请求对象获取用户输入的内容
		String username = req.getParameter("username");
		String password = req.getParameter("userpwd");
		
		System.out.println(username+" "+password);
		//如果输入的用户名是abc,密码是123,则表示注册成功,反之注册失败
		if("abc".equals(username)&&"123".equals(password)){
			//请求转发
			req.getRequestDispatcher("success.html").forward(req, resp);;
		}else{
			//使用响应对象,重定向到注册页面
			resp.sendRedirect("register.html");
		}
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//设定请求的字符集
		req.setCharacterEncoding("utf-8");
		//设置响应的文本类型
		resp.setContentType("text/html;charset=utf-8");
		//通过请求对象获取用户输入的内容
		String username = req.getParameter("username");
		String password = req.getParameter("userpwd");
		System.out.println(username+" "+password);
		//如果输入的用户名是abc,密码是123,则表示注册成功,反之注册失败
		if("abc".equals(username)&&"123".equals(password)){
			//使用响应对象,重定向到成功页面
			resp.sendRedirect("success.html");
		}else{
			//使用响应对象,重定向到注册页面
			resp.sendRedirect("register.html");
		}
	}
}
附:

A.注册页面

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>注册页面</title>
	</head>
	<body>
		<a href="myservlet?a=10&b=5">测试我的servlet</a>
		<form action="myservlet" method="get">
			用户名:<input type="text" name="username"><br>
			密码:<input type="password" name="userpwd"><br>
			<input type="submit" value="注册">
		</form>
	</body>
</html>

B.成功页面

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>注册成功</title>
</head>
	<body>
		恭喜你注册成功!!
	</body>
</html>

六、get和post方法

区别

七、重定向和转发

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐