• [原创]java WEB学习笔记10:GenericServlet


    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

    内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

    本人互联网技术爱好者,互联网技术发烧友

    微博:伊直都在0221

    QQ:951226918

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    1.实现页面的跳转:对于LoginServlet.java 采用直接实现的Servlet接口的方式

    web.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3     xmlns="http://java.sun.com/xml/ns/javaee"
     4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     5     id="WebApp_ID" version="3.0">
     6     
     7     <!-- 配置web应用的初始化参数 -->
     8     <context-param>
     9         <param-name>user</param-name>
    10         <param-value>jason</param-value>
    11     </context-param>
    12     
    13     <context-param>
    14         <param-name>password</param-name>
    15         <param-value>zhangzhen</param-value>
    16     </context-param>
    17     
    18     <!-- 配置和映射servlet -->
    19     <servlet>
    20         <servlet-name>LoginServlet</servlet-name>
    21         <servlet-class>com.jason.testweb.LoginServlet</servlet-class>
    22     </servlet>
    23     
    24     <servlet-mapping>
    25         <servlet-name>LoginServlet</servlet-name>
    26         <url-pattern>/login</url-pattern> <!-- 和提表单提交的 action 一致 -->
    27     </servlet-mapping>
    28     
    29 </web-app>

    login.html

     1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     2 <html>
     3 <head>
     4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     5 <title>this is a test </title>
     6 </head>
     7 <body>
     8     <form action="login" method="post">
     9     
    10         user:<input type="text" name="username"/>
    11         password:<input type="text" name="password"/>
    12             
    13         <input type="submit" value="submit"/>
    14         
    15     </form>
    16 </body>
    17 </html>

    LoginServlet.java

     1 package com.jason.testweb;
     2 
     3 import java.io.IOException;
     4 import java.io.PrintWriter;
     5 
     6 import javax.servlet.Servlet;
     7 import javax.servlet.ServletConfig;
     8 import javax.servlet.ServletContext;
     9 import javax.servlet.ServletException;
    10 import javax.servlet.ServletRequest;
    11 import javax.servlet.ServletResponse;
    12 
    13 public class LoginServlet implements Servlet {
    14 
    15     @Override
    16     public void destroy() {
    17         // TODO Auto-generated method stub
    18     }
    19 
    20     @Override
    21     public ServletConfig getServletConfig() {
    22         // TODO Auto-generated method stub
    23         return null;
    24     }
    25 
    26     @Override
    27     public String getServletInfo() {
    28         // TODO Auto-generated method stub
    29         return null;
    30     }
    31 
    32     private ServletConfig servletConfig; //自定义一个成员变量
    33 
    34     @Override
    35     public void init(ServletConfig servletConfig) throws ServletException {
    36 
    37         this.servletConfig = servletConfig;
    38 
    39     }
    40 
    41     @Override
    42     public void service(ServletRequest request, ServletResponse response)
    43             throws ServletException, IOException {
    44         // 1.获取请求参数
    45         String userName = request.getParameter("username");
    46         String passWord = request.getParameter("password");
    47 
    48         // 2.获取当前web 应用的初始化参数,user,password
    49         ServletContext servletContext = servletConfig.getServletContext();
    50         String initUser = servletContext.getInitParameter("user");
    51         String initPassword = servletContext.getInitParameter("password");
    52 
    53         PrintWriter out = response.getWriter();
    54 
    55         // 3.比对
    56         // 4.打印响应字符串
    57         if (initUser.equals(userName) && initPassword.equals(passWord)) {
    58             out.print("hello :" + userName);
    59         } else {
    60             out.print("sorry :" + userName);
    61         }
    62 
    63     }
    64 
    65 }

    2.实现页面的跳转:创建一个MyGenericServlet的类,实现Servlet接口,对于 LoginServlet.java则继承MyGenericServlet类

    MyGenericServlet.java

     1 package com.jason.testweb;
     2 
     3 import java.io.IOException;
     4 import java.util.Enumeration;
     5 
     6 import javax.servlet.GenericServlet;
     7 import javax.servlet.Servlet;
     8 import javax.servlet.ServletConfig;
     9 import javax.servlet.ServletContext;
    10 import javax.servlet.ServletException;
    11 import javax.servlet.ServletRequest;
    12 import javax.servlet.ServletResponse;
    13 
    14 /**
    15  * 
    16  * @author:jason
    17  * @time:2016年5月18日
    18  * @description:自定义的Servlet 接口的实现类,,简化开发
    19  *
    20  */
    21 
    22 public abstract class MyGenericServlet implements Servlet {
    23 
    24     @Override
    25     public void destroy() {
    26     }
    27 
    28     @Override
    29     public ServletConfig getServletConfig() {
    30         return servletConfig;
    31     }
    32 
    33     private ServletConfig servletConfig; // 声明一个成员变量
    34 
    35     @Override
    36     public String getServletInfo() {
    37         return null;
    38     }
    39 
    40     @Override
    41     public void init(ServletConfig arg0) throws ServletException {
    42         this.servletConfig = arg0;
    43     }
    44 
    45     @Override
    46     // 声明为抽象方法,由每个继承的类的实现业务
    47     public abstract void service(ServletRequest arg0, ServletResponse arg1)
    48             throws ServletException, IOException;
    49 
    50 }

    LoginServlet.java

     1 package com.jason.testweb;
     2 
     3 import java.io.IOException;
     4 import java.io.PrintWriter;
     5 
     6 import javax.servlet.Servlet;
     7 import javax.servlet.ServletConfig;
     8 import javax.servlet.ServletContext;
     9 import javax.servlet.ServletException;
    10 import javax.servlet.ServletRequest;
    11 import javax.servlet.ServletResponse;
    12 
    13 public class LoginServlet extends MyGenericServlet {
    14 
    15     @Override
          //重写抽象方法
    16 public void service(ServletRequest request, ServletResponse response) 17 throws ServletException, IOException { 18 // 1.获取请求参数 19 String userName = request.getParameter("username"); 20 String passWord = request.getParameter("password"); 21 22 // 2.获取当前web 应用的初始化参数,user,password 23 ServletContext servletContext = getServletConfig().getServletContext(); 24 String initUser = servletContext.getInitParameter("user"); 25 String initPassword = servletContext.getInitParameter("password"); 26 27 PrintWriter out = response.getWriter(); 28 29 // 3.比对 30 // 4.打印响应字符串 31 if (initUser.equals(userName) && initPassword.equals(passWord)) { 32 out.print("hello :" + userName); 33 } else { 34 out.print("sorry :" + userName); 35 } 36 37 } 38 39 }

    2.关于GenericServlet

      public abstract class GenericServlet  extends java.lang.Object   implements    Servlet, ServletConfig, java.io.Serializable

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

    2)如果新建的Servlet 程序直接继承GenericServlet 更加简洁

    3)具体实现

     ①在GenericServlet 中声明了一个ServletConfig 类型的成员变量,在init(ServletConfig) 方法中对其初始化。

     ②不建议直接覆盖init(ServletConfig) ,因为如果调用super(ServletConfig),而还有ServletConfig接口的方法,则抛出空指针异常。int(){}方法不是sevlet的声明周期方法。而init(ServletConfig)是servlet的周期方法

     1   @Override
     2     public void init(ServletConfig config) throws ServletException {
     3         this.config = config;
     4         this.init();
     5     }
     6 
     7     /**
     8      * A convenience method which can be overridden so that there's no need to
     9      * call <code>super.init(config)</code>.
    10      * <p>
    11      * Instead of overriding {@link #init(ServletConfig)}, simply override this
    12      * method and it will be called by
    13      * <code>GenericServlet.init(ServletConfig config)</code>. The
    14      * <code>ServletConfig</code> object can still be retrieved via
    15      * {@link #getServletConfig}.
    16      * 
    17      * @exception ServletException
    18      *                if an exception occurs that interrupts the servlet's
    19      *                normal operation
    20      */
    21     public void init() throws ServletException {
    22         // NOOP by default
    23     }

    ②利用了servletConfig 成员变量的方法实现了ServletConfig 接口的方法(以下是GenericServlet 的方法源码)

     1  @Override
     2     public String getInitParameter(String name) {
     3         return getServletConfig().getInitParameter(name);
     4     }
     5 
     6  @Override
     7     public Enumeration<String> getInitParameterNames() {
     8         return getServletConfig().getInitParameterNames();
     9     }
    10 
    11  @Override
    12     public ServletConfig getServletConfig() {
    13         return config;
    14     }
    15 
    16  @Override
    17     public ServletContext getServletContext() {
    18         return getServletConfig().getServletContext();
    19     }
    20 
    21 @Override
    22     public String getServletName() {
    23         return config.getServletName();
    24     }

    3.总结

     1)深刻理解servletConfig对象

     2)java的封装,继承特性

  • 相关阅读:
    Java子类与父类的初始化
    悠哈牛奶糖为什么有五种味道单独装的,而不是混合装的
    C++ TinyXml操作(含源码下载)
    动物园海洋馆
    冰上行走
    Tmux : GNU Screen 的替代品
    考虑使用jruby
    关于一些展现的框架
    python抓取google搜索url
    pythonwebkit
  • 原文地址:https://www.cnblogs.com/jasonHome/p/5506810.html
Copyright © 2020-2023  润新知