開發工具:idea2017
開發環境: JDK8.0;tomcat7.09; mySQL8.0;
利用maven 做struts spring hibernate的jar包管理;實體是通過hibernate生成,映射xml也是。
頁面樣式效果:
完成後效果圖:
JSP頁面:
form表單中,
action標識struts的方法的名稱,在struts,xml中進行配置Action的id,class,method
method:是請求的類型:post
input中的typpe= submit:表示定義提交按鈕。提交按鈕會把表單數據發送到服務器
onsubmit :提交之後調用checkFrom()方法
novalidate: 還不是很明白,是HTML5的一個特性,表示不校驗
struts.xml
<struts>
<!-- 告知Struts2運行時使用Spring來創建對象 -->
<constant name="struts.objectFactory" value="spring" />
<package name="default" extends="struts-default" namespace="/">
<action name="userThree_*" class="userAction" method="regist">
</action>
</package>
</struts>
對應的java類:
類名userAction
/**
* Created by 邢美玲 on 2020/1/20 17:00.
* 跳轉到註冊頁面的方法
* @Version 1.0
*/
public class UserAction extends ActionSupport implements ModelDriven<UserEntity> {
private UserEntity userEntity = new UserEntity();
public UserEntity getModel() {
return userEntity ;
}
// 注入userService
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
/**
* 用戶註冊的方法:
*/
public String regist() {
userService.save(userEntity);
return null;
}
}
這裏因爲要用到userEntity,引入映射後的實體implement : 因爲要把這個類作爲Action啓動類所以exensActionSupport,這樣和struts.xml中的<action></action>可以建立聯繫;
這裏是如何注入Service的? 通過applicationContext.xml也就是spring的配置文件,進行注入;
applicationContext.xml
<bean id="userAction" class="action.UserAction" scope="prototype">
<!--注入service-->
<property name="userService" ref="userService"/>
</bean>
<!--Service的配置-->
<bean id="userService" class="service.UserService" scope="prototype" >
<!--注入dao-->
<property name="userDao" ref="userDao"/>
</bean>
<!--dao的配置-->
<bean id="userDao" class="dao.UserDao" scope="prototype">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
這裏展示的是部分配置,這是Action類中注入Service,Service類中注入Dao,Dao中注入session
Service層中的類:
/**
* Created by 邢美玲 on 2020/1/21 9:10.
* @Version 1.0
*/
// 事務管理的註釋
@Transactional
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
/*
* 用戶注入的方法--邢美玲
* 2020年2月8日
*/
public void save(UserEntity userEntity) {
// 將數據存入到數據庫
userEntity.setState(0); // 0:代表用戶未激活. 1:代表用戶已經激活.
String code = UUIDUtils.getUUID()+ UUIDUtils.getUUID();
userEntity.setCode(code);
userDao.save(userEntity);
}
}
這裏注意到Service層中相比其他層,多了一個事務管理的註釋,爲什麼只有這個層有呢?
這一部分,主要是spring做的封裝,在spring的配置文件中我們可以看見關於事務的配置:主要是通過spring-tx的jar包提供的。
這是applicationContext.xml中的配置:
<!-- 事務管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- 開啓註解事務 --> <!--annotation-driven: 表示支持註解 tx表示支持事務註解在@Transactional--> <tx:annotation-driven transaction-manager="transactionManager"/>
使用 Spring 框架,它對事務做了很好的封裝,
通過它的 AOP 配置,可以靈活的配置在任何一層;但是在很多的需求和應用,直接使用 JDBC 事務控
制還是有其優勢的。其實,事務是以業務邏輯爲基礎的;一個完整的業務應該對應業務層裏的一個方法;
如果業務操作失敗,則整個事務回滾;所以,事務控制是絕對應該放在業務層的;
Dao層的類:
/**
* Created by 邢美玲 on 2020/1/21 9:10.
*
* @Version 1.0
*/
public class UserDao extends HibernateDaoSupport {
/* 註冊用戶信息--邢美玲
* 2020年2月8日
*/
public void save(UserEntity userEntity) {
this.getHibernateTemplate().save(userEntity);
}
}
通過extens hibernateDaoSupport類可以直接用getHibernateTemplate()來對數據進行增刪改操作,這個類下實現了很多find,save,update,delete等方法。
小結:這是ssh,,從jsp頁到數據層的數據傳輸,這其中struts可以靈活配置java類和方法,它是java類jsp之間建立聯繫的樞紐,這其中當然也少不了web下web.xml 配置的struts的過濾。spring中spring-core 和 spring-beans 模塊是 Spring 框架的核心模塊,包含了控制反轉(Inversion of Control, IOC)和依賴注入(Dependency Injection, DI)