Servlet(8)—GenericServlet和改进Servlet实例
- 概念genericservlet是个抽象的父类,必须给出子类才能实例化它。它给出了设计servlet的一些骨架,定义了servlet生命周期,还有一些得到名字、配置、初始化参数的方法,其设计的是和应用层协议无关的,也就是说你有可能用非http协议实现它(其实目前Java Servlet还是只有Http一种)。
- 该类实现了Servlet, ServletConfig,接口,所以解决了使用Servlet类时必须要实现Servlet的所有方法这个问题,使用Servlet时可以继承genericServlet即可,此时只需要实现一个抽象方法service()就行,其他方法,需要时在重写或者调用
注意:
GenericServlet自己写也行,jdk提供的也有,解决了多余方法的问题。
package com.test.web;
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;
/***
* 自定义Sevlet实现类,使用时可以不需要写出全部的方法,只需要实现一个抽象方法,其他的方法用到时再写。
* 该类实现了两个接口,Servlet、ServletConfig
*/
public abstract class MyGenericServlet implements Servlet ,ServletConfig{
private ServletConfig servletConfig;
/**
* 以下方法继承自Servlet
*/
@Override
public void destroy() { }
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
this.servletConfig = arg0;
init();
}
public void init() throws ServletException {
}
/***
* 该方法必须要实现,所以使用abstract关键字修饰成抽象方法,所以该类也就是抽象类
*/
@Override
public abstract void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException;
/**
* 以下方法继承自ServletConfig
*/
//获取请求中的指定参数的参数值
@Override
public String getInitParameter(String arg0) {
return servletConfig.getInitParameter(arg0);
}
//获取Enumeration对象
@Override
public Enumeration<String> getInitParameterNames() {
return servletConfig.getInitParameterNames();
}
//获取ServletContext对象
@Override
public ServletContext getServletContext() {
return servletConfig.getServletContext();
}
//获取Servlet的名称
@Override
public String getServletName() {
return servletConfig.getServletName();
}
}
一个Servlet
/**
* 该类改进了因为实现Servlet接口而产生的多余方法
*但是获取请求方式的方法需要修改
*/
public class LoginServlet2 extends MyGenericServlet {
/**
* 该方法覆盖了父类中的init(ServletConfig config)方法,导致父类中的init方法没有运行,
* 出现空值针异常。该方法想要执行就需要:在父类中写一个空参的init方法覆盖掉,在父类中也可以调用被覆盖的方法,
* 只是具体执行时会执行子类重写的方法,或者直接覆盖掉父类中带参的init方法,但是在方法中写上super.init(config)
* 这句话,显式调用一下即可。
*/
/*@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("初始化...");
}*/
@Override
public void init() throws ServletException {
System.out.println("初始化...");
}
@Override
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
//获取请求的方式
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String method = httpServletRequest.getMethod();
System.out.println("请求方式:" + method);
//1.获取请求参数username,password(获取的是表单信息)
String username = request.getParameter("username");
String password = request.getParameter("password");
//2.获取当前web应用的初始化参数user,password。
String initUser = getServletContext().getInitParameter("user");
String initPassword = getServletContext().getInitParameter("password");
PrintWriter out = response.getWriter();
//3.比对
if(initUser.equals(username) && initPassword.equals(password)){
//4.打印响应字符串
out.println("Hello: " + username);
}else{
out.println("Sorry: " + username);
}
}
}
一个页面
<body>
<form action="loginServlet" method="get">
user:<input type="text" name="user"/>
<br>
password:<input type="password" name="password"/>
<br>
interesting:
<input type="checkbox" name="interesting" value="read"/>read
<input type="checkbox" name="interesting" value="walk"/>walk
<input type="checkbox" name="interesting" value="swing"/>swing
<input type="checkbox" name="interesting" value="shopping"/>shopping
<input type="checkbox" name="interesting" value="tv"/>TV
<br>
<input type="submit" value="Submit"/>
</form>
</body>
Servlet(8)—GenericServlet和改进Servlet实例的更多相关文章
- Servlet(9)—HttpServlet和改进Servlet实例
HttpServlet:针对Http协议定义的一个Servlet基类,唯一的功能就是强制类型转换ServletRequest转换成HttpServletRequest,ServletResponse转 ...
- Servlet笔记6--Servlet程序改进
第一步改进,GenericServlet: 我们目前所有放入Servlet类直接实现了javax.servlet.Servlet接口,但是这个接口中有很多方法是目前不需要的,我们可能只需要编写serv ...
- servlet 之 GenericServlet抽象类详解
GenericSerlvet抽象类源码如下: package javax.servlet; import java.io.IOException; import java.util.Enumerati ...
- servlet、genericservlet、httpservlet之间的区别
转自:http://blog.csdn.net/rat9912345/article/details/5161789 当编写一个servlet时,必须直接或间接实现servlet接口,最可能实现的方法 ...
- 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 ...
- Servlet课程0424(二) 通过继承GenericServlet来开发Servlet
//这是第二种开发servlet的方法(继承GernericServlet) package com.tsinghua; import javax.servlet.GenericServlet; im ...
- app开发历程---1,servlet 返回JSON作为android 接口实例
最近公司领导要做app,虽然以前自己是做app的测试的,但是好多东西都不是很明白,这里记录自己这段日子的历程. 1.搭建服务器端,以前做测试的时候,他们用的是Apache+mysql+php,而自己上 ...
随机推荐
- C#使用Emit生成构造函数和属性
假设我们需要一个名叫Kitty的类,其在Pets程序集下. 1 // specify a new assembly name 2 var assemblyName = new AssemblyName ...
- maven安装和eclipse集成
maven作为一个项目构建工具,在开发的过程中很受欢迎,可以帮助管理项目中的bao依赖问题,另外它的很多功能都极大的减少了开发的难度,下面来介绍maven的安装及与eclipse的集成. maven的 ...
- bzoj4773: 负环
题解: 网上还有一种spfa+深度限制的算法 https://www.cnblogs.com/BearChild/p/6624302.html 是不加队列优化的spfa,我觉得复杂度上限是bellma ...
- 【AtCoder】ARC071
ARC071 C - 怪文書 / Dubious Document 题目大意:给n个字符串,每个字符串可以通过扔掉一些字母将剩下的字母重排得到新的字符串,求n个字符串都能拼出的字符串且长度最大,若有多 ...
- eclipse发布后在tomcat下没有文件夹,服务器的Server locations不能修改
主要是因为Server locations中的deploy路径不正确,要修改这个路径,需要移除服务器中的所有项目,然后点击清空,这时再双击服务器,既可修改这个设置.
- Flink--Table和DataStream和DataSet的集成
将DataStream或DataSet转换为表格 在上面的例子讲解中,直接使用的是:registerTableSource注册表 对于flink来说,还有更灵活的方式:比如直接注册DataStream ...
- Python学习(十三) —— 网络编程
一.操作系统基础 操作系统(Operating System):OS是管理和控制计算机硬件和软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行 ...
- UOJ#310 【UNR #2】黎明前的巧克力 FWT 多项式
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ310.html 题目传送门 - UOJ#310 题意 给定 $n$ 个数 ,请你选出两个不相交的集合(两个 ...
- JavaSE| 网络编程
URL URI(Uniform resource identifier):表示一个统一资源标识符 (URI) 引用,用来唯一的标识一个资源. URL(Uniform Resource Locator) ...
- day21 模块 异常处理
常用模块:http://www.cnblogs.com/Eva-J/articles/7228075.html 今日概要: #time # —— 时间:时间戳 字符串 结构化时间 #collectio ...