HttpServlet 详解

1. 简述

1.1 Servlet

  • Java Servlet 是运行在服务器上的程序,其作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
  • 使用 Servlet可收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

1.2 HttpServlet

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

2、响应流程

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

3、创建HttpServlet步骤

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

4、具体实现

HttpServlet的实现由两种方式:

4.1、xml配置实现

具体实现步骤如下:

  • 配置xml文件(实现方式同Servlet接口的.xml配置相同,此处不再重复),代码实现如下:
# 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>
  • 继承HttpServlet抽象类,并重写get()和post()方法,代码实现如下:
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");
		}
	}
}

4.2、注解实现

步骤如下:

  • 直接在Package包下新建Servlet
    在这里插入图片描述

在这里插入图片描述

  • 取消构造方法,选中doGet、doPost方法后,点击Finish创建结束
    在这里插入图片描述
  • 重写doGet()和doPost()
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");
		}
	}
}

5、get和post方法对比

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值