05-------Servlet解决代码复用之HttpServlet

本文探讨了在Servlet开发中,直接继承HttpServlet而非GenericServlet以提高代码复用性的方法。通过一个简单的登录HTML示例,解释了如何避免在每个Servlet类中重复编写获取请求方法的判断代码。建议程序员在编写Servlet时直接继承HttpServlet,并根据GET或POST请求重写doGet和doPost方法,以实现更好的代码组织和复用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

希望对你有帮助,祝你有一个好心情,加油!

若有错误、不全、可优化的点,欢迎纠正与补充!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值