- 浏览: 399839 次
- 性别:
- 来自: 昆明
文章分类
- 全部博客 (198)
- java (28)
- J2EE (19)
- struts (33)
- sping (13)
- hibernate (18)
- mybatis (15)
- connection pool (3)
- DB (26)
- SQL (21)
- html (13)
- js (7)
- json (3)
- jquery (2)
- document (17)
- linux (15)
- C# (1)
- url (2)
- eweb4j (1)
- Turbine (1)
- 框架 (11)
- jdbcTemplate (3)
- aop (2)
- windows (2)
- ubuntu (1)
- eclipse (11)
- JPA (8)
- svn (4)
- get 传值 (2)
- mysql (5)
- oracle (2)
- hadoop (1)
- MongoDB (2)
- spring (1)
- python (1)
最新评论
-
jcbingjc:
楼主,你好,按照上面的配置,我报如下错误:Missing Pe ...
[properJavaRDP]在网页中实现远程连接 -
sucful:
折腾了半天跑不通 ,要传就搞个完整的吧
Struts2 <sx:div/>实现页面模块异步刷新 -
Kattou:
你好! 看了你写的这个分页 感觉很好, 但是不怎么会用么,请指 ...
jsp分页控件 -
我叫PSB:
地址完全用不了
eclipse中的安装 jseclipse -
1111emotion:
我的工程里还是有乱码的情况,我该改的地方都改了。
Eclipse/MyEclipse更改默认字符集 设置UTF-8
背景
:
1) Struts2
会对每一个请求,产生一个Action的实例来处理.
2) Spring的Ioc容器管理的bean默认是单实例的.
当Struts2
与Spring整合后,由spring来管理Struts2
的Action,会遇到什么问题
?如何解决
?
---------------------------------------------------------------- 会遇到什么问题?
Struts2
与Spring整合后,
由spring来管理Struts2
的Action,
bean默认是单实例有情况下,会有如下问题:
1) Action是单例,其中的FieldError,actionerror中的错误信息 会累加, 即使再次输入了正确的信息,也过不了验证.
2) Struts2
的Action是有状态的,他有自己的成员属性, 所以在多线程下,会有问题. ----------------------------------------------------------------
如何解决?
方案一: 就是不用单例, spring中bean的作用域设为prototype,每个请求对应一个实例.
或者取消单例模式,如配置文件修改为(Spring版本的不同,在DTD文件约束也不同):
<bean id="authgroupact" class="com.skywalk.framework.web.struts.action.AuthoriseGroupAct" singleton="false">
<property name="ibser">
<ref bean="ibser" />
</property>
</bean>
再写一个拦截器, 清空
FieldError与actionerror
总结
:
方案一 ,
bean的作用域设为prototype, 担心性能不好, 但没实际测试过,不好说话,也只是担心而已.
方案二: 由于对方案一有担心, 所有才有了方案二, 不知比方案一性能 能高多少
我们知道在Struts中Action是从map中拿出来的,是单实例的。那么在多线程调用的时候会出问题。 那么在Spring中通过getBean方法每调用一次,spring都会new一个实例给我们,所以可以利用这一点把Struts中action的创建交给Spring来处理。 Spring Bean的作用域: Bean作用域
singleton 在每个Spring IoC容器中一个bean定义对应一个对象实例。 prototype 一个bean定义对应多个对象实例。 request 在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。 session 在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。 global session 在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext情形下有效。 继续之前先回顾一下==与equals的用法 我们说==比较的是两个对象的地址,而equals比较的是两个对象的内容。所以 上面打印的结果为: 说明:s1,s2分别在栈中分配内存,即两个局部变量。那么他们的值存放的是地址。 new String的时候会在堆中分配对象的空间,显然调用了两次new分配了两个对象的地址。所以s1与s2的值即地址是不一样的,所以s1==s2返回为false. 而s1.equals(s2)比较的是两个对象的内容,显然对象内容都是sfsf所以返回为true. 相关知识如: 那么现在我们对从spring得到的对象进行测试。 测试代码: 配置文件: 测试类: 运行结果: 测试发现bean1==bean2,bean1.equals(bean2)均返回为true。这说明默认的情况下,Spring采用的是单例Singleton模式创建对象,一旦创建,以后每次只是把引用返回。所以所有返回的对象都是同一个。 这个在配置文件中是可以修改的,如我们在bean的配置上增加scope属性: 测试上面代码: 结果为: 可以看到返回为false,false即每次创建的实例是不同的。我们在使用这一特性解决struts action单实例时就要这样配置。 public class ClearFieldErrorInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionSupport actionSupport = (ActionSupport)invocation.getAction();
actionSupport.clearErrorsAndMessages();
String resultCode = invocation.invoke();
return resultCode;
}
作用域
描述
String s1 = new String("sfsf");
String s2 = new String("sfsf");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));false
trueString s = new String("xyz");创建了几个String Object
答:"xyz"本身作为字符常量,在汇编语言中应该作为常量放在数据段,Java有一个类似数据段的constant pool保存这个常量,在classloader加载这个类的时候就把"xyz"和这个类的其他一些信息放在constant pool new String("xyz")根据常量"xyz"在heap上创建String对象所以,一共两个对象
String(String original) Initializes a newly created String object so that it represents the same sequence of characters as the argument; in other words, the newly created string is a copy of the argument string.
package com.lwf.bean;
public class Bean1 {
}<?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: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/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="bean1" class="com.lwf.bean.Bean1"></bean>
</beans>
package com.lwf.client;
import junit.framework.TestCase;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.lwf.bean.Bean1;
public class Client extends TestCase {
public void testScope() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext*.xml");
Bean1 bean1 = (Bean1)ctx.getBean("bean1");
Bean1 bean2 = (Bean1)ctx.getBean("bean1");
System.out.println(bean1==bean2);
System.out.println(bean1.equals(bean2));
}
}2010-05-19 14:34:07,419 INFO [org.springframework.context.support.ClassPathXmlApplicationContext] - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1c78e57: display name [org.springframework.context.support.ClassPathXmlApplicationContext@1c78e57]; startup date [Wed May 19 14:34:07 CST 2010]; root of context hierarchy
2010-05-19 14:34:07,654 INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - Loading XML bean definitions from file [D:\workdirlocal\SpringBean\bin\applicationContext.xml]
2010-05-19 14:34:08,076 INFO [org.springframework.context.support.ClassPathXmlApplicationContext] - Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@1c78e57]: org.springframework.beans.factory.support.DefaultListableBeanFactory@80fa6f
2010-05-19 14:34:08,123 INFO [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@80fa6f: defining beans [bean1]; root of factory hierarchy
true
true<bean id="bean1" class="com.lwf.bean.Bean1" scope="prototype"></bean>
2010-05-19 16:05:47,353 INFO [org.springframework.context.support.ClassPathXmlApplicationContext] - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1c78e57: display name [org.springframework.context.support.ClassPathXmlApplicationContext@1c78e57]; startup date [Wed May 19 16:05:47 CST 2010]; root of context hierarchy
2010-05-19 16:05:47,524 INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - Loading XML bean definitions from file [D:\workdirlocal\SpringBean\bin\applicationContext.xml]
2010-05-19 16:05:47,899 INFO [org.springframework.context.support.ClassPathXmlApplicationContext] - Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@1c78e57]: org.springframework.beans.factory.support.DefaultListableBeanFactory@80fa6f
2010-05-19 16:05:47,931 INFO [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@80fa6f: defining beans [bean1]; root of factory hierarchy
false
falsePrototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。
评论
When an object is to be created, it uses the class attribute in the Struts configuration to correspond to the id attribute in the Spring configuration. If not found, the class will try to be created as usual, then be autowired by Spring.
这是struts2-spring plugin中的介绍.
发表评论
-
SpringMvc+MyBatis+Freemarker 配置
2017-04-06 09:32 23721、引入Jar包: spring所有jar文件 my ... -
Struts2.1.8升级到Struts2.3.15.1的时候遇到了问题
2013-08-09 10:14 2012我把原来的Struts2.1.8升级到Struts2.3. ... -
struts2 url传值中文乱码解决方案
2012-09-21 16:21 1419HttpServletRequest request = Ac ... -
使用struts2中的ognl表达式调用类方法
2012-04-19 09:35 1367struts标签中value都会被解析,如,<s:pro ... -
使用struts2中的ognl表达式调用类方法(转)
2012-04-15 16:54 1284struts标签中value都会被解析,如,<s:pro ... -
Struts2 get 传值乱码过滤器配置
2012-04-15 16:31 1375package cn.org.du.Encode; im ... -
struts2 url传值中文乱码解决方案
2012-04-15 15:51 1514HttpServletRequest request ... -
struts2 result type 介绍
2012-03-23 09:14 1166在默认时,<result>标签的type属性值是“ ... -
Struts2中<jsp:forward page="xxx.action"></jsp:forward>失效
2012-03-08 17:43 1956问题:在Struts2中<jsp:forward pag ... -
Struts2整合Spring、JPA
2012-02-27 09:46 1919一直觉得JPA很神秘,最近抽空看了下,下面贴出刚才做的St ... -
spring mvc 配置
2011-11-28 14:14 14361、/WEB-INF/web.xml <ser ... -
spring jdbcTemplate调用存储过程
2011-11-27 21:36 1464第一种方式: List<Map<String,Ob ... -
spring3之JdbcTemplate AOP 事务
2011-11-27 01:36 7459一、applicationContext.xml配置:定义事务 ... -
Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误)
2011-11-27 01:37 1483Spring AOP代理时 ClassCastExce ... -
spring3之JdbcTemplate详解
2011-11-27 01:36 34091、JdbcTemplate操作数据库 Spring ... -
JAVA三大框架的各自作用
2011-11-25 00:04 3199一、Spring Spring是 ... -
使用SSH到底是为了快速开发,还是为了标准?
2011-11-25 00:00 2471使用SSH到底是为了快速开发,还是为了标准? 使用S ... -
Struts2、Spring、Hibernate 高效开发的最佳实践
2011-11-26 00:16 1269引言 SSH(Struts2+Spring+Hi ... -
Struts2与urlrewrite整合
2011-11-24 00:15 3349Struts2与URL Rewrite整合注意的地方 ... -
SiteMesh模板应用与struts2整合
2011-11-23 09:23 1734SiteMesh是一个非常优秀 ...
相关推荐
这行配置告诉Struts框架使用Spring作为对象工厂,这意味着所有的Action实例都将由Spring容器来创建和管理。这样一来,Action类就无需实现特定的接口或继承特定的基类,可以保持其原有的简洁性。 #### 五、示例:...
- 使用Spring的`<bean>`元素来创建Struts Action的实例,同时可以利用Spring的依赖注入特性来管理Action与其他组件之间的依赖关系。 2. **简化开发流程**: - 通过Spring管理Struts中的Action,可以减少大量的...
- **Spring插件**:Struts2提供了一个Spring插件,使得Spring管理的Bean可以直接作为Struts2的Action。 - **Action配置**:在struts.xml中声明Spring管理的Action,不再需要在Action类上添加任何Struts注解。 - *...
通过在 Action 类上使用 `@Component` 注解并配置在 Spring 配置文件中,可以确保 Spring 能够创建和管理这些类的实例。 5. **拦截器**:Struts2 中的拦截器可以用来实现通用的行为,如权限验证、日志记录等。通过...
在实际项目中,开发人员会创建一个Struts2的Action类,该类可能会依赖于Spring管理的服务。Action类通过注解或者配置文件声明其依赖,Spring容器会自动将依赖注入到Action类中。同时,Struts2的配置文件(如struts....
在本实例中,Maven扮演着核心角色,通过其配置管理Spring、Struts2、iBatis以及Velocity的依赖,使得项目的构建过程更加规范和高效。开发者可以通过编写pom.xml文件来声明项目依赖,Maven会自动下载并管理这些依赖库...
- **整合工作**:在Struts2的Action类中,通过@Autowired注入Service层bean,Service层再调用由Spring管理的DAO实现类完成数据访问。同时,Spring的AOP功能可以用来实现事务管理,确保业务操作的原子性。 - **测试...
这将使Struts2能够从Spring容器中获取Action实例,实现Action的依赖注入。配置通常包括修改`struts.xml`中的`<package>`标签,添加`parent="struts-default"`和`namespace="/"`, 并使用`<action>`标签的`class`属性...
- 在使用Struts2-Spring插件时,注意Action类的生命周期是由Spring控制,而非Struts2。 整合Spring和Struts2是一个常见的Java Web开发实践,熟练掌握这一技能能够提高开发效率,提升应用的可维护性和扩展性。在实际...
本实例将探讨如何在Maven环境下搭建一个基于Spring、Struts2和JSTL的项目,这些技术的组合提供了强大的后端控制、依赖管理和前端展示能力。 首先,让我们详细了解每个组件的作用: 1. **Maven**:Maven是一个项目...
在本项目"spring_struts2_mybatis_注解的小实例"中,我们将深入探讨如何使用SSM(Spring、Struts2、MyBatis)框架来实现一个基础的增删改查(CRUD)功能。SSM是Java Web开发中常用的三大组件,它们各自负责不同的...
同时,可以使用Spring插件(struts2-spring-plugin)来实现Spring与Struts的集成,这样Action类可以直接从Spring容器获取服务层对象。 **4. 实现业务逻辑** 创建JPA实体类,使用`@Entity`注解标识。接着,创建对应...
同时,我们需要在Struts2的配置文件中指定Spring的Action代理(Spring-Action-Proxy),这样,Struts2的Action实例将由Spring管理。 在图书管理系统中,我们可以定义一个Spring Bean来代表图书实体类,包含了如书名...
Struts2、MyBatis和Spring是Java Web开发中常用的三大框架,它们分别负责MVC模式中的Action层、数据持久层和应用上下文管理。这篇文档将深入探讨如何将这三个框架整合在一起,以及如何结合数据库进行实际应用。 ...
然而,Struts1在后期的开发中逐渐暴露出一些问题,如性能瓶颈、复杂的配置等,这促使了Struts2的诞生。 最后,Hibernate是一个流行的Java ORM(对象关系映射)框架,它简化了数据库操作,使开发者能够用面向对象的...
其次,Spring的角色在于统一管理整个应用程序的组件,包括Struts2的Action和Hibernate的SessionFactory。它通过ApplicationContext来加载和管理bean,提供依赖注入,使得各组件之间的关系更加松耦合。Spring还负责...
学习这个实例,你可以了解如何将前端请求与后端服务连接,理解 Spring 如何通过 DI 管理对象,以及 Struts 2.0 如何组织和执行业务逻辑。这对于初学者来说是一个很好的实践平台,能帮助你快速掌握 Java Web 开发的...
在Struts2中,我们可以利用Spring的Action代理来创建和管理Action实例,从而实现更灵活的控制。 整合Struts2和Spring的第一步是添加相关的依赖库到项目中,通常包括Struts2的Core库和Spring的Web上下文库。然后,...
4. **整合步骤**:配置Struts2的Spring插件,使Struts2能够从Spring容器中获取Action实例。在Action类中注入Service,Service再注入DAO,形成完整的依赖链。 5. **测试**:编写JUnit测试用例,验证Spring、Struts2...