使用Servlet完成单表的CRUD
- 實(shí)現(xiàn)步驟
- 第一步:準(zhǔn)備一張數(shù)據(jù)庫表。(sql腳本)
- 第二步:準(zhǔn)備一套HTML頁面(項(xiàng)目原型)【前端開發(fā)工具使用HBuilder】
- 第三步:分析我們這個(gè)系統(tǒng)包括哪些功能
- 第四步:在IDEA當(dāng)中搭建開發(fā)環(huán)境
- 第五步:實(shí)現(xiàn)第一個(gè)功能:查看部門列表
- 第六步:查看部門詳情。
- 第七步:刪除部門
- 第九步:跳轉(zhuǎn)到修改部門的頁面
- 第十步:修改部門
使用純粹的Servlet完成單表【對部門的】的增刪改查操作。(B/S結(jié)構(gòu)的。)
實(shí)現(xiàn)步驟
第一步:準(zhǔn)備一張數(shù)據(jù)庫表。(sql腳本)
部門表
drop table if exists dept;
create table dept(deptno int primary key,dname varchar(255),loc varchar(255)
);
insert into dept(deptno, dname, loc) values(10, 'XiaoShouBu', 'BEIJING');
insert into dept(deptno, dname, loc) values(20, 'YanFaBu', 'SHANGHAI');
insert into dept(deptno, dname, loc) values(30, 'JiShuBu', 'GUANGZHOU');
insert into dept(deptno, dname, loc) values(40, 'MeiTiBu', 'SHENZHEN');
commit;
select * from dept;+--------+------------+-----------+
| deptno | dname | loc |
+--------+------------+-----------+
| 10 | XiaoShouBu | BEIJING |
| 20 | YanFaBu | SHANGHAI |
| 30 | JiShuBu | GUANGZHOU |
| 40 | MeiTiBu | SHENZHEN |
+--------+------------+-----------+
第二步:準(zhǔn)備一套HTML頁面(項(xiàng)目原型)【前端開發(fā)工具使用HBuilder】
- 把HTML頁面準(zhǔn)備好
- 然后將HTML頁面中的鏈接都能夠跑通。(頁面流轉(zhuǎn)沒問題。)然后,具體哪一些數(shù)據(jù)是動態(tài)的,哪一些是靜態(tài)的,到時(shí)候再分析
- 應(yīng)該設(shè)計(jì)哪些頁面呢?
- 歡迎頁面:index.html
- 列表頁面:list.html(以列表頁面為核心,展開其他操作。)
- 新增頁面:add.html
- 修改頁面:edit.html
- 詳情頁面:detail.html
歡迎頁面:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>歡迎使用oa系統(tǒng)</title></head><body><a href="list.html">查看部門列表</a></body>
</html>
列表頁面:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>部門列表頁面</title></head><body><h1 align="center">部門列表</h1><hr /><table border="1px" align="center" width="50%"><tr><th>序號</th><th>部門編號</th><th>部門名稱</th><th>操作</th></tr><tr><td>1</td><td>10</td><td>銷售部</td><td><a href="">刪除</a><a href="edit.html">修改</a><a href="detail.html">詳情</a></td></tr><tr><td>2</td><td>20</td><td>研發(fā)部</td><td><a href="">刪除</a><a href="edit.html">修改</a><a href="detail.html">詳情</a></td></tr><tr><td>3</td><td>30</td><td>運(yùn)營部</td><td><a href=>刪除</a><a href="edit.html">修改</a><a href="detail.html">詳情</a></td></tr></table><a href="add.html" >新增部門</a></body>
</html>
目前頁面都是寫死的,后續(xù)的話,需要動態(tài)獲取數(shù)據(jù),比如說,我們在銷售部那里點(diǎn)擊修改,那么跳出的數(shù)據(jù),部門名稱就應(yīng)該是銷售部,點(diǎn)擊哪一個(gè)部門,顯示就應(yīng)該是哪一個(gè)部門。這些值都是通過數(shù)據(jù)庫查出來的,動態(tài)展示
修改部門的時(shí)候,部門編號是不能修改的,因?yàn)槲覀冃薷臄?shù)據(jù)的時(shí)候,是通過部門編號作為篩選條件,來進(jìn)行修改的
新增頁面:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>新增部門</title></head><body><form action="list.html" method="get">部門編號<input type="text" name="deptno" /><br />部門名稱<input type="text" name="dname" /><br />部門位置<input type="text" name="loc" /><br /><input type="submit" value="保存" /> <br /></form></body>
</html>
修改頁面:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>修改部門</title></head><body><form action="list.html" method="get">部門編號<input type="text" name="deptno" value="20" readonly=""/><br />部門名稱<input type="text" name="dname" value="銷售部"/><br />部門位置<input type="text" name="loc" value="北京"/><br /><input type="submit" value="修改" /> <br /></form></body>
</html>
詳情頁面:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>部門詳情</title></head><body><h1>部門詳情</h1><hr />部門編號:20<br />部門名稱:銷售部<br />部門位置:北京<br /><input type="button" value="后退" onclick="window.history.back()" /></body>
</html>
第三步:分析我們這個(gè)系統(tǒng)包括哪些功能
- 什么叫做一個(gè)功能呢?
- 只要 這個(gè)操作連接了數(shù)據(jù)庫,就表示一個(gè)獨(dú)立的功能。
- 包括哪些功能?
- 查看部門列表
- 新增部門
- 刪除部門
- 查看部門詳細(xì)信息
- 跳轉(zhuǎn)到修改頁面
- 修改部門
第四步:在IDEA當(dāng)中搭建開發(fā)環(huán)境
- 創(chuàng)建一個(gè)webapp(給這個(gè)webapp添加servlet-api.jar和jsp-api.jar到classpath當(dāng)中。)
- 向webapp中添加連接數(shù)據(jù)庫的jar包(mysql驅(qū)動)
- 必須在WEB-INF目錄下新建lib目錄,然后將mysql的驅(qū)動jar包拷貝到這個(gè)lib目錄下。這個(gè)目錄名必須叫做lib,全部小寫的。
- JDBC的工具類
package com.bjpowernode.oa.utils;import java.sql.*;
import java.util.ResourceBundle;/**JDBC工具類* @author zengyihong* @create 2022--03--10 20:21*/
public class DBUtils {//靜態(tài)變量,在類加載時(shí)執(zhí)行,自上而下的順序//根據(jù)屬性配置文件的key獲取valueprivate static ResourceBundle boundle=ResourceBundle.getBundle("resources.jdbc");private static String driver=boundle.getString("driver");private static String url=boundle.getString("url");private static String user=boundle.getString("user");private static String password=boundle.getString("password");static {try {//連接數(shù)據(jù)庫的驅(qū)動,不能寫死,以后可能連接其他數(shù)據(jù)庫,比如Oracle//OCP開閉原則:對擴(kuò)展開放,對修改關(guān)閉(功能擴(kuò)展的時(shí)候,不需要修改Java源代碼)//Class.forName("com.mysql.jdbc.Driver");Class.forName(driver);} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 注冊驅(qū)動只需要一次,可以使用靜態(tài)代碼塊*/public static Connection getConnection() throws SQLException {Connection conn= DriverManager.getConnection(url,user,password);return conn;}/*** 釋放資源* @param conn 連接對象* @param ps 數(shù)據(jù)庫操作對象* @param rs 結(jié)果集對象*/public static void close(Connection conn, Statement ps, ResultSet rs){if (rs !=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}try {if (ps !=null){ps.close();}} catch (SQLException e) {e.printStackTrace();}try {if (rs !=null){rs.close();}} catch (SQLException e) {e.printStackTrace();}}}
- 將所有HTML頁面拷貝到web目錄下。
第五步:實(shí)現(xiàn)第一個(gè)功能:查看部門列表
-
我們應(yīng)該怎么去實(shí)現(xiàn)一個(gè)功能呢?
- 建議:你可以從后端往前端一步一步寫。也可以從前端一步一步往后端寫。都可以。但是千萬要記住不要想起來什么寫什么。你寫代碼的過程最好是程序的執(zhí)行過程。也就是說:程序執(zhí)行到哪里,你就寫哪里。這樣一個(gè)順序流下來之后,基本上不會出現(xiàn)什么錯誤、意外。
- 從哪里開始?
- 假設(shè)從前端開始,那么一定是從用戶點(diǎn)擊按鈕那里開始的。
- 第一:先修改前端頁面的超鏈接,因?yàn)橛脩粝赛c(diǎn)擊的就是這個(gè)超鏈接。
- 因?yàn)椴榭床块T列表是要和數(shù)據(jù)庫進(jìn)行交互的,里面的數(shù)據(jù)不能是寫死的,要實(shí)時(shí)更新數(shù)據(jù),所以需要執(zhí)行一個(gè)Java程序
<a href="/oa/dept/list">查看部門列表</a>
- 第二:編寫web.xml文件
<servlet><servlet-name>list</servlet-name><servlet-class>com.bjpowernode.oa.web.action.DeptListServlet</servlet-class></servlet><servlet-mapping><servlet-name>list</servlet-name>
<!--不需要加項(xiàng)目名 路徑不能亂寫,要和前端的頁面路徑對應(yīng)--><url-pattern>/dept/list</url-pattern></servlet-mapping>
- 第三:編寫DeptListServlet類繼承HttpServlet類。然后重寫doGet方法。
- 因?yàn)辄c(diǎn)擊超鏈接是get請求
- 再來回憶一下通信原理
package com.bjpowernode.oa.web.action;import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;public class DeptListServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}
}
- 第四:在DeptListServlet類的doGet方法中連接數(shù)據(jù)庫,查詢所有的部門,動態(tài)的展示部門列表頁面.
-
分析list.html頁面中哪部分是固定死的,哪部分是需要動態(tài)展示的。
-
list.html頁面中的內(nèi)容所有的雙引號要替換成單引號,因?yàn)閛ut.print("")這里有一個(gè)雙引號,容易沖突。
-
現(xiàn)在寫完這個(gè)功能之后,你會有一種感覺,感覺開發(fā)很繁瑣,只使用servlet寫代碼太繁瑣了。
public class DeptListServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//獲取應(yīng)用的根路徑String contextPath = request.getContextPath();response.setContentType("text/html;charset=UTF-8");PrintWriter writer = response.getWriter();writer.println(" <!DOCTYPE html> ");writer.println("<html>");writer.println("<head>");writer.println(" <meta charset='utf-8'>");writer.println(" <title>部門列表頁面</title>");writer.println("</head>");writer.println("<body>");writer.println("<h1 align='center'>部門列表</h1>");writer.println("<hr />");writer.println("<table border='1px' align='center' width='50%'>");writer.println("");writer.println(" <tr>");writer.println("");writer.println(" <th>序號</th>");writer.println(" <th>部門編號</th>");writer.println(" <th>部門名稱</th>");writer.println(" <th>操作</th>");writer.println("");writer.println(" </tr>");/*** 要分析頁面哪些部分是靜態(tài)的,哪些部分是動態(tài)的*///連接數(shù)據(jù)庫,查詢所有數(shù)據(jù)Connection conn=null;PreparedStatement ps=null;ResultSet rs=null;try {//獲取連接conn= DBUtils.getConnection();//獲取預(yù)編譯的數(shù)據(jù)庫操作對象String sql="select deptno,dname,loc from dept";ps = conn.prepareStatement(sql);//執(zhí)行sql語句rs=ps.executeQuery();//處理結(jié)果集int i=0;while (rs.next()){String deptno=rs.getString("deptno");String dname = rs.getString("dname");String loc = rs.getString("loc");writer.println(" <tr>");writer.println(" <td>"+(++i)+"</td>");writer.println(" <td>"+deptno+"</td>");writer.println(" <td>"+dname+"</td>");writer.println(" <td><a href=''>刪除</a>");writer.println(" <a href='edit.html'>修改</a>");/*** 點(diǎn)擊詳情的時(shí)候,我們點(diǎn)擊哪一個(gè)部門,就應(yīng)該顯示相應(yīng)部門的信息*/writer.println(" <a href='detail.html'>詳情</a></td>");writer.println(" </tr>");}} catch (SQLException e) {e.printStackTrace();}finally {//釋放資源DBUtils.close(conn,ps,rs);}//<!-- 往下都是固定死的-->writer.println("</table>");writer.println("<a href='add.html' >新增部門</a>");writer.println("");writer.println("");writer.println("</body>");writer.println("</html>");}}
先來回顧一下,之前準(zhǔn)備數(shù)據(jù)庫中的表的數(shù)據(jù)
+--------+------------+-----------+
| deptno | dname | loc |
+--------+------------+-----------+
| 10 | XiaoShouBu | BEIJING |
| 20 | YanFaBu | SHANGHAI |
| 30 | JiShuBu | GUANGZHOU |
| 40 | MeiTiBu | SHENZHEN |
+--------+------------+-----------+
寫這個(gè)小功能的體會:我們可以先寫出靜態(tài)頁面,然后根據(jù)這個(gè)頁面來分析,哪些部分是需要動態(tài)展示的,也就是要和數(shù)據(jù)庫連接的,哪些部分是固定死的,再根據(jù)我們的分析去操作,這樣思路會比較清晰,不然的話,可能東寫一個(gè),西寫一個(gè),最后自己都亂了。
第六步:查看部門詳情。
-
建議:從前端往后端一步一步實(shí)現(xiàn)。首先要考慮的是,用戶點(diǎn)擊的是什么?用戶點(diǎn)擊的東西在哪里?
- 一定要先找到用戶點(diǎn)的“詳情”在哪里。找了半天,終于在后端的java程序中找到了
<a href='寫一個(gè)路徑'>詳情</a>
-
-
詳情 是需要連接數(shù)據(jù)庫的,所以這個(gè)超鏈接點(diǎn)擊之后也是需要執(zhí)行一段java代碼的。所以要將這個(gè)超鏈接的路徑修改一下。
-
注意:修改路徑之后,這個(gè)路徑是需要加項(xiàng)目名的。"/oa/dept/detail"
-
-
技巧:
-
out.print("<a href='"+contextPath+"/dept/detail?deptno="+deptno+"'>詳情</a>"); -
重點(diǎn):向服務(wù)器提交數(shù)據(jù)的格式:uri?name=value&name=value&name=value&name=value
- 這里的問號,必須是英文的問號。不能中文的問號。
-
解決404的問題。寫web.xml文件。
<servlet><servlet-name>detail</servlet-name><servlet-class>com.bjpowernode.oa.web.action.DeptDetailServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>detail</servlet-name><url-pattern>/dept/detail</url-pattern>
</servlet-mapping>
編寫一個(gè)類:DeptDetailServlet繼承HttpServlet,重寫doGet方法。
中文思路(思路來源于:你要做什么?目標(biāo):查看部門詳細(xì)信息。)第一步:獲取部門編號第二步:根據(jù)部門編號查詢數(shù)據(jù)庫,獲取該部門編號對應(yīng)的部門信息。第三步:將部門信息響應(yīng)到瀏覽器上。(顯示一個(gè)詳情。)
package com.bjpowernode.oa.web.action;import com.bjpowernode.oa.utils.DBUtils;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** @author zengyihong* @create 2022--03--11 19:14*/
public class DeptDetailServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter writer = response.getWriter();writer.println(" <!DOCTYPE html>");writer.println("<html>");writer.println(" <head>");writer.println(" <meta charset='utf-8'>");writer.println(" <title>部門詳情</title>");writer.println(" </head>");writer.println(" <body>");writer.println(" <h1>部門詳情</h1>");writer.println(" <hr />");//獲取部門編號// /oa/dept/detail?deptno=30//顯然提交的是30,但是服務(wù)器獲取的是30這個(gè)字符串String deptno = request.getParameter("deptno");//連接數(shù)據(jù)庫,根據(jù)相關(guān)部門來查詢部門信息Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;//部門編號是主鍵,所以查詢出來的記錄最多就一條try {conn = DBUtils.getConnection();String sql = "select dname,loc from dept where deptno=?";ps = conn.prepareStatement(sql);ps.setString(1, deptno);rs = ps.executeQuery();if (rs.next()) {String dname = rs.getString("dname");String loc = rs.getString("loc");writer.println(" 部門編號:" + deptno + "<br />");writer.println(" 部門名稱:" + dname + "<br />");writer.println(" 部門位置:" + loc + "<br />");}} catch (SQLException e) {e.printStackTrace();} finally {DBUtils.close(conn, ps, rs);}writer.println(" <input type='button' value='后退' οnclick='window.history.back()' />");writer.println(" </body>");writer.println("</html>");}}
接下來,看看效果
點(diǎn)擊后退
可以看出,點(diǎn)擊不同部門的詳情,就會對應(yīng)相應(yīng)的信息
如果程序出現(xiàn)錯誤,顯示4開頭的錯誤代碼,一般是前端代碼問題,如果是5開頭的錯誤代碼,一般是Java程序出現(xiàn)問題
第七步:刪除部門
- 怎么開始?從哪里開始?從前端頁面開始,用戶點(diǎn)擊刪除按鈕的時(shí)候,應(yīng)該提示用戶是否刪除。因?yàn)閯h除這個(gè)動作是比較危險(xiǎn)的。任何系統(tǒng)在進(jìn)行刪除操作之前,是必須要提示用戶的,因?yàn)檫@個(gè)刪除的動作有可能是用戶誤操作。(在前端頁面上寫JS代碼,來提示用戶是否刪除。)
<a href="javascript:void(0)" onclick="del(30)" >刪除</a><script type="text/javascript">function del(dno){//彈出確認(rèn)框,用戶點(diǎn)擊確定,返回true,點(diǎn)擊取消,返回falsevar ok=window.confirm("親,刪了不可恢復(fù)哦");//在JS代碼中如何發(fā)送請求給服務(wù)器//四種寫法都可以//document.location.href="請求路徑";// document.location="請求路徑";
// window.location.href="請求路徑";
// window.location="請求路徑";
//我們在點(diǎn)擊刪除的時(shí)候,要把刪除哪一個(gè)部門的編號傳進(jìn)去document.location.href="/oa/dept/delete?deptno="+dno;}
</script>
-
以上的前端程序要寫到后端的java代碼當(dāng)中:
- DeptListServlet類的doGet方法當(dāng)中,使用out.print()方法,將以上的前端代碼輸出到瀏覽器上。
-
解決404的問題:
-
http://localhost:8080/oa/dept/delete?deptno=30
-
web.xml文件
-
<servlet><servlet-name>delete</servlet-name><servlet-class>com.bjpowernode.oa.web.action.DeptDelServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>delete</servlet-name><url-pattern>/dept/delete</url-pattern>
</servlet-mapping>
編寫DeptDelServlet繼承HttpServlet,重寫doGet方法。
package com.bjpowernode.oa.web.action;import com.bjpowernode.oa.utils.DBUtils;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;/*** @author zengyihong* @create 2022--03--12 11:33*/
public class DeptDeleteServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//根據(jù)部門編號,刪除部門//獲取部門編號String deptno = request.getParameter("deptno");//連接數(shù)據(jù)庫刪除數(shù)據(jù)Connection conn=null;PreparedStatement ps=null;int count=0;try {conn= DBUtils.getConnection();//關(guān)閉自動提交,就是開啟事務(wù)conn.setAutoCommit(false);String sql="delete from dept where deptno =?";ps=conn.prepareStatement(sql);ps.setString(1,deptno);//返回的是影響數(shù)據(jù)庫表中多少條記錄count = ps.executeUpdate();conn.commit();} catch (SQLException e) {//遇到異常要回滾if (conn !=null){try {conn.rollback();} catch (SQLException ex) {ex.printStackTrace();}}e.printStackTrace();}finally {DBUtils.close(conn,ps,null);}if (count == 1){//刪除成功//仍然跳轉(zhuǎn)到部門列表頁面//部門列表頁面的顯示需要執(zhí)行另外一個(gè)Servlet,怎么辦?轉(zhuǎn)發(fā)request.getRequestDispatcher("/dept/list").forward(request,response);}else {request.getRequestDispatcher("/error.html").forward(request,response);}}
}
刪除成功或者失敗的時(shí)候的一個(gè)處理(這里我們選擇了轉(zhuǎn)發(fā),并沒有使用重定向機(jī)制。)
// 判斷刪除成功了還是失敗了。
if (count == 1) {//刪除成功//仍然跳轉(zhuǎn)到部門列表頁面//部門列表頁面的顯示需要執(zhí)行另一個(gè)Servlet。怎么辦?轉(zhuǎn)發(fā)。request.getRequestDispatcher("/dept/list").forward(request, response);
}else{// 刪除失敗request.getRequestDispatcher("/error.html").forward(request, response);
}
-
第八步:新增部門
- 注意:最后保存成功之后,轉(zhuǎn)發(fā)到 /dept/list 的時(shí)候,會出現(xiàn)405,為什么?
- 第一:保存用的是post請求。底層要執(zhí)行doPost方法。
- 第二:轉(zhuǎn)發(fā)是一次請求,之前是post,之后還是post,因?yàn)樗且淮握埱蟆?/li>
- 第三:/dept/list Servlet當(dāng)中只有一個(gè)doGet方法。
- 怎么解決?兩種方案
- 第一種:在/dept/list Servlet中添加doPost方法,然后在doPost方法中調(diào)用doGet。
- 第二種:重定向。
- 注意:最后保存成功之后,轉(zhuǎn)發(fā)到 /dept/list 的時(shí)候,會出現(xiàn)405,為什么?
第九步:跳轉(zhuǎn)到修改部門的頁面
package com.bjpowernode.oa.web.action;import com.bjpowernode.oa.utils.DBUtils;import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class DeptEditServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 獲取應(yīng)用的根路徑。String contextPath = request.getContextPath();response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.print("<!DOCTYPE html>");out.print("<html>");out.print(" <head>");out.print(" <meta charset='utf-8'>");out.print(" <title>修改部門</title>");out.print(" </head>");out.print(" <body>");out.print(" <h1>修改部門</h1>");out.print(" <hr >");out.print(" <form action='"+contextPath+"/dept/modify' method='post'>");// 獲取部門編號String deptno = request.getParameter("deptno");// 連接數(shù)據(jù)庫,根據(jù)部門編號查詢部門的信息。Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {conn = DBUtils.getConnection();String sql = "select dname, loc as location from dept where deptno = ?";ps = conn.prepareStatement(sql);ps.setString(1, deptno);rs = ps.executeQuery();// 這個(gè)結(jié)果集中只有一條記錄。if(rs.next()){String dname = rs.getString("dname");String location = rs.getString("location"); // 參數(shù)"location"是sql語句查詢結(jié)果列的列名。// 輸出動態(tài)網(wǎng)頁。out.print(" 部門編號<input type='text' name='deptno' value='"+deptno+"' readonly /><br>");out.print(" 部門名稱<input type='text' name='dname' value='"+dname+"'/><br>");out.print(" 部門位置<input type='text' name='loc' value='"+location+"'/><br>");}} catch (SQLException e) {e.printStackTrace();} finally {DBUtils.close(conn, ps, rs);}out.print(" <input type='submit' value='修改'/><br>");out.print(" </form>");out.print(" </body>");out.print("</html>");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}
第十步:修改部門
package com.bjpowernode.oa.web.action;import com.bjpowernode.oa.utils.DBUtils;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;/*** @author zengyihong* @create 2022--03--13 8:35*/
public class DeptModifyServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//解決請求體的亂碼問題request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");//獲取表單數(shù)據(jù)String deptno = request.getParameter("deptno");String dname = request.getParameter("dname");String loc = request.getParameter("loc");//連接數(shù)據(jù)庫,執(zhí)行更新語句Connection conn = null;PreparedStatement ps = null;int count=0;try {conn = DBUtils.getConnection();String sql = "update dept set dname=?,loc=? where deptno=? ";ps = conn.prepareStatement(sql);ps.setString(1, dname);ps.setString(2, loc);ps.setString(3, deptno);count = ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {DBUtils.close(conn, ps, null);}if (count==1){//更新成功//跳到列表頁面 部門列表頁面是通過Java程序動態(tài)生成的,需要請求轉(zhuǎn)發(fā),所以需要執(zhí)行另外一個(gè)servletrequest.getRequestDispatcher("/dept/list").forward(request,response);}else{request.getRequestDispatcher("/error.html").forward(request,response);}}}
大家還是需要自己動手練習(xí)
這里使用的是純粹的Servlet技術(shù),比較麻煩,后續(xù)還會改造一下這個(gè)小項(xiàng)目
總結(jié)
以上是生活随笔為你收集整理的使用Servlet完成单表的CRUD的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web站点的欢迎页面
- 下一篇: MySQL基础之select基本查询