日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

使用Servlet完成单表的CRUD

發(fā)布時(shí)間:2023/11/28 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Servlet完成单表的CRUD 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  • 實(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)到修改部門的頁面

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。