• Servlet练习和自定义GenericServlet实现类


    在web.xml文件中设置两个WEB应用的初始化参数,user、password

    定义一个loginServlet,在其中获取请求的user,password,比对其和web.xml文件中定义的请求参数是否一致。若一致,响应Hello:xxx,若不一致,响应Sorry:xxx xxx为user。

    Servlet:

      private ServletConfig servletConfig;
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            System.out.println("init...");
            this.servletConfig = servletConfig;
        }
    
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("service...");
    //        1.获取请求参数:username,password
            String username = servletRequest.getParameter("username");
    //        2.获取当前web应用的初始化参数:user,password
            String password = servletRequest.getParameter("password");
    //        3.比对
            ServletContext servletContext = servletConfig.getServletContext();
            String initUser = servletContext.getInitParameter("user");
            String initPassword = servletContext.getInitParameter("password");
    
            PrintWriter printWriter = servletResponse.getWriter();
    //        4.打印响应字符串
            if (username.equals(initUser) && password.equals(initPassword)){
                printWriter.print("Hello" + username);
            }else{
                printWriter.print("Sorry" + username);
            }
        }
    

     web.xml:

        <!--配置当前web应用的初始化参数-->
        <context-param>
            <param-name>user</param-name>
            <param-value>YHS</param-value>
        </context-param>
        <context-param>
            <param-name>password</param-name>
            <param-value>123</param-value>
        </context-param>
    
        <servlet>
            <servlet-name>DengluServlet</servlet-name>
            <servlet-class>com.demo.javaweb.DengluServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>DengluServlet</servlet-name>
            <url-pattern>/DengluServlet</url-pattern>
        </servlet-mapping>
    

      

    GenericServlet:

    1)是一个Servlet.是Servlet接口和ServletConfig接口的实现类,但是一个抽象类。其中的service方法为抽象方法

    2)如果新建的Servlet程序直接继承GenericServlet会使开发更简洁

    3)具体实现

    - 在GenericServlet中声明了一个ServletConfig类型的成员变量,在init(ServletConfig)方法中对其进行了初始化

    - 利用servletConfig成员变量的方法实现了ServletConfig接口的方法

    - 还定义了一个init()方法,在init(ServletConfig)方法中对其进行调用,子类可以直接覆盖init()对其中实现对Servlet的初始化

    - 不建议直接覆盖init(ServletConfig),因为如果忘记编写super(ServletConfig),而还用了ServletConfig接口的方法,则会出现空指针异常

    - 新建的init(){}并非Servlet的生命周期方法,而init(ServletConfig)是生命周期相关的方法

      

    package com.demo.javaweb;
    
    import javax.servlet.*;
    import java.io.IOException;
    import java.util.Enumeration;
    
    /*自定义的一个Servlet接口的实现类:让开发的任何Servlet都继承该类,以简化开发
    * */
    public  abstract class GenericServlet implements Servlet,ServletConfig{
    //    以下方法为Servlet接口的方法
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            this.servletConfig = servletConfig;
            init();
        }
    
        public void init()throws ServletException{
    //        我们自己可以写的创建时的东西
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return servletConfig;
        }
    
        @Override
        public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException;
    
        @Override
        public String getServletInfo() {
            return null;
        }
        @Override
        public void destroy() {
    
        }
    
        private ServletConfig servletConfig;
        //    以下方法为ServletConfig接口的方法
        @Override
        public String getServletName() {
            return servletConfig.getServletName();
        }
    
        @Override
        public ServletContext getServletContext() {
            return servletConfig.getServletContext();
        }
    
        @Override
        public String getInitParameter(String s) {
            return servletConfig.getInitParameter(s);
        }
    
        @Override
        public Enumeration<String> getInitParameterNames() {
            return servletConfig.getInitParameterNames();
        }
    }
    

      

    Servlet:

    package com.demo.javaweb;
    
    import javax.servlet.*;
    import javax.servlet.GenericServlet;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    public class DengluServlet extends GenericServlet {
        
        private ServletConfig servletConfig;
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            System.out.println("init...");
            this.servletConfig = servletConfig;
            super.init(servletConfig);
        }
    
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("service...");
    //        1.获取请求参数:username,password
            String username = servletRequest.getParameter("username");
    //        2.获取当前web应用的初始化参数:user,password
            String password = servletRequest.getParameter("password");
    //        3.比对
    
            String initUser = getServletContext().getInitParameter("user");
            String initPassword = getServletContext().getInitParameter("password");
    
            PrintWriter printWriter = servletResponse.getWriter();
    //        4.打印响应字符串
            if (initUser.equals(username) && initPassword.equals(password)){
                printWriter.print("Hello" + username);
            }else{
                printWriter.print("Sorry" + username);
            }
        }
    
    
    
        @Override
        public String getServletInfo() {
            System.out.println("getServletInfo...");
            return null;
        }
    
        @Override
        public void destroy() {
            System.out.println("destroy...");
        }
    }
    

      

  • 相关阅读:
    数据库常用连接字符串(网址)
    WPF布局(2)控件拖动
    TreeView templete(code project)
    寄宿(host)和应用程序域(appdomain)
    C#DSN操作
    WPF布局(3)坐标(转)
    C#注册表操作
    程序集加载与反射
    关于RichTextBox 及 RTF格式文件的保存
    Ajax实现不刷屏的前提下实现页面定时刷新
  • 原文地址:https://www.cnblogs.com/yangHS/p/10925105.html
Copyright © 2020-2023  润新知