Servlet

Posted __Ethan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet相关的知识,希望对你有一定的参考价值。

servlet 2.5:

(单体架构使用servlet创建的模板用Java Enterprise,可以指定Tomcat版本,JavaEE版本以及Web)

Tomcat的核心

1 servlet ; 2 jsp引擎

servlet作用:

接受浏览器的url到serlvet

 拦截url上 /* 的所有链接到DispatchServlet
 <servlet>
    <servlet-name>dispatchServlet</servlet-name>
    <servlet-class>servlet.DispatchServlet</servlet-class>
 </servlet>
 <servlet-mapping>
    <servlet-name>dispatchServlet</servlet-name>
    <url-pattern>/*</url-pattern>
 </servlet-mapping>

然后把jsp引擎转译成的java页面返回给浏览器 ,并且转译后jsp页面实现了serlvet接口

此时接收和返回流都受控于servlet

 public class Jsp引擎转译后的Jsp页面 extends HttpServlet{
 
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         //模拟Servlet (DispatchServlet)经过jsp引擎转译后的java页面到浏览器
         resp.setContentType("text/html;charset=utf-8");
         PrintWriter writer = resp.getWriter();
         writer.println("<h1><%@ page contentType=\\"text/html;charset=UTF-8\\" language=\\"java\\" %></h1>");
         writer.println("<h1><html></h1>");
         writer.println("<h1><head></h1>");
         writer.println("<title>Title</title>");
         writer.println("<title>Title</title>");
         writer.println("</head>");
         writer.println("<body>");
         writer.println("<h2>我是页面</h2>");
         writer.println("</body>");
         writer.println("</html>");
    }
 }

在springMVC中会指定转译后的jsp页面存放地址

(默认Idea绑定Tomcat后 会采用第三种方式发布项目 即:在config.xml中指定目录存放jsp转译后的文件 一般指定在Idea 的 out 目录下)

 

 

servlet 3.0

省略Web.xml配置文件(指定url-pattern和servlet-class)

将url-pattern写在了Servlet注解中

 
 @WebServlet(name = "ServletDemo",urlPatterns = "/*")
 public class SerrvletDemo extends HttpServlet {
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         resp.setContentType("text/html;charset=utf-8");
         PrintWriter writer = resp.getWriter();
         writer.println("<h2>测试2</h2>");
    }
 }

 

实际开发中jsp引擎转译后的jsp页面已经实现了Servlet接口,交由Servlet管控 只需要在Web.xml编写url-pattern和servlet-class, 还可以采用servlet3.0方式 在jsp转译后的java类上添加@WebServlet(....)实现Web.xml的功能

 

Servlet原理:

url请求经过url-pattern到达指定的servlet-class即Servlet接口实现类(转译后的jsp页面) 实现类中的service方法会把页面信息一行一行的返回给浏览器解析 以上代码模拟出了jsp的转译类如何实现信息到浏览器的返回

(Servlet接口中的service方法在实现类HttpServlet中根据请求方式细分出了doGet和doPost方法)

 

 

 

Servlet接口的生命周期

 @WebServlet(urlPatterns ={"/demo12","/demo13","*.do"},loadOnStartup = 1)
 public class DispatcherServletDemo implements Servlet {
     
     @Override
     public void init(ServletConfig servletConfig) throws ServletException {
         System.out.println("servlet初始化时执行该方法, 若loadOnStartup = 1 则在Tomcat启动时时执行该方法且只执行一次");
    }
 
     @Override
     public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
         System.out.println("每次访问servlet时执行该方法");
    }
     
     @Override
     public void destroy() {
         System.out.println("关闭服务器时执行该方法");
    }
 
     @Override
     public ServletConfig getServletConfig() {
         return null;
    }
 
     @Override
     public String getServletInfo() {
         return null;
    }
 }

 

操作Web.xml中 init-param 标签

web.xml中会初始化一些参数 init-param 标签中的代码

     <servlet>
        <servlet-name>DispacherServlet</servlet-name>
        <servlet-class>servlet.DispatcherServletSDemo</servlet-class>
 
        <init-param>
            <param-name>username</param-name>
            <param-value>张三</param-value>
        </init-param>
 
        <init-param>
            <param-name>age</param-name>
            <param-value>25</param-value>
        </init-param>
 
        <load-on-startup>1</load-on-startup>
    </servlet>

url请求进入servlet时就携带了 init-param 初始化参数, 需要在servlet中的init方法中获取init-param里的参数

 public void init(ServletConfig config) throws ServletException {
    Enumeration<String> initParameterNames = config.getInitParameterNames();
    while (initParameterNames.hasMoreElements()) {
        String name = initParameterNames.nextElement();
        String value = config.getInitParameter(name);
        System.out.println(name+" :"+value);
    }
 }

 

 

细节

@WebServlet(name = "SerrvletDemo",urlPatterns = "/*")

urlPatterns是一个String类型的数组容器 String[] urlPatterns() default {};

 

Servlet默认第一次被访问时init会和service方法一起执行, 当loadOnStartup = 1时init方法会在Tomcat启动时执行 会比service方法早执行 (SpringMVC在Web.xml中会设置loadOnStartup =1,使init方法比service方法早执行)

 

 

 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;

HttpServletResponse接口继承了ServletResponse接口

 public interface HttpServletResponse extends ServletResponse {

 

以上是关于Servlet的主要内容,如果未能解决你的问题,请参考以下文章

servlet和filter的区别

Java基础——JSP

java---servlet与filter的联系与区别

servlet,filter,listener,intercepter区别

Tomcat根据JSP生成Servlet机制解析

servlet,过滤器,监听器,拦截器的区别