**struts2 spring4 hibernate 4.3.10 注解形式 框架整合 tomcate7 jdk1.7 ,myeclipse 10.7亲测 **
jar包地址:http://download.csdn.net/detail/baidu_25696489/8793163
web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<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>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
</web-app>
在classpath下创建applicationcontext.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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
default-autowire="byName">
<!--加载属性文件 -->
<context:property-placeholder location="classpath*:application.properties" />
<!--扫描注解包 -->
<context:component-scan base-package="com" />
<!-- 配置系统的数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!--配置session工厂 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql" >${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
</props>
</property>
<!-- 扫描hibernate对应的实体类 -->
<property name="packagesToScan" value="com.lavasoft.demo.entity" />
</bean>
<!-- 开启注解事务支持 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" read-only="false"/>
<tx:method name="save*" propagation="REQUIRED" read-only="false" />
<tx:method name="remove*" propagation="REQUIRED" read-only="false" />
<tx:method name="delete*" propagation="REQUIRED" read-only="false"/>
<tx:method name="modify*" propagation="REQUIRED" read-only="false"/>
<tx:method name="update*" propagation="REQUIRED" read-only="false" />
<tx:method name="*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<!--面向切面的切入点配置 -->
<aop:config>
<aop:pointcut id="pointcut"
expression="execution(* com.lavasoft.demo.service.*Impl.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" />
</aop:config>
</beans>
创建application.properties
jdbc.driverClassName=com.mysql.jdbc.Driver//驱动名称
jdbc.url=jdbc\:mysql\://192.168.1.22\:3306/test?useUnicode\=true&characterEncoding\=utf8//数据库连库串
jdbc.username=root//用户名
jdbc.password=root//密码
################### Hibernate Configuration ##########################
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect//方言
hibernate.show_sql=false//是否输出sql语句
hibernate.format_sql=true//sql语句标准格式化
hibernate.hbm2ddl.auto=update//开启后当映射实体类找不到相应的映射时会自动创建新的数据库表
hibernate.generate_statistics=true
hibernate.cache.use_second_level_cache=true
创建log4j.properties
log4j.rootLogger= stdout
log4j.logger.java.sql.Connection=info, stdout
log4j.logger.java.sql.Statement=stdout
log4j.logger.java.sql.PreparedStatement=stdout
log4j.logger.org.hibernate=error
log4j.logger.org.hibernate.SQL=debug
log4j.logger.org.hibernate.tool.hbm2ddl=debug
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%p %d{yyyy-MM-dd HH:mm:ss} %c:%L - %m%n
log4j.category.org.springframework =ON
创建struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.devMode" value="true"/>//开发模式,开启后当修改相应的注解时无需重启项目。
<constant name="struts.i18n.encoding" value="UTF-8" />
<constant name="struts.convention.result.path" value="/WEB-INF/pages"/>//返回值所在路径
<constant name="struts.convention.package.locators" value="web,action"/>
<constant name="struts.objectFactory" value="spring"/><!--通过使用spring的工厂来替代struts2的实例工厂 -->
<constant name="struts.configuration.xml.reload" value="true"/>
</struts>
上面这几个属性文件全部配在classpath下
在src下创建相应的包具体如下
userdao.java
package com.lavasoft.demo.dao;
import java.util.List;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.lavasoft.demo.entity.User;
/**
* Created by Administrator on 14-4-23.
*
* @author leizhimin 14-4-23 下午6:43
*/
@Repository
public class UserDAO {
@Autowired
SessionFactory sessionFactory;
public void save(User user) {
sessionFactory.getCurrentSession().save(user);
}
@SuppressWarnings("unchecked")
public List<User> findAll() {
return sessionFactory.getCurrentSession().createQuery("from User").list();
}
public User findone(Integer id) {
return (User) sessionFactory.getCurrentSession().get(User.class, id);
}
public void update(User user) {
sessionFactory.getCurrentSession().merge(user);
}
}
user.java
package com.lavasoft.demo.entity;
import javax.persistence.*;
import static javax.persistence.GenerationType.IDENTITY;
@Entity
@Table(name = "t_demo")
public class User implements java.io.Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private int id;
@Column(name = "username", length = 255)
private String username;
@Column(name = "password", length = 255)
private String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' +
'}';
}
}
UserService.java
package com.lavasoft.demo.service;
import com.lavasoft.demo.dao.UserDAO;
import com.lavasoft.demo.entity.User;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
/**
* Created by Administrator on 14-4-23.
*
* @author leizhimin 14-4-23 下午6:46
*/
@Service
@Transactional
public class UserService {
@Resource
private UserDAO userDAO;
@Transactional
public void saveUser(User user) {
userDAO.save(user);
}
public List<User> queryUserAll() {
return userDAO.findAll();
}
public User findone(Integer id) {
return userDAO.findone(id);
}
public void update(User user) {
userDAO.update(user) ;
}
}
UserAction.java
package com.lavasoft.demo.web.action;
import com.lavasoft.demo.entity.User;
import com.lavasoft.demo.service.UserService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
* Created by Administrator on 14-4-23.
*
* @author leizhimin 14-4-23 下午3:09
*/
@Namespace("/demo")//命名空间
@Component//声明组件
@Scope("prototype")//每次访问新建实例
// 当有请求进入时是否进行重新的实例。prototype为非单例,每次进入都创建实例
public class UserAction extends ActionSupport {
@Resource
private UserService userService;
private User user;
private List<User> userList;
//定义action
@Action(value = "regUser", results = {
@Result(name = "success", location = "/WEB-INF/pages/dashboard.jsp"),
@Result(name = "error", location = "/WEB-INF/pages/error.jsp") })
public String reg() {
System.out.println("----reg page----");
return SUCCESS;
}
@Action(value = "saveUser", results = {
@Result(name = "success", location = "list", type = "redirect"),//重定向
@Result(name = "error", location = "/WEB-INF/pages/error.jsp"),
@Result(name = "add", location = "/WEB-INF/pages/add.jsp") })
public String save() {
System.out.println("----save----");
System.out.println(user);
if (user == null || user.getUsername().equals("")
|| user.getPassword().equals("") || null == user.getUsername()
|| null == user.getPassword()) {
return "add";
}
userService.saveUser(user);
return SUCCESS;
}
@Action(value = "list", results = {
@Result(name = "success", location = "/WEB-INF/pages/list.jsp"),
@Result(name = "error", location = "/WEB-INF/pages/error.jsp") })
public String list() {
System.out.println("----list----");
userList = userService.queryUserAll();
ActionContext.getContext().put("userList", userList);
return SUCCESS;
}
@Action(value = "update", results = { @Result(name = "success", location = "/WEB-INF/pages/update.jsp") })
public String update() {
System.out.println("----update----" + user.getId());
int id = user.getId();
User u = userService.findone(id);
ActionContext.getContext().put("u", u);
return SUCCESS;
}
@Action(value = "updateuser", results = { @Result(name = "success", location = "list", type = "redirect") })
public String updateuser() {
System.out.println("----updateUser----" + user.getId());
userService.update(user);
return SUCCESS;
}
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
创建index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>index</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<!--/ssh_joker/demo/saveUser /项目名/命名空间/方法名 -->
<form action="/ssh_joker/demo/saveUser" method="post"><br>
用户名:<input type="text" name="user.username"/><br>
密码:<input type="text" name="user.password"/>
<input type="submit" name="保存" value="添加用户"/>
</form>
</body>
</html>
list.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>list.jsp</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script src="js/jquery-2.1.1.min.js" > </script>
<style type="text/css">
table{
border-collapse:collapse;
background-color:silver;
position:relative;
top:70px;
width: 700;
}
td{
height:35px;
text-align: center;
border: 1px solid black;
}
.input{
height:25px;
width: 70px;
}
tr:HOVER{
background-color:white;
}
.button td{
text-align: left;
}
</style>
<script type="text/javascript">
$(document).ready(function(){
$("#add").click(function(){
location.href="demo/saveUser";
});
});
$(document).ready(function(){
$("#delete").click(function(){
location.href="index.jsp";
});
});
</script>
</head>
<body>
<h1 id="h1"></h1>
<form action="#">
<table align="center" >
<tr class="button">
<td colspan="5" >
<input type="button" value="删除" class="input" id="delete">
<input type="button" value="添加" class="input" id ="add">
<input type="reset" value="重置" class="input" id="reset">
</td>
</tr>
<tr >
<td >选择</td> <td >id</td> <td>用户名</td><td>密码</td><td>操作</td>
</tr>
<c:forEach items="${userList}" var="userList">
<tr>
<td > <input type="checkbox"></td>
<td>${userList.id}</td>
<td>${userList.username}</td>
<td>${userList.password}</td>
<td><a href="demo/update?user.id=${userList.id}"><input type="button" value="修改" class="input" id="update" /></a></td>
</tr>
</c:forEach>
</table>
</form>
</body>
</html>