1つのサーブレットクラスが複数のリクエスト処理を実装します(サーブレットの最適化)

1つは、サーブレットクラスを最適化することです。

アイデアの説明:
新しいサーブレットの場合、jsp +サーブレットの追加、削除、変更、およびチェックを処理するときは、さまざまな機能でリクエストを処理するために複数のサーブレットを確立する必要があります。
ここに画像の説明を挿入
実際、複数のリクエストを処理するために必要なサーブレットは1つだけです。これにより、JSPページでサーブレットにリクエストを送信するときにパラメータを渡すだけで済みます。このパラメータ値は、このリクエストをマークするために使用されます。BeanServletクラスに入るとき、パラメータ値を判断し、対応するメソッドを作成してリクエストを処理するだけです。jspページの
ここに画像の説明を挿入
具体的な実現

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
    
<%
	// 把绝对路径封装成一个变量
	String ctx = request.getContextPath();
	pageContext.setAttribute("ctx", ctx);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<!--servlet优化:
	在发送请求时,
	传递一个标记,
	当前请求的参数
 -->
<a href="${ctx}/beanServlet?action=add">添加商品</a>
<a href="${ctx}/beanServlet?action=del">删除商品</a>
<a href="${ctx}/beanServlet?action=update">更新商品</a>
<div>
	${returns}
</div>
</body>
</html>

BeanServlet.java

package Test;

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/beanServlet")
public class beanServlet extends HttpServlet {
    
    
	private static final long serialVersionUID = 1L;
    @Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
    		// 获取请求标记
    		String action = req.getParameter("action");
    		
    		String returns = null;
    		// 对比请求标记值
    		if(action.equals("add")) {
    
    
    			// 调用处理方法接受返回值
    			returns = add(req, resp);
    		}
    		// 对比请求标记值
    		if(action.equals("del")) {
    
    
    			// 调用处理方法接受返回值
    			returns = del(req, resp);
    		}
    		// 对比请求标记值
    		if(action.equals("update")) {
    
    
    			// 调用处理方法接受返回值
    			returns = update(req, resp);
    		}
    		// 将返回用请求值返回页面
    		req.setAttribute("returns",returns);
    		//这个做一个判空
    		if(returns!=null) {
    
    
    			req.getRequestDispatcher("/bean.jsp").forward(req, resp);
    		}
    	}
    //    请求处理	
    public String add(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{
    
        	
    	return "添加成功!";
    }
    public String del(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{
    
    	
    	return "删除成功!";	
    }
    public String update(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{
    
    
    	return "更新成功!";
    }
}

このようにして、サーブレットクラスの小さな最適化を実現し、複数のサーブレットクラスを作成する問題を解決しましたが、リクエストが3つしかないため、これは実現したいことではありません。リクエストが多すぎる場合は、これに従ってください。このように、多くのifステートメントを作成する必要がありますが、これは理想的ではありません。

2つ目は、リフレクションを使用して最適化する

考え方の説明:
リフレクションについて言及するときは、Javaのクラスロードメカニズムについて言及する必要があります。クラスロードメカニズムとは何ですか。ここでは説明しません。ブロガーの詳細な説明を見つけました。興味があれば、見て。ここをクリックしてください:Javaクラスのロードメカニズム

リフレクションを使用して最適化します。具体的な手順は、最初に現在のクラスのバイトコードファイルを取得し、このクラスのバイトコードオブジェクトを返し、次にgetMethod()を使用してページから取得したリクエストフラグを渡し、次に渡します。 2つの要求クラスと応答クラス、

実装:

package Test;

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/beanServlet")
public class beanServlet extends HttpServlet {
    
    
	private static final long serialVersionUID = 1L;
    @Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
    		// 获取请求标记
    		String action = req.getParameter("action");
    		try {
    
    
   				//  获取当前类的字节码文件	
    			Class<? extends beanServlet> clazz = this.getClass(); 
    			/** 
    			 * clazz.getMethod();
    			 * 查找当前类,有没有action值所对应的处理方法,它相当于:
    			 * if(action.equals("add")){}
    			 */
				Method method = clazz.getMethod(action,HttpServletRequest.class,HttpServletResponse.class);
    		    // 判断是否为空!
				if(method!=null) {
    
    
    				//  method.invoke(this, req,resp);是去执行匹配的请求处理方法
					String returns=(String) method.invoke(this, req,resp);
    		        //  判空,传值,跳转
					if(returns != null) {
    
    
						req.setAttribute("returns", returns);
						req.getRequestDispatcher("/bean.jsp").forward(req, resp);
					}
				}
			
    		} catch (Exception e) {
    
    
				e.printStackTrace();
			}
    //    请求处理  注意:使用反射优化,这里的方法必须是 public	公有的
    public String add(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{
    
        	
    	return "添加成功!";
    }
    public String del(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{
    
    	
    	return "删除成功!";	
    }
    public String update(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{
    
    
    	return "更新成功!";
    }
}

第三に、さらなる最適化
このモジュールを分散処理するためのリフレクションメソッドをBeanServletクラスにカプセル化し、他のサーブレットにこのクラスを継承させることができます。これはさらに最適化できます。
beanServlet

public class BaseServlet extends HttpServlet {
    
    
	private static final long serialVersionUID = 1L;

	 @Override
    	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
    		// 获取请求标记
    		String action = req.getParameter("action");
    		try {
    
    
   				//  获取当前类的字节码文件	
    			Class<? extends beanServlet> clazz = this.getClass(); 
    			/** 
    			 * clazz.getMethod();
    			 * 查找当前类,有没有action值所对应的处理方法,它相当于:
    			 * if(action.equals("add")){}
    			 */
				Method method = clazz.getMethod(action,HttpServletRequest.class,HttpServletResponse.class);
    		    // 判断是否为空!
				if(method!=null) {
    
    
    				//  method.invoke(this, req,resp);是去执行匹配的请求处理方法
					String returns=(String) method.invoke(this, req,resp);
    		        //  判空,传值,跳转
					if(returns != null) {
    
    
						req.setAttribute("returns", returns);
						req.getRequestDispatcher("/bean.jsp").forward(req, resp);
					}
				}
			
    		} catch (Exception e) {
    
    
				e.printStackTrace();
			}
 
}

サーブレット

public class Servlet extends BeanServlet {
    
    
	private static final long serialVersionUID = 1L;
    //    请求处理  注意:使用反射优化,这里的方法必须是 public	公有的
    public String add(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{
    
        	
    	return "添加成功!";
    }
    public String del(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{
    
    	
    	return "删除成功!";	
    }
    public String update(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{
    
    
    	return "更新成功!";
    }
}

このようにして、最適化はより柔軟になります!
効果を見てください!
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_44676935/article/details/106649260
おすすめ