本篇主要记录下,对GenericServlet的作用理解,及其与Servlet/HttpServlet之间的关系。

  • 示例完成业务:

1、新建一个login.jsp页面,要求改页面能输入username,password,login.jsp提交页面,对应的处理servlet为LoginServlet;

2、在J2EE环境下,新建一个Dynamic Web Project工程,之后给该工程创建一个LoginServlet servlet类;

3、LoginServlet 完成业务为,获取全局初始化参数信息:username,password的值,那这两个值与从login.jsp页面获取到的值就行对比,如果context-param:username=form:username且context-param:password=form:password,则向客户端返回:

context-param:username:xxx

context-param:password:yyy

form:username:xxx

form:password:yyy

ok!

否则,返回:

context-param:username:xxx

context-param:password:yyy

form:username:xx

form:password:zzz

error!

思路:以前我们都是要写LoginServlet实现Servlet接口类的函数,那现在我们想把LoginServlet代码变得更简洁,我们把一些不常用的代码放在一个抽象Servlet类中,我们的LoginServlet来继承该抽象Servlet类。

1、定义一个MyGenericServlet类,并将该类实现Servlet接口:

 public abstract class MyGenericServlet implements Servlet{
private ServletConfig servletConfig; public MyGenericServlet() {
} @Override
public void destroy() {
} @Override
public ServletConfig getServletConfig() {
return this.servletConfig;
} @Override
public String getServletInfo() {
return "";
} @Override
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig = servletConfig;
this.init();
} public void init() throws ServletException {
} @Override
public abstract void service(ServletRequest request, ServletResponse response) throws ServletException, IOException;
}

2、把service方法修改为一个抽象函数,因为不管哪个继承该类的servlet类都要进行与客户端进行交互(接收客户端信息,响应客户端信息),而service方法是servlet与客户端进行交互的唯一生命周期方法。

3、如果把service方法变为抽象类,我们必须要把这个类变为一个抽象类。

4、为了让子类LoginServlet更好的使用上下文函数,我们实现了getServletConfig()方法:定义一个局部变量,并在init(ServletConfig servletConfig)方法中给该局部变量赋值,这样我们就可以在getServletConfig()中返回这个局部变量即可。

备注:为什么我们要实现servletConfig()方法呢?------在我们业务中提到我们要获取web.xml的全局初始化参数信息,那么我们必须找到ServletContext对象,而找到ServletContext对象,在servlet交互过程中,我们可以通过ServletConfig的getServletContext()方法获取ServletContext对象。

5、添加一个init()函数,为什么添加呢?

比如说我在LoginServlet中要对servlet初始化时,进行一些工作,那么我就会覆盖init(ServletConfig servletConfig)方法,如果这是我又不知道父类干了什么工作,就想当然的把父类实现给注释掉:

 @Override
public void init(ServletConfig servletConfig) throws ServletException {
//super.init(servletConfig);
}

这是在运行程序就会抛出 一个空指针异常。

因为如果覆盖了父类的init(ServletConfig servletConfig)方法时,把supper.init(servletConfig)给注释了,那么在父类的init(ServletConfig servletConfig)函数中的给局部变量servletConfig赋值部分就不会执行了,那么当我们使用ServletConfig对象(调用getServletConfig()方法获取到的)时,就会抛出空指针错误。

为了避免这种情况,我们就自定义了一个init()方法,让MyGenericServlet的init(ServletConfig servletConfig)方法调用它,当子类需要在初始化时做的事情,就可以通过覆盖init()方法使用。

6、从上边业务上来说我们能推断出在LoginServlet的service(ServletRequest request,ServletResponse response)方法中,获取全局初始化参数时,需要这样写:

 ServletContext servletContext=getServletConfig().getServletContext();
String username=servletContext.getInitParameter("username");
String password=servletContext.getInitParameter("password");

那如果是获取servlet局部初始化变量时,我们需要这样写:

String username=getServletConfig().getInitParameter("username");
String password=getServletConfig().getInitParameter("password");

