IDEA 下寫出第一個 SSH 整合框架練手專案(四,部門和員工的增刪改查完成)
這是SSH 整合專案的第三章,第一章基於Meavn 整合 Spring 和 Hibernate 框架並進行了進行了自動建表,第二章則在此基礎上加入 Struts 2 框架以及完成一個簡單的登陸頁面。第三章主要側重於分頁查詢功能的實現,第四章則著重完善增刪改查程式碼,因為重複性太大,直接將程式碼粘上來,比較難的會寫上註釋。
首先寫Employee 的增刪改查,直接寫Action--->Service---->Dao
EmployeeAction.java 中新增的程式碼
/** * 首先獲取到所有的部門,更改員工所在的部門,然後跳轉到真正新增員工的jsp */ public String saveUI() { //查詢部門 List<Department> list = departmentService.findAll(); //集合用 set 方法, 物件用 push ActionContext.getContext().getValueStack().set("list", list); return "saveUI"; } /** * 儲存員工的 save() */ public String save() { employeeService.save(employee); return "saveSuccess"; } /** * 更新員工資訊的方法 */ public String edit() { //根據員工ID 查詢員工 employee = employeeService.findById(employee.getEid()); List<Department> list = departmentService.findAll(); ActionContext.getContext().getValueStack().set("list", list); return "editSuccess"; } public String update() { employeeService.update(employee); return "updateSuccess"; } /** * 刪除員工使用的方法 */ public String delete(){ employeeService.delete(employee); return "deleteSuccess"; }
EmployeeService.java(Service 的介面全部程式碼)
EmployeeServiceImpl.java 中新增程式碼package com.test.ssh.service; import com.test.ssh.domain.Employee; import com.test.ssh.domain.PageBean; public interface EmployeeService { public Employee login(Employee employee); PageBean<Employee> fingByPage(Integer currPage); void save(Employee employee); Employee findById(int eid); void delete(Employee employee); void update(Employee employee); }
@Override public void save(Employee employee) { employeeDao.save(employee); } @Override public Employee findById(int eid) { return employeeDao.findById(eid); } @Override public void delete(Employee employee) { employeeDao.delete(employee); } @Override public void update(Employee employee) { employeeDao.update(employee); }
此時在/web/frame 下新增一個 editEmployee.jsp
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" %>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8">
<title></title>
<body>
<table border="0" width="600px">
<tr>
<td align="center" style="font-size:24px; color:#666"> 員工修改</td>
</tr>
<tr>
<td align="right">
<a href="javascript:document.getElementById('saveForm').submit()">儲存</a>
<a href="javascript:history.go(-1)">退回</a>
</td>
</tr>
</table>
<br/>
<s:form action="employee_update" method="post" namespace="/" id="saveForm" theme="simple">
<s:hidden name="eid" value="%{model.eid}"/>
<table border='0' cellpadding="0" cellspacing="10">
<tr>
<td>姓名:</td>
<td><s:textfield name="ename" value="%{model.ename}"/></td>
<td>性別:</td>
<td><s:radio name="sex" list="{'男','女'}" value="%{model.sex}"/></td>
</tr>
<tr>
<td>出生日期:</td>
<td><input type="text" name="birthday" value="<s:date name="model.birthday" format="yyyy-MM-dd"/>"/></td>
<td>入職時間:</td>
<td><input type="text" name="joinDate" value="<s:date name="model.joinDate" format="yyyy-MM-dd"/>"/></td>
</tr>
<tr>
<td>所屬部門:</td>
<td><s:select name="department.did" list="list" listKey="did" listValue="dname"
value="%{model.department.did}" headerKey="" headerValue="-----請--選--擇----"/></td>
<td>編號:</td>
<td><s:textfield name="eno" value="%{model.eno}"/></td>
</tr>
<tr>
<td>使用者名稱:</td>
<td><s:textfield name="username" value="%{model.username}"/></td>
<td>密碼:</td>
<td><s:password name="password" value="%{model.password}" showPassword="true"/></td>
</tr>
</table>
</s:form>
</body>
</html>
在同一位置新增一個editDepartment.jsp
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" %>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8">
<title></title>
</head>
<body>
<table border="0" width="600px">
<tr>
<td align="center" style="font-size:24px; color:#666"> 部門編輯</td>
</tr>
<tr>
<td align="right">
<a href="javascript:document.getElementById('saveForm').submit()">儲存</a>
<a href="javascript:history.go(-1)">退回 </a>
</td>
</tr>
</table>
<br/>
<br>
<s:form id="saveForm" action="department_update.action" method="post" namespace="/" theme="simple">
<s:hidden name="did" value="%{model.did}"/>
<table style="font-size::16px">
<tr>
<td>部門名稱:</td>
<td><s:textfield name="dname" value="%{model.dname}"/></td>
</tr>
<tr>
<td>部門介紹:</td>
<td></td>
</tr>
<tr>
<td width="10%"></td>
<td>
<s:textarea cols="50" rows="5" name="ddesc" value="%{model.ddesc}"/>"/>
</td>
</tr>
</table>
</s:form>
</body>
</html>
測試發現出現Bug,
org.springframework.dao.InvalidDataAccessApiUsageException:
object references an unsaved transient instance - save the transient instance before flushing:
com.test.ssh.domain.Department; nested exception is org.hibernate.TransientObjectException: object r
查詢後更改applicationContext.xml
將
<!--開啟註解式事務管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
改為
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="search*" read-only="false" />
</tx:attributes>
</tx:advice>
然後更改DepartmentAction.java(直接放全部程式碼)
package com.test.ssh.action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.test.ssh.domain.Department;
import com.test.ssh.domain.PageBean;
import com.test.ssh.service.DepartmentService;
import com.test.ssh.service.impl.DepartmentServiceImpl;
public class DepartmentAction extends ActionSupport implements ModelDriven<Department> {
//模型使用的驅動
private Department department = new Department();
private DepartmentService departmentService;
/**
* 查詢並設定頁數的操作
* 先預設當前頁面 currPage = 1
*/
private Integer currPage = 1;
public void setCurrPage(Integer currPage) {
this.currPage = currPage;
}
public String findAll() {
PageBean<Department> pageBean = departmentService.findByPage(currPage);
//將pageBean 存入到值棧中
ActionContext.getContext().getValueStack().push(pageBean);
return "findAll";
}
//新增部門
public String save() {
departmentService.save(department);
return "saveSuccess";
}
/**
* 我們在findAll頁面裡點選了 編輯按鈕後,呼叫edit 方法,
* 主要是獲取想要修改的部門的屬性,並展現在網頁中,
* 待使用者修改完成後,點選儲存,則呼叫的是 update() 方法進行更新
*/
//編輯部門的執行的方法
public String edit() {
department = departmentService.findById(department.getDid());
return "editSuccess";
}
//修改部門的執行的方法
public String update() {
departmentService.update(department);
return "updateSuccess";
}
/**
* 為了完成級聯刪除,即刪除某一個部門,對應的所有員工都被刪除
* 需要先查詢,後刪除
*/
public String delete() {
department = departmentService.findById(department.getDid());
departmentService.delete(department);
return "deleteSuccess";
}
public void setDepartment(Department department) {
this.department = department;
}
public void setDepartmentService(DepartmentService departmentService) {
this.departmentService = departmentService;
}
@Override
public Department getModel() {
return department;
}
}
DepartmentServiceImpl.java(介面中的父方法手動補全)package com.test.ssh.service.impl;
import com.test.ssh.dao.DepartmentDao;
import com.test.ssh.domain.Department;
import com.test.ssh.domain.Employee;
import com.test.ssh.domain.PageBean;
import com.test.ssh.service.DepartmentService;
import java.util.List;
public class DepartmentServiceImpl implements DepartmentService {
private DepartmentDao departmentDao;
public void setDepartmentDao(DepartmentDao departmentDao) {
this.departmentDao = departmentDao;
}
@Override
public PageBean<Department> findByPage(Integer currPage) {
PageBean<Department> departmentPageBean = new PageBean<Department>();
// 封裝當前的頁數
departmentPageBean.setCurrPage(currPage);
//封裝每頁顯示的記錄數,預設為3
int pageSize = 3;
departmentPageBean.setPageSize(pageSize);
//封裝總記錄數,總記錄數通過查詢資料庫獲得
int totalCount = departmentDao.findCount();
departmentPageBean.setTotalCount(totalCount);
//封裝總頁數
double tc = totalCount;
Double num = Math.ceil(tc / pageSize);
departmentPageBean.setTotalPage(num.intValue());
//封裝每頁顯示的資料
int begin = (currPage - 1) * pageSize;
List<Department> list = departmentDao.findByPage(begin, pageSize);
departmentPageBean.setList(list);
return departmentPageBean;
}
@Override
public List<Department> findAll() {
return departmentDao.findAll();
}
@Override
public void save(Department department) {
departmentDao.save(department);
}
@Override
public void update(Department department) {
departmentDao.update(department);
}
@Override
public void delete(Department department) {
departmentDao.delete(department);
}
@Override
public Department findById(int did) {
return departmentDao.findById(did);
}
}
DepartmentDaoImpl.java(介面中的父方法手動補全)
package com.test.ssh.dao.impl;
import com.test.ssh.dao.DepartmentDao;
import com.test.ssh.dao.EmployeeDao;
import com.test.ssh.domain.Department;
import com.test.ssh.domain.Employee;
import org.hibernate.criterion.DetachedCriteria;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import java.util.List;
public class DepartmentDaoImpl extends HibernateDaoSupport implements DepartmentDao {
@Override
public int findCount() {
//查詢個數
String hql = "select count(*) from Department ";
List<Long> list = this.getHibernateTemplate().find(hql);
//如果個數
if (list.size() > 0) {
return list.get(0).intValue();
//將Long 型別轉為 int 型別後返回.
}
return 0;
}
@Override
public List<Department> findByPage(int begin, int pageSize) {
DetachedCriteria criteria = DetachedCriteria.forClass(Department.class);
List<Department> list = this.getHibernateTemplate().findByCriteria(criteria,begin,pageSize);
return list;
}
@Override
public List<Department> findAll() {
//查詢到所有語句的 hql 語句。
List<Department> list = this.getHibernateTemplate().find("from Department ");
return list;
}
@Override
public void save(Department department) {
this.getHibernateTemplate().save(department);
}
@Override
public Department findById(int did) {
return this.getHibernateTemplate().get(Department.class,did);
}
@Override
public void update(Department department) {
this.getHibernateTemplate().update(department);
}
@Override
public void delete(Department department) {
this.getHibernateTemplate().delete(department);
}
}
然後進行對addDepartment.jsp 進行更改。
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" %>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8">
<title></title>
</head>
<body>
<table border="0" width="600px">
<tr>
<td align="center" style="font-size:24px; color:#666"> 部門新增</td>
</tr>
<tr>
<td align="right">
<a href="javascript:document.getElementById('saveForm').submit()">儲存</a>
<a href="javascript:history.go(-1)">退回 </a>
</td>
</tr>
</table>
<br/>
<br>
<s:form id="saveForm" action="department_save.action" method="post" namespace="/" theme="simple">
<table style="font-size::16px">
<tr>
<td>部門名稱:</td>
<td><s:textfield name="dname"/></td>
</tr>
<tr>
<td>部門介紹:</td>
<td></td>
</tr>
<tr>
<td width="10%"></td>
<td>
<s:textarea cols="50" rows="5" name="ddesc"/>
</td>
</tr>
</table>
</s:form>
</body>
</html>
至此,本專案全部結束。 不清楚的可以留言詢問。
相關推薦
IDEA 下寫出第一個 SSH 整合框架練手專案(四,部門和員工的增刪改查完成)
這是SSH 整合專案的第三章,第一章基於Meavn 整合 Spring 和 Hibernate 框架並進行了進行了自動建表,第二章則在此基礎上加入 Struts 2 框架以及完成一個簡單的登陸頁面。第三章主要側重於分頁查詢功能的實現,第四章則著重完善增刪改查程式碼,因為
IDEA 下寫出第一個 SSH 整合框架練手專案(二,整合SSH及登陸頁面的完成)
這是SSH 整合專案的第二章,第一章基於Meavn 整合 Spring 和 Hibernate 框架並進行了進行了自動建表,這一章則在此基礎上加入 Struts 2 框架以及完成一個簡單的登陸頁面。 1. 配置 Struts 2 選中 Project Struts
IDEA 下寫出第一個 SSH 整合框架練手專案( 一 ,Spring 與 Hibernate 整合)
IDEA 下寫出第一個 SSH 整合框架練手專案( 一 ) 最近幾周快速的學完了 SSH 框架,因為很快,所以幾乎沒記住什麼,又抄著視訊寫了一個專案,決定自己只看原始碼的再寫一遍。 1. 新建meavn專案 首先,新建一個Meavn 專案,File <---
Python開發學習寫出第一個Python程序
Python編程語言 Python開發學習 目標:了解Python,了解Python的特征,了解Python的應用,掌握Linux下Python開發環境的搭建,理解Windows下Python環境搭建,寫出第一個Python程序。 什麽是Python 一種解釋型的、面向對象的、帶有動態語義
使用 Android Studio 寫出第一個 NDK 程式(超詳細)
NDK(Native Development Kit),是用於在 Android 應用中巢狀原生代碼的工具集,現在 Android 開發最常用的工具就是 Android Studio 了,筆者也是剛剛接觸 NDK 開發,用了一天的時間,踩了很多坑,最終跑通了自己的第一
Anaconda+django寫出第一個web app(一)
圖片 things tab tro ogr 參考 min sent clas 在安裝好Anaconda和django之後,我們就可以開始創建自己的第一個Web app,那麽首先創建一個空文件夾,之後創建的文件都在這個文件夾內。 啟動命令行進入此文件夾內,可以先通過如下命令查
AI 入門,從零搭建完整 AI 開發環境,並寫出第一個 AI 應用
是時候學習 AI 了!怎麼做我們來教你。 所需環境:64位的 Windows10,Windows8/7 64位下也能安裝。機器要有至少 30G 的硬碟空間。要求:讀者需要知道怎麼用基本的 GitHub 操作和基本程式開發。 本場 Chat 主要內容:入門 AI 工具和平臺,一
Anaconda+django寫出第一個web app(五)
down lock 下載 解決 RKE 分享圖片 tinymce 今天 分享 今天開始學習網頁風格和設計,就像python有Web框架一樣,也有一些CSS框架。對於CSS框架,我們可以使用默認的樣式,也可以在原基礎上編輯修改。本教程使用的是materialize這個CSS框
Anaconda+django寫出第一個web app(六)
HERE obj short ren 混亂 all err strong anaconda 今天學習如何寫一個註冊用戶的界面。 上一節的導航欄中我們修改了導航欄右側的文字為register並將路徑設置為/register,內容如下: <li><a hre
Anaconda+django寫出第一個web app(十)
one reg url cat AMM filter import tex nac 今天繼續學習外鍵的使用。 當我們有了category、series和很多tutorials時,我們查看某個tutorial,可能需要這樣的路徑http://127.0.0.1:8000/c
例項:建立一個表格,分頁顯示資料(MongoDB資料庫儲存),功能:實現增刪改查
需求:建立一個表格,分頁顯示資料,功能:實現增刪改查 效果圖: 自動建立一個專案 命令列: express mongodb-demo --view=ejs cd mongodb-demo npm install npm install mongodb --save npm sta
JFinal框架學習------整合bootstrap前端框架,實現簡單的增刪改查功能
Bootstrap,來自 Twitter,是目前最受歡迎的前端框架。Bootstrap 是基於 HTML、CSS、JAVASCRIPT 的,它簡潔靈活,使得 Web 開發更加快捷。 一、JFinal整合bootstrap 1.下載bootstra
SSH-1 員工增刪改查案例
1. 基本需求 基於SSH框架的員工增刪改查小案例的具體需求如下圖所示: 2. 實現步驟 2.1 搭建SSH框架環境 第一步:新增Spring4框架,具體步驟如下: 加入Spring4框架所依賴的jar包; 配置web.xml
Flask第四天-MongoDB介紹、增刪改查、資料型別、比較符、查詢關鍵字、修改器、排序選取跳過
db 檢視當前資料庫 show dbs 查詢所有資料庫(在物理磁碟上的) u
堅持堅持!用Java寫出刪除一個連結串列的倒數第N個節點,並返回頭節點(N總是可達的)
這個題目有個前提條件就是N總是可達的,所以直接省去了一種情況(N不可達時的情況) 思路: 資料結構裡面首先給定兩個指標p和q分別都指向這個連結串列的頭節點,然後若想求出這個連結串列的倒數第N個節點,方法就是先讓p向後挪N個位置,q不動。 因為N總是可達的,所以會有倆種情況,
自己寫的第一個android 遊戲《是男人就下100層》
自己開發的第一個android 遊戲《是男人就下100層》,注意是安卓遊戲,不是IPhone的。截圖如下: 這個有遊戲是用重力感應來控制的,所以要晃動手機來控制人物移動。這個遊戲的目標是下越多層數越好。這個遊戲跟電腦版的區別就是,到後面,吃兩個漢堡
ubuntu下創建第一個rails應用程序
pos readme size spring iss width ron starting font 一.創建一個新的應用程序 在控制臺輸入 > rails new demo create create README.rdoc
如何對第一個Vue.js元件進行單元測試 (下)
我們的首次測試 讓我們來寫首個測試。我們首先需要使用shallowMount手動掛載我們的元件,並將其儲存在我們將執行斷言的變數中。我們還可以通過propsData屬性傳遞道具作為物件。 已安裝的元件是一個物件,它有一些實用方法: 然後,我們可以寫第一個斷言: 讓我們來
構建第一個SSH的maven專案
環境配置: eclispe maven版本:3.3.9 本地倉庫位置: 在C:\apache-maven-3.3.9\conf\settings.xml,需要配置好本地倉庫的路徑。 c盤目錄下的本地倉庫 一:新建Maven專案 因為是w
【AI實戰】訓練第一個AI模型:MNIST手寫數字識別模型
在上篇文章中,我們已經把AI的基礎環境搭建好了(見文章:Ubuntu + conda + tensorflow + GPU + pycharm搭建AI基礎環境),接下來將基於tensorflow訓練第一個AI模型:MNIST手寫數字識別模型。 MNIST是一個經典的手寫數字資料集,來自美國國家