zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    异常练习一 throw
    MAP排序
    Java正则表达式应用详解
    java多线程 sleep()和wait()的区别
    面向对象的15、18位中国大陆身份证号码解析、工具
    java学习笔记--this 关键字的理解
    Java六大问题你都懂了吗?
    Java类的声明和访问介绍
    java的五种数据类型解析
    Java集合框架的总结
  • 原文地址:https://www.cnblogs.com/tengpengfei/p/10453987.html
Copyright © 2011-2022 走看看