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

来源:互联网 发布:mymusic软件 编辑:程序博客网 时间:2024/05/16 19:21
  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>