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
原文地址:https://www.cnblogs.com/afangfang/p/12716054.html