servlet 返回可访问文件_JavaWeb技术(4):Servlet的理解(上)

6130245e894510bff3405b5e1f751b83.png

我们在开发中无时无刻都在与Servlet进行接触,只是因为框架的封装性,我们很少直接地去操作servlet,但再怎么封装,基本的思路都不会变化,变得只是实现的方式,

Servlet是什么:

网上的回答基本是Servlet是Java类,用于处理业务逻辑,

详细一点说Servlet确实是Java类,他是在Tomcat包中的,我们知道Tomcat是服务器,他为我们封装Request和Response,我们只需要实现Servlet接口就可以拿到封装好的Request和Response对象,是不是很方便呢,那么Servlet起到的作用就是在拿到封装好的Request后进行业务逻辑处理,然后返回Response,Servlet的整个生命周期由Tomcat控制,

因此,通过这个就能很好的实现开发业务逻辑与Http封装的解藕,开发也会更加高效,

Servlet的作用:

我们可以通过顶层接口来分析Servlet的作用:

54a68a6b5f36be95d31e204ff417c8fd.png

这几个方法都是由容器去调用,我们自己去调用是无效的,

  1. init,这个接受一个容器帮我们封装好的ServletConfig,然后保存到本地
  2. getServletConfig返回先前保存到本地的ServletConfig
  3. getServletInfo返回一些version或者author等信息
  4. service接受请求对象,用作开发人员业务处理,完毕后返回响应对象
  5. destroy,容器销毁servlet

我们去来到源码中的GenericServlet,看看他是怎样为我们去实现的:

public abstract class GenericServlet implements Servlet, ServletConfig{private transient ServletConfig config;@Overridepublic void init(ServletConfig config) throws ServletException {this.config = config;this.init();}@Overridepublic String getInitParameter(String name) {return getServletConfig().getInitParameter(name);}@Overridepublic abstract void service(ServletRequest req, ServletResponse res)throws ServletException, IOException;@Overridepublic ServletConfig getServletConfig() {return config;}
}

这里截取了部分方法实现,可以看到,使用了模板方法模式,

反正我手长:模板方法模式​zhuanlan.zhihu.com
20f9dd5371c5c7d6e5b521d6fa1c282f.png

GenericServlet是abstract类,你可以很经常地在abstract类中看见这种设计,

另外还有一个HttpServlet,

