使用Servlet+JSP+EL+JSTL來實現簡易增刪改查操作
技術標籤:JavaJavaWebServletjavaservletjsp
使用Servlet+JSP+EL+JSTL來實現簡易增刪改查操作
以一個基本的User類為例,來通過Serlvet+JSP+EL+JSTL來實現一個基本的增刪改查。其中我在備註中記錄了改BUG過程中遇到的一些知識點和難題,並且記錄了相應的解決方案。請讀者多注意注意相應的程式碼備註。
JavaBean——User類
對於JavaBean的作用就不細談了,簡要的講就是定義了一個抽象類(之前C#的學習過程中,經常稱他為列舉型別,但其實和列舉還是有很大的差別的。)並且在之後的方法中對該類進行增刪改查操作。
package com.sumu.entity;
public class User {
private Integer id;
private String name;
private Double score;
public User(Integer id, String name, Double score) {
this.id = id;
this.name = name;
this.score = score;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getScore() {
return score;
}
public void setScore(Double score) {
this.score = score;
}
}
Servlet——UserServlet最初的狀態
這次講增刪改查統一在了一個Servlet當中,但是在實際開發過程中這樣明顯是不對的。當然,一個小練習就無關緊要了。
package com.sumu.servlet;
import com.gyh.entity.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/user")
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<User> users = new ArrayList<>();
users.add(new User(1,"Allen",10.0));
users.add(new User(2,"Jack",9.8));
req.setAttribute("user",users);
req.getRequestDispatcher("user.jsp").forward(req,resp);
}
}
在這個Servlet當中,只是定義了一個最基本的初始化了兩個User物件資料,並且新增進了List當中。這裡用到了一些知識點:
- HttpServlet的使用:Servlet有三層架構,這裡用了最常用的HttpServlet的doGet方法。具體的知識點詳見我的另一篇Blog:https://blog.csdn.net/sumu_Guyuhang/article/details/112305966
- 關於request會話中的一些方法:這裡會話使用的是request,使用了裡面的setAttribute()方法和轉發的方法,具體內容詳見我的另一篇blog:https://blog.csdn.net/sumu_Guyuhang/article/details/112423137
實現增加操作
向我們現有的User類中增加一個新的使用者資訊。注意:由於這個基本操作中並不涉及資料庫,因此初始的資料是寫死的,並且生命週期是根據伺服器來運作的,實際開發中並不適用,只是作為一個練習加大難度而已。
增加操作的頁面——add.jsp
一個無腦form表單,沒啥好說的。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>增加</title>
</head>
<body>
<form method="post" name="add" action="/user">
編號:<input name="id" type="text" /><br/>
姓名:<input name="name" type="text" /><br/>
成績:<input name="score" type="text" /><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
加上新增功能後的UserServlet
package com.sumu.servlet;
import com.sumu.entity.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/user")
public class UserServlet extends HttpServlet {
/*
在doGet方法中和doPost方法中需要將users變數傳遞過去,
所以在這裡需要擴充作用域。
將其定義為全域性變數
*/
private List<User> users = new ArrayList<>();
/*由於在後續會出現重複呼叫doGet中的新增list的問題,
所以在這裡使用構造方法來進行初始化的定義,將List等操作放在這裡進行
*/
public UserServlet() {
// users擴充作用域之後就可以直接在所有的方法中全域性訪問。
users.add(new User(1,"Allen",10.0));
users.add(new User(2,"Jack",9.8));
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("user",users);
req.getRequestDispatcher("user.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解決中文亂碼問題
req.setCharacterEncoding("UTF-8");
// 獲取上面表單中的資料
/*
這裡注意getParamter和getAttribute兩者不要混淆
*/
String id_str = req.getParameter("id");
String name = req.getParameter("name");
String score_str = req.getParameter("score");
Integer id = Integer.parseInt(id_str);
Double score = Double.parseDouble(score_str);
// 將資料新增進表單當中
users.add(new User(id,name,score));
req.setAttribute("user",users);
}
}
其實上面關於初始化資料重複的部分也可以通過靜態程式碼塊來進行更改
private static List<User> list = new ArrayList<>();
static {
list.add(new User(1,"Allen",10.0));
list.add(new User(2,"Jack",9.8));
}
實現刪除操作
首先在User.jsp頁面上進行一些修改
User.jsp修改後
</tr>
<c:forEach items="${user}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.score}</td>
<a href="/user?method=delete&id=${user.id}">刪除</a>
<a>修改</a>
</tr>
</c:forEach>
UserServlet 邏輯修改後
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
在實現刪除操作的時候,我們採用了通過url傳遞method來進行區分是什麼操作
那麼我們就在doGet方法中使用switch控制來對這些邏輯進行區分。
*/
String method = req.getParameter("method");
if(method == null){
method = "findAll";
}
switch (method) {
case "delete":
String idStr = req.getParameter("id");
Integer id = Integer.parseInt(idStr);
// 這裡的刪除功能無法實現,需要更換List集合為Map對映,此處就不做展示了
// 重點在於上述的邏輯控制
// PS:其實還是因為太懶了(害...)
users.remove(id);
break;
case "findAll":
req.setAttribute("user",users);
req.getRequestDispatcher("user.jsp").forward(req,resp);
break;
}
}
這裡其實並沒有實現該功能。
主要的問題在於,如果想要通過一個Servlet來實現該刪除操作的話,那麼該如何區分兩種操作呢?這裡提供了一種解決辦法,在url後面加上鍵值對來進行區分,在後端操作中取出該屬性,並且通過switch-case判斷來選擇該進入那個邏輯選擇中。
修改操作——之後更新。
最後總結:
-
一般遇到重複初始化的問題,就可以通過重寫構造方法來進行初始化。在Java基礎中得知其實每個類在執行的時候編譯器都會送一個構造方法,而我們也可以自己去重寫一個構造方法。
-
遇到變數跨方法無法傳遞的時候,通常的解決方案就是擴大變數的作用域,但是注意在實際開發過程中,一般我們在類中定義成員變數的時候都是需要將其的安全性設為私有,也就是private。
-
在不同的操作需要進入同一個方法的時候,可以通過在url後面加上屬性值來區分該操作。後端中只需要將該屬性拿出來,然後通過判斷邏輯來進行區分即可。