聲明:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!!
目錄
3、把6個 Servlet邏輯處理代碼放在 ActionServlet中
一、前言
上一篇文章我們介紹的內容:把 Servlet中jdbc 連接和操作(增刪改查)數據庫的代碼抽取出來,以及結合dao和工廠模式,優化實現了“增刪改查”員工信息的相關代碼。詳細可參考博文:原創 java服務器端開發-servlet:4_2、dao模式_工廠模式_“增刪改查”員工信息
這篇文章我們將繼續進行優化實現,之前的代碼寫了6個Servlet類進行“增刪改查”員工信息,接下來我們把它整合成一個Servlet,即實現一個servlet處理多種請求_“增刪改查”員工信息。
有關理論知識介紹,可參考博文:原創 java服務器端開發-servlet:4、dao 、一個servlet處理多種請求、servlet處理請求資源路徑、將中文數據插入數據庫
二、如何讓一個servlet處理多種請求?
step1,使用後綴匹配模式
我們可以把之前的,配置文件代碼:web.xml 修改成如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>web10</display-name>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>web.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<!-- 後綴匹配:
(1)使用"*."開頭,後接任意的1個或者多個字符
(2)匹配所有以".do"結尾的請求。
常見如下“url-pattern”標籤 -->
<url-pattern>*.do</url-pattern>
<!-- 之前是這樣寫的 -->
<!-- <url-pattern>/show</url-pattern> -->
</servlet-mapping>
</web-app>
step2,分析請求資源路徑
1、新建一個ActionServlet
之前的6個 Servlet代碼就不要啦,新建一個ActionServlet
package web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* http://localhost:8080/web10/show.do
* http://localhost:8080/web10/add.do
* http://localhost:8080/web10/del.do
* http://localhost:8080/web10/delAll.do
* http://localhost:8080/web10/load.do
* http://localhost:8080/web10/update.do
*
* @author luminal
*/
public class ActionServlet extends HttpServlet {
public void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 步驟1:獲得請求資源路徑
String uri = request.getRequestURI();
System.out.println("uri--->" + uri);// /web10/show.do
// 步驟2:把請求資源路徑簡化
String action = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
System.out.println("action--->" + action);// /show
// 步驟3:匹配資源路徑
if (action.equals("/show")) {
System.out.println("查找員工列表...");
} else if (action.equals("/add")) {
System.out.println("添加員工信息...");
} else if (action.equals("/del")) {
System.out.println("刪除個人員工信息...");
} else if (action.equals("/delAll")) {
System.out.println("刪除所有員工信息...");
} else if (action.equals("/load")) {
System.out.println("查找一條員工信息,前端頁面可編輯,用於修改員工信息....");
} else if (action.equals("/update")) {
System.out.println("修改員工信息-操作修改數據庫...");
}
}
}
2、效果演示-匹配 url路徑
啓動tomact,部署web項目,在谷歌瀏覽器輸入:http://localhost:8080/web10/show
這時候會看到控制檯打印如下:
現在路徑可以匹配到了,那麼我們不妨把其他 6個 Servlet邏輯處理代碼,放在上面的條件語句當中
3、把6個 Servlet邏輯處理代碼放在 ActionServlet中
下面是把6個 Servlet邏輯處理代碼放在 ActionServlet中的具體代碼
package web;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dao.EmployeeDAO;
import entity.Employee;
import util.Factory;
/**
* http://localhost:8080/web10/show.do
* http://localhost:8080/web10/add.do
* http://localhost:8080/web10/del.do
* http://localhost:8080/web10/delAll.do
* http://localhost:8080/web10/load.do
* http://localhost:8080/web10/update.do
* @author luminal
*/
public class ActionServlet extends HttpServlet{
public void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException,IOException{
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//步驟1:獲得請求資源路徑
String uri = request.getRequestURI();
//步驟2:把請求資源路徑簡化
String action = uri.substring(uri.lastIndexOf("/"),
uri.lastIndexOf("."));
//步驟3:匹配簡化後的資源路徑
//依據分析結果,調用不同的分支進行處理
//http://ip:port/appname/show.do
if(action.equals("/show")){//查找員工列表
System.out.println("查找員工列表...");
try {
out.println("<table border='1' width='60%' " +
"cellpadding='0' cellspacing='0'>");
out.println("<tr><td>ID</td><td>姓名</td>" +
"<td>薪水</td><td>年齡</td>" +
"<td>操作</td></tr>");
EmployeeDAO dao =
(EmployeeDAO)Factory.getInstance(
"EmployeeDAO");
List<Employee> employees =
dao.findAll();
for(int i=0;i<employees.size();i++){
Employee e = employees.get(i);
int id = e.getId();
String name = e.getName();
double salary = e.getSalary();
int age = e.getAge();
out.println("<tr><td>" + id
+ "</td><td>" + name
+ "</td><td>" + salary
+"</td><td>" + age
+ "</td><td>" +
"<a href='del.do?id="
+ id + "'>刪除</a> " +
"<a href='load.do?id="
+ id + "'>修改</a></td></tr>");
}
out.println("</table>");
out.println("<a href='addEmp.html'>添加新員工</a>");
out.println("<a href='delAll.do'>" + "刪除所有僱員</a>");
} catch (Exception e) {
e.printStackTrace();
out.println("系統繁忙,稍後重試");
}
}else if(action.equals("/add")){//添加員工信息
System.out.println("添加員工信息...");
//讀請求參數
String name = request.getParameter("name");
String salary = request.getParameter("salary");
String age = request.getParameter("age");
//服務端驗證一定要有,此處省略...
//將員工信息插入數據庫
try {
EmployeeDAO dao =
(EmployeeDAO)Factory.getInstance(
"EmployeeDAO");
Employee e = new Employee();
e.setName(name);
e.setSalary(Double.parseDouble(salary));
e.setAge(Integer.parseInt(age));
dao.save(e);
response.sendRedirect("show.do");
} catch (Exception e) {
e.printStackTrace();
out.println("系統繁忙,稍後重試");
}
}else if(action.equals("/del")){//刪除個人員工信息
System.out.println("刪除個人員工信息...");
/* 獲取請求的id */
int id = Integer.parseInt(
request.getParameter("id"));
try {
EmployeeDAO dao =
(EmployeeDAO)Factory.getInstance(
"EmployeeDAO");
dao.delete(id);
response.sendRedirect("show.do");
}catch(Exception e){
e.printStackTrace();
out.println("系統繁忙,稍後重試");
}
}else if(action.equals("/delAll")){//刪除所有員工信息
System.out.println("刪除所有員工信息...");
try {
//不要設計任何具體的實現: 具體實現類EmployeeDAOImpl
EmployeeDAO dao =
(EmployeeDAO)Factory.getInstance(
"EmployeeDAO");
dao.deleteAllData();
response.sendRedirect("show.do");
}catch(Exception e){
e.printStackTrace();
out.println("系統繁忙,稍後重試");
}
}else if(action.equals("/load")){//查找一條員工信息,前端頁面可編輯
System.out.println("查找一條員工信息,前端頁面可編輯,用於修改員工信息....");
int id = Integer.parseInt(request.getParameter("id"));
try {
EmployeeDAO dao =
(EmployeeDAO)Factory.getInstance(
"EmployeeDAO");
Employee e = dao.findById(id);
if(e != null){
String name = e.getName();
double salary = e.getSalary();
int age = e.getAge();
out.println("<form action='update.do?id=" + id + "' method='post'>");
out.println("id:" + id + "<br/>");
out.println("姓名:<input name='name' value='"
+ name + "'/><br/>");
out.println("薪水:<input name='salary' value='"
+ salary + "'/><br/>");
out.println("年齡:<input name='age' value='"
+ age + "'/><br/>");
out.println("<input type='submit' value='提交'/>");
out.println("</form>");
}
}catch(Exception e){
e.printStackTrace();
out.println("系統繁忙,稍後重試");
}
}else if(action.equals("/update")){//修改員工信息-操作修改數據庫
System.out.println("修改員工信息-操作修改數據庫...");
int id = Integer.parseInt(request.getParameter("id"));
String name = request.getParameter("name");
double salary = Double.parseDouble(request.getParameter("salary"));
int age = Integer.parseInt(request.getParameter("age"));
// 將員工信息插入數據庫
try {
EmployeeDAO dao =
(EmployeeDAO)Factory.getInstance("EmployeeDAO");
Employee e = new Employee();
e.setId(id);
e.setName(name);
e.setSalary(salary);
e.setAge(age);
dao.update(e);
response.sendRedirect("show.do");
} catch (Exception e) {
e.printStackTrace();
out.println("系統繁忙,稍後重試");
}
}
}
}
4、注意:重定向、表單提交等位置,需要修改爲點do
response.sendRedirect("show.do");