目录
2.3 优化2.2例子(使用GenericServlet抽象类)
GenericServlet类,这个类使用的不是很多,了解一下即可
一、知识点
GenericServlet :
1.是一个Serlvet.是Servlet接口和ServletConfig接口的实现类。但是一个抽象类。 其中的service方法为抽象方法扫描二维码关注公众号,回复: 11303317 查看本文章2.如果新建的Servlet程序直按继承GenericSerlvet会使开发更简洁。
3.具体实现:
1)在Genericservlet中声明了-个SerlvetConfig类型的成员交量,在init(ServletConf1g)方法中对其进行了初蛤化
2)利用serv1etConfig成员交量的方法实现了Serv1etConfig接口的方法
3)还定义了一个init() 方法,在init(SerlvetConfig) 方法中对其进行调用,子奥可以直接覆盖init() 在其中实现对Servlet 的初始化
4)不建议直按覆盖init(ServletConfig), 因为如果忘记编写super(ServletConfig), 而还是用了Ser1vetconfig 接口的方法,
则会出现空指计异常。
JEE API中的关系为
二、例子
2.1 例1 使用GenericServlet接口之前
2.1.1 需求
在web. xml文件中设置两个WEB应用的初始化参数,user, password.定义-个1ogin.html,里边定义两个请求字段: user, password. 发送请求到loginServlet在创建一个LoginServlet,在其中获取请求的user, password. 比对其和web.xml文件中定义的请求参数是否一若一致,响应Hel1o:xxx,若不一致,响应Sorry: xxxxx为user.
2.1.2 实现代码
1 web.xml配置
为了方便在web.xml的<context-param>放置用户名和密码,并设备路由映射。
下面设置用户名为t1,密码为789
<!-- 这个是在<servlet>外面,不是它的二级配置-->
<context-param>
<param-name>user</param-name>
<param-value>t1</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>789</param-value>
</context-param><servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/loginServlet</url-pattern>
</servlet-mapping>
2 创建login.html
web-->login.html代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<form action="loginServlet" method="post">
用户: <input type="text" name="username" />
密码: <input type="password" name="password" />
<input type="submit" value="提交"/>
</form>
</body>
</html>
3 创建LoginServlet.java
src-->LoginServlet.java
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
public class LoginServlet implements Servlet {
private ServletConfig MyservletConfig;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.MyservletConfig=servletConfig;
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//1. 获取请求参数: username, password
String username = servletRequest.getParameter("username");
String password = servletRequest.getParameter("password");
//2. 获取当前WEB应用的初初化参数: user, password
// 需要使用 servletConfig 对象。
ServletContext servletContext = MyservletConfig.getServletContext();
String initUser = servletContext.getInitParameter("user");
String initPassword = servletContext.getInitParameter("password");
PrintWriter out = servletResponse.getWriter();
//3. 比对,这里不用
//4. 打印响应字符串
if (initUser.equals(username) && initPassword.equals((password))){
out.print("Hello: "+ username);
}else {
out.print("Sorry: " + username);
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
2.1.3 测试
运行idea,在弹出的浏览器中尾部输入 login.html
用户名和密码对的情况,输入用户名和密码分别为t1和789,点“提交”
用户名和密码不对的情况,输入用户名和密码分别为hua和123,点“提交”
2.2 优化2.1例子(抽成通用类)
在2.1例子中发现很多多余的是空的,根本不用写,为了使代码更简洁通用,可以建立一个抽象类MyGenericServlet继承Servlet,MyGenericServlet代码如下:
import javax.servlet.*;
import java.io.IOException;
public abstract class MyGenericServlet implements Servlet {
private ServletConfig servletConfig;
@Override
public void init(ServletConfig arg0) throws ServletException {
this.servletConfig=arg0;
}
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
@Override
public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException;
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
修改LoginServlet继承MyGenericServlet类
LoginServlet修改代码如下:
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class LoginServlet extends MyGenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//1. 获取请求参数: username, password
String username = servletRequest.getParameter("username");
String password = servletRequest.getParameter("password");
//2. 获取当前WEB应用的初初化参数: user, password
// 需要使用 servletConfig 对象。
ServletContext servletContext = getServletConfig().getServletContext();
String initUser = servletContext.getInitParameter("user");
String initPassword = servletContext.getInitParameter("password");
PrintWriter out = servletResponse.getWriter();
//3. 比对, 这里不用写,
//4. 打印响应字符串
if (initUser.equals(username) && initPassword.equals((password))){
out.print("Hello: "+ username);
}else {
out.print("Sorry: " + username);
}
}
}
是不是比2.1更简洁了,多余的可以不写了。
其它不变,重启idea,在弹出的浏览器中尾部输入 login.html,测试效果和2.1是一样的
2.3 优化2.2例子(使用GenericServlet抽象类)
在2.2例子中实现servlet接口还是有点麻烦,自己要写很多,其实 servlet 有一个子类 GenericServlet 可以直接实现封装很多方法做普通类比自己写更方便。
把上面的MyGenericServlet.java通用类删除,使用使用java自带的通用类GenericServlet 并修改LoginServlet.java代码如下:
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
public class LoginServlet extends GenericServlet {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//1. 获取请求参数: username, password
String username = servletRequest.getParameter("username");
String password = servletRequest.getParameter("password");
//2. 获取当前WEB应用的初初化参数: user, password
// 需要使用 servletConfig 对象。
ServletContext servletContext = getServletConfig().getServletContext();
String initUser = getServletContext().getInitParameter("user");
String initPassword = getServletContext().getInitParameter("password");
PrintWriter out = servletResponse.getWriter();
//3. 比对, 这里不用写,
//4. 打印响应字符串
if (initUser.equals(username) && initPassword.equals((password))){
out.print("Hello: "+ username);
}else {
out.print("Sorry: " + username);
}
}
}
是不是比2.2更好了^_^,
其它不变,重启idea,在弹出的浏览器中尾部输入 login.html,测试效果和2.1是一样的