【归纳总结】JavaEE之开发Servlet的方式、Servlet的生命周期、url-pattern、Context域

本文介绍了三种开发Servlet的方法:继承GenericServlet、继承HttpServlet及使用@WebServlet注解,并详细解析了Servlet的生命周期及其配置细节。

开发Servlet的三种方式

方式一:继承GenericServlet
public class FirstServlet extends GenericServlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("hello servlet");
    }
}

注意:需要重写service方法

方式二:继承HttpServlet
public class SecondServlet extends HttpServlet {
   
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
    }
}

注意:不需要重写service方法,因为HttpServlet类已经重写了service方法,其重写的service方法会根据请求方式的不同,自动跳转到doPost或者doGet方法,因此需要重写这两个方法。

方式一和方式二需要在web.xml文件中进行如下配置

    <servlet>
        <servlet-name>first</servlet-name>
        <servlet-class>FirstServlet</servlet-class>
    </servlet>
	<servlet-mapping>
        <servlet-name>first</servlet-name>
        <url-pattern>/first</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>second</servlet-name>
        <servlet-class>SecondServlet</servlet-class>
    </servlet>
	<servlet-mapping>
        <servlet-name>second</servlet-name>
        <url-pattern>/seccond</url-pattern>
    </servlet-mapping>
方式三:使用@WebServlet注解
@WebServlet("/servlet3")
public class ThirdServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

Servlet的生命周期

顾名思义就是servlet从出生到死亡的整个过程。

servlet接口中制定了三个方法:

  1. init:默认情况下,在servlet第一次被访问之前调用。
    servlet标签的loadOnStartup属性默认为负数,如果把该属性改成非负数,则当应用启动时,就调用
  2. service:当servlet被访问到的时候调用
  3. destroy:当应用被卸载,服务器关闭时调用

有什么样的的意义呢?

  • 首先,生命周期函数本身的意义,对于init、destroy,如果你希望再servlet创建以及servlet被销毁的时候去做一些额外的事情,那么可以再init、destoy方法里面写对应的逻辑。

设置init load-on-startup非负数有什么样的意义呢?

  • 比如说,当前servlet需要预先做一些运算,如果在第一次访问之前去执行,那么可能时间有点来不及,这个时候我就可以设置init方法随着应用的启动而执行,那么就有了更多的时间来运算。

url-pattern

一、url-pattern的优先级

servlet的url-pattern可能存在着相互覆盖的情况,最终tomcat会调用哪个servlet来处理该请求按如下规则:

  1. /开头的url-pattern的优先级高于*.后缀
  2. 对于都是/开头的url-pattern,匹配程度越高(匹配的越多),优先级也越高
二、url-pattern细节
  1. 一个servlet可以设置多个url-pattern吗?可以
  2. 多个servlet可以映射同一个url-pattern吗?不可以
  3. servlet的url-pattern有哪些写法呢? /xxx 和 *.后缀 ,其他全部都是非法的。
三、特殊的url-pattern
  1. /*
    当我们设置了/ *时,访问jsp页面以及访问静态资源页面均无法访问到

  2. /
    缺省servlet,专门用来接收那些没有任何servlet可以处理的请求。
    在这里插入图片描述


Context域

用来实现多个servlet之间进行的数据共享

通过调用getServletContext()方法来获得唯一的context对象,在此对象上调用方法:

  1. setAttribute(key,value) 存数据
  2. getAttribute(key) 取数据
  3. removeAttribute(key) 删除数据
@WebServlet("/domain1")
public class DomainServlet1 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = "zs";
        ServletContext servletContext = getServletContext();
        servletContext.setAttribute("username", name);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}
@WebServlet("/domain2")
public class DomainServlet2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servlet = getServletContext();
        String username = (String) servlet.getAttribute("username");
        System.out.println(username);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

在context对象上调用getRealPath()方法可以获得应用根目录的绝对路径

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>CVTI_BHMC</display-name> <security-constraint> <display-name>Forbidden</display-name> <web-resource-collection> <web-resource-name>Http Method Contraint</web-resource-name> <url-pattern>/*</url-pattern> <http-method>PUT</http-method> <http-method>DELETE</http-method> <http-method>TRACE</http-method> <http-method>OPTIONS</http-method> </web-resource-collection> <auth-constraint /> </security-constraint> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> <filter> <filter-name>HTMLTagFilter</filter-name> <filter-class>able.com.web.filter.HTMLTagFilter</filter-class> </filter> <filter-mapping> <filter-name>HTMLTagFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> <!-- J2534 전송 테그 필터 적용 해야하는지 확인해야함 안하도록 우선 적용 --> <!-- <filter> <filter-name>HTMLTagFilter2</filter-name> <filter-class>com.cvti.core.HTMLTagFilter</filter-class> </filter> <filter-mapping> <filter-name>HTMLTagFilter2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring/context-*.xml</param-value> </context-param> <context-param> <param-name>contextInitialTaskingFactory</param-name> <param-value>able.com.web.context.ContextInitialTaskingFactory</param-value> </context-param> <session-config> <session-timeout>120</session-timeout> </session-config> <listener> <listener-class>able.com.web.context.ContextListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/springmvc/dispatcher-servlet*.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>/na/getToken.action</url-pattern> </servlet-mapping> <servlet> <servlet-name>action2</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/j2534/dispatcher-servlet.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action2</servlet-name> <url-pattern>*.action</url-pattern> <url-pattern>*.bin</url-pattern> <url-pattern>*.BIN</url-pattern> <url-pattern>*.zip</url-pattern> </servlet-mapping> <servlet> <servlet-name>tilesDispatcher</servlet-name> <servlet-class>org.apache.tiles.web.util.TilesDispatchServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>tilesDispatcher</servlet-name> <url-pattern>*.tiles</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <login-config> <auth-method>BASIC</auth-method> </login-config> <!-- <resource-ref> <res-ref-name>jndi/CVTIHME</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> --> <jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <page-encoding>UTF-8</page-encoding> <include-prelude>/WEB-INF/jsp/include/declare.jspf</include-prelude> </jsp-property-group> </jsp-config> <error-page> <exception-type>java.lang.Throwable</exception-type> <location>/WEB-INF/jsp/com/error.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/WEB-INF/jsp/com/error404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/WEB-INF/jsp/com/error.jsp</location> </error-page> </web-app> 什么意思
最新发布
01-09
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值