它的注释让我们不要去实现service方法,因为他已经为我们封装了请求分发的逻辑,比如判断一个请求是get还是post,然后分发到具体的方法上去,

        if (method.equals(METHOD_GET)) {doGet(req, resp);} else if (method.equals(METHOD_HEAD)) {doHead(req, resp);} else if (method.equals(METHOD_POST)) {doPost(req, resp);} else if (method.equals(METHOD_PUT)) {doPut(req, resp);} else if (method.equals(METHOD_DELETE)) {doDelete(req, resp);} else if (method.equals(METHOD_OPTIONS)) {doOptions(req,resp);} else if (method.equals(METHOD_TRACE)) {doTrace(req,resp);} else {//// Note that this means NO servlet supports whatever// method was requested, anywhere on this server.//String errMsg = lStrings.getString("http.method_not_implemented");Object[] errArgs = new Object[1];errArgs[0] = method;errMsg = MessageFormat.format(errMsg, errArgs);resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);}

我们需要实现的是doGet、doPost这些方法,在里面写我们的业务逻辑,这里又有模板方法模式的身影


Servlet有两个息息相关的类,

ServletContext和ServletConfig,

对应JSP中九大作用域中的application和config对象,本质是用于做数据分享,

ServletContext:

Web应用有且仅有一个ServleContext,在应用起动的时候会被创建,他可以实现应用内的数据共享,

但是仅限单机版的应用程序,因为他仅仅是保存在一个JVM创建的上下文中,如果是分布式的,那建议使用数据库、session或者其他组件来代替

ServletConfig:

/*** A servlet configuration object used by a servlet container to pass* information to a servlet during initialization.*/

用于容器向Servlet传递信息,

在ServletConfig和ServletContext都有getInitParameter方法, 这两个方法的都能从web.xml中获取参数,但是是有区别的。

可以在xml中配置,

<!-- 通过ServletContext#getInitParameter获取 -->    
<context-param><param-name>test</param-name><param-value>ServletContext</param-value></context-param><servlet><servlet-name>testServletConfig</servlet-name><servlet-class>com.web.test.TestServletConfig</servlet-class><!-- 通过ServletConfig#getInitParameter获取 -->    <init-param><param-name>testServletConfig</param-name><param-value>getFromServletConfig</param-value></init-param><init-param><param-name>encode</param-name><param-value>utf-8</param-value></init-param></servlet>

如何获得ServletContext和ServletConfig:

ServletConfig:可以通过Servlet#getServletConfig获取,该方法就在Servlet中,Servlet是在ServletContext初始化之后才初始化(Servlet可以在Web应用启动或者发送请求的时候初始化,这要看load-on-startup的配置,当这个值>=0(相反为不配置或者<0)时,Web应用启动的时候就会初始化),Servlet初始化之后你才能获得ServletConfig。

ServletContext:在web.xml中读取到<context-param>的时候就会创建ServletContext,然后将<context-param>中的值(配置文件的地址)塞到ServletContext中,

所以理论上来说,这一步之后,Web容器中的内容都能获取ServletContext了,就看源码设计者觉得哪个地方需要就提供一个方法,然后Tomcat启动的时候会负责调用方法或者注入ServletContext等一系列操作:

  1. 实现WebApplicationInitializer接口
  2. 注册监听器,实现ServletContextListener
  3. ServletConfig#getServletContext
  4. ServletRequest#getServletContext
  5. HttpSession#getServletContext

侧面也表现了ServletContext和ServletConfig的作用范围,

还有一个有意思的点,你只要是在能获取到ServletContext的地方,你就可以通过ServletContext#setAttribute来设置值,这个操作对整个Web应用都可见,不需要返回ServletContext,因为我前面说过Web应用有且仅有一个ServleContext,出现的地方都是传递的引用:

d47b908548aac9a1fab92a15a0be1fd9.png

917c0b1928b81d516a9efff014b4c61f.png

JavaWeb项目中有一个WEB-INF的文件夹,可以放置一些不能被客户端直接访问的数据,但不能被客户端访问并不代表不能被访问,实际上可以通过Servlet映射或则重定向来访问,

RequestDispatcher rd = request.getRequestDispatcher("./WEB-INF/view/a.jsp");
rd.forward(request, response);<servlet><servlet-name>Customer</servlet-name><jsp-file>/WEB-INF/customer.jsp</jsp-file>
</servlet>
<servlet-mapping><servlet-name>Customer</servlet-name><url-pattern>/User</url-pattern>
</servlet-mapping>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何设置打印的时候不加上页面链接_excel表格的这10个打印小技巧,办公室财务人员记得收藏...

打印工作表是日常工作中最常见的一个工作&#xff0c;也是Excel在工作中最常用的一个地方&#xff0c;如何做到快速准确地打印文件呢。今天文理会计小编给大家从网上整理了几个打印文件的小技巧。1、打印标题打印的工作表的数据有好多页的时候&#xff0c;为了查看方便&#xf…

rabbitmq 拉取消息太慢_面试官:消息队列这些我都要问

作者&#xff1a;mousycodersegmentfault.com/a/1190000021054802消息队列连环炮项目里怎么样使用 MQ 的&#xff1f;为什么要使用消息队列&#xff1f;消息队列有什么优点和缺点&#xff1f;kafka,activemq,rabbitmq,rocketmq 都有什么去呗&#xff1f;如何保证消息队列高可用…

python 定义变量_第三章(第2节):变量和常量

变量的概念基本上和初中代数的方程变量是一致的&#xff0c;只是在计算机程序中&#xff0c;变量不仅可以是数字&#xff0c;还可以是任意数据类型&#xff0c;比如我们上节课刚刚学过的基本数据类型或者我们后面要学的自定义数据类型。所谓常量就是不能改变的变量&#xff0c;…

pytorch卷积神经网络_资源|卷积神经网络迁移学习pytorch实战推荐

点击上方“AI遇见机器学习”&#xff0c;选择“星标”公众号重磅干货&#xff0c;第一时间送达一、资源简介这次给大家推荐一篇关于卷积神经网络迁移学习的实战资料&#xff0c;卷积神经网络迁移学习简单的讲就是将一个在数据集上训练好的卷积神经网络模型通过简单的调整快速移…

php 删除服务器上的文件,php如何删除服务器文件

在php中可以使用“ftp_delete”函数删除服务器文件&#xff0c;其语法是“ftp_delete(ftp_connection,file)”&#xff0c;参数“ftp_connection”表示要使用的FTP连接&#xff0c;参数“file”表示要删除的文件的路径。推荐&#xff1a;《PHP视频教程》PHP ftp_delete() 函数定…

java class load 类加载

1:what is it jvm把描述类的数据从class字节码文件加载到内存&#xff0c;并对数据进行校验、解析、初始化&#xff0c;最终成为jvm直接使用的数据类型 1、ClassNotFoundExcetpion   我们在开发中&#xff0c;经常可以遇见java.lang.ClassNotFoundExcetpion这个异常&#xf…

debian执行php网页,如何在Debian上安装和使用PHP Composer

php composer是一个包管理工具&#xff0c;它消除了手动维护应用程序的PHP包的麻烦&#xff0c;可以使用composer轻松安装所有必需的包。本篇文章将介绍在Debian系统上安装和配置PHP Composer的方法。1、条件shell使用sudo权限访问正在运行的debian系统。必须安装和配置5.3或更…

JAVA_if或者怎么用,Java If语句

Java教程 - Java If语句Java if语句用于根据条件执行一个代码块。Java If语句下面是Java if语句的最简单形式:if(condition)statement;condition是一个布尔表达式。如果condition是true那么执行语句。如果condition是false&#xff0c;那么绕过语句。以下代码根据an的值输出消息…

iOS开发——高级技术本地化与国际化详解

本地化与国际化详解效果如下&#xff1a;英语&#xff1a; 中文&#xff1a; 具体实现如下&#xff1a;一。先做准备&#xff1a;设置程序本地化在xcode点击程序图标…

Matlab经纬度坐标转换xy坐标,经纬度坐标系转换为UTM坐标系(matlab)

如题所说&#xff0c;直接上程序。验证自己做一下&#xff0c;结果应该是对的。诚不我欺。(注意&#xff1a;程序名与函数名保持一致&#xff01;&#xff01;&#xff01;)function[shuchu]lat_lon2utm(lat_shuru,lon_shuru)%地理经纬度坐标转换为UTM坐标size_shuzusize(lat_s…

matlab空间曲面拟合,matlab如何进行曲面拟合

matlab如何进行曲面拟合以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;在一丘陵地带测量高程&#xff0c;x和 y方向每隔100米测一个点&#xff0c;得高程如下表&#xff0c;试插值一曲面&am…

treegrid.bootstrap使用说明

treegrid.bootstrap使用说明 这个插件是用来做有层次的表格的&#xff0c;大概如图&#xff1a; 官网 http://maxazan.github.io/jquery-treegrid/ 使用这个控件之前需要引入以下css及js&#xff08;因为用到了 bootstrap.js 所以加上了 bootstrap的样式和脚本&#xff09; bo…

matlab 条形图横坐标,Matlab条形图bar横坐标间距设置

1. 默认横坐标数据 X[x1, x2, x3, x4, x5, x6] %一行六列bar(X); %绘制基础条形图2. 修改横坐标标签#考虑横坐标标签文本较长且字体较大的情况bar(X);set(gca, xticklabels,{Apple, Orange, Banana, Pear, Pitaya, Lemon}, Fontname, Times New Roman, Fontsize, 16); %修…

stm32 485和232可以用同一个串口吗_STM32的复用时钟何时开启?

STM32的AFIO时钟真的是在开启引脚复用功能的时候开启吗&#xff1f;其实并不是~什么是复用&#xff1f;我们知道&#xff0c;STM32有很多外设&#xff0c;这些外设的外部引脚都是与GPIO共用的。我们可以通过软件来配置引脚作为GPIO引脚还是作为外设引脚。当引脚配置为外设引脚时…

php 简析对象,PHP白盒审计工具RIPS源码简析

RIPS是一款对PHP源码进行风险扫描的工具&#xff0c;其对代码扫描的方式是常规的正则匹配&#xff0c;确定sink点&#xff1b;还是如flowdroid构建全局数据流图&#xff0c;并分析存储全局数据可达路径&#xff1b;下面就从其源码上略探一二。1、扫描流程分析其源码前&#xff…

左右伸缩_冬季装修为啥要留伸缩缝?等到天热地板开裂就晚了!合肥人注意下...

后台有粉丝问&#xff1a;冬天真的不适合做装修吗&#xff1f;假的&#xff0c;这句话不要再传了。每个季节都会有利有弊&#xff0c;只不过冬季施工过程中干燥的比较快&#xff0c;装修的时候对施工要求的更严格。就拿伸缩缝来说吧&#xff0c;冬天装修时不注意&#xff0c;等…

红色警戒2修改器原理百科(七)

&#xff08;十五&#xff09;科技全开——前方高能&#xff0c;BOOM 其实这一小节&#xff0c;最晚应该在第四篇的十小节来讲述的&#xff0c;这样是按照一条线索来讲的&#xff0c;容易理解和把握笔者修改时的思路&#xff0c;以一点逐渐扩大。由于笔者的一些原因&#xff08…

wpf click事件在触摸屏上点击第一次没反应_你的PLC和你的触摸屏为什么总是通讯不上?...

三菱PLC全系列资料免费送啦&#xff01;想要撩我(点击上方红字&#xff0c;免费领资料)很多师傅有以下这些问题&#xff0c;其实除去厂家自行定义的通讯方式外&#xff0c;我们在做项目的时候最常用的通讯方式&#xff0c;通讯不上无非就是这几个原因是否选择正确通讯协议(modb…

ubuntu 开放端口_Masscan端口扫描工具使用小手册

1Masscan介绍1.1 Masscan简介1) nmap是端口扫描仪的合法王位&#xff0c;而今天仍然是最通用的选择。但对于纯粹的速度也有一些已经超越了它&#xff0c;包括scanrand&#xff0c;unicornscan&#xff0c;zmap&#xff0c;和现在的masscan(https://github.com/robertdavidgraha…

hdu4277 暴力

hdu4277 暴力 USACO ORZ Time Limit : 5000/1500ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 4 Accepted Submission(s) : 2 Problem DescriptionLike everyone, cows enjoy variety. Their current fancy is new shapes for pastu…