Servlet 基础知识点解析

Servlet 基础知识点

前言

上一篇博客,我记录了一些有关jsp的基础知识,这次就来展开记录servlet的基础知识点

servlet 本体

    public class Servlet extends HttpServlet {
        public Servlet() {
            super();
        }
        public void destroy() {
            super.destroy();
            //销毁
        }
        public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
            //get请求处理
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
            //post请求处理
        }
        public void init() throws ServletException {
            //初始化
        }
    }

servlet 创建时会自动调用4种方法,分别是init()初始化方法、destroy()销毁方法、doGet()doPost()处理客户端的请求
Servlet 基础知识点解析_第1张图片
servlet启动过程

servlet 对象

隐式对象 说明 对象 作用域
request 转译后对应HttpServletRequest/ServletRequest对象 请求对象 Request
response 转译后对应HttpServletRespons/ServletResponse对象 响应对象 Page
session 转译后对应HttpSession对象 会话对象 Session
application 转译后对应ServletContext对象 应用程序对象 Application
out 转译后对应JspWriter对象,其内部关联一个PrintWriter对象 输出对象 Page
page 转译后对应this 页面对象 Page
config 转译后对应ServletConfig对象 配置对象 Page
exception 转译后对应Throwable对象,代表由其他JSP页面抛出的异常对象,只会出现于JSP错误页面(isErrorPage设置为true的JSP页面) 异常对象 Page
pageContext 转译后对应PageContext对象,它提供了JSP页面资源的封装,并可设置页面范围属性 页面上下文对象 Page

Servlet 基础知识点解析_第2张图片
基本对象之间的关系

作用域

名称 说明 生命周期
application 全局作用范围,整个应用程序共享,就是在部署文件中的同一个webApp共享 应用程序启动到停止
session 会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记住这个会话状态 会话超时,或者服务器端强制使会话失效
request 请求作用域 客户端的一次请求
page 一个JSP页面 页面打开到关闭

以上作用范围使越来越小, request和page的生命周期都是短暂的,他们之间的区别就是:一个request可以包含多个page页(include,forward以及filter)。

web.xml

创建jsp项目时的一个基本配置文件,可以配置servlet的名称、映射地址等属性

  
  <servlet>
    
    <description>This is the description of my J2EE componentdescription>
    
    <display-name>This is the display name of my J2EE componentdisplay-name>
    
    <servlet-name>Servletservlet-name>
    
    <servlet-class>org.servlet.Servletservlet-class>
    
    <load-on-startup>0load-on-startup>
  servlet>
  
  <servlet-mapping>
    
    <servlet-name>Servletservlet-name>
    
    <url-pattern>/servlet/Servleturl-pattern>
  servlet-mapping>

监听器Listener

域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器。

这三个监听器接口分别是
ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener

这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同。

  • attributeAdded 方法

    当向被监听对象中增加一个属性时,web容器就调用事件监听器的attributeAdded方法进行响应,这个方法接收一个事件类型的参数,监听器可以通过这个参数来获得正在增加属性的域对象和被保存到域中的属性对象

        public void attributeAdded(ServletContextAttributeEvent scae)
        public void attributeAdded(HttpSessionBindingEvent  hsbe)
        public void attributeAdded(ServletRequestAttributeEvent srae)
    
  • attributeRemoved 方法

    当删除被监听对象中的一个属性时,web容器调用事件监听器的attributeRemoved方法进行响应

        public void attributeRemoved(ServletContextAttributeEvent scae)
        public void attributeRemoved(HttpSessionBindingEvent  hsbe)
        public void attributeRemoved(ServletRequestAttributeEvent srae)
    
  • attributeReplaced 方法

    当监听器的域对象中的某个属性被替换时,web容器调用事件监听器的attributeReplaced方法进行响应

        public void attributeReplaced(ServletContextAttributeEvent scae)
        public void attributeReplaced(HttpSessionBindingEvent  hsbe)
        public void attributeReplaced(ServletRequestAttributeEvent srae)
    

HttpSessionAttributeListener监听器范例:

    public class TrolleyListener implements HttpSessionAttributeListener{

        @Override
        public void attributeAdded(HttpSessionBindingEvent event) {
            // TODO Auto-generated method stub
            String nameString =event.getName();
            if(nameString=="trolley"){
                System.out.println("attributeAdded");
            }
        }

        @Override
        public void attributeRemoved(HttpSessionBindingEvent event) {
            // TODO Auto-generated method stub
            String nameString =event.getName();
            if(nameString=="trolley"){
                System.out.println("attributeRemoved");
            }
        }

        @Override
        public void attributeReplaced(HttpSessionBindingEvent event) {
            // TODO Auto-generated method stub  
            String nameString =event.getName();
            if(nameString=="trolley"){
                System.out.println("attributeReplaced");
            }
        }
    }

web.xml

监听器listener也需要在web.xml中注册才能使用

    <listener>
        <listener-class>org.listener.TrolleyListenerlistener-class>
    listener>

过滤器Filter

过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。

过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:

  • 在客户端的请求访问后端资源之前,拦截这些请求。
  • 在服务器的响应发送回客户端之前,处理这些响应。

过滤器重写Filter接口中的doFilter方法实现过滤

编码过滤器范例:

    public class EncodingFilter implements Filter {

        @Override
        public void destroy() {
            // TODO Auto-generated method stub
            //过滤器销毁
        }

        //过滤器代码,编码过滤器
        @Override
        public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
        throws IOException, ServletException {
            // TODO Auto-generated method stub
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            chain.doFilter(request, response);
        }

        @Override
        public void init(FilterConfig arg0) throws ServletException {
            // TODO Auto-generated method stub
            //过滤器初始化
        }

    }

web.xml

过滤器Filter也需要在web.xml中注册才能使用

    
    <filter>
        
        <filter-name>encodingFilterfilter-name>
        
        <filter-class>org.filter.EncodingFilterfilter-class>
    filter>
    
    <filter-mapping>
        
        <filter-name>encodingFilterfilter-name>
        
        <url-pattern>/*url-pattern>
    filter-mapping>

路径

servlet中一般使用逻辑路径调用,而在jsp页面中由于的作用其基础路径被重定向至项目根目录

        String path = request.getContextPath();
        String basePath = request.getScheme() + "://"
            + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
    //basePath默认为http://127.0.0.1:8080/XX/

项目物理路径如下
Servlet 基础知识点解析_第3张图片

这就导致*.jsp的逻辑路径为http://127.0.0.1:8080/shopjsp/*.jsp
而servlet为http://127.0.0.1:8080/shopjsp/servlet/*.java

所以在servlet中重定向至jsp页面一般需要返回上一级目录查找。

你可能感兴趣的:(JSP)