zoukankan      html  css  js  c++  java
  • JavaEE基础(02):Servlet核心API用法详解

    本文源码:GitHub·点这里 || GitEE·点这里

    一、核心API简介

    1、Servlet执行流程

    Servlet是JavaWeb的三大组件之一(Servlet、Filter、Listener),它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:接收请求数据;处理请求;完成响应。

    2、核心API简介

    API 作用描述
    ServletConfig 获取servlet初始化参数和servletContext对象。
    ServletContext 在整个Web应用的动态资源之间共享数据。
    ServletRequest 封装Http请求信息,在请求时创建。
    ServletResponse 封装Http响应信息,在请求时创建。

    二、ServletConfig接口

    1、接口简介

    容器在初始化servlet时,为该servlet创建一个servletConfig对象,并将这个对象通过init()方法来传递并保存在此Servlet对象中。核心作用:1.获取初始化信息;2.获取ServletContext对象。

    2、代码案例

    • 配置文件
    <servlet>
        <init-param>
            <param-name>my-name</param-name>
            <param-value>cicada</param-value>
        </init-param>
        <servlet-name>servletOneImpl</servlet-name>
        <servlet-class>com.node02.servlet.impl.ServletOneImpl</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>servletOneImpl</servlet-name>
        <url-pattern>/servletOneImpl</url-pattern>
    </servlet-mapping>
    
    • API用法
    public class ServletOneImpl implements Servlet {
    
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            String servletName = servletConfig.getServletName() ;
            System.out.println("servletName="+servletName);
            String myName = servletConfig.getInitParameter("my-name") ;
            System.out.println("myName="+myName);
            Enumeration paramNames = servletConfig.getInitParameterNames() ;
            while (paramNames.hasMoreElements()){
                String paramKey = String.valueOf(paramNames.nextElement()) ;
                String paramValue = servletConfig.getInitParameter(paramKey) ;
                System.out.println("paramKey="+paramKey+";paramValue="+paramValue);
            }
            ServletContext servletContext = servletConfig.getServletContext() ;
            servletContext.setAttribute("cicada","smile");
        }
    }
    

    三、ServletContext接口

    1、接口简介

    一个项目只有一个ServletContext对象,可以在多个Servlet中来获取这个对象,使用它可以给多个Servlet传递数据,该对象在Tomcat启动时就创建,在Tomcat关闭时才会销毁!作用是在整个Web应用的动态资源之间共享数据。

    • 获取方式
    1、ServletConfig#getServletContext();
    2、GenericServlet#getServletContext();
    3、HttpSession#getServletContext()
    4、ServletContextEvent#getServletContext()
    

    2、四大域对象

    ServletContext是JavaWeb四大域对象之一:

    1、PageContext;
    2、ServletRequest;
    3、HttpSession;
    4、ServletContext;
    

    所有域对象都有存取数据的功能,因为域对象内部有一个Map,用来存储数据。

    3、代码案例

    • 配置文件
    <context-param>
        <param-name>my-blog</param-name>
        <param-value>2019-11-19</param-value>
    </context-param>
    <servlet>
        <servlet-name>servletTwoImpl</servlet-name>
        <servlet-class>com.node02.servlet.impl.ServletTwoImpl</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>servletTwoImpl</servlet-name>
        <url-pattern>/servletTwoImpl</url-pattern>
    </servlet-mapping>
    
    • API用法
    public class ServletTwoImpl extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setContentType("text/html;charset=utf-8");
            // 1、参数传递
            ServletContext servletContext = this.getServletContext() ;
            String value = String.valueOf(servletContext.getAttribute("cicada")) ;
            System.out.println("value="+value);
            // 2、获取初始化参数
            String myBlog = servletContext.getInitParameter("my-blog") ;
            System.out.println("myBlog="+myBlog);
            // 3、获取应用信息
            String servletContextName = servletContext.getServletContextName() ;
            System.out.println("servletContextName="+servletContextName);
            // 4、获取路径
            String pathOne = servletContext.getRealPath("/") ;
            String pathTwo = servletContext.getRealPath("/WEB-INF/") ;
            System.out.println("pathOne="+pathOne+";pathTwo="+pathTwo);
            response.getWriter().print("执行:doGet; value:"+value);
        }
    }
    

    四、ServletRequest接口

    1、接口简介

    HttpServletRequest接口继承ServletRequest接口,用于封装请求信息,该对象在用户每次请求servlet时创建并传入servlet的service()方法,在该方法中,传入的servletRequest将会被强制转化为HttpservletRequest对象来进行HTTP请求信息的处理。核心作用:1.获取请求报文信息;2.获取网络连接信息;3.获取请求域属性信息。

    2、代码案例

    • 配置文件
    <servlet>
        <servlet-name>servletThreeImpl</servlet-name>
        <servlet-class>com.node02.servlet.impl.ServletThreeImpl</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>servletThreeImpl</servlet-name>
        <url-pattern>/servletThreeImpl</url-pattern>
    </servlet-mapping>
    
    • API用法
    public class ServletThreeImpl extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // http://localhost:6003/servletThreeImpl?myName=cicada
            String method = request.getMethod();
            System.out.println("method="+method); // GET
            String requestURL = request.getRequestURL().toString();
            // http://localhost:6003/servletThreeImpl
            System.out.println("requestURL="+requestURL);
            String requestURI = request.getRequestURI();
            System.out.println("requestURI="+requestURI); // /servletThreeImpl
            String queryString = request.getQueryString() ;
            System.out.println("queryString="+queryString); // myName=cicada
            String myName = request.getParameter("myName");
            System.out.println("myName="+myName); // cicada
        }
    }
    

    五、ServletResponse接口

    1、接口简介

    HttpServletResponse继承自ServletResponse,封装了Http响应信息。客户端每个请求,服务器都会创建一个response对象,并传入给Servlet.service()方法。核心作用:1.设置响应头信息;2.发送状态码;3.设置响应正文;4.重定向;

    2、代码案例

    • 配置文件
    <servlet>
        <servlet-name>servletFourImpl</servlet-name>
        <servlet-class>com.node02.servlet.impl.ServletFourImpl</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>servletFourImpl</servlet-name>
        <url-pattern>/servletFourImpl</url-pattern>
    </servlet-mapping>
    
    • API用法
    public class ServletFourImpl extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setContentType("text/html;charset=utf-8") ;
            response.setCharacterEncoding("UTF-8");
            response.setStatus(200) ;
            response.getWriter().print("Hello,知了");
        }
    }
    

    3、转发和重定向

    • 转发

    服务器端进行的页面跳转的控制 ;

    request.getRequestDispatcher("/转发地址").forward(request, response);
    
    • 重定向

    服务端响应跳转信息,浏览器端进行的页面跳转 ;

    response.sendRedirect("重定向地址");
    
    • 转发和重定向对比
    区别 转发 重定向
    地址栏 不变 变化
    跳转 服务端跳转 浏览器端跳转
    请求次数 一次 两次
    域中数据 不会丢失 丢失

    六、源代码地址

    GitHub·地址
    https://github.com/cicadasmile/java-base-parent
    GitEE·地址
    https://gitee.com/cicadasmile/java-base-parent
    

  • 相关阅读:
    BEM(Block–Element-Modifier)
    http://element.eleme.io/#/zh-CN/component/quickstart
    Commit message 的写法规范。本文介绍Angular 规范(
    好的commit应该长啥样 https://github.com/torvalds/linux/pull/17#issuecomment-5654674
    代码管理
    if you have content fetched asynchronously on pages where SEO is important, SSR might be necessary
    Martin Fowler’s Active Record design pattern.
    The Zen of Python
    Introspection in Python How to spy on your Python objects Guide to Python introspection
    Object-Oriented Metrics: LCOM 内聚性的度量
  • 原文地址:https://www.cnblogs.com/cicada-smile/p/12020195.html
Copyright © 2011-2022 走看看