GenericServlet
Generic-汉语意思:类的adj
GenericServlet是一个抽象类,它的源码很容易看懂,继承Servlet接口和ServletConfig接口
所有它里面有父接口里面的方法,所以它就是在Servlet的基础上把一些功能给封装起来了(省的我们手写了)。把ServletConfig给保存下来,以便使用它可以获得其他值。
它里面有这些方法(部分)
void destroy()
String getInitParameter(string name)
Enumeration getInitParameterNames()
ServletConfig getServletConfig()
ServletContext getServletContext()
...
模拟GenericServlet抽象类
package one.servlet; import java.io.IOException; import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; //模拟GenericServlet类
public class BServlet implements Servlet{
private ServletConfig config;//一个成员 @Override
public void destroy() {
System.out.println("啊,我要死了!");
}
//这个方法一定会在init()方法之后被调用!
//init()被调用后,本类的成员this.config已经有值了!
@Override
public ServletConfig getServletConfig() {
return this.config;
}
//没有用的东西
@Override
public String getServletInfo() {
return "用字符串简单描述Servlet";
}
/*
* 由Tomcat来调用,并且调用一次
* 它是这些方法中第一个被调用的,它会在构造器之后马上被调用(先创建对象,再调用方法)!
* */
@Override
public void init(ServletConfig config) throws ServletException {
//把Tomcat传递的ServletConfig赋值给本类的一个成员,其实就是把它保存起来,方便在其他地方用
this.config=config;
} @Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
System.out.println("每次处理请求都会被调用!");
} public ServletContext getServletContext(){
return config.getServletContext();
} public String getInitParameter(String name){
return config.getInitParameter(name);
}
//等等方法都可以模拟GenericServlet里的方法
}
其他Servlet可以继承上述的模拟GenericServlet(也就是继承BServlet),但是如果重写init()方法,就会覆盖父类中的this.config=config;然后该类中的部分其他方法将不能使用。
解决方案:
父类BServlet
@Override
public void init(ServletConfig config) throws ServletException {
//把Tomcat传递的ServletConfig赋值给本类的一个成员,其实就是把它保存起来,方便在其他地方用
this.config=config;
init();
}
//本类定义的方法,不是Servlet接口中的方法。
public void init(){ }
子类CServlet
package one.servlet;
public class CServlet extends BServlet{
//服务器不会调用这个方法,但是会调用父类有参的init方法,然后再去掉用父类的init无参的方法
@Override
public void init() {
System.out.println("子类的CServlet重载之后的方法");
}
}
从而在请求CServlet的时候,就会执行重写过后init方法中的代码。
也就是子类继承了父类有参的init()方法,服务器调用有参的之后,然后再去调用init();这个调用
总结:解决了数据库所给的config的保存问题,以及子类重写init()方法后的问题。这就是GenericServlet的原理。
使用GenericServlet
DServlet.java
package one.servlet; import java.io.IOException; import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class DServlet extends GenericServlet {
//要想在出生时笑一笑,覆盖无参的init() @Override
public void init() throws ServletException {
System.out.println("哈哈,我出生了!");
} @Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("hello world!");
} //死的時候留遺言
@Override
public void destroy() {
System.out.println("我走了");
}
}
web.xml配置
//部分配置
<servlet>
<servlet-name>xx</servlet-name>
<servlet-class>one.servlet.DServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>xx</servlet-name>
<url-pattern>/DServlet</url-pattern>
</servlet-mapping>
请求DServlet--http://localhost:8080/XJS_Servlet1/DServlet
哈哈,我出生了!
hello world!
GenericServlet的更多相关文章
- Servlet 之 GenericServlet
我们都知道javaweb中servlet的三大组件 servlet filter listener 实现动态资源的 是可以继承 Servlet接口,或者集成GenericServlet .Http ...
- servlet、genericservlet、httpservlet之间的区别
转自:http://blog.csdn.net/rat9912345/article/details/5161789 当编写一个servlet时,必须直接或间接实现servlet接口,最可能实现的方法 ...
- Java Servlet(五):GenericServlet与Servlet、HttpServlet之间的关系(jdk7+tomcat7+eclipse)
本篇主要记录下,对GenericServlet的作用理解,及其与Servlet/HttpServlet之间的关系. 示例完成业务: 1.新建一个login.jsp页面,要求改页面能输入username ...
- servlet实现的三种方式对比(servlet 和GenericServlet和HttpServlet)
第一种: 实现Servlet 接口 第二种: 继承GenericServlet 第三种 继承HttpServlet (开发中使用) 通过查看api文档发现他们三个(servlet 和GenericSe ...
- Servlet,GenericServlet和HttpServlet的继承关系
HttpServlet是GenericServlet的子类. GenericServlet是个抽象类,必须给出子类才能实例化.它给出了设计servlet的一些骨架,定义了servlet生命周期,还有一 ...
- servlet、genericservlet、httpservlet之间的区别(转)
当编写一个servlet时,必须直接或间接实现servlet接口,最可能实现的方法就是扩展javax.servlet.genericservlet或javax.servlet.http.httpser ...
- GenericServlet,HttpServletRequest和HttpServletResponse
最基本的是通过实现Servlet接口来编写Servlet类,这需要实现Servlet接口中定义的5个方法. 为了简化Servlet的编写,在javax.servlet包中提供了一个抽象类Generic ...
- Servlet课程0424(二) 通过继承GenericServlet来开发Servlet
//这是第二种开发servlet的方法(继承GernericServlet) package com.tsinghua; import javax.servlet.GenericServlet; im ...
- servlet三种实现方式之二继承GenericServlet开发
servlet有三种实现方式: 1.实现servlet接口 2.继承GenericServlet 3.通过继承HttpServlet开发servlet 第二种示例代码如下(已去掉包名): //这是第二 ...
- Servlet(二)GenericServlet
以GenericServlet创建Servlet 1.在FirstServlet同文件夹下建立GServlet.java package com.hunhun; import javax.servle ...
随机推荐
- Centos6.X搭建Squid为YUM做代理
1.在能联网的机器上安装 Squid yum install squid 2.配置squid vi /etc/squid/squid.conf 编辑内容如下: http_port cache_mem ...
- IEnumerable<T>和IQueryable<T>区别
LINQ查询方法一共提供了两种扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了IEnumerable<T>接口的集合进行扩展:Queryab ...
- JAVA中的栈和堆【转】
原文链接 https://www.cnblogs.com/ibelieve618/p/6380328.html JAVA在程序运行时,在内存中划分5片空间进行数据的存储.分别是:1:寄存器.2:本地方 ...
- 将DataTable转换为List<T>对象遇到问题:类型“System.Int64”的对象无法转换为类型“System.Int32”。
可以利用反射将DataTable转换为List<T>对象:原始链接http://www.jb51.net/article/67386.htm 但是该方法在DataTable里某个字段类型是 ...
- 【MySql】常用方法总结
将一个字段分组,统计每组重复个数,并排序 SELECT Customer, OrderDate, count(*) as Num FROM `all_orders` GROUP BY Customer ...
- SpringBoot 多数据源分布式事务
1.pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- Python内置模块之configparse
一.概述 1.1.处理的文件形式 configparse 主要是用来处理类似于windows的 ini文件,这个文件的特点是有多个节(section),每个节下会存储多个k=v的值 如下配置 [har ...
- Linux 查看负载内存
负载 内存 1.作用 top命令用来显示执行中的程序进程,使用权限是所有用户. 2.格式 top [-] [d delay] [q] [c] [S] [s] [i] [n] 3.主要参数 ...
- Intervals 差分约束
题意:给定n个区间[Li,Ri]以及n个整数vi. 现在要有一个集合,使得这个集合和任意[Li,Ri]都有 至少 vi个元素相同. 问这个集合最少要几个元素. 定义S(x) 表示[1,x]中选择的元素 ...
- Innodb与Myisam引擎的区别与应用场景
1. 区别: (1)事务处理: MyISAM是非事务安全型的,而InnoDB是事务安全型的(支持事务处理等高级处理): (2)锁机制不同: MyISAM是表级锁,而InnoDB是行级锁: (3)sel ...