当前位置: 首页 > article >正文

学习Servlet(Servlet实现方式3)

目录

前言

继承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 {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       // super.doGet(req, resp);
    }

    @Override
    protected 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()方法中,写我们的逻辑代码

   @Override
    protected 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 

我现在输入正确答案


http://www.kler.cn/a/408664.html

相关文章:

  • Knife4j快速入门
  • 【redis】哈希类型详解
  • 【pip install报SSL类错误】
  • 【Anaconda】Pycharm如何配置conda虚拟环境
  • 深入理解 JVM 中的 G1 垃圾收集器原理、算法、过程和参数配置
  • YOLOv11融合[ECCV 2018]RCAN中的RCAB模块及相关改进思路
  • _computed _destinations() 为什么模板不写()
  • 渗透测试---shell(6)if条件判断与for循环结构
  • Vue小项目(开发一个购物车)
  • realme gt neo6官方刷机包 全量升级包下载
  • jar包解压和重新打包
  • 微信小程序 表单验证(async-validator)
  • 基于Gradle搭建Spring6.2.x版本源码阅读环境
  • Alluxio在小红书的实践:加速云端机器学习
  • HarmonyOS Next 浅谈 发布-订阅模式
  • 【热门主题】000062 云原生后端:开启高效开发新时代
  • IDEA运行程序》java: 程序包XX不存在
  • shell编程之awk
  • MySQL:IF()函数根据指定条件返回不同的值
  • 【ubuntu+win】Win10+Ubuntu22.04双系统给ubuntu系统中的某个分区进行扩容(从400G->800G)数据无损坏