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 ... 
随机推荐
- Pycharm新建模板默认添加作者时间等信息
			在pycharm使用过程中,对于每次新建文件的shebang行和关于代码编写者的一些个人信息快捷填写,使用模板的方式比较方便. 方法如下: 1.打开pycharm,选择File-Settings 2. ... 
- java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
			♦ 问题所在:项目lib包里少一个jar包 ♦ 解决办法: commons-lang3-3.1.jar 导入到项目就ok 
- 【easy】100. Same Tree
			判断两棵二叉树是否相等 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left ... 
- 【原创】大叔问题定位分享(2)spark任务一定几率报错java.lang.NoSuchFieldError: HIVE_MOVE_FILES_THREAD_COUNT
			最近用yarn cluster方式提交spark任务时,有时会报错,报错几率是40%,报错如下: 18/03/15 21:50:36 116 ERROR ApplicationMaster91: Us ... 
- STM32F0使用LL库实现MS5536C通讯
			在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.在本文中我们说明一下,使用LL库实现MS5 ... 
- SSM(SpringMVC Spring Mybatis)框架整合搭建
			1.新建一个web工程. 2.首先看一下整体的框架结构: 3.将ssm框架搭建所需要的jar包复制到lib目录下 3.需要配置各个配置文件. 1)配置web.xml文件: <?xml versi ... 
- kubenetes 环境的塔建
			最近听我朋友说他们公司准备上云,全线把服务迁到 k8s 上面,一下感觉,我们就 lower 了不少,之前服务器一直跑的就是 docker ,想想弄到 k8s 应该还是没有啥,于是我们也开始改造了 参考 ... 
- Linux系统挂载Windows系统下的共享文件
			声明:本文是小编借鉴大神们的经验,仅供学习使用. 第一步:在Windows系统上选择要共享的文件夹,右击“属性”-“共享”-“高级共享”-勾选“共享此文件”-设置共享名-“权限”-“添加”-“高级”- ... 
- Spark之join、leftOuterJoin、rightOuterJoin及fullOuterJoin
			Spark的join与mysql的join类似,mysql的join是将表与表之间连接查询,spark中join是将RDD数据集进行连接,Spark主要有join.leftOuterJoin.righ ... 
- 原生js实现双向数据绑定
			一.两个model之间的双向绑定 var o = { a: 0 } o.b = o.a + 1; console.log(o.a); // "0" console.log(o.b) ... 
