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,一经查实,立即删除!

相关文章

java ldap 分页_具有从属引用的 LDAP 分页查询未正确处理

具有从属引用的 LDAP 分页查询未正确处理09/14/2020本文内容本文提供了一些方法来避免使用从属引用的 LDAP 分页查询未正确处理的问题。原始产品版本&#xff1a; Windows 8原始 KB 编号&#xff1a; 2561166症状你有一个应用程序&#xff0c;使用 ldap_search_ext 或 ldap…

js分家效应

&#xff08;原创文章&#xff0c;转载请注明出处&#xff09; 有继承&#xff0c;那么就有分家。让我们看以下例子。 var parents function(){}parents.prototype.money 200;var children function(){}children.prototype new parents();var parent new parents();var ch…

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

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

java sql objects_第十五章-简书.sql

-- ## 练习1-- 1. 创建一个视图&#xff0c;通过该视图可以查询到工资在2000-5000内并且姓名中包含有A的员工编号&#xff0c;姓名&#xff0c;工资。create or replace view viewSal2k_5kas select empno,ename,sal from empwhere sal between 2000 and 5000and ename like %A…

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

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

java 星期顺序_第8周 【项目3-顺序串算法】

/**Copyright (c)2017,烟台大学计算机与控制工程学院*All rights reservrd.*作者&#xff1a;李欣豪*完成时间&#xff1a;2017年12月14日*版本号&#xff1a;v1.0*问题描述&#xff1a;采用顺序存储方式存储串&#xff0c;实现下列算法并测试&#xff1a;(1)试编写算法实现将…

[ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify uniq

angularjs 使用ng-repeat报错 <div ng-init"words [高校,高校,高校]" ng-repeat"word in words">{{word}} </div> [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use track by expression to specify unique keys 发现是因为相…

java 并列排名,178. 分数排名

题目描述编写一个 SQL 查询来实现分数排名。如果两个分数相同&#xff0c;则两个分数排名(Rank)相同。请注意&#xff0c;平分后的下一个名次应该是下一个连续的整数值。换句话说&#xff0c;名次之间不应该有“间隔”。-----------| Id | Score |-----------| 1 | 3.50 || 2 |…

编写高质量代码改善C#程序的157个建议——建议130:以复数命名枚举类型,以单数命名枚举元素...

建议130&#xff1a;以复数命名枚举类型&#xff0c;以单数命名枚举元素 枚举类型应该具有负数形式&#xff0c;它表达的是将一组相关元素组合起来的语义。比如&#xff1a; enum Week{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday} 在这里&#xff0c;Week对于星…

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

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

OpenStack Weekly Rank 2015.08.24

Module  Reviews  Drafted Blueprints  Completed Blueprints  Filed Bugs  Resolved Bugs Cinder  5      1          1            6       13 Swift   10     N/A         N/A           8   …

php如何判断是否新数据类型,php中如何判断变量的数据类型呢?

摘要:下文讲述PHP中判断变量数据类型的方法分享&#xff0c;如下所示&#xff1b;实现思路:方式1&#xff1a;使用gettype函数返回变量的数据类型gettype函数可返回"boolean”、“integer”、“double”(float类型会返回“double”&#xff0c;而非“float”)、“string”…

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() 函数定…

企业生产环境下不同业务的linux分区建议

常规分区方案&#xff1a; /boot: 100M swap:内存的1至1.5倍 / : 剩余硬盘大小 DB及存储&#xff1a;有大量重要的数据 /boot : 100M swap: 内存的1至1.5倍&#xff0c;如果内存大于等于16G&#xff0c;分为8G至16G / &#xff1a;50-200G /data&#xff1a; 硬盘剩余所有大小…

python爬虫ip限制_简单爬虫,突破IP访问限制和复杂验证码,小总结

简单爬虫&#xff0c;突破复杂验证码和IP访问限制好吧&#xff0c;看题目就知道我是要写一个爬虫&#xff0c;这个爬虫的目标网站有一些反爬取意识&#xff0c;所以就有了本文了。我先说说场景吧&#xff1a;由于工作需要&#xff0c;平时有一大堆数据需要在网上查询&#xff0…

php使用双引号,PHP编程双引号怎么使用

PHP编程双引号怎么使用PHP用单引号代替双引号来包含字符串&#xff0c;这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量&#xff0c;单引号则 不会&#xff0c;注意&#xff1a;只有echo能这么做&#xff0c;它是一种可以把多个字符串当作参数的“函数”(译注&…

IOS UITextView自适应高度

LOFTER app需要实现了一个类似iPhone短信输入框的功能&#xff0c;它的功能其实蛮简单&#xff0c;就是&#xff1a;【UITextView的高度随着内容高度的变化而变化】。实现思路应该是&#xff1a; 在UITextView的textChanged事件响应代码里计算输入内容的高度&#xff0c;然后如…

python获取mac窗口程序内容_在Mac OS X中获取当前活动窗口/文档的标题

在Objective-C&#xff0c;简单的答案&#xff0c;用少量可可和大多Carbon Accessibility API是&#xff1a;// Get the process ID of the frontmost application.NSRunningApplication* app [[NSWorkspace sharedWorkspace]frontmostApplication];pid_t pid [app processId…

php实战搭建博客,yii2项目实战-博客管理平台的搭建

作者&#xff1a;白狼 出处&#xff1a;http://www.manks.top/document/yii2-blog-manage.html 本文版权归作者&#xff0c;欢迎转载&#xff0c;但未经作者同意必须保留此段声明&#xff0c;且在文章页面明显位置给出原文连接&#xff0c;否则保留追究法律责任的权利。相信看了…