• Struts2.1.6 + Spring2.5+Hibernate3.2整合


    首先来看需要的jar包:

    spring

    在web.xml中的配置:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 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_2_5.xsd">
    
    	<!-- 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>
    	
    	<!-- OpenSession In View -->
    	<filter>
    		<filter-name>openSessionInView</filter-name>
    		<filter-class>
    			org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
    		</filter-class>
    	</filter>
    
    	<filter-mapping>
    		<filter-name>openSessionInView</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    
    	<!-- Spring配置 指定spring配置文件位置-->
    	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>classpath:ApplicationContext.xml</param-value>
    	</context-param>
    
    
    	<!-- 实例化Spring容器 -->
    	<listener>
    		<listener-class>
    			org.springframework.web.context.ContextLoaderListener
    		</listener-class>
    	</listener>
    
    
    
    	<welcome-file-list>
    		<welcome-file>index.jsp</welcome-file>
    	</welcome-file-list>
    </web-app>
    在Struts2的配置文件struts.xml中的配置:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
    	"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
    	"http://struts.apache.org/dtds/struts-2.1.dtd">
    <struts>
    	<package name="myStruts" extends="struts-default" namespace="/">
    		<!-- 使用通配符 -->
    		<action name="*_*" class="{1}" method="{2}"> 
    			<result name="list">/{1}/list.jsp</result>
    			<result name="input">/{1}/update.jsp</result>
    			<result name="reload" type="chain">{1}_list</result>
    		</action>
    	</package>
    </struts>
    需要注意的是class的名字要和Spring中管理Action的Bean的名字相同。

    由于需要将Struts2的Action交给Spring去管理,我们在struts.properties配置文件中加入:

    struts.objectFactory=spring

    再来看看Spring的配置文件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: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/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
    
    	<!-- 启用自动扫描 -->
    	<context:component-scan base-package="com.javaonroad"></context:component-scan>
    
    	<!-- 事务管理 -->
    	<tx:annotation-driven transaction-manager="transactionManager" />
    	<bean id="transactionManager"
    		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    		<property name="sessionFactory" ref="sessionFactory"></property>
    	</bean>
    
    	<bean id="dataSource"
    		class="com.mchange.v2.c3p0.ComboPooledDataSource">
    		<property name="driverClass" value="com.mysql.jdbc.Driver" />
    		<property name="jdbcUrl" value="jdbc:mysql:///struts2" />
    		<property name="maxIdleTime" value="25000" />
    		<property name="properties">
    			<props>
    				<prop key="user">root</prop>
    				<prop key="password">root</prop>
    				<prop key="c3p0.acquire_increment">2</prop>
    				<prop key="c3p0.max_size">20</prop>
    				<prop key="c3p0.min_size">1</prop>
    			</props>
    		</property>
    	</bean>
    
    
    	<!-- 定义Hibernate SessionFactory -->
    	<bean id="sessionFactory"
    		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    		<!-- dataSource可以为任意的数据源 例如DBCP、C3P0 -->
    		<property name="dataSource" ref="dataSource"></property>
    		<!-- 映射文件路径 -->
    		<property name="mappingResources">
    			<value>com/javaonroad/pojo/User.hbm.xml</value>
    		</property>
    		<!-- 其他的Hibernate常用配置 -->
    		<property name="hibernateProperties">
    			<props>
    				<prop key="hibernate.dialect">
    					org.hibernate.dialect.MySQLDialect
    				</prop>
    				<prop key="hibernate.show_sql">true</prop>
    			</props>
    		</property>
    	</bean>
    </beans>

    由于启用了自动扫描,所以在dao、service以及action中都要使用注解进行标记:

    DAO类:

    package com.javaonroad.dao;
    
    import java.util.List;
    
    import javax.annotation.Resource;
    
    import org.hibernate.Criteria;
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.springframework.stereotype.Repository;
    
    import com.javaonroad.pojo.User;
    
    @Repository
    public class UserDAO {
    	
    	@Resource
    	private SessionFactory sessionFactory;
    	
    	private Session getSession(){
    		return sessionFactory.getCurrentSession();
    	}
    	
    	public void save(User user)
    	{
    		getSession().save(user);
    	}
    	public void update(User user)
    	{
    		getSession().update(user);
    	}
    	public User get(int id)
    	{
    		return (User) getSession().get(User.class, id);
    	}
    	public User findUserByNameAndPwd(User user)
    	{
    		String hql = "from User where name = :name and pwd = :pwd";
    		Query query = getSession().createQuery(hql);
    		query.setString("name", user.getName());
    		query.setString("pwd", user.getPwd());
    		return (User) query.uniqueResult();
    	}
    	public void delete(int id)
    	{
    		getSession().delete(get(id));
    	}
    	@SuppressWarnings("unchecked")
    	public List<User> findAll()
    	{
    		Criteria cri = getSession().createCriteria(User.class);
    		List<User> list = cri.list();
    		return list;
    	}
    }
    Service类:
    其中事务同样采用注解:
    package com.javaonroad.service;
    
    import java.util.List;
    
    import javax.annotation.Resource;
    
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import com.javaonroad.dao.UserDAO;
    import com.javaonroad.pojo.User;
    
    @Transactional
    @Service
    public class UserService {
    
    	@Resource
    	private UserDAO userDAO;
    	
    	public User login(User user)
    	{
    		return userDAO.findUserByNameAndPwd(user);
    	}
    	
    	public void save(User user)
    	{
    		userDAO.save(user);
    	}
    	public void update(User user)
    	{
    		userDAO.update(user);
    	}
    	public User get(String id)
    	{
    		return userDAO.get(Integer.valueOf(id));
    	}
    	
    	public void delete(String id)
    	{
    		userDAO.delete(Integer.valueOf(id));
    	}
    	public List<User> findAll()
    	{
    		return userDAO.findAll();
    	}
    }

    最后是我们的Action类,由于Struts2的Action的线程安全的所以在注解的时候需要改变Spring默认的Scope属性:

    package com.javaonroad.web;
    
    import java.util.List;
    
    import javax.annotation.Resource;
    import javax.servlet.http.HttpSession;
    
    import org.apache.struts2.ServletActionContext;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Controller;
    
    import com.javaonroad.pojo.User;
    import com.javaonroad.service.UserService;
    import com.opensymphony.xwork2.ActionSupport;
    
    @Controller("user")
    @Scope("prototype")
    public class UserAction extends ActionSupport {
    
    	@Resource
    	private UserService userService;
    	
    	private User user;
    	
    	private String id;
    	private List<User> list;
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 5638432269244791021L;
    	
    	
    	/*业务方法*/
    	public String login()throws Exception
    	{
    		User currUser = userService.login(user);
    		if(currUser != null)
    		{
    			HttpSession session = ServletActionContext.getRequest().getSession();
    			session.setAttribute("currUser", currUser);
    			return list();
    		}
    		else
    		{
    			return "input";
    		}
    	}
    	public String list()throws Exception
    	{
    		list = userService.findAll();
    		return "list";
    	}
    	public String add()throws Exception
    	{
    		userService.save(user);
    		return "reload";//list();
    	}
    	public String delete()throws Exception
    	{
    		userService.delete(id);
    		return "reload";
    	}
    	public String update()throws Exception
    	{
    		userService.update(user);
    		return "reload";
    	}
    	public String toUpdate()throws Exception
    	{
    		user = userService.get(id);
    		return "input";
    	}
    	/*geterAndSeter*/
    	public User getUser() {
    		return user;
    	}
    
    	public void setUser(User user) {
    		this.user = user;
    	}
    
    	public List<User> getList() {
    		return list;
    	}
    
    	public void setList(List<User> list) {
    		this.list = list;
    	}
    	public String getId() {
    		return id;
    	}
    	public void setId(String id) {
    		this.id = id;
    	}
    }
    列表页面list.jsp:
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <%
    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>
        <title>列表页面</title>
      </head>
      
      <body>
      	<a href="<%=basePath %>/user/add.jsp">添加用户</a>
        <table border="1" width="60%">
        	<tr>
        		<td>用户名</td>
        		<td>是否可用</td>
        		<td>操作</td>
        	</tr>
        	<c:forEach items="${list}" var="u">
        	<tr>
        		<td>${u.name }</td>
        		<td>${u.enable }</td>
        		<td>
        			<a href="<%=basePath %>/user_delete.action?id=${u.id }">删除</a>
        			<a href="<%=basePath %>/user_toUpdate.action?id=${u.id }">修改</a>
        		</td>
        	</tr>
        	</c:forEach>
        </table>
      </body>
    </html>
    结束!
  • 相关阅读:
    telnet命令测试端口连接是否正常, telnet不是内部或外部命令的方案
    Linux常用命令
    nginx的反向代理的优势,特点于原理(一)
    linux操作系统中的常用命令以及快捷键(一)
    Centos网卡名称命名
    Centos第一次使用配置IP地址
    Linux环境下交叉编译器安装及运行
    jupyter更换路径
    python3实现在二叉树中找出和为某一值的所有路径
    使用 SQL 服务器时,"评估期已过期"错误消息
  • 原文地址:https://www.cnblogs.com/kay/p/1518278.html
Copyright © 2020-2023  润新知