目录
前言
继承javax.servlet.http.HttpServlet类。
前言
上一篇博客介绍了Servlet的第二种创建方式:继承javax.servlet.GenericServlet类;
本篇博客介绍第三种Servlet创建方式:继承javax.servlet.http.HttpServlet类。
注意:这种方式,也是之后我们广泛使用的,用于前后端交互使用的。
继承javax.servlet.http.HttpServlet类。
继承javax.servlet.http.HttpServlet类。这种创建方式和前面两种的区别在于
- 我们真正要写的变得越来越少,绝大部分已经自己实现了代码,只需要关心业务代码。
如 init() Servlet用于初始化方法 ,ServletConfig() 用于添加配置信息,destroy()注销....等
service 方法,也不需要我们去重写了
现在请看一下HttpServlet类 的源码
双击shift键,弹出搜索HttpServlet类并且选中右上角的“包括非项目条目” 查看源码
我们重点看 源代码中的重写service方法
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String method = req.getMethod();long lastModified;if (method.equals("GET")) {lastModified = this.getLastModified(req);if (lastModified == -1L) {this.doGet(req, resp);} else {long ifModifiedSince;try {ifModifiedSince = req.getDateHeader("If-Modified-Since");} catch (IllegalArgumentException var9) {ifModifiedSince = -1L;}if (ifModifiedSince < lastModified / 1000L * 1000L) {this.maybeSetLastModified(resp, lastModified);this.doGet(req, resp);} else {resp.setStatus(304);}}} else if (method.equals("HEAD")) {lastModified = this.getLastModified(req);this.maybeSetLastModified(resp, lastModified);this.doHead(req, resp);} else if (method.equals("POST")) {this.doPost(req, resp);} else if (method.equals("PUT")) {this.doPut(req, resp);} else if (method.equals("DELETE")) {this.doDelete(req, resp);} else if (method.equals("OPTIONS")) {this.doOptions(req, resp);} else if (method.equals("TRACE")) {this.doTrace(req, resp);} else {String errMsg = lStrings.getString("http.method_not_implemented");Object[] errArgs = new Object[]{method};errMsg = MessageFormat.format(errMsg, errArgs);resp.sendError(501, errMsg);}}
我们知道Servlet类中service方法是当我们访问Servlet类 会调用该方法,也就是前端请求后,后端处理请求业务的,就交给service方法来执行。就像上一篇博客【学习Servlet(Servlet实现方式2)】中我们需要重写service方法一样。
大家是否有这个疑问
现在我们service方法,在源码中也帮我们实现了,那我们应该做什么呢?
答案:实现 doGet ()方法和doPost()方法
原因:service ()方法确实是处理前端请求的 方法但 我们有注意到service ()方法的内部依旧有调用其他方法如 doGet ()方法和doPost()方法。因此 大的框架Service 已经帮我们处理好了,我们处理细节处。去重写这个两个方法
在IDEA 中我创建了LoginServlet 继承HttpServlet类
代码如下
package fs;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;public class CServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// super.doGet(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//super.doPost(req, resp);} }
实例
我现在写一个简单的表单的前端代码使用 继承HttpServlet 的方式创建Servlet 来做一个简单的交互
前端代码如下
我们知道:
- action 属性 是我们访问Servlet的地址
- method 属性 是选择请求的方式。 常见的请求方式有 :get /post
注意:默认是get
并且我还做了一点小改动:把之前默认首页为index.html 变为我现在创建的login .html界面
操作如下
打开编辑配置,修改url
那我们如何访问到我们创建的Servlet呢?还是像之前一样在xml配置文件中添加用来访问的url
如图所示
<!-- CServlet--><servlet><servlet-name>CServlet</servlet-name><servlet-class>fs.CServlet</servlet-class></servlet><servlet-mapping><servlet-name>CServlet</servlet-name><url-pattern>/c</url-pattern></servlet-mapping>
虽然这样也可以,但我们在后期是不在xml 配置文件中这样写了,采用注解的方式更加方便
如下图所示:
// 这个参数表示当我们在浏览器访问时,可以找到这个参数关联的Servlet中 // 如果这个参数只有一个 ,value 是可以省略的 //@WebServlet(value="/login") @WebServlet("/login")
// 这个参数表示当我们在浏览器访问时,可以找到这个参数关联的Servlet中
最根本的原因:url 和Servlet 存在映射关系像key-value 键值对一样。
// 如果这个参数只有一个 ,value 是可以省略的
//@WebServlet(value="/login")查看注解源码发现
由于我写的表单是默认使用get请求方式提交的
因此我们需要在doGet()方法中,写我们的逻辑代码
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // super.doGet(req, resp);String username = req.getParameter("username");String password = req.getParameter("password");if ("admin".equals(username)&&"123".equals(password)){System.out.println("登录成功");}else {System.out.println("登录失败");}}
启动服务器,访问LoginServlet
我现在输入正确答案