1.导入struts-2.3.36-all\struts-2.3.36\apps\struts2-blank-2.3.36\WEB-INF\lib中的包以及struts2-spring-plugin-2.3.36
2.配置struts.xml
<struts>
<constant name="struts.action.extension" value="action,do"/><!-- 设置后缀 -->
<constant name="struts.objectFactory" value="spring" /><!--被spring管理,action由spring管理,可以使用spring的依赖注入 -->
<package name="default" namespace="/" 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 name="redirect" type="redirect">${url}</result>
</action>
</package>
</struts>
注意:(1).class使用的不是类,是@Controller("groupAction")中的groupAction
(2).注意小写,因为在groupAction,group是小写,所以是group_list而不是Group_list
GroupAction:
@Controller("groupAction")
@Scope("prototype")//action必须使用多例
public class GroupAction extends ActionSupport implements ModelDriven<Group>{
/**
*
*/
private static final long serialVersionUID = 9035927090402972047L;
private IGroupService groupService;
private Group group;
private int cid;//接收网页过来的参数
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
public IGroupService getGroupService() {
return groupService;
}
@Resource
public void setGroupService(IGroupService groupService) {
this.groupService = groupService;
}
public String list() {
System.out.println("list");
ActionContext.getContext().put("gl", groupService.listAllGroup());
return SUCCESS;
}
public String show() {
System.out.println(cid);
group=groupService.load(cid);
System.out.println(group);
return SUCCESS;
}
@Override
public Group getModel() {
// TODO 自动生成的方法存根
if(group==null) group=new Group();
return group;
}
}
BaseDao:
public class BaseDao<T> extends HibernateDaoSupport implements IBaseDao<T>{
private Class<T> clz;
@SuppressWarnings("unchecked")
public Class<T> getClz() {
if(clz==null) {
clz = ((Class<T>)
(((ParameterizedType)(this.getClass().getGenericSuperclass())).getActualTypeArguments()[0]));
}
return clz;
}
public void setClz(Class<T> clz) {
this.clz = clz;
}
@Resource(name="sessionFactory")
public void setSuperSessionFactory(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
}
@Override
public void add(T t) {
// TODO 自动生成的方法存根
this.getHibernateTemplate().save(t);
}
@Override
public void delete(int id) {
// TODO 自动生成的方法存根
this.getHibernateTemplate().delete(this.load(id));
}
@Override
public void update(T t) {
// TODO 自动生成的方法存根
this.getHibernateTemplate().update(t);
}
@Override
public T load(int id) {
// TODO 自动生成的方法存根
return this.getHibernateTemplate().load(getClz(), id);
}
@Override
public List<T> list(String sql) {
// TODO 自动生成的方法存根
return list(sql, null);
}
@Override
public List<T> list(String sql, Object[] args) {
// TODO 自动生成的方法存根
@SuppressWarnings("unchecked")
Query<T> q=this.getSessionFactory().getCurrentSession().createQuery(sql);
if(args!=null) {//参数不为空才取长度,才遍历
for(int i=0;i<args.length;i++) {
q.setParameter(i, args[i]);
}
}
List<T> list=q.list();
return list;
}
@Override
public List<T> list(String sql, Object args) {
// TODO 自动生成的方法存根
return list(sql, new Object[] {args});
}
}
注意:(1).if(args!=null) {}//参数不为空才取长度,才遍历
(2).return list(sql, null); 里面传入null,所以我们需要进行判断,不为空再取数据
GroupHibernateDao.:
@Repository("groupHibernateDao")
public class GroupHibernateDao extends BaseDao<Group> implements IGroupDao {
}
GroupService:
@Service("groupService")
public class GroupService implements IGroupService {
private IGroupDao groupHibernateDao;
public IGroupDao getGroupHibernateDao() {
return groupHibernateDao;
}
@Resource
public void setGroupHibernateDao(IGroupDao groupHibernateDao) {
this.groupHibernateDao = groupHibernateDao;
}
@Override
public Group load(int id) {
// TODO 自动生成的方法存根
return groupHibernateDao.load(id);
}
@Override
public List<Group> listAllGroup() {
// TODO 自动生成的方法存根
return groupHibernateDao.list("from Group");
}
}
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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.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">
<!-- 打开Spring的Annotation支持 -->
<context:annotation-config />
<!-- 设定Spring 去哪些包中找Annotation -->
<context:component-scan base-package="spring" />
<!--Spring +Hibernate整合 -->
<!--加载数据库的连接配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置数据库来连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!--驱动类全称 -->
<property name="driverClassName" value="${jdbc.driverClassName}" />
<!--数据库的url地址 -->
<property name="url" value="${jdbc.url}" />
<!--用户名 -->
<property name="username" value="${jdbc.username}" />
<!--密码 -->
<property name="password" value="${jdbc.password}" />
</bean>
<!--配置Hibernate的SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!--1、配置数据库连接池 -->
<property name="dataSource" ref="dataSource"></property>
<property name="packagesToScan">
<value>spring.model</value>
</property>
<!--2、Hibernate的配置信息 -->
<property name="hibernateProperties">
<props>
<!--方言 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<!--事物管理对象 -->
<bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean> -->
<!--配置事物的通知 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- 事物的属性,其实就是为切面中的哪些方法进行事物的配置 -->
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!--aop配置信息 -->
<aop:config>
<aop:pointcut id="pcut" expression="execution(* spring.dao.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pcut"/>
</aop:config>
</beans>
注意:(1).导入配置文件的location应该使用classpath:jdbc.properties
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener><!-- 创建监听器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:beans.xml</param-value>
</context-param>
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping><!-- 创建OpenSessionInViewFilter -->
<!-- OpenSessionInViewFilter允许这个request使用的是一个session,可以在request的任何时期延迟加载数据 -->
<!-- 要想该过滤器起作用,必须设置在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><!-- 创建struts过滤器 -->
</web-app>
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="#gl"><!-- 取ActionContext中的数据需要# -->
${id }----<a href="group_show.action?cid=${id }">${name }</a>
<br>
</s:iterator>
</body>
</html>
show.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>组信息</title>
</head>
<body>
<h1>组名称:${group.name }</h1><!-- 在action中有group这个参数(用来把数据从action传到页面) -->
</body>
</html>