这里我们需要使用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; } }
(6)接下来我们开始对action层进行设置,实际项目中的action可能会有很多,所以我们这里需要对action进行分包,因为我们这里针对Person进行操作,所以我们创建test.s2sh.action.person.
这里先做保存操作
SavePersonAction.java
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"); } } }
下面创建一个保存人员的提交页面
save.jsp
<%@ 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>
操作成功页面
save-success.jsp
<%@ 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>
接下来我们需要配置struts.xml,创建action
<action name="savePerson" class="savePersonAction"> <result name="success" type="redirect">/save-success.jsp</result> <result name="input">/save.jsp</result> </action>
由于现在的action的创建已经由spring所接管,所以这里class里面使用的是别名,该别名与applicationContext.xml中的id对应.
接下来我们需要配置applicationContext的ioc。
<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>
这里说明一下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,始终带着这个错误,所以就提交不过去了。
到目前为止这个整合已经完成了。