那么,如果我们让抽象类MyGenericServlet实现接口ServletConfig,我们是不是在LoginServlet中就可以这样获取局部初始化变量:

String username=this.getInitParameter("username");
String password=this.getInitParameter("password");

这样代码是不是会更简洁呢.

因此我们修改后的MyGenericServlet类,是这个样子:

 package com.dx.hiservlet;

 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; public abstract class MyGenericServlet implements Servlet,ServletConfig {
private ServletConfig servletConfig; public MyGenericServlet() {
} @Override
public void destroy() {
} @Override
public ServletConfig getServletConfig() {
return this.servletConfig;
} @Override
public String getServletInfo() {
return "";
} @Override
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig = servletConfig;
this.init();
} public void init() throws ServletException {
} @Override
public abstract void service(ServletRequest request, ServletResponse response) throws ServletException, IOException; @Override
public String getInitParameter(String arg0) {
return this.getServletConfig().getInitParameter(arg0);
} @Override
public Enumeration<String> getInitParameterNames() {
return this.getServletConfig().getInitParameterNames();
} @Override
public ServletContext getServletContext() {
return this.getServletConfig().getServletContext();
} @Override
public String getServletName() {
return this.getServletConfig().getServletName();
} }

login.jsp:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="LoginServlet" method="POST">
username:<input type="text" name="username" />
<br />
password:<input type="text" name="password" />
<br />
<input type="submit" value="submit" />
</form>
</body>
</html>

LoginServlet类

 package com.dx.hiservlet;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class LoginServlet extends MyGenericServlet {
public LoginServlet() {
} @Override
public void init() {
System.out.println("init....");
} @Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String username = servletContext.getInitParameter("username");
String password = servletContext.getInitParameter("password"); String formUserName = request.getParameter("username");
String formPassword = request.getParameter("password"); PrintWriter writer = response.getWriter(); writer.println("context-param:username:"+username);
writer.println("context-param:password:"+password); writer.println("form:username:"+formUserName);
writer.println("form:password:"+formPassword); if (username.equals(formUserName) && password.equals(formPassword)) {
writer.println("ok!");
} else {
writer.println("error!");
}
} }

web.xml配置映射,全局初始化参数“:

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<context-param>
<param-name>username</param-name>
<param-value>111</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>111</param-value>
</context-param> <servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>com.dx.hiservlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping> </web-app>

测试地址:http://localhost:8080/MyGenericServlet001/login.jsp

我们为什么定义一个这样的MyGenericServlet呢,目的是为了学习GenericServlet,从GenericServlet源代码中,我们可以发现我们上边写的这个MyGenericServlet与GenericServlet基本相同,我们把LoginServlet继承类改为GenericServlet,运行结果一样。

那么GenericServlet与Servlet之间的关系,相信我们都清楚了,那么GenericServlet与HttpServlet之间是什么关系呢?

我们去查看下HttpServlet的源代码:

 public abstract class HttpServlet extends GenericServlet
implements Serializable
{
。。。
}

但从Servlet API上来看,HttpServlet要比Servlet,GenricServlet内容更多,具有大量http相关的信息。

具体细节,请参考Servlet Api.

