Servlet三大组件的创建以及使用

  • Servlet
    Servlet组件是JavaEE进行web开发的最基本组件,可以处理请求写出响应,tomcat启动以后监听8080端口,解析web.xml文件,获取每个servlet以及对应的请求url,当tomcat接受到请求的时候,就可以根据请求的url信息,找到对应的servlet,然后通过反射创建这个servlet对象,再执行init方法,在调用servlet的service方法。当然也可以通过标签让服务器启动时就创建servlet对象,并执行init方法。
  1. web.xml中配置servlet
    <servlet>
        <servlet-name>myServlet</servlet-name>
        <servlet-class>com.web.servlet.MyServlet</servlet-class>
        <init-param>
            <param-name>url</param-name>
            <param-value>www.cq.com</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>myServlet</servlet-name>
        <url-pattern>/ser01</url-pattern>
    </servlet-mapping>
  1. servlet代码
public class MyServlet extends HttpServlet {
    
    

    public MyServlet(){
    
    
        System.out.println("构造方法执行了");
    }

    @Override
    public void init() throws ServletException {
    
    
        System.out.println("初始化方法执行了");
        ServletConfig servletConfig = getServletConfig();
        System.out.println("当前servlet的name是" + servletConfig.getServletName());
        System.out.println("当前servlet的初始化参数url是" + servletConfig.getInitParameter("url"));
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("servlet接受到了请求");
    }
}

我们可以看到mySevlet在服务器启动时被创建了,还执行了init方法,获取到了参数。

在这里插入图片描述

  • 这里注意,servlet在响应的时候有两个响应流,一个是resp.getWriter(),一个是resp.getOutputStream(),这两个流前者专门写字符串,后者可以写任意类型数据包括二进制,但调用了其中任何一个就不能再调用另一个了。在文件下载的时候,通常使用OutputStream(),然后设置响应头 Content-Disposition ; attachment;filename=xxx.xxx,来告诉浏览器进行下载,如果filename有中心,还需要使用URLEncoder进行编码。

  • Filter
    Filter为过滤器组件,在执行Servlet之前执行,可以在Filter中进行日志输出,权限校验等。多个Filter会组成FilterChian,也就是在调用chain.doFilter(res,resp)方法时,会传给下一个过滤器(如果有),如果没有则,会访问servlet。servlet访问完之后,就会执行chan.doFilter之后的代码,也就是整个过程是在一个线程执行的。
    同时,filter的init方法,也可以获取filtername以及初始化参数init-param

自定义一个过滤器来模拟解决响应编码问题

  <filter>
        <filter-name>myFilter</filter-name>
        <filter-class>com.web.filter.MyFilter</filter-class>
        <init-param>
            <param-name>requestEncoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>responseEncoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>myFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
public class MyFilter implements Filter {
    
    

    private String requestEncoding;

    private String responseEncoding;

    public MyFilter(){
    
    
        System.out.println("filter构造方法执行了");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    
    
        System.out.println("filterinit方法执行了");
        System.out.println("当前filtername是" + filterConfig.getFilterName());
        System.out.println("当前filter初始化参数设置的请求编码是" + filterConfig.getInitParameter("requestEncoding"));
        System.out.println("当前filter初始化参数设置的响应编码是" + filterConfig.getInitParameter("responseEncoding"));
        this.requestEncoding = filterConfig.getInitParameter("requestEncoding");
        this.responseEncoding = filterConfig.getInitParameter("responseEncoding");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
    
        System.out.println("filter执行前置代码");
        servletRequest.setCharacterEncoding(this.requestEncoding);
        servletResponse.setCharacterEncoding(this.responseEncoding);
        servletResponse.setContentType("text/plain;charset=" + this.responseEncoding);
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("filter执行后置代码");
    }

    @Override
    public void destroy() {
    
    
        System.out.println("filter被销毁了");
    }
}

在服务器启动时filter就会创建
在这里插入图片描述
拦截请求
在这里插入图片描述

  • Listener
    三大组件之一的Listener是在服务器启动时,执行监听器的回调方法,对服务器做一个初始化操作,并且listener中还可以获取ServletContxext对象,ServletContxext一个web工程只有一个,随着服务器的启动而创建,随着服务器的停止而销毁。监听器最典型的应用就是当我们和spring集成的时候配置的spring的监听器,spring的监听器就会得到ServletContext对象,拿到这个对象以后就可以拿到在中指定contextConfigLocation值,获取到配置文件以后,spring就可以执行new ClassPathXML…,这样解析好spring的配置文件以后,就可以创建好项目中的bean并自动装配好。

1.web.xml配置监听器以及ServletContext的初始化参数

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring.properties</param-value>
    </context-param>
    
    <listener>
        <listener-class>com.web.listener.ContextloadListener</listener-class>
    </listener>
  1. listener伪代码
public class ContextloadListener implements ServletContextListener {
    
    
    @Override
    public void contextInitialized(ServletContextEvent event) {
    
    
        ServletContext servletContext = event.getServletContext();
        String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
        InputStream resourceAsStream = this.getClass().getClassLoader().
                getResourceAsStream("spring.properties");
        byte[] bytes = new byte[10240];
        int read = 0;
        try {
    
    
            read = resourceAsStream.read(bytes);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        System.out.println("---------------"+new String(bytes,0,read));
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    
    

    }
}

监听器的contextDestroyed当服务器停止时调用。

おすすめ

転載: blog.csdn.net/qq_43750656/article/details/120400769