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

本文详细介绍如何在Struts2框架中整合Spring框架,包括配置文件的设置、DAO层、Service层及Action层的具体实现方式,并通过示例展示整个过程。

http://www.cnblogs.com/kay/archive/2009/07/07/1518278.html

首先来看需要的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>
结束
同步定位与地图构建(SLAM)技术为移动机器人或自主载具在未知空间中的导航提供了核心支撑。借助该技术,机器人能够在探索过程中实时构建环境地图并确定自身位置。典型的SLAM流程涵盖传感器数据采集、数据处理、状态估计及地图生成等环节,其核心挑战在于有效处理定位与环境建模中的各类不确定性。 Matlab作为工程计算与数据可视化领域广泛应用的数学软件,具备丰富的内置函数与专用工具箱,尤其适用于算法开发与仿真验证。在SLAM研究方面,Matlab可用于模拟传感器输出、实现定位建图算法,并进行系统性能评估。其仿真环境能显著降低实验成本,加速算法开发与验证周期。 本次“SLAM-基于Matlab的同步定位与建图仿真实践项目”通过Matlab平台完整再现了SLAM的关键流程,包括数据采集、滤波估计、特征提取、数据关联与地图更新等核心模块。该项目不仅呈现了SLAM技术的实际应用场景,更为机器人导航与自主移动领域的研究人员提供了系统的实践参考。 项目涉及的核心技术要点主要包括:传感器模型(如激光雷达与视觉传感器)的建立与应用、特征匹配与数据关联方法、滤波器设计(如扩展卡尔曼滤波与粒子滤波)、图优化框架(如GTSAM与Ceres Solver)以及路径规划与避障策略。通过项目实践,参与者可深入掌握SLAM算法的实现原理,并提升相关算法的设计与调试能力。 该项目同时注重理论向工程实践的转化,为机器人技术领域的学习者提供了宝贵的实操经验。Matlab仿真环境将复杂的技术问题可视化与可操作化,显著降低了学习门槛,提升了学习效率与质量。 实践过程中,学习者将直面SLAM技术在实际应用中遇到的典型问题,包括传感器误差补偿、动态环境下的建图定位挑战以及计算资源优化等。这些问题的解决对推动SLAM技术的产业化应用具有重要价值。 SLAM技术在工业自动化、服务机器人、自动驾驶及无人机等领域的应用前景广阔。掌握该项技术不仅有助于提升个人专业能力,也为相关行业的技术发展提供了重要支撑。随着技术进步与应用场景的持续拓展,SLAM技术的重要性将日益凸显。 本实践项目作为综合性学习资源,为机器人技术领域的专业人员提供了深入研习SLAM技术的实践平台。通过Matlab这一高效工具,参与者能够直观理解SLAM的实现过程,掌握关键算法,并将理论知识系统应用于实际工程问题的解决之中。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值