Spring-Struts2-基本集成
步骤:
1,导入struts2的相关jar包(检查是否有冲突的包,即同一个包有不同的几个版本存在)
2,导入struts2和spring的整合包 struts2-spring-plugin-2.3.4.jar
3,配置struts.xml文件(打开struts2的用户向导帮助可以找到如何集成spring)
<!-- 表示action由Spring创建,可以直接使用spring的依赖注入来做 --> <constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" />
4, 创建Action
/** * 此时等于用Spring创建了userAction对象,在struts.xml配置文件中写action的class的时候 * 就不能写类,而应该写userAction这个对象 */ @Controller("userAction")
5,重新配置struts.xml基于通配符的访问方式
<!-- 基于通配符的方式 ,由于整合了Spring,在class中不用使用完整的类,而应该使用spring所注入的对象,如userAction就应该使用userAction来创建 --> <action name="*_*" class="{1}Action" method="{2}"> <result>/WEB-INF/{1}/{2}.jsp</result> <result name="input">/WEB-INF/jsp/{1}/{2}Input.jsp</result> <result type="redirect" name="redirect">/${url}</result> </action>
6, 在web.xml中配置获取BeanFactory的操作
1)创建监听器获取Spring的工厂
<!-- 1,创建Spring的监听器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 2, Spring的监听器通过context-param获取beans.xml的位置--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:beans.xml</param-value> </context-param>
2)配置Struts2的过滤器
<!-- 3,配置struts2的过滤器--> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
7,下面是一个完整过程的代码
1)beans.xml
<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-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!--1, 打开Spring的annotation --> <context:annotation-config/> <!-- 2, 设定Spring去那些包中找annotation --> <context:component-scan base-package="com.yangw.spring" /> <!-- 使用dbcp没有成功, 加的是commons-dbcp-1.4.jar class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" > <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <context:property-placeholder location="classpath:jdbc.properties"/> <!--创建sessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" > <!-- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" --> <property name="dataSource" ref="dataSource"/> <!-- 基于XML配置文件的形式 <property name="mappingResources"> <list> <value>product.hbm.xml</value> </list> </property> --> <!-- 自动去包中找hbm文件或者设置了annotation的类--> <property name="packagesToScan" value="com.yangw.spring.model" /> <!-- 将hibernate配置文件放到单独的配置文件中的方式--> <!-- <property name="configLocation" value="classpath:hibernate.cfg.xml" /> --> <property name="hibernateProperties"> <value> hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.show_sql=true hibernate.hbm2ddl.auto=update hibernate.format_sql=false </value> </property> </bean> <!-- 配置Spring事务处理 --> <!-- 1,创建事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 2, 配置AOP,Spring是通过AOP进行事务管理的--> <aop:config> <!-- 设置PointCut表示哪些方法要加入事务--> <aop:pointcut id="allMethods" expression="execution(* com.yangw.spring.dao.*.*(..))"/> <!-- 通过advisor来确定具体加入事务控制的方法 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods"/> </aop:config> <!--3, 配置哪些方法要加入事务 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="get*" read-only="true" /> <tx:method name="count*" read-only="true" /> <tx:method name="is*" read-only="true" /> <tx:method name="has*" read-only="true" /> <!-- 所有方法都加入事务 --> <tx:method name="*" /> </tx:attributes> </tx:advice> </beans>
2) struts.xml
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.action.extension" value="action,do" /> <constant name="struts.configuration.xml.reload" value="true" /> <constant name="struts.multipart.maxSize" value="10240000" /> <constant name="struts.custom.i18n.resources" value="Message" /> <!-- 表示action由Spring创建,可以直接使用spring的依赖注入来做 --> <constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" /> <package name="default" extends="struts-default"> <!-- 基于通配符的方式 --> <action name="*_*" class="{1}Action" method="{2}"> <result>/WEB-INF/jsp/{1}/{2}.jsp</result> <result name="input">/WEB-INF/jsp/{1}/{2}Input.jsp</result> <result type="redirect" name="redirect">/${url}</result> </action> </package> </struts>
3)web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <!-- 1,创建Spring的监听器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 2, Spring的监听器通过context-param获取beans.xml的位置--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:beans.xml</param-value> </context-param> <!-- 3,配置struts2的过滤器--> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
4)UserAction
package com.yangw.spring.action; import javax.annotation.Resource; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import com.yangw.spring.model.User; import com.yangw.spring.service.IUserService; /** * 此时等于用Spring创建了userAction对象,在struts.xml配置文件中写action的class的时候 * 就不能写类,而应该写userAction这个对象 * @author Administrator * */ @Controller("userAction") @Scope("prototype") public class UserAction extends ActionSupport implements ModelDriven<User> { private User user; @Resource private IUserService userService; public User getModel() { if(user==null) user=new User(); return user; } public String list(){ ActionContext.getContext().put("userList", userService.list()); return SUCCESS; } }
5) IUserService 和 UserService
package com.yangw.spring.service; import java.util.List; import com.yangw.spring.model.User; public interface IUserService { public void add(User user); public void update(User user); public void delete(int id) ; public User load(int id); public List<User> list(); }
package com.yangw.spring.service; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.yangw.spring.dao.IUserDao; import com.yangw.spring.model.User; @Service("userService") public class UserService implements IUserService { @Resource private IUserDao userDao; public void add(User user) { userDao.add(user); } public void update(User user) { userDao.update(user); } public void delete(int id) { userDao.delete(id); } public User load(int id) { return userDao.load(id); } public List<User> list() { String hql="from User"; return userDao.list(hql); } }
6) IUserDao 和 UserDao
package com.yangw.spring.dao; import com.yangw.spring.model.User; public interface IUserDao extends IBaseDao<User>{ //此时的IUserDao只需要写特殊的一些方法,让子类去实现 //假设下面这个是IUserDao中的特殊方法 public void add(User user,int gid); }
package com.yangw.spring.dao; import org.springframework.stereotype.Repository; import com.yangw.spring.model.User; @Repository("userDao") public class UserDao extends BaseDao<User> implements IUserDao { public void add(User user, int gid) { System.out.println("cccc"); } }
7) IBaseDao 和 BaseDao
package com.yangw.spring.dao; import java.util.List; /** * IBaseDao接口是所有Dao公共的操作 * @author Administrator * @param <T> */ public interface IBaseDao<T> { public void add(T t); public void update(T t); public void delete(int id); public T load(int id); public List<T> list(String hql,Object[] args); public List<T> list(String hql); public List<T> list(String hql,Object arg); }
package com.yangw.spring.dao; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; /** * * 把所有公共方法都写到BaseDao,所有Dao都继承 BaseDao即可,这样就实现了大量的基础方法 * 如果Dao中有特殊的方法,再次具体的Dao中进行实现 * @author Administrator * * @param <T> */ public class BaseDao<T> extends HibernateDaoSupport implements IBaseDao<T> { //注入SessionFactory @Resource(name="sessionFactory") public void setSuperSessionFactory(SessionFactory sessionFactory){ super.setSessionFactory(sessionFactory); } private Class<T> entityClass; /** * 获取T对象的Class * @return */ @SuppressWarnings({ "unused", "unchecked" }) private Class<T> getEntityClass(){ if(entityClass==null){ entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; } return entityClass; } public void add(T t) { super.getHibernateTemplate().save(t); } public void update(T t) { super.getHibernateTemplate().update(t); } public void delete(int id) { //先加载对象再删除 super.getHibernateTemplate().delete(this.load(id)); } public T load(int id) { return super.getHibernateTemplate().get(getEntityClass(), id); } @SuppressWarnings("unchecked") public List<T> list(String hql, Object[] args) { //select * 的处理,可以利用反射来做 Query query=this.getSession().createQuery(hql); if(args!=null){ for(int i=0;i<args.length;i++){ query.setParameter(i, args[i]); } } return query.list(); } public List<T> list(String hql) { return this.list(hql, null); } public List<T> list(String hql, Object arg) { return this.list(hql, new Object[]{arg}); } }
8) /WEB-INF/jsp/user/list.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <s:iterator value="#userList"> ---${id}-----${name}----${age}---<br/> </s:iterator> </body> </html>
Spring-Struts2-基本集成的更多相关文章
- 最新版ssh hibernate spring struts2环境搭建
最新版ssh hibernate spring struts2环境搭建 最新版spring Framework下载地址:spring4.0.0RELEASE环境搭建 http://repo.sprin ...
- 手动配置三大框架整合:Spring+Struts2+mybatis
如今主流的项目框架中,数据库持久层有可能不是hibernate,而是mybatis或者ibatis,事实上它们都是一样的,以下我来把环境搭建一下: [导入相关jar包]新建web项目projectms ...
- 在spring环境下集成ActiveMQ
1.参考文献 Spring集成ActiveMQ配置 Spring JMS异步发收消息 ActiveMQ 2.环境 在前面的一篇ActiveMQ入门实例中我们实现了消息的异步传送,这篇博文将如何在spr ...
- 【原】Spring与MongoDB集成:配置
MongoDB的API提供了DBObject接口来实现BSONObject的操作方法,BasicDBObject是具体实现.但是并没有提供DBObject与BeanObject的转换.在还没有了解到与 ...
- Spring与Hibernate集成中的Session问题
主要讨论Spring与Hibernate集成中的session问题 1.通过getSession()方法获得session进行操作 public class Test extends Hibernat ...
- spring springMVC mybatis 集成
最近闲来无事,整理了一下spring springMVC mybatis 集成,关于这个话题在园子里已经有很多人写过了,我主要是想提供一个完整的demo,涵盖crud,事物控制等. 整个demo分三个 ...
- Struts2之—集成Json插件实现Ajax
上篇博客介绍了Struts2中自己定义结果集实现Ajax,也分析了它的缺点:这样自己定义的结果集,写死了,不能做到client须要什么数据就传什么数据:Struts2之-自己定义结果集实现aja ...
- spring+struts2+ibatis 框架整合以及解析
一. spring+struts2+ibatis 框架 搭建教程 参考:http://biancheng.dnbcw.net/linux/394565.html 二.分层 1.dao: 数据访问层(增 ...
- Quartz学习——Spring和Quartz集成详解(三)
Spring是一个很优秀的框架,它无缝的集成了Quartz,简单方便的让企业级应用更好的使用Quartz进行任务的调度.下面就对Spring集成Quartz进行简单的介绍和示例讲解!和上一节 Quar ...
- 简单Spring+Struts2+Hibernate框架搭建
使用Maven+Spring+Struts2+Hibernate整合 pom文件 <project xmlns="http://maven.apache.org/POM/4.0.0&q ...
随机推荐
- 深入解析JavaScript中的this关键字
如果问初学者js中什么东西比较难懂,很多回答会是this关键字.this在不同场景下所指向的对象不同,这就有一种扑朔迷离的感觉,放佛魔法一般神秘:this到底是什么?这里有四种绑定规则. 1. 默认绑 ...
- linux系统参数调优
执行 ulimit -a 查看系统配置 需要修改max user processes 和 open files 这两个值 vim /etc/security/limits.conf #新增下面几行 ...
- python 学习网站
python 文档库 docs.python.org/2/library/index.html python 第三方模块查找 pypi.python.org
- Integer陷阱(0~127和其他 数值相等对象比较)
Integer 类在对象中包装了一个基本类型 int 的值. 有一个陷阱存在,经常出现在面试题中,情况如下面代码 public class IntegerDemo { public static vo ...
- poj2912 Rochambeau
Description N children are playing Rochambeau (scissors-rock-cloth) game with you. One of them is th ...
- ORA-06575:程序包或函数处于无效状态
今天一个朋友问我下面这段sql语句的问题,我发现了他竟然把程序员的编程思想带入了oracle,虽然是错误的,但也是很经典的错误啊. create or replace package p_view_p ...
- JSP入门必读
JSP基础知识:转自老师上课梳理的笔记,希望对大家有所帮助.有什么不妥当的地方还望大家批评指正. 特别适用于JSP入门的人员使用.1.JSP [1] 简介1.1 HTML HTML擅长显示一个静 ...
- HandlerThread实现数字时钟
1.描述 刚看完Android多线程编程,对HandlerThread比较感兴趣,趁热巩固练习,实现一个了数字时钟,希望对学习HandlerThread有所帮助.如下: 启动一个HandlerThre ...
- Day3 - Linux系统安装_Centos6.9
第1章 虚拟机安装 1.1 镜像下载 1.1.1 新版本下载 http://mirrors.aliyun.com #阿里云官方镜像站点 1.1.2 旧版本下载 http://vault.cento ...
- 深度剖析Redis持久化
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt118 Redis是一种面向"key-value"类型数据 ...