CRUD是指在做計算處理時的增加(Create)、查詢(Retrieve)(重新得到數據)、更新(Update)和刪除(Delete)幾個單詞的首字母簡寫。主要被用在描述軟件系統中數據庫或者持久層的基本操作功能。
In computing, CRUD is an acronym for create, retrieve, update, and delete. It is used to refer to the basic functions of a database or persistence layer in a software system.
C reate new records
R etrieve existing records
U pdate existing records
D elete existing records.
在響應新增部門請求中,通過導入Struts 的配置文件(struts-config.xml) 來完成業務流程的部署。它把depAdd.jsp 和depAdd.do 連接起來。depAdd.jsp上產生客戶請求,depAdd.do 則對請求產生響應、處理jsp頁面上的數據。當點擊depAdd.jsp 上的保存按鈕
( <div style="float: right; padding: 10px 25px 0 0;">
<div class="right_button">
<a href="#" onclick="check();return false;"><bean:message
key="go.add" /> </a>
</div>
</div>)
先檢查頁面數據的正確性,校驗通過後將輸入數據用Set方法存入到userinfoForm這個FormBean中。
function check()
{
var userName = document.userinfoForm.userName.value;
var password = document.userinfoForm.password.value;
var length = document.userinfoForm.password.value.length;
var repassword = document.userinfoForm.repassword.value;
var tel = document.userinfoForm.tel.value;
var department = document.userinfoForm.department.value;
if(userName=="")
{
alert('部門管理員姓名不能為空!')
return false;
}
if(password=="")
{
alert('密碼不能為空!')
return false;
}
if(length<6||length>10)
{
alert('密碼必須大於6個字符小於10個字符!')
return false;
}
if(repassword=="")
{
alert('重復密碼不能為空!')
return false;
}
if(password!=repassword)
{
alert('密碼輸入不一致!')
return false;
}
if(tel!="")
{
No = "0123456789()+-"
for(i=0; i<tel.length; i++)
{
var Checkstr = tel.charAt(i);
if (No.indexOf(Checkstr)== -1)
{
alert("聯系電話格式不正確!");
return false;
}
}
}
if(department=="")
{
alert('部門管理員所屬部門不能為空!')
return false;
}
else
{
document.userinfoForm.submit();
}
}
然後根據struts-config.xml調用depAdd.do (這將在Spring配置文件中指定相應的Action) 進行業務處理。在depAdd.do中頁面數據將從userinfoForm 中讀取。depAdd.do 執行成功後將顯示/ok.jsp頁面。depAdd.do對應的Action (DepAddAction)在Spring的配置文件(applicationContext.xml) 中指定。要把depAdd.do和DepAddAction對應起來,首先要在struts-config.xml 中配置Delegating RequestProcessor。其次,需要在application Context.xml中定義名字為“/depAdd”的受管JavaBean。每次對DepAddAction請求時,Delegating Request Processor將充當代理。同時,DepAddAction 使用到受管Java Beansm Service。要使用UserinfoService,需要在DepAddAction中生成UserinfoService的get()、set()方法,並且application Context.xml 中對“/depAdd”進行Dep Add Action的依賴注入。因為DepAddAction 並沒有直接去操作數據訪問Userinfo DAO。而是通過調用業務邏輯層UserinfoService 中的方法來實現業務邏輯的。DepAddAction中部分代碼如下:
String userName = userinfoForm.getUserName();
String pwd = userinfoForm.getPassword();
String rePwd = userinfoForm.getRepassword();
String tel = userinfoForm.getTel();
String dep = userinfoForm.getDepartment();
// 生成userinfo對象
Userinfo userinfo = new Userinfo();
// 將從表單中獲得的值賦給該對象
userinfo.setUserName(userName);
userinfo.setPassword(pwd);
userinfo.setTel(tel);
userinfo.setDepartment(dep);
userinfo.setUserType("dep");// 所有新增用戶類型一律為dep
// 數據入庫
userinfoService.save(userinfo);
如果depAdd.do要對應另一個Action,則只要修改applicationContext.xml 即可,這將有利於系統的更新。同樣,如果另一個.do 要對應DepAddAction,也只要在applicationContext.xml中配置即可,這將有利於代碼的重用。在本系統中,Hibernate 和Spring 共用一個配置文件applicationContext.xml。Hibernate 從applicationContext.xml 中讀取和數據庫有關的信息。數據庫信息包括數據庫連接、與數據庫結構相對應的映射文件。在新增部門請求中,涉及到的數據庫表為userinfo表,它所對應的映射文件為Userinfo.hbm.xml。為了訪問數據庫表userinfo,只有Userinfo.hbm.xml映射文件是不夠的,還需要數據訪問類UserinfoDAO、數據類AbstractUserinfo,Userinfo。數據類Userinfo的實現較為簡單,它只是Java對象與數據庫表之間的對應,主要用於在各應用層間傳遞數據,在它的基礎上要實現的就是數據訪問類UserinfoDAO。系統在生成UserinfoDAO 的同時,也將UserinfoDAO作為JavaBean配置到applicationContext.xml 中。UserinfoDAO中是對userinfo 表進行保存、查詢、刪除或修改等基本數據操作,在applicationContext.xml 中需要userinfoService 進行UserinfoDAO 及其代理的依賴注入。這樣做,使得當UserinfoDAO 變化時,只需修改applicationContext.xml給userinfoService實現新的注入,指向新的實現就可以了,由此解除了數據訪問層和業務層的緊密耦合。數據訪問類UserinfoDAO 繼承於輔助類Hibernate-DaoSupport,借助於getHibernateTemplate() 獲得對Hibernate資源的操作,極大的方便了Hibernate框架的使用。在UserinfoDAO中定義了對數據庫表userinfo的操作函數。如下面代碼,即是UserinfoService 中調用的saveData 方法。
public class UserinfoDAO extends HibernateDaoSupport implements IUserinfoDAO {
private static final Log log = LogFactory.getLog(UserinfoDAO.class);
protected void initDao() {
// do nothing
}
public void save(Userinfo transientInstance) {
log.debug("saving Userinfo instance");
try {
getHibernateTemplate().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
部門添加模塊中applicationContext.xml中的代碼如下:
<!-- 創建事務管理類 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<!-- 創建用戶事務代理類 -->
<bean id="userinfoDAOProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="UserinfoDAO" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="modify*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="get">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
…
<!--進行UserinfoDAO及其代理的依賴注入-->
<bean id="UserinfoService" class="com.dpt.ec.service.impl.UserinfoService">
<property name="userinfoDAO">
<ref bean="userinfoDAOProxy" />
</property>
</bean>
…
<!--調度管理#新增部門管理員 -->
<bean name="/depAdd" class="com.dpt.ec.web.action.admin.DepAddAction"
singleton="false">
<property name="userinfoService">
<ref bean="UserinfoService" />
</property>
</bean>
部門添加模塊中struts-config.xml中的代碼如下:
<form-beans>
…
<form-bean name="userinfoForm" type="com.dpt.ec.web.form.UserinfoForm" />
</form-beans>
…
<!-- 調度管理#新增加部門管理員-->
<action path="/depAdd" name="userinfoForm"
type="org.springframework.web.struts.DelegatingActionProxy" scope="request" validate="false">
<forward name="success" path="/ok.jsp" />
<forward name="warning" path="error.pub" />
<forward name="failure" path="error.sys" />
</action>
…
在本項目的開發過程中運用這樣的技術方法大大提高了開發效率、增加了程序的可讀性、減少了模塊間的耦合性,這樣使得系統更加容易更新和維護。
出處:http://gaochaojs.blog.51cto.com/812546/210131