Spring与Struts和JPA集成

这是一个Web Project

首先是web.xml文件

<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- 指定Spring的配置文件,默认从web根目录下开始寻找配置文件 --> <!-- 我们可以通过Spring提供的classpath:前缀指定从类路径下寻找 --> <!-- 这里【contextConfigLocation】是固定的 --> <!-- 通过ContextLoaderListener类的第53行的new ContextLoader()跳转到ContextLoader.java类中 --> <!-- 在ContextLoader.java类的第93行发现CONFIG_LOCATION_PARAM的值就是contextConfigLocation --> <!-- 这个值就是Spring系统内部使用的,所以是不能更改的,如果修改了的话,那么就找不到Spring的配置文件了 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:beans.xml</param-value> </context-param> <!-- 实例化Spring容器 --> <!-- 当应用启动的时候,ContextLoaderListener就会被执行,然后就会读取Spring的相关配置文件 --> <!-- 它默认会到//当前Web应用//WebRoot//WEB-INF//目录中查找applicationContext.xml文件 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 解决乱码问题 --> <filter> <filter-name>SpringCharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>SpringCharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 解决JPA因EntityManager对象关闭,而导致的延迟加载的例外问题 --> <!-- 本工程用到的JPA的实现框架的Jar包,请参考http://blog.csdn.net/jadyer/archive/2010/11/22/6027641.aspx --> <filter> <filter-name>SpringOpenEntityManagerInViewFilter</filter-name> <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>SpringOpenEntityManagerInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>struts</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>struts</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> </web-app>

然后是位于//WebRoot//WEB-INF//中的struts-config.xml文件

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> <form-bean name="personForm" type="com.jadyer.web.form.PersonForm" /> </form-beans> <action-mappings> <action path="/person/list" validate="false"> <forward name="list" path="/WEB-INF/page/personlist.jsp" /> </action> <action path="/person/manage" parameter="method" name="personForm" scope="request" validate="false"> <forward name="message" path="/WEB-INF/page/message.jsp" /> </action> </action-mappings> <!-- 在Struts1.x配置文件中添加Spring的请求控制器,它会根据Action的path值到Spring容器中寻找同名bean --> <!-- 即把Action交给Spring管理,然后在Action中就可以通过DI注入业务层bean,此时要确保Action的path值与bean的名称相同 --> <!-- 注意:不要忘记引入//spring-framework-2.5.6.SEC01//dist//modules//spring-webmvc-struts.jar文件 --> <controller> <set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor" /> </controller> </struts-config>

接着是用于收集用户名的login.jsp页面

<%@ page language="java" pageEncoding="UTF-8"%> <h2>Struts1.2.9和Spring2.5.6和JPA的集成</h2> <form action="person/manage.do" method="POST"> <input type="hidden" name="method" value="add"> 人员姓名:<input type="text" name="name"><br/> <input type="submit" value="添加人员"> </form>

位于//WebRoot//WEB-INF//page//中的用于显示添加新用户的结果的message.jsp页面

<%@ page language="java" pageEncoding="UTF-8"%> <font style="color:green;font-size:22px" mce_style="color:green;font-size:22px">${message}</font> <br/> <br/> 查看<a href="<%=request.getContextPath()%>/person/list.do">人员列表</a>信息

位于//WebRoot//WEB-INF//page//中的用于显示用户列表的personlist.jsp页面

<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <c:forEach items="${persons}" var="person"> 编号:${person.id}<br/> 姓名:${person.name}<br/><br/> </c:forEach>

然后是位于//src//META-INF//中的JPA持久化单元文件persistence.xml

<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="ssj" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.hbm2ddl.auto" value="update"/><!-- 同步数据库的表信息 --> <property name="hibernate.max_fetch_depth" value="3" /> <property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver" /> <property name="hibernate.connection.username" value="scott" /> <property name="hibernate.connection.password" value="jadyer" /> <property name="hibernate.connection.url" value="jdbc:oracle:thin:@127.0.0.1:1521:jadyer" /> </properties> </persistence-unit> </persistence>

接着是位于src根目录【即classpath下】的beans.xml文件

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <!-- Spring2.5中使用注解装配属性 --> <!-- 可参考我的文章:http://blog.csdn.net/jadyer/archive/2010/11/27/6038604.aspx --> <context:annotation-config /> <!-- EntityManagerFactory与SessionFactory的作用是比较相似的 --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> <!-- 这里的value就是//src//META-INF//persistence.xml中配置的持久化单元名称 --> <property name="persistenceUnitName" value="ssj" /> </bean> <!-- 配置Spring针对JPA所封装的事务管理器 --> <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <tx:annotation-driven transaction-manager="txManager" /> <bean id="personService" class="com.jadyer.service.impl.PersonServiceImpl" /> <bean name="/person/list" class="com.jadyer.web.action.PersonAction" /> <bean name="/person/manage" class="com.jadyer.web.action.PersonManageAction" /> </beans>

用到的数据库实体类Person.java

