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 "更新成功!";
}
}
このようにして、最適化はより柔軟になります!
効果を見てください!