我們在對JavaWEB工程進行開發的時候,我們經常會遇到這樣一個問題,在jsp中發送到Servlet的每一個請求都要寫一個對應的Servlet,這樣會造成一個工程完成下來需要寫幾十個Servlet,那么怎么可以做到多個請求共用一個Servlet呢?
下面介紹兩種方法(第一種比較難理解一點,第二種相對容易):
一、利用反射原理(根據獲取到的url-pattern,截取出相應的方法名,進而調用相應的方法)
1.配置web.xml文件,<url-pattern>中設置以 *.擴展名 的方式進行匹配(下面的例子以 *.do 匹配,調用的Servlet為 StaffServlet,對Staff表的查詢query 和刪除delete 請求進行處理)
-
<servlet>
-
<servlet-name>StaffServlet </servlet-name>
-
<servlet-class>cn.edu.lingnan.servlet.StaffServlet </servlet-class>
-
</servlet>
-
<servlet-mapping>
-
<servlet-name>StaffServlet </servlet-name>
-
<url-pattern>*.do </url-pattern>
-
</servlet-mapping>
所有以 .do 結尾的請求都會調用StaffServlet
2.編寫Servlet(例子:StaffServlet)
-
public class StaffServlet extends HttpServlet {
-
private static final long serialVersionUID = 1L;
-
-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
doPost(request, response);
-
}
-
-
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
//1.獲取能夠與“url-pattern”中匹配的路徑
-
String method = request.getServletPath();
-
-
//(此時處理的請求是查詢 query.do)
-
System.out.println( "request.getServletPath()獲取的值為: " + method); //輸出 /query.do
-
-
//2.通過字符串截取,把方法名 query 截取出來
-
method = method.substring( 1, method.length()- 3);
-
-
System.out.println( "截取后的值為: "+ method);
-
-
Method m = null;
-
try {
-
//3.獲取當前類中名字為 method 的方法
-
m = this.getClass().getDeclaredMethod(method,
-
HttpServletRequest.class, HttpServletResponse.class);
-
-
//4.調用 method 方法
-
m.invoke( this, request, response);
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
}
-
-
private void query(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
System.out.println( "query方法被調用");
-
-
}
-
-
private void delete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
System.out.println( "delete方法被調用");
-
-
}
-
}
3. jsp 中發送請求調用servlet
-
<%@ page language="java" contentType="text/html; charset=UTF-8"
-
pageEncoding= "UTF-8"%>
-
-
<html>
-
<head>
-
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-
<title>Insert title here </title>
-
</head>
-
<body>
-
<a href="query.do">這是一個查詢請求,調用Servlet中的query方法 </a>
-
<br>
-
<br>
-
<a href="delete.do">這是一個刪除請求,調用Servlet中的delete方法 </a>
-
</body>
-
</html>
點查詢和刪除的超鏈接后台輸出結果如下:

如還需要添加其他操作請求,只需在Servlet中添加相應名字的方法,如更新請求 jsp中 update.do, servlet中添加如下方法:
-
private void update(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
-
}
其他請求也是如上操作即可,注意:url-pattern 中的擴展名可以是任意字符,不一定要是 .do , 例如也可以是 .doStaff , 但是改了擴展名了要注意修改截取的字符串的位置,如修改由.do 修改為 .doStaff 時,doPost中
method = method.substring(1, method.length()-3);需修改為(.do 為三個字符)
method = method.substring(1, method.length()-8);(.doStaff 為八個字符)
jsp 中調用時,則也相應修改 query.do ---> query.doStaff
二、利用URL中的參數傳送需要調用的方法名
1.配置web.xml, 映射Servlet路徑(以下以 StudentServlet 調用 Servlet 中的 query 和 delete 方法為例子)
-
<servlet>
-
<servlet-name>StudentServlet </servlet-name>
-
<servlet-class>servlet.StudentServlet </servlet-class>
-
</servlet>
-
<servlet-mapping>
-
<servlet-name>StudentServlet </servlet-name>
-
<url-pattern>/studentServlet </url-pattern>
-
</servlet-mapping>
2.編寫Servlet(StudentServlet)
-
package servlet;
-
-
import java.io.IOException;
-
import javax.servlet.ServletException;
-
import javax.servlet.annotation.WebServlet;
-
import javax.servlet.http.HttpServlet;
-
import javax.servlet.http.HttpServletRequest;
-
import javax.servlet.http.HttpServletResponse;
-
-
/**
-
* Servlet implementation class StudentServlet
-
*/
-
-
public class StudentServlet extends HttpServlet {
-
private static final long serialVersionUID = 1L;
-
-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
this.doPost(request, response);
-
}
-
-
-
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
//獲取請求參數 method
-
String method = request.getParameter( "method");
-
-
System.out.println( "獲取到的method參數為: " + method);
-
//調用 method 方法
-
if(method.equals( "query")) {
-
this.query(request, response);
-
} else {
-
if(method.equals( "delete")) {
-
this.delete(request, response);
-
}
-
}
-
}
-
-
private void query(HttpServletRequest request, HttpServletResponse response)
-
throws ServletException, IOException {
-
System.out.println( "query 方法被調用");
-
}
-
-
private void delete(HttpServletRequest request, HttpServletResponse response)
-
throws ServletException, IOException {
-
System.out.println( "delete 方法被調用");
-
}
-
}
3. jsp中發送請求調用Servlet
-
<%@ page language="java" contentType="text/html; charset=UTF-8"
-
pageEncoding= "UTF-8"%>
-
-
<html>
-
<head>
-
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-
<title>Insert title here </title>
-
</head>
-
<body>
-
<a href="studentServlet?method=query">這是一個查詢請求,調用Servlet中的query方法 </a>
-
<br>
-
<br>
-
<a href="delete.do?method=delete">這是一個刪除請求,調用Servlet中的delete方法 </a>
-
</body>
-
</html>
點查詢和刪除超鏈接后台輸出結果如下:

