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

Servlet是什么:

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

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

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

Servlet的作用:

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

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

  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

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,出现的地方都是传递的引用:


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>

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

  1. servlet 返回可访问文件_Servlet第二篇「Servlet细节、ServletConfig、ServletContext」

    Servlet的调用图 前面我们已经学过了Servlet的生命周期了,我们根据Servlet的生命周期画出Servlet的调用图加深理解 Servlet的细节 一个已经注册的Servlet可以被多次映 ...

  2. servlet 返回可访问文件_Windows 10 可直接访问 Linux 文件

    Windows.Linux虽然看似两套对立的系统,但也一直在努力尝试互通,比如微软这边,Windows 10此前就增加了WSL Linux子系统,接下来还会持续改进.升级. 从Windows 10 v ...

  3. C#操作FTP报错,远程服务器返回错误:(550)文件不可用(例如,未找到文件,无法访问文件)的解决方法

    C#操作FTP报错,远程服务器返回错误:(550)文件不可用(例如,未找到文件,无法访问文件)的解决方法 参考文章: (1)C#操作FTP报错,远程服务器返回错误:(550)文件不可用(例如,未找到文 ...

  4. Python技术手册 · 函数的多返回值&文件操作

    目录 ​函数的多返回值&文件操作 ​函数的多返回值 ​多返回值返回方式 ​函数的传参方式(以不同的使用方式分类) 位置参数 关键字参数 缺省参数 不定长参数 ​匿名函数(lambda) ​函数 ...

  5. Servlet学习DAY_02:重定向/ 文件上传/ Cookie和Session/ 导入一个工程 / 配置欢迎页面 / 同步请求和异步请求/JSON和AJax介绍 /过滤器

    重定向 重定向是服务器告诉客户端往指定的路径再次发出请求的指令 执行过程: 当服务器执行重定向方法时会给客户端返回302状态码和一个请求路径,浏览器接收到302后会立即往指定的路径再次发出请求 res ...

  6. Web页面或app等前端页面之Java Web的JSP、Servlet、Cookie、Session等技术小结

    Java Web学习,掌握JSP.Servlet.Cookie.Session等内容,使用JSTL进行数据展示完成实际应用. 2.3.1 XML基础 XML的用途.语法规则.语义约束.如何解析XML, ...

  7. servlet返回数据_JavaEE の Servlet - Http/Servlet - Day14 - 190507

    { 一.Http.二.Servlet } Day01 - 190507 一.Http 二.Servlet 三.Tomcat 四.web.xml 五.HttpServletRequest.HttpSer ...

  8. 第十六章--访问文件

    本章所涵盖的主题即应用于磁盘文件系统的普通文件,也应用于块设备文件:将这两种文件系统都简单地统称为"文件".         访问文件的模式有多种.我们在本章考虑如下几种情况:   ...

  9. Java笔记(十二) 文件基础技术

    文件基础技术 一.文件概述 一)基本概念 1.文件的分类: 1)文本文件:文件中每个二进制字节都是某个可打印字符的一部分.如.java文件 2)二进制文件:文件中每个二进制字节不一定用来表示字符,也可 ...

最新文章

  1. ceph-deploy rpm包的制作
  2. 被忽视的Web安全漏洞:如何识别和解决?
  3. 计算机考研:计算机组成原理考点分析
  4. python爬虫多进程_Python爬虫技术--基础篇--多进程
  5. 20140418--第1讲.开山篇
  6. [Bzoj2049][Sdoi2008]Cave 洞穴勘测
  7. ASP.NET的路由系统
  8. 人工智能领域的新秀——Get智能写作
  9. HTTP代理怎样使用
  10. figtree需要在JAVA下运行吗,科学网—Inno setup 制作安装文件以编译FigTree为例 - 张金龙的博文...
  11. 软件设计学习笔记1_架构
  12. 3999 元起,小米 13 正式发布:骁龙 8 Gen 2、IP68、超窄边框直屏、徕卡三摄
  13. OpenStack Blazar 架构解析与功能实践
  14. 基恩士CSV点云文件转PCD文件 PYTHON版
  15. 股票公式成功率测试软件,超牛指标,成功率95%(同花顺公式 副图 源码 测试图)...
  16. matplotlib之pyplot教程
  17. 记一次注销联通卡的吐血经历
  18. Unity-URP学习笔记(四)赛璐珞高光
  19. java复制文件的4种方式及拷贝文件到另一个目录下与删除单个文件和删除整个文件夹
  20. CLRS[1]:general concept

热门文章

  1. C语言进阶深度学习目录表
  2. 【Git、GitHub、GitLab】四 Git文件重命名的简单方法以及使用git log查看版本演变历史
  3. 【OS学习笔记】三十五 保护模式十:中断描述符表、中断门和陷阱门
  4. 【OS学习笔记】十八 保护模式五:保户模式下如何进行内存保护 与 别名段的意义与作用 对应汇编代码
  5. ltp makefile 解析
  6. JavaSE--类加载器
  7. php运行出现Call to undefined function curl_init()解决方法
  8. Spring的常见问题及答案
  9. pip: The ultimate package manager for Python
  10. debian添加删除用户