Java Servlet(五):GenericServlet与Servlet、HttpServlet之间的关系(jdk7+tomcat7+eclipse)
本篇主要记录下,对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)的更多相关文章
- Java Servlet(四):Servlet接口service工作(ServletRequest,ServletResponse对象)(jdk7+tomcat7+eclipse)
本篇将会记录,Servlet接收客户端传递来的参数信息,并返回信息使用的对象,及这些对象的函数相关用法. 还是在java ee工程中进行操作,在WebContent目录下创建一个login.jsp文件 ...
- Java Servlet(六):HttpServlet实现原理(jdk7+tomcat7+eclipse)
本篇记录了HttpServlet的实现过程,主要讲述了如何依赖Servlet,GenericServlet实现的原理. HttpServlet实现过程:1.是一个Servlet,继承自GenericS ...
- Java Servlet(七):JavaWeb MVC 操作(jdk7+tomcat7+eclipse)
之前一段时间一直忙于毕业设计,也没有空学习了,本篇继续学习. 本篇将开始学习java web下使用servlet下来操作数据库,并展示到界面上的使用方法. 新建工程ServletMvc001. 目录结 ...
- Java Servlet(一):创建工程(jdk7+tomcat7+eclipse)
本篇文件主要记录下怎么在jdk7+tomcat7下,使用eclipse创建并运行一个servlet工程. 安装具体步骤从网上搜索就可以找到,这里不再赘述. 在eclipse中切换到j2ee下, 从导航 ...
- Java Servlet(二):servlet配置及生命周期相关(jdk7+tomcat7+eclipse)
该篇文章记录了Servlet配置相关用法及Servlet在Servlet容器中生命周期方法. Tomcat是一个Servlet容器: 1.Servlet容器管理了Servlet的整个生命周期,并调用s ...
- java内存模型及内存与cpu之间的关系
主内存和cpu之间的关系,因为cpu是在是处理速度太快了.所以一般cpu都有一个cpu缓存,上图的意思是主内存--->cpu缓存--->cpu寄存器--->cpu执行处理,写的时候反 ...
- JAVA面向对象-----接口与类、接口之间的关系
接口与类.接口之间的关系 大家之前都知道类与类之间的关系继承,那么接口与类之间又是怎样子的关系呢? 接口与类之间是实现关系.非抽象类实现接口时,必须把接口里面的所有方法实现.类实现接口用关键字impl ...
- Java中接口与接口和类之间的关系
接口和接口之间的关系 继承关系 可以多继承,并且可以多层继承 注意: 1.如果多个父接口中有同名的抽象方法,那么子接口只需要实现一次即可 2.如果多个父接口中有同名的默认方法,那么子接口必须重写默认方 ...
- 玩转Web之servlet(五)---- 怎样解决servlet的线程安全问题
servlet默认是存在线程安全问题的,但是说白了,servlet的线程安全问题实际上就是多线程的线程安全问题,因为servlet恰巧是一个多线程才会出现安全性问题. 浏览器每次通过http协议去提交 ...
随机推荐
- 【BZOJ】1225: [HNOI2001] 求正整数
http://www.lydsy.com/JudgeOnline/problem.php?id=1225 题意:给一个数n,求一个最小的有n个约数的正整数.(n<=50000) #include ...
- 【BZOJ1012】 【JSOI2008】最大数maxnumber
Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. 2. ...
- jquery.autocomplete在火狐下的BUG解决
该插件在火狐下使用拼音输入法输入,回车后无法即使响应事件,需要再输入别的字母才会响应事件 主要原因: 该插件响应主要监听了keydown事件 其他浏览器在打开中文输入法的情况下输入的拼 ...
- LaTex Font Size 字体大小命令
LaTex中字体大小有很多中等级,分别由下列命令控制: \tiny \scriptsize \footnotesize \small \normalsize \large \Large \LARGE ...
- 利用SQL注入漏洞登录后台的实现方法 。。。。转载
一.SQL注入的步骤 a) 寻找注入点(如:登录界面.留言板等) b) 用户自己构造SQL语句(如:' or 1=1#,后面会讲解) c) 将sql语句发送给数据库管理系统(DBMS) d) DBMS ...
- POJ 3321 树状数组(+dfs+重新建树)
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 27092 Accepted: 8033 Descr ...
- javascript通过时区获取时间
/* 描述:时区的换算 参数:offset时区位置 使用:东八区calcTime(”+8"); */ function calcTime(offset) { // 创建一个本地日期 var ...
- SQL Server如何添加登录名
1.电脑上如果安装有SQL Server,我们在开始里面打开SQL Server Management Studio,或者以桌面的快捷方式等打开SQL Server. 2.首先以Windows身份验证 ...
- 使用smtp和pop3 协议收发qq邮箱实验
email系统组件:MTA 消息传输代理,负责邮件的路由,队列和发送SMTP 简单邮件传输协议1 连接到服务器2 登陆3 发出服务请求4 退出POP:邮局协议RFC918 "邮局协议的目的是 ...
- BizTalk动手实验(九)业务规则引擎使用
1 课程简介 通过本课程熟悉业务规则引擎(BRE)的使用(本环境为Windows 2008 32位操作系统环境 + Visual Studio 2010 + BizTalk 210) 2 准备工作 1 ...