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

Servlet-体系结构

一、思考

读者阅读完上一篇关于Servlet基本概念的文章后,我们知道每次实现一个Servlet,都需要覆盖五个接口,我们对除service接口外的其它四个接口,我们通常不会做什么处理。那么,这种实现方式是否有些繁琐呢?于是,为了简化Servlet的开发,我们通常不会直接实现Servlet接口,而是继承其子类。下面我们将首先尝试实现Servlet接口来完成一个更真实的Servlet类,再介绍Servlet的体系结构,以及更简单化创建一个Servlet类的方法。

二、尝试通过实现Servlet接口

为了实现一个有意义的Servlet,我们当然会在service方法中获取相应的参数,并根据参数做出对应的处理,再装处理的结果响应给客户端。

@WebServlet("/hello")
public class ServletDemo implements Servlet {@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;String method = httpServletRequest.getMethod();if ("GET".equals(method)) {System.out.println("get method...");// GET方法获取参数,并进行相应处理doGet(servletRequest, servletResponse);} else if ("POST".equals(method)) {System.out.println("post method...");// POST方法获取参数,并进行相应处理doPost(servletRequest, servletResponse);}System.out.println("hello servlet!");}

如以上代码所示:GET与POST方法获取参数的方式是不一样的,因此一个Servlet被请求时肯定需要判断请求的方式,Servlet再对其做相应的处理。

当我们编写一个新的Servlet类时,也需要重复这里的if/else if判断。因此我们自然会想到将这部分逻辑进行封装,于是我们创建一个抽象类MyServlet,将来所有的Servlet只需要继承这个抽象类并重写doGet与doPost方法即可:

package com.byhuang;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;public abstract class MyServlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;String method = httpServletRequest.getMethod();if ("GET".equals(method)) {System.out.println("get method...");// GET方法获取参数,并进行相应处理doGet(servletRequest, servletResponse);} else if ("POST".equals(method)) {System.out.println("post method...");// POST方法获取参数,并进行相应处理doPost(servletRequest, servletResponse);}System.out.println("hello servlet!");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}protected void doGet(ServletRequest servletRequest, ServletResponse servletResponse) {// do something}protected void doPost(ServletRequest servletRequest, ServletResponse servletResponse) {// do something}}

子类Servlet:

package com.byhuang;import javax.servlet.*;
import javax.servlet.annotation.WebServlet;@WebServlet("/hello")
public class ServletDemo extends MyServlet {@Overrideprotected void doGet(ServletRequest servletRequest, ServletResponse servletResponse) {super.doGet(servletRequest, servletResponse);}@Overrideprotected void doPost(ServletRequest servletRequest, ServletResponse servletResponse) {super.doPost(servletRequest, servletResponse);}
}
三、HttpServlet抽象类

当然Java官方已经考虑到了这个问题,推出了HttpServlet抽象类,而这个类的内部实现逻辑与我们自己定义的MyServlet逻辑是相同的。

四、总结

因此,我们后续需要创建Servlet时,只需继承HttpServlet抽象类,重写doGet与doPost方法即可。Servlet的体系结构我们也已然清晰:(可在一个Servlet实现类右键后点击Diagrams选项展示)

相关文章:

  • 开关电源PFC电路原理详解及matlab仿真
  • 聊聊 Java 集合框架中的 ArrayList
  • 全新加密叙事,以Solmash为代表的 LaunchPad 平台如何为用户赋能?
  • uniapp 打包成 apk(原生APP-云打包)免费
  • 软件测试|Python数据可视化神器——pyecharts教程(九)
  • 确保CentOS系统中的静态HTTP服务器的数据安全
  • 深入了解Java多线程编程:JVM内存模型与同步机制
  • Linux学习记录——사십이 高级IO(3)--- Poll型服务器
  • allegro PCB设计心得笔记(二) PCB板框设计心得
  • 【Golang】IEEE754标准二进制字符串转为浮点类型
  • JsonPath
  • RPA财务机器人在厦门市海沧医院财务管理流程优化汇总的应用RPA全球生态 2024-01-05 17:27 发表于河北
  • 三国杀移动版武将台词大全-神
  • three.js 关键帧动画
  • GSTAE
  • [deviceone开发]-do_Webview的基本示例
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • AWS实战 - 利用IAM对S3做访问控制
  • css布局,左右固定中间自适应实现
  • egg(89)--egg之redis的发布和订阅
  • Javascript 原型链
  • PHP变量
  • Rancher-k8s加速安装文档
  • React Native移动开发实战-3-实现页面间的数据传递
  • socket.io+express实现聊天室的思考(三)
  • SQLServer插入数据
  • yii2中session跨域名的问题
  • 基于axios的vue插件,让http请求更简单
  • 爬虫模拟登陆 SegmentFault
  • 如何实现 font-size 的响应式
  • 我建了一个叫Hello World的项目
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 阿里云API、SDK和CLI应用实践方案
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​ubuntu下安装kvm虚拟机
  • ​力扣解法汇总946-验证栈序列
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #ifdef 的技巧用法
  • #include<初见C语言之指针(5)>
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (12)Hive调优——count distinct去重优化
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (十三)Flask之特殊装饰器详解
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (转载)OpenStack Hacker养成指南
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .Net 访问电子邮箱-LumiSoft.Net,好用