• 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
    

  • 相关阅读:
    C#获取本地IP地址
    C#中将字符串转换成数值
    JavaScript实现基于对象的双端队列
    Java网络编程
    JavaScript实现基于对象的队列
    JavaScript实现基于对象的栈
    JavaScript实现基于数组的栈
    发送短信按钮倒计时案例
    JavaScript动态显示时间
    html
  • 原文地址:https://www.cnblogs.com/cicada-smile/p/12020195.html
Copyright © 2020-2023  润新知