public abstract class HttpServlet
extends GenericServlet
implements Serializable
Provides an abstract class to be subclassed to create an HTTP servlet suitable for a Web site. A subclass of HttpServlet must override at least one method, usually one of these:
doGet, if the servlet supports HTTP GET requests
doPost, for HTTP POST requests
doPut, for HTTP PUT requests
doDelete, for HTTP DELETE requests
init and destroy, to manage resources that are held for the life of the servlet
getServletInfo, which the servlet uses to provide information about itself
There's almost no reason to override the service method. service handles standard HTTP requests by dispatching them to the handler methods for each HTTP request type (the doXXX methods listed above).
Likewise, there's almost no reason to override the doOptions and doTrace methods.
Servlets typically run on multithreaded servers, so be aware that a servlet must handle concurrent requests and be careful to synchronize access to shared resources. Shared resources include in-memory data such as instance or class variables and external objects such as files, database connections, and network connections. See the Java Tutorial on Multithreaded Programming for more information on handling multiple threads in a Java program.
程序员编写的Servlet类继承HttpServlet继承GenericServlet实现Servlet。
若代码直接继承GenericServlet在每一个Servlet开始执行的时候都获取请求的method,进行一系列的判断,如果浏览器客户端发送的请求方式和底层服务器端要求的请求方式不一致,则提示405错误。但是目前项目存在的缺点是:在每一个Servlet类都需要编写以上的重复的代码。显然代码没有得到复用。
以一个简单的登录html为例子
login.html页面不变【提前将继承GenericServlet与HttpServlet按钮画好】:
html>
<head>
<title>登录页面</title>
<meta charset="UTF-8">
</head>
<body>
<!-- 登录系统要求发送POST请求 -->
<form action="/httpServlet/user/login" method="post">
用户名<input type="text" name="username"><br>
密码<input type="password" name="password"><br>
<input type="submit" value="继承GenericServlet->登录">
</form>
<!-- 退出系统要求发送GET请求 -->
<form action="/httpServlet/user/logout">
<input type="submit" value="继承GenericServlet->安全退出系统">
</form>
<!-- 继承HttpServlet的登录系统要求发送POST请求 -->
<form action="/httpServlet/user/loginNew" method="post">
用户名<input type="text" name="username"><br>
密码<input type="password" name="password"><br>
<input type="submit" value="继承HttpServlet->登录">
</form>
<!-- 继承HttpServlet的退出系统要求发送GET请求 -->
<form action="/httpServlet/user/logoutNew">
<input type="submit" value="继承HttpServlet->安全退出系统New">
</form>
</body>
</html>
web.xml文件配好【提前将Servlet配置完成】:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 继承GenericServlet -->
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.httpServlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/user/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>logout</servlet-name>
<servlet-class>com.httpServlet.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>logout</servlet-name>
<url-pattern>/user/logout</url-pattern>
</servlet-mapping>
<!-- 继承HttpServlet -->
<servlet>
<servlet-name>loginNew</servlet-name>
<servlet-class>com.httpServlet.LoginServletNew</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginNew</servlet-name>
<url-pattern>/user/loginNew</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>logoutNew</servlet-name>
<servlet-class>com.httpServlet.LogoutServletNew</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>logoutNew</servlet-name>
<url-pattern>/user/logoutNew</url-pattern>
</servlet-mapping>
</web-app>
编写继承GenericServlet小程序代码:
package com.httpServlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* LoginServlet是处理用户登录的
* 要求浏览器客户端发送POST请求方式
* 但是前端发送的请求有可能是GET方式,服务器端应该提供一种检查机制:
* 当需要post请求的时候,浏览器发送get请求,此时应该提示客户端错误
* 当需要get请求的时候,浏览器发送post请求,此时也应该提示客户端错误
*/
public class LoginServlet extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
//向下转型(系统是基于B/S架构的,协议也是HTTP协议,所以可以强制类型转换)
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
//获取请求方式
String method = request.getMethod();
//设置响应的内容类型以及字符编码方式
response.setContentType("text/html;charset=UTF-8");
//获取响应流
PrintWriter out = response.getWriter();
//LoginServlet需要客户端发送POST请求
//浏览器客户端如果发送GET请求应该提示错误信息
if("GET".equals(method)){
out.print("<html>");
out.print("<head>");
out.print("<title>错误报告</title>");
out.print("</head>");
out.print("<body>");
out.print("405-错误");
out.print("</body>");
out.print("</html>");
}else{
//正常
out.print("login success!");
}
}
}
package com.httpServlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* LogoutServlet是退出系统,需要客户端发送get请求
* 如果发送POST请求,应该提示错误信息
*/
public class LogoutServlet extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
String method = request.getMethod();
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
if("POST".equals(method)){
out.print("<html>");
out.print("<head>");
out.print("<title>错误报告</title>");
out.print("</head>");
out.print("<body>");
out.print("405-错误");
out.print("</body>");
out.print("</html>");
}else{
out.print("系统已经安全退出");
}
}
}
继承GenericServlet的Servlet开始执行的时候都获取请求的method,进行一系列的判断,代码没有得到复用
======================继承GenericServlet华丽分割线=======================
下面我们手写一个简单的HttpServlet:
package com.httpServlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HttpServlet extends GenericServlet {
//原始的service函数,从Servlet接口中继承的
//这个service方法最先被调用
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
service(request,response);
}
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String method = request.getMethod();
if("GET".equals(method)){
doGet(request,response);
}else if("POST".equals(method)){
doPost(request,response);
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("<html>");
out.print("<head>");
out.print("<title>错误报告</title>");
out.print("</head>");
out.print("<body>");
out.print("405-错误");
out.print("</body>");
out.print("</html>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("<html>");
out.print("<head>");
out.print("<title>错误报告</title>");
out.print("</head>");
out.print("<body>");
out.print("405-错误");
out.print("</body>");
out.print("</html>");
}
}
编写继承HttpServlet小程序代码【可以先继承上面手写代码】:
package com.httpServlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* LoginServlet负责登录,要求发送POST请求,那么LoginServlet应该重写doPost方法
*/
//public class LoginServletNew extends HttpServlet {
public class LoginServletNew extends javax.servlet.http.HttpServlet {
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().print("login success!");
}
}
//=============================分割线=================================
package com.httpServlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* LogoutServlet要求浏览器发送GET请求,则该类重写doGet方法
*/
//public class LogoutServletNew extends HttpServlet {
public class LogoutServletNew extends javax.servlet.http.HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().print("logout success!");
}
}
解决代码复用!
总结:大家以后所编写的所有的Servlet类,不要实现Servlet接口,也不要继承GenericServlet,直接继承HttpServlet
如果是GET请求,请重写doGet方法,
如果是POST请求,请重写doPost方法。
程序员编写的Servlet类继承HttpServlet继承GenericServlet实现Servlet
希望对你有帮助,祝你有一个好心情,加油!
若有错误、不全、可优化的点,欢迎纠正与补充!