Servlet(8)—GenericServlet和改进Servlet实例

  1. 概念genericservlet是个抽象的父类,必须给出子类才能实例化它。它给出了设计servlet的一些骨架,定义了servlet生命周期,还有一些得到名字、配置、初始化参数的方法,其设计的是和应用层协议无关的,也就是说你有可能用非http协议实现它(其实目前Java Servlet还是只有Http一种)。
  2. 该类实现了Servlet, ServletConfig,接口,所以解决了使用Servlet类时必须要实现Servlet的所有方法这个问题,使用Servlet时可以继承genericServlet即可,此时只需要实现一个抽象方法service()就行,其他方法,需要时在重写或者调用

注意:
GenericServlet自己写也行,jdk提供的也有,解决了多余方法的问题。

package com.test.web;

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;
/***
 * 自定义Sevlet实现类,使用时可以不需要写出全部的方法,只需要实现一个抽象方法,其他的方法用到时再写。
 * 该类实现了两个接口,Servlet、ServletConfig
 */
public abstract class MyGenericServlet implements Servlet ,ServletConfig{

    private ServletConfig servletConfig;

    /**
     * 以下方法继承自Servlet
     */
    @Override
    public void destroy() { }

    @Override
    public ServletConfig getServletConfig() {
        return servletConfig;
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void init(ServletConfig arg0) throws ServletException {
        this.servletConfig = arg0;
        init();
    }

    public void init() throws ServletException {
    } 
    /***
     * 该方法必须要实现,所以使用abstract关键字修饰成抽象方法,所以该类也就是抽象类
     */
    @Override
    public abstract void service(ServletRequest arg0, ServletResponse arg1)
            throws ServletException, IOException;

    /**
     * 以下方法继承自ServletConfig
     */
    //获取请求中的指定参数的参数值
    @Override
    public String getInitParameter(String arg0) {
        return servletConfig.getInitParameter(arg0);
    }

    //获取Enumeration对象
    @Override
    public Enumeration<String> getInitParameterNames() {
        return servletConfig.getInitParameterNames();
    }

    //获取ServletContext对象
    @Override
    public ServletContext getServletContext() {
        return servletConfig.getServletContext();
    }

    //获取Servlet的名称
    @Override
    public String getServletName() {
        return servletConfig.getServletName();
    }



}

一个Servlet

/**
 * 该类改进了因为实现Servlet接口而产生的多余方法
 *但是获取请求方式的方法需要修改
 */
public class LoginServlet2 extends MyGenericServlet {

    /**
     * 该方法覆盖了父类中的init(ServletConfig config)方法,导致父类中的init方法没有运行,
     * 出现空值针异常。该方法想要执行就需要:在父类中写一个空参的init方法覆盖掉,在父类中也可以调用被覆盖的方法,
     * 只是具体执行时会执行子类重写的方法,或者直接覆盖掉父类中带参的init方法,但是在方法中写上super.init(config)
     * 这句话,显式调用一下即可。
     */
    /*@Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("初始化...");
    }*/
    @Override
    public void init() throws ServletException {
        System.out.println("初始化...");
    }
    @Override
    public void service(ServletRequest request, ServletResponse response)
            throws ServletException, IOException {

        //获取请求的方式
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        String method = httpServletRequest.getMethod();
        System.out.println("请求方式:" + method);

        //1.获取请求参数username,password(获取的是表单信息)
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //2.获取当前web应用的初始化参数user,password。
        String initUser = getServletContext().getInitParameter("user");
        String initPassword = getServletContext().getInitParameter("password");

        PrintWriter out = response.getWriter();
        //3.比对
        if(initUser.equals(username) && initPassword.equals(password)){
            //4.打印响应字符串
            out.println("Hello: " + username);
        }else{
            out.println("Sorry: " + username);
        }
    }

}

一个页面

<body>

    <form action="loginServlet" method="get">
        user:<input type="text" name="user"/>
        <br>
        password:<input type="password" name="password"/>
        <br>
        interesting:
        <input type="checkbox" name="interesting" value="read"/>read
        <input type="checkbox" name="interesting" value="walk"/>walk
        <input type="checkbox" name="interesting" value="swing"/>swing
        <input type="checkbox" name="interesting" value="shopping"/>shopping
        <input type="checkbox" name="interesting" value="tv"/>TV
        <br>
        <input type="submit" value="Submit"/>
    </form>
</body>
原文地址:https://www.cnblogs.com/tengpengfei/p/10453987.html