欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Syong : JavaWeb三大组件Servlet,Filter,Listener

程序员文章站 2024-02-09 15:53:40
...

JavaWeb三大组件

What
JavaWeb:javaweb是java中开发web的方向,包括两个部分,运行应用程序的服务器端,也称后端,已经展示给用户浏览的前端;而接下来要介绍的javaweb三大组件都是运行再后端的;

Servlet:用java编写的服务器端程序,依赖于Servlet容器(例如Tomcat),响应多个HTTP请求,生成动态Web内容

Filter:Filter是javaweb中的过滤器,filter负责拦截过滤HTTP请求,可以实现URL权限访问,敏感内容过滤,编码问题,登录判断等功能;

Listener:Listener是javaweb中的监听器,listener主要负责监听ServletContext,HttpSession,ServletRequest的创建与销毁或属性的改变。

How
1.Servlet实现

java代码:

public class ServletDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取响应流,写入“my first servlet”
        response.getWriter().append("my frist servlet");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//调用doget()方法
        doGet(request, response);
    }

	//初始化
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("Servlet初期化" + config.getServletName());
    }

	//销毁
    @Override
    public void destroy() {
        System.out.println("Servlet销毁");
    }
}

xml配置文件

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>
	
	<!-- 声明注册ServletDemo -->
    <servlet>
        <servlet-name>MyFirstServlet</servlet-name>
        <servlet-class>com.song.demo.ServletDemo</servlet-class>
    </servlet>
	<!-- 配置映射路径 -->
    <servlet-mapping>
        <servlet-name>MyFirstServlet</servlet-name>
        <url-pattern>/MyFirst</url-pattern>
    </servlet-mapping>
</web-app>

注意:

每一个servlet都要继承HttpServlet并重写doget()与doPost()方法,并在xml中注册servlet配置映射路径

2.Filter实现

java代码:

public class FilterDemo implements Filter {
 
	//初始化
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
 
	//主要逻辑
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
         
        //对request和response进行一些预处理
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
         
        System.out.println("Filter执行前");
        chain.doFilter(request, response);  //放行
        System.out.println("Filter执行后");
    }
	
	//销毁
    @Override
    public void destroy() {
    }
}

xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
  <!--注册过滤器-->
  <filter>
      <filter-name>FilterDemo</filter-name>
      <filter-class>com.syong.demo.FilterDemo</filter-class>
  </filter>
   
  <!--配置过滤器过滤路径-->
  <filter-mapping>
      <filter-name>FilterDemo</filter-name>
      <!--“/*”表示拦截所有的请求 -->
      <url-pattern>/*</url-pattern>
  </filter-mapping>
   
</web-app>

注意:

每一个Filter都要实现Filter ,重写 doFilter()方法,并在适当的时候放行chain.doFilter(request, response);,与servlet差不多,需要注册Filter配置过滤路径

3.Listener实现

Begin
监听器由哪些:

empty ServletContext域 HttpSession域 ServletRequest域
域对象的创建与销毁 ServletContextListener HttpSessionListener ServletRequestListener
域对象内的属性变化 ServletContextAttributeListener HttpSessionAttributeListener ServletRequestAttributeListener

After
java代码:

public class MyServletContextListener implements ServletContextListener{
 
	@Override
	//此方法是用来监听context域对象的创建的 
	public void contextInitialized(ServletContextEvent sce) {
		//获得的就是被监听的对象---ServletContext
		ServletContext servletContext = sce.getServletContext();
		//getSource方法也是获得被监听的对象,是通用的方法,可以通过强转转换成ServletContext对象
		Object source = sce.getSource();
		System.out.println("context创建.....");
	}
	
	@Override
	//此方法是用来监听context域对象的销毁的 
	public void contextDestroyed(ServletContextEvent arg0) {
		System.out.println("context销毁.....");
	}
}

xml配置:

<?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" 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>LinstenerPro23</display-name>
  <!-- 注册(配置)我的监听器 -->
  <listener>
      <listener-class>com.syong.app.MyServletContextListener</listener-class>
  </listener>

</web-app>

顺便一提(By the way),Spring的官方给的配置文件中,也是由一个监听器开始:

  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

Others

1.Servlet 3.0提供注解的方式配置Servlet,Filter,Listener,就是说,可以通过@WebServlet,@WebFilter,@WebListener注解配置,而不需要配置到xml里面;
2.Servlet是单例多线程,所以在共享资源的时候,会有多线程问题;

结束语优秀是一种习惯。