Java Servlet(五):GenericServlet与Servlet、HttpServlet之间的关系(jdk7+tomcat7+eclipse)的更多相关文章

  1. Java Servlet(四):Servlet接口service工作(ServletRequest,ServletResponse对象)(jdk7+tomcat7+eclipse)

    本篇将会记录,Servlet接收客户端传递来的参数信息,并返回信息使用的对象,及这些对象的函数相关用法. 还是在java ee工程中进行操作,在WebContent目录下创建一个login.jsp文件 ...

  2. Java Servlet(六):HttpServlet实现原理(jdk7+tomcat7+eclipse)

    本篇记录了HttpServlet的实现过程,主要讲述了如何依赖Servlet,GenericServlet实现的原理. HttpServlet实现过程:1.是一个Servlet,继承自GenericS ...

  3. Java Servlet(七):JavaWeb MVC 操作(jdk7+tomcat7+eclipse)

    之前一段时间一直忙于毕业设计,也没有空学习了,本篇继续学习. 本篇将开始学习java web下使用servlet下来操作数据库,并展示到界面上的使用方法. 新建工程ServletMvc001. 目录结 ...

  4. Java Servlet(一):创建工程(jdk7+tomcat7+eclipse)

    本篇文件主要记录下怎么在jdk7+tomcat7下,使用eclipse创建并运行一个servlet工程. 安装具体步骤从网上搜索就可以找到,这里不再赘述. 在eclipse中切换到j2ee下, 从导航 ...

  5. Java Servlet(二):servlet配置及生命周期相关(jdk7+tomcat7+eclipse)

    该篇文章记录了Servlet配置相关用法及Servlet在Servlet容器中生命周期方法. Tomcat是一个Servlet容器: 1.Servlet容器管理了Servlet的整个生命周期,并调用s ...

  6. java内存模型及内存与cpu之间的关系

    主内存和cpu之间的关系,因为cpu是在是处理速度太快了.所以一般cpu都有一个cpu缓存,上图的意思是主内存--->cpu缓存--->cpu寄存器--->cpu执行处理,写的时候反 ...

  7. JAVA面向对象-----接口与类、接口之间的关系

    接口与类.接口之间的关系 大家之前都知道类与类之间的关系继承,那么接口与类之间又是怎样子的关系呢? 接口与类之间是实现关系.非抽象类实现接口时,必须把接口里面的所有方法实现.类实现接口用关键字impl ...

  8. Java中接口与接口和类之间的关系

    接口和接口之间的关系 继承关系 可以多继承,并且可以多层继承 注意: 1.如果多个父接口中有同名的抽象方法,那么子接口只需要实现一次即可 2.如果多个父接口中有同名的默认方法,那么子接口必须重写默认方 ...

  9. 玩转Web之servlet(五)---- 怎样解决servlet的线程安全问题

    servlet默认是存在线程安全问题的,但是说白了,servlet的线程安全问题实际上就是多线程的线程安全问题,因为servlet恰巧是一个多线程才会出现安全性问题. 浏览器每次通过http协议去提交 ...

随机推荐

  1. 5分钟windows wamp php安装phpunit 2015最新安装实践

    16:11 2015/11/235分钟windows wamp php安装phpunit 2015最新安装实践我花了一个下午和一个上午的时间注意:步骤中添加环境变量多的时候要保存很多步,知道窗口都自动 ...

  2. Android --日期控件使用并显示选择的日期

    1. main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: ...

  3. 【JAVA】Spring 数据源配置整理

            在Spring中,不但可以通过JNDI获取应用服务器的数据源,也可以直接在Spring容器中配置数据源,此外,还可以通过代码的方式创建一个数据源,以便进行无依赖的单元测试. 配置数据源 ...

  4. hdu1232 并查集

    1. hdu1232 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232 3.总结:简单并查集 #include<iostream> # ...

  5. 李洪强iOS经典面试题132-版本控制

    面试过程中,可能会问及一些关于版本控制的问题,理解下SVN和Git的原理,记住常用命令即可. SVN SVN 是集中式源代码管理工具 概念: 1> Repository 代码仓库,保存代码的仓库 ...

  6. Java中的try,catch,finally

    讲解的是关于java中关于try.catch.finally中一些问题 下面看一个例子(例1),来讲解java里面中try.catch.finally的处理流程 public class TryCat ...

  7. mysql安装及卸载

    一.关于mysql MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是 ...

  8. oracle中删除表中某字段出现重复的信息 保留其中一条

    记得以前有个同事问过我这个,说是以前面试的时候碰到的问题,下面我介绍三种方法. 首先我们在这里创建一个测试表添加相应的测试数据. create table test  (id number,name ...

  9. 使用ftp软件上传下载php文件时换行丢失bug

    正 文:   在使用ftp软件上传下载php源文件时,我们偶尔会发现在本地windows下notepad++编辑器写好的php文件,在使用ftp上传到linux服务器后,php文件的换行符全部丢失了, ...

  10. tab左右箭头切换

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...