s2sh整合<四>
這里我們需要使用spring的ioc將DAO諸如到service中,所以不要忘記在service實現類中加入DAO作為屬性。
PersonServiceImpl.java
- package test.s2sh.service.impl;
- import java.util.List;
- import test.s2sh.bean.Person;
- import test.s2sh.dao.PersonDAO;
- import test.s2sh.service.PersonService;
- public class PersonServiceImpl implements PersonService {
- private PersonDAO personDAO;
- public void delete(Person p) {
- this.personDAO.removePerson(p);
- }
- public List<Person> findAll() {
- return this.personDAO.findAllPersons();
- }
- public Person findById(Integer id) {
- return this.personDAO.findPersonById(id);
- }
- public void save(Person p) {
- this.personDAO.savePerson(p);
- }
- public void update(Person p) {
- this.personDAO.updatePerson(p);
- }
- public PersonDAO getPersonDAO() {
- return personDAO;
- }
- public void setPersonDAO(PersonDAO personDAO) {
- this.personDAO = personDAO;
- }
- } </OL>
- package test.s2sh.action.person;
- import test.s2sh.bean.Person;
- import test.s2sh.service.PersonService;
- import com.opensymphony.xwork2.ActionSupport;
- public class SavePersonAction extends ActionSupport {
- private Person p;
- private PersonService service;
- public Person getP() {
- return p;
- }
- public void setP(Person p) {
- this.p = p;
- }
- public PersonService getService() {
- return service;
- }
- public void setService(PersonService service) {
- this.service = service;
- }
- public String execute() throws Exception {
- this.service.save(p);
- return this.SUCCESS;
- }
- public void validate() {
- if(p.getName()==null||"".equals(p.getName())){
- this.addFieldError("p.name", "name is not null");
- }
- }
- } </OL>
- <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Save Person</title>
- </head>
- <body>
- <s:form action="savePerson">
- <s:textfield name="p.name" label="name"></s:textfield>
- <s:textfield name="p.age" label="age"></s:textfield>
- <s:submit></s:submit>
- </s:form>
- </body>
- </html> </OL>
- <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Save OK</title>
- </head>
- <body>
- 保存成功 <br>
- </body>
- </html> </OL>
- <action name="savePerson" class="savePersonAction">
- <result name="success" type="redirect">/save-success.jsp</result>
- <result name="input">/save.jsp</result>
- </action> </OL>
- <bean id="personDAO" class="test.s2sh.dao.impl.PersonDAOImpl" scope="singleton">
- <!-- 由于該類是繼承于HibernateDaoSupport,所以需要將sessionFactory注入 -->
- <property name="sessionFactory" >
- <ref bean="sessionFactory"/>
- </property>
- </bean>
- <bean id="personService" class="test.s2sh.service.impl.PersonServiceImpl">
- <property name="personDAO" ref="personDAO"></property>
- </bean>
- <bean id="savePersonAction" class="test.s2sh.action.person.SavePersonAction" scope="prototype">
- <property name="service" ref="personService"></property>
- </bean> </OL>
(6)接下來我們開始對action層進行設置,實際項目中的action可能會有很多,所以我們這里需要對action進行分包,因為我們這里針對Person進行操作,所以我們創建test.s2sh.action.person.
這里先做保存操作
SavePersonAction.java
<OL class=dp-j>
下面創建一個保存人員的提交頁面
save.jsp
<OL class=dp-j>
操作成功頁面
save-success.jsp
<OL class=dp-j>
接下來我們需要配置struts.xml,創建action
<OL class=dp-xml>
由于現在的action的創建已經由spring所接管,所以這里class里面使用的是別名,該別名與applicationContext.xml中的id對應.
接下來我們需要配置applicationContext的ioc。
這里說明一下spring中的單例與設計模式中的單例不同,設計模式的單例是在jvm中只產生一個實例,而spring中的單例
是針對每個ioc容器來言,如果存在兩個ioc容器,那么每個ioc容器都會生成唯一的類實例
將sessionFactory注入Dao中,這里的Dao來說是無狀態的,可以設置為單例singleton。這里的action是使用spring創建的。
struts2與struts1的action有所不同,因為struts2中的action中可能存在屬性,這里是Person,所以struts2的action可能是有狀態的。
如果是有狀態的我們就需要將scope設置成原型模式,即每次請求都新建一個action。
不然可能會出現如果表單提交的第一次出錯,之后就再也提交不過去了,值就是應為使用默認的singleton,
當第一次的時候就將FieldError中加入了錯誤,每次都是這個action,始終帶著這個錯誤,所以就提交不過去了。
到目前為止這個整合已經完成了。