转载

servlet简介

servlet是动态网页的一种技术,用java语言实现。在tomcat中,servlet的创建是有tomcat实现。

Servlet对象介绍:

servlet接口中有5个函数:

  1. void init(ServletConfig config):系统的初始化,在浏览器第一次访问servlet对象的时候有tomcat的容器管理器创建。创建以后就初始化Servlet对象,配置参数信息与初始化。ServletConfig对象是管理器给的。
  2. ServletConfig getServletConfig():调用配置信息,这个一般是service函数中调用。
  3. void service(ServletRequest req, ServletResponse res):处理请求,每次网页有请求的时候就调用一次这个函数,注意每一个网页请求是不同的线程,servlet对象是线程不安全的
  4. String getServletInfo():serlvet的配置信息,这个对servlet对象的描述,相当于toString()函数。
  5. void destroy():管理器调用的函数,收回内存。

其他信息:init、service、destroy是生命周期函数。init destroy是调用一次。而service是调用多次。

servlet的路径配置

servlet其实就是应用中的一个小程序,一个应用部署中可以由多个servlet。根据url的应用信息可以找到对应的web应用。servlet的路径需要在web的文件中进行指定。多个url可以指定一个name。或者使用通配符。

url路径匹配:

  • 路径匹配: /abc/*
  • 后缀匹配: *.do
  • 匹配所有: /*
  • *不能放到中间。
<servlet>
    <name></name>
    <servlet-class></servlet-class>
</servlet>
<servlet-mapping>
    <name></name>
    <url-pattern></url-pattern>
</servlet-mapping>


复制代码

*********注意servlet的url路径前要有/表示相对地址。如果没有/部署会报错。

servletConfig类

主要实现是管理容器传给servlet一些信息。初始化参数与servletContext,serverlet标签在配置文件中的写法如下图:name是唯一标识,class代表真是的servlet类。里面包含一些initparameter配置信息。

servlet简介

servletConfig函数

  1. String getServletName() servlet标签的名字。
  2. ServletContext getServletContext():servlet的环境信息,这个很重要包含应用的私有信息与公共信息。下一章节介绍。
  3. String getInitParameter(String name):初始化参数的name得到值。
  4. Enumeration getInitParameterNames():得到初始化参数name迭代器。

genericservlet类

继承了servlet与configservlet接口。并且实现log的方法,这个方法主要方便我们编写servlet接口的函数。

httpservlelt类

基于http协议继承了servlet类。将service()函数分散到http中的各种方法中 相关函数介绍:

  • HttpServlet()构造函数,donothing。一般通过反射调用类,构造函数都是无参的。
  • protected void doGet(HttpServletRequest req, HttpServletResponse resp)针对http的get方法,servlet的处理过程,一般get方法都是相对安全的,每次请求是相同的。
  • protected long getLastModified(HttpServletRequest req)这个函数是get函数调用,在http使用缓存的时候,请求报文中有if-Modified-Since,servlet对比这个时间,如果cookie的是新的,就返回304方法。
  • protected void doHead(HttpServletRequest req, HttpServletResponse resp)head请求方法是服务器只返回包的头部。这个是针对head请求报文的处理
  • protected void doPost(HttpServletRequest req, HttpServletResponse resp)针对http中post报文的处理方法,会修改服务信息的内容,一般是不安全的。
  • protected void doPut(HttpServletRequest req,HttpServletResponse resp)http中上传文件报文,处理对应的方法
  • protected void doDelete(HttpServletRequest req,HttpServletResponse resp)删除文件的方法
  • protected void doOptions(HttpServletRequest req,HttpServletResponse resp)查询服务器支持的方法,一般不用覆盖
  • protected void doTrace(HttpServletRequest req, HttpServletResponse resp)原样返回收到内容。用于调试。一般不用覆盖
  • protected void service(HttpServletRequest req, HttpServletResponse resp)http的协议处理service函数,把功能分给以上的doXXX函数;这个函数是被下面的函数调用。不可以覆盖
  • public void service(ServletRequest req, ServletResponse res)调用上面的service函数,不可以覆盖

ServletContext

简介

servletContext对应一个应用,包含一个servlet容器的相关信息。这个类是很重要的,也称为一个数据域(一个应用的servlet可以相互传递信息)

函数介绍

  1. String getContextPath()返回uri中的应用地址,以/开头。如果是默认根context,返回一个空字符串。注意这个方法可能与HttpServletRequest.getContextPath()返回的不同,但context对应几个不同的context path的时候。后面再分析HttpServletRequest的函数。
System.out.println(context1.getContextPath());//  return  /web3  。uri对象的应用地址
复制代码
  1. ServletContext getContext(String uripath):通过context path地址返回相应的context对象。这个函数基本没有什么用处,如果一个servlet调用其他servlet的相对路径,会返回null。
ServletContext  context2=context1.getContext("/web2");
       System.out.println(context2.getContextPath());//抛出异常,null指针
        ServletContext  context3=context1.getContext("/web3");
        System.out.println(context3.getContextPath());//  /web3  没有任何用处。
复制代码
  1. int getMajorVersion();int getMinorVersion();int getEffectiveMajorVersion();int getEffectiveMinorVersion()前两个函数返回servlet容器支持的版本号,下面两个返回serlvet的真实版本号。
  2. String getMimeType(String file):返回MIME的类型。MIME的类型是对互联网文件的标识,存放在/config/web.xml中
System.out.println(context1.getMimeType("abc.text"));  //text/plain
        System.out.println(context1.getMimeType("abc.jpg"));   //image/jpeg
复制代码
  1. Set getResourcePaths(String path):返回文件夹路径下对应的资源路径。子文件夹以/结束。
For example, for a web application containing:

   /welcome.html
   /catalog/index.html
   /catalog/products.html
   /catalog/offers/books.html
   /catalog/offers/music.html
   /customer/login.jsp
   /WEB-INF/web.xml
   /WEB-INF/classes/com.acme.OrderServlet.class
   /WEB-INF/lib/catalog.jar!/META-INF/resources/catalog/moreOffers/books.html
 
getResourcePaths("/") would return {"/welcome.html", "/catalog/", "/customer/", "/WEB-INF/"}, and getResourcePaths("/catalog/") would return {"/catalog/index.html", "/catalog/products.html", "/catalog/offers/", "/catalog/moreOffers/"}.
复制代码
  1. URL getResource(String path):这个函数是调取资源的URL地址,如果以/开头是相对地址,相对与context的地址。如果是其他地址默认调用url的函数处理
System.out.println(context1.getResource("a.txt")); 
//print:file:/D:/java_temp/plug1/out/artifacts/web3_war_exploded/a.txt
复制代码
  1. InputStream getResourceAsStream(String path)在上一步的继承上打开资源,变为输入流。
  2. RequestDispatcher getRequestDispatcher(String path)返回一个资源调度字,内容指向path的资源,path以/开始,
  3. RequestDispatcher getNamedDispatcher(String name):同上,知识name代表servlet的name。
  4. void log(String msg):void log(String message,Throwable throwable)。log内容的写入
  5. String getRealPath(String path):打开资源相对与操作系统的地址。
  6. String getServerInfo():返回servlet container的信息。
  7. String getInitParameter(String name)
    Enumeration getInitParameterNames()
    boolean setInitParameter(String name, String value)
    这三个方法是关于servletContext初始化参数的信息。初始化参数不能被覆盖,serinitparameter覆盖的时候返回false,并且初始化参数不能被设置,当应用启动的时候;初始化的标签为:
<context-param>
        <param-name>name1</param-name>
        <param-value>value1</param-value>
    </context-param>

复制代码
  1. Object getAttribute(String name)
    Enumeration getAttributeNames()
    void setAttribute(String name, Object object)
    void removeAttribute(String name)
    属性参数,可以覆盖。进而完成servlet之间的数据通信
  2. String getServletContextName()返回servletContext的name。一般在配置文件的标签中存在。没有返回null

ServletRegistration.Dynamic addServlet(String servletName, String className)

ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet)

ServletRegistration.Dynamic addServlet(String servletName, Class<? extends Servlet> servletClass)把servlet增加到context里面,相当于注册。

  1. T createServlet(Class clazz) throws ServletException创建servlet的类 18.

    ServletRegistration getServletRegistration(String servletName)

    Map<String,? extends ServletRegistration> getServletRegistrations()返回注册的servlet。

  2. FilterRegistration.Dynamic addFilter(String filterName, String className)

    FilterRegistration.Dynamic addFilter(String filterName,Filter filter)

    FilterRegistration.Dynamic addFilter(String filterName, Class<? extends Filter> filterClass)

    T createFilter(Class clazz)

    FilterRegistration getFilterRegistration(String filterName)

    Map<String,? extends FilterRegistration> getFilterRegistrations() 同上servlet 20.其他的都是关于listener、session、classloader、declareRoles

网页的相对地址与绝地地址

web的工程如下图,在hello.html增加超链接的网页,其中第一个不能进行相对地址到servlet程序:相对地址为http://localhost:8080/bservlet。相对地址一般采用三张方式:

  1. 绝地地址
  2. 相对当前站点的地址。以/开始
  3. 相对当面目录的地址,开头不能以/开始
servlet简介
<a  href="/bservlet" target="_blank">bservlet</a>
	<a  href="bservlet" target="_blank">bservlet</a>
	<a  href="/web3/bservlet" target="_blank">bservlet</a>
	<a  href="http://localhost:8080/web3/bservlet" target="_blank">bservlet</a>
复制代码
原文  https://juejin.im/post/5cff63fb6fb9a07edb393db2
正文到此结束
Loading...