Spring,负责对象对象创建
Struts, 用Action处理请求
Spring与Struts框架整合,
关键点:让struts框架action对象的创建,交给spring完成!
步骤:
1)引入struts .jar相关文件
a、引入struts .jar相关文件
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
commons-lang3-3.1.jar
freemarker-2.3.19.jar
javassist-3.11.0.GA.jar
ognl-3.0.5.jar
struts2-core-2.3.4.1.jar
xwork-core-2.3.4.1.jar
b、spring-core 相关jar文件
commons-logging-1.1.3.jar
spring-beans-3.2.5.RELEASE.jar
spring-context-3.2.5.RELEASE.jar
spring-core-3.2.5.RELEASE.jar
spring-expression-3.2.5.RELEASE.jar
c、spring-web 支持jar包
spring-web-3.2.5.RELEASE.jar 【Spring源码】
struts2-spring-plugin-2.3.4.1.jar 【Struts源码】
2)配置:
struts.xml 【struts路径与action映射配置】
<?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> <package name="user" extends="struts-default"> <action name="user" class="userAction" method="execute"> <result name="success">/index.jsp</result> </action> </package> </struts>
bean.xml 【spring ioc容器配置】
a . bean-dao.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:p="http://www.springframework.org/schema/p" 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"> <bean id="userDao" class="com.gqx.dao.UserDao" scope="singleton" lazy-init="false"></bean> </beans>
b、bean-service.xml 同上,将对象加入IOC容器
<bean id="userService" class="com.gqx.service.UserService"> <property name="userDao" ref="userDao"></property> </bean>
c、bean-action.xml
<bean id="userDao" class="com.gqx.dao.UserDao" scope="singleton" lazy-init="false"></bean>
web.xml
【核心过滤器: 引入struts功能】
【初始化spring的ioc容器】
具体配置可 以查看源码的api
<!-- 1. struts配置 --> <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> <!-- 2. spring 配置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/classes/bean-*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
3)、代码
项目截图
userDao
package com.gqx.dao; public class UserDao { public void save() { System.out.println("DB:保存用户"); } }
userService
public class UserService { //IOC容器注入 private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void save() { userDao.save(); } }
userAction
public class UserAction extends ActionSupport { // springIOC容器注入 private UserService userService; public void setUserService(UserService userService) { this.userService = userService; } public String execute() { userService.save(); return SUCCESS; } }
4)、访问http://localhost:8080/struts-spring/user
就可以看到控制台如下的信息
Bug
按照
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener 错误解决方案
种错误意思很明确:找不到“ org.springframework.web.context.ContextLoaderListener”这个类,ContextLoaderListener这个类是在spring-web.jar包下,我仔细检查了项目jar环境,发现该jar包确实存在,而且也能找到编译后的ContextLoaderListener.class文件。
在网上找到的回答解决了问题,如下
如果你是maven项目,tomcat在发布项目的时候没有同时发布maven依赖所添加的jar包,你需要设置一下eclipse:项目 —> 属性 -> Deployment Assembly -> Add -> Java Build Path Entries -> 选择Maven Dependencies -> Finish -> OK把对应的Maven依赖包也发布到tomcat,调试时会自动把那些jar发布到指定目录下,tomcat也能找到那些jar了。 网上有去查了一下原因,如下:Java虚拟机是根据Java ClassLoader(类加载器)决定如何加载Class。 系统默认提供了3个ClassLoader Root ClassLoader,ClassPath Loader,Ext ClassLoader 我们也可以编写自己的ClassLoader,去加载特定环境下的Jar文件。 能不能加载Jar,加载哪里的Jar,是由ClassLoader决定的。 问题可能是 导入的仅仅是jar包的引用,需要特殊的指定(类似快捷方式) 如果是通过正常的WEB-INF/lib下引入jar包,会正常的显示,默认会buildPath,如果是通过项目->属性->java Build Path->Add library->user Library....这种方式导入包,会出现上面那种错误,需要按上面的方法去解决!