zoukankan      html  css  js  c++  java
  • GenericServlet

    1. GenericServlet:

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

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

    3). 具体实现:

              ①. 在 GenericServlet 中声明了一个 SerlvetConfig 类型的成员变量, 在 init(ServletConfig) 方法中对其进行了初始化
              ②. 利用 servletConfig 成员变量的方法实现了 ServletConfig 接口的方法
              ③. 还定义了一个 init() 方法, 在 init(SerlvetConfig) 方法中对其进行调用, 子类可以直接覆盖 init() 在其中实现对 Servlet 的初始化.
              ④. 不建议直接覆盖 init(ServletConfig), 因为如果忘记编写 super.init(config); 而还是用了 SerlvetConfig 接口的方法,
                    则会出现空指针异常.
              ⑤. 新建的 init(){} 并非 Serlvet 的生命周期方法. 而 init(ServletConfig) 是生命周期相关的方法.

    2.实验:

              在 web.xml 文件中设置两个 WEB 应用的初始化参数, user, password.
              定义一个 login.html, 里边定义两个请求字段: user, password. 发送请求到 loginServlet
              在创建一个 LoginServlet, 在其中获取请求的 user, password. 比对其和 web.xml 文件中定义的请求参数是否一致
              若一致, 响应 Hello:xxx, 若不一致, 响应 Sorry: xxx xxx 为 user.

    MyGenericServlet

    package com.aff.java;
    import java.io.IOException;
    import java.util.Enumeration;
    import javax.servlet.Servlet;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    //自定义的一个Servlet接口的实现类,让开发任何Servlet都继承该类,以简化开发
    public abstract class MyGenericServlet implements Servlet, ServletConfig {
    
        /**
         * 下面的方法为Servlet接口的方法
         */
        @Override
        public void destroy() {
        }
    
        @Override
        public ServletConfig getServletConfig() {// 得到servletConfig传给调用他的子类
            return servletConfig;
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        private ServletConfig servletConfig;
    
        @Override
        public void init(ServletConfig arg0) throws ServletException {
            this.servletConfig = arg0;
            init();
        }
        //自己定义的方法不是Servlet的生命周期方法
        public void init() throws ServletException {// 想初始化给他提供一个空的init方法
    
        }
    
        @Override
        public abstract void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException;
    
        /**
         * 以下方法为 ServletConfig 接口的方法
         */
        @Override
        public String getInitParameter(String arg0) {
            return servletConfig.getInitParameter(arg0);
        }
    
        @Override
        public Enumeration<String> getInitParameterNames() {
            return servletConfig.getInitParameterNames();
        }
    
        @Override
        public ServletContext getServletContext() {
            return servletConfig.getServletContext();
        }
    
        @Override
        public String getServletName() {
            return servletConfig.getServletName();
        }
    }

    LoginServlet

    package com.aff.java;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    public class LoginServlet extends MyGenericServlet {
        // 对当前Servlet进行初始化:覆盖init方法
        @Override
        public void init( ) throws ServletException {//在空的init方法中初始化
            System.out.println("初始化...");
        }
    
        @Override
        public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
            // 1. 获取请求参数
            String username = request.getParameter("username");
            String password = request.getParameter("password");
    
            // 2. 获取当前应用的初始化参数: user ,password
            // 需要使用servletContext对象
            String inituser = getServletContext().getInitParameter("user");
            String initpassword = getServletContext().getInitParameter("password");
    
            PrintWriter out = response.getWriter();
            // 3. 比对
            // 4. 打印响应字符串
            if (inituser.equals(username) && initpassword.equals(password)) {
                out.print("Hello" + username);
            } else {
                out.print("sorry" + username);
            }
        }
    }

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
        version="3.1">
        <!--配置当前web应用的初始化参数 全局的 -->
        <context-param>
            <param-name>user</param-name>
            <param-value>hmm</param-value>
        </context-param>
    
        <context-param>
            <param-name>password</param-name>
            <param-value>123456</param-value>
        </context-param>
    
        <servlet>
            <servlet-name>loginServlet</servlet-name>
            <servlet-class>com.aff.java.LoginServlet</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>loginServlet</servlet-name>
            <url-pattern>/loginServlet</url-pattern>
        </servlet-mapping>
    
    </web-app>

    login.html

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    
    <form action="loginServlet" method="post">
    user:<input type="text"  name="username"/>
    password:<input type="password" name="password"/>
    <input type="submit" value="Submit"/>
    </form>
    
    </body>
    </html>

    目录

    All that work will definitely pay off
  • 相关阅读:
    FFT学习笔记
    FWT(Fast Walsh Transformation)快速沃尔什变换学习笔记
    GMS2游戏开发学习历程
    [BZOJ3238][AHOI2013]差异 [后缀数组+单调栈]
    Trie树简单讲解
    自己的题
    小技巧
    编程注意事项
    构造方法
    递归
  • 原文地址:https://www.cnblogs.com/afangfang/p/12716054.html
Copyright © 2011-2022 走看看