package com.jadyer.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Person{ private Integer id; private String name; public Person(){} //保留无参的构造函数 public Person(String name){ this.name = name; } @Id @GeneratedValue //默认根据数据库方言决定主键值的生成策略 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(length=10,nullable=false) public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } //建议大家重载hashCode()和equals()方法 //重载时根据实体的标识,即id来判断两个对象是否相等 @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final Person other = (Person) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } }

用到的服务层接口以及实现类

package com.jadyer.service; import java.util.List; import com.jadyer.model.Person; public interface PersonService { public void save(Person person); public List<Person> getPersons(); } /** * 上面的PersonService是服务层的接口 * 下面的PersonServiceBean是服务层接口的实现类 */ package com.jadyer.service.impl; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.jadyer.model.Person; import com.jadyer.service.PersonService; @Transactional public class PersonServiceImpl implements PersonService { //使用@PersistenceContext注解注入EntityManager对象,它由JAP规范所提供,并且Spring对它也支持 @PersistenceContext EntityManager em; public void save(Person person){ em.persist(person); } //查询,无需开启事务 @Transactional(propagation=Propagation.NOT_SUPPORTED, readOnly=true) public List<Person> getPersons(){ return em.createQuery("select o from Person o").getResultList(); } }

接着是Struts1.x中用于收集前台表单信息的ActionForm类

package com.jadyer.web.formbean; import org.apache.struts.action.ActionForm; public class PersonForm extends ActionForm { private Integer id; private String name; /* 两个属性的setter和getter略 */ }

然后是Struts1.x中用于添加用户的Action类

package com.jadyer.web.action; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.actions.DispatchAction; import com.jadyer.model.Person; import com.jadyer.service.PersonService; import com.jadyer.web.formbean.PersonForm; public class PersonManageAction extends DispatchAction { @Resource //关于@Resource注解的资料,请参考我的文章:http://blog.csdn.net/jadyer/archive/2010/11/27/6038604.aspx PersonService personService; public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { PersonForm formbean = (PersonForm)form; personService.save(new Person(formbean.getName())); request.setAttribute("message", "添加人员成功"); return mapping.findForward("message"); } }

最后是Struts1.x中用于显示用户列表的Action类

package com.jadyer.web.action; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import com.jadyer.service.PersonService; public class PersonAction extends Action { @Resource PersonService personService; @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { request.setAttribute("persons", personService.getPersons()); return mapping.findForward("list"); } }

另外附上使用JUnit4编写的单元测试类PersonServiceTest.java

package com.jadyer.junit; import java.util.List; import org.junit.BeforeClass; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.jadyer.model.Person; import com.jadyer.service.PersonService; public class PersonServiceTest { private static PersonService personService; @BeforeClass public static void setUpBeforeClass() throws Exception { try { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); personService = (PersonService) context.getBean("personService"); } catch (RuntimeException e) { e.printStackTrace(); //若出错,则打印提示信息到控制台。否则它是不会打印到控制台上的 } } @Test public void testSave() { personService.save(new Person("张起灵")); personService.save(new Person("汪藏海")); personService.save(new Person("铁面生")); } @Test public void testGetPersons() { List<Person> persons = personService.getPersons(); for(Person person : persons){ System.out.println(person.getName()); } } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
运行环境 操作系统:Windows XP。 Java平台:JDK 1.5。 Web服务器:Tomcat v 5.5.23,下载地址:http://tomcat.apache.org/。 数据库服务器:MySQL v 5.0.45,下载地址:http://www.mysql.com/。 开发平台:Eclipse SDK v 3.2.2,下载地址:http://www.eclipse.org/download/index.jsp。 Eclipse插件TomcatPlugins v 3.2.1,下载地址:http://www.eclipse-plugins.info/eclipse/index.jsp。 Eclipse插件ResourceBundleEditor v 0.7.7,下载地址:http://resourcebundleeditor.com/。 Eclipse插件MyEclipse v 5.5.1,下载地址:http://www.myeclipseide.com/ Spring 采用 2.0 版本 Hibernate 采用3.0版本 ====================================================== 请注意:如出现中文乱码,检查如下配置是否正确。 (1)MySql 数据库是否是utf-8 格式(在安装时选择支持多语言),数据是否正常。 (2)项目是否为utf-8格式(同时看看的源代码文件中,中文是否乱码)。 (3)JSP页面是否是utf-8 格式。 (4)在web.xml 是否配置了编码过滤器。 (5)数据源配置的url(?useUnicode=true&characterEncoding=UTF-8),具体请看项目实例。 如果上面5步都没问题,你就不存在中文乱码问题。 ====================================================== 数据库使用的是MySQL,其版本为5.0.45 版本。 数据库的用户名及密码均为root。 使用的时候,请参考附件数据库导入一节。或将需要用到的某章的数据库目录复制到“mysql安装根目录\data”文件夹下就可以了。 ★★★★★★★★★★★★★★★★★★★★★★★★★ 该实例来源下面这本书 《精通Java EE项目案例-基于Eclipse Spring Struts Hibernate》 本书下载链接,电驴,迅雷皆可 ed2k://|file|%E7%B2%BE%E9%80%9AJava.EE%E9%A1%B9%E7%9B%AE%E6%A1%88%E4%BE%8B-%E5%9F%BA%E4%BA%8EEclipse.Spring.Struts.Hibernate%E5%85%89%E7%9B%98%E6%BA%90%E7%A0%81.rar|70436209|475e7c3548acf955e89e378e760cf894|h=caud4x2auasf3pl2ln27e35fjw2jwxyb|/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值