`
hnylj
  • 浏览: 211239 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于struts2中使用request引起系统性能的思考

阅读更多

struts2从2007年初推出第一个稳定的版本到现在已经发展了近3个年头,现在,在新的产品或项目中,如果选用了struts方案,一般都选择了struts2,并非为用struts2而用struts2,我想一定是它的优秀吸引着我们。

 

在struts2中,value stack和ognl这两个概念非常重要。由于我们大多数人都是从struts1过渡到struts2的,思想的转变是需要一些时间,更重要的是需要一些实践的,因而,我们在使用struts2的时候,常常有些类似于struts1的形式,例如,我们来看一个action的代码:

package com.javaeye.hnylj.action;

import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.javaeye.hnylj.model.UserInfo;
import com.javaeye.hnylj.service.UserInfoService;
import com.opensymphony.xwork2.ActionSupport;

/**
 * UserAction
 * 
 * @since Mar 15, 2010
 */
public class UserAction extends ActionSupport implements ServletRequestAware {

	private static final long serialVersionUID = 7815936222081975676L;

	private HttpServletRequest request;

	private String id;

	private String name;

	private UserInfoService userInfoService;

	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public UserInfoService getUserInfoService() {
		return userInfoService;
	}

	public void setUserInfoService(UserInfoService userInfoService) {
		this.userInfoService = userInfoService;
	}

	/**
	 * list users
	 * 
	 * @return success
	 * @throws Exception
	 */
	@Override
	public String execute() throws Exception {
		// 注:userInfoService通过spring注入
		List<UserInfo> userList = userInfoService.getUserList();
		request.setAttribute("id", id);
		request.setAttribute("name", name);
		request.setAttribute("userList", userList);
		return SUCCESS;
	}
}

 

从上面的代码中,我们明显感觉到,这与struts1的代码模式非常相似,而常常我们在代码中又是这样写的,当然这样也是完全可以的。

而作为struts2的代码应该是这样的:

package com.javaeye.hnylj.action;

import java.util.List;
import com.javaeye.hnylj.model.UserInfo;
import com.javaeye.hnylj.service.UserInfoService;
import com.opensymphony.xwork2.ActionSupport;

/**
 * UserAction
 * 
 * @since Mar 15, 2010
 */
public class UserAction extends ActionSupport {

	private static final long serialVersionUID = 7815936222081975676L;

	private String id;

	private String name;

	List<UserInfo> userList;

	private UserInfoService userInfoService;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public List<UserInfo> getUserList() {
		return userList;
	}

	public void setUserList(List<UserInfo> userList) {
		this.userList = userList;
	}

	public UserInfoService getUserInfoService() {
		return userInfoService;
	}

	public void setUserInfoService(UserInfoService userInfoService) {
		this.userInfoService = userInfoService;
	}

	/**
	 * list users
	 * 
	 * @return success
	 * @throws Exception
	 */
	@Override
	public String execute() throws Exception {
		// 注:userInfoService通过spring注入
		userList = userInfoService.getUserList();
		return SUCCESS;
	}
}

 

简单比较这两段代码,引起我思考的是这两种代码模式在性能上的不同,我们知道,在struts2中,所有的属性值,包括从客户端传递的参数或从数据库查询的数据,只要在action中对应有此属性变量的定义,并拥有相应的setter与getter方法,这些数据都会被放置到值栈中,在页面我们就可以使用struts2的标签或ognl取得这些值。struts2将这些数据放置到值栈中,肯定是需要耗费一定的内存的,但struts2的过滤器有一种功能就是在使用之后执行ActionContextCleanUp.cleanUp(req),将值栈清空。而我们第一种代码方式,是将所有的数据,包括从客户端传递的参数或从数据库查询的数据都放置到request中,然后在页面通过jstl或el表达式取出request中的值,虽然request在一次请求之后也会把数据销毁,但我想说的是,既然struts2已经将这些数据放置到了值栈中,而我们又将这些数据在request中放置一遍,那么这样一来,每一个action被执行,在数据没有销毁之前,数据在内存中就放置了两份,这无疑会牺牲不必要的内存资源,特别是一些对性能要求较高而硬件配置又有限的情况下。

 

在struts2中,每一个Action是线程安全的,即每一个客户端的请求都会new一个新的Action为其提供服务,如此就会使得,当系统在线人数较多时,会new出较多的Action来为这些在线的用户服务,而当我们使用第一种模式的代码时,每一个Action中都将数据放置到request中,然后通过jstl在页面中显示,这样,request不知要放置多少数据,再加上本来struts2在值栈中也放置了这些数据,那么内存的使用将是成倍数的上升,我们完全可以放弃使用request,因为在struts2中所有的数据会自动放置到值栈中,我做了一点测试,使用第一种模式的代码,我通过查看windows资源管理器的tomcat进程的内存使用,发现它明显高于第二种代码模式的内存使用,另外让我感觉更为兴奋的是,jstl也完全可以取得值栈中的数据,所以你完全可以使用struts2+jstl进行开发。

 

这是我对关于struts2中使用request中引起系统性能的一点思考,欢迎大家提出异议,一起交流,共同进步!

 

一个Java技术交流群,一起交流,共同进步,扣扣群号:513086638

 


 

 

分享到:
评论
10 楼 handsomesomeJ 2013-09-11  
不会吧,毕竟只是引用而已,并不会导致内存的成倍增加。
9 楼 lucky16 2010-03-23  
tibetjungle 写道
gouflv 写道

2. jstl? 怎么不用S2的标签库呢

  jstl会让你的生活而更美好而且简单:because it is standard。jstl发展到1.2,新增了不少tag,让它的功能更强大,比如function、format。以前你无法通过标准库判断一个list的大小,但在1.2中就可以。s2的标签是很强大,有时间和精力就学吧。

struts2的tag确实不爽,JSTL,看见大家都说他好, 过两天去看看,
8 楼 fiercelf 2010-03-23  
不会有人使用第一种方式,发这样的帖子没意义。
7 楼 wiwiluo 2010-03-23  
Struts2的标签用来取值尚可,曾经接受过一个项目,整个工程中没有el没有jstl,甚至界面元素全部都是Struts2标签,痛苦至极
6 楼 tibetjungle 2010-03-22  
gouflv 写道

2. jstl? 怎么不用S2的标签库呢

  jstl会让你的生活而更美好而且简单:because it is standard。jstl发展到1.2,新增了不少tag,让它的功能更强大,比如function、format。以前你无法通过标准库判断一个list的大小,但在1.2中就可以。s2的标签是很强大,有时间和精力就学吧。
5 楼 sw1982 2010-03-22  
有数据说明?
你可以试试get、set方法情况下debug, request对象里面还是会带值的
hnylj 写道
我发这个帖子主要是说明这样一个观点:在struts2中不应该将数据(包括从客户端传递的参数或从数据库查询的数据)放到request中,这会消耗不必要的内存资源。当然我们在Action中有时也会使用request,session,但我想说的是,不要滥用它,不能是不是都往request中放,这是我们应该注意的。

4 楼 hnylj 2010-03-22  
我发这个帖子主要是说明这样一个观点:在struts2中不应该将数据(包括从客户端传递的参数或从数据库查询的数据)放到request中,这会消耗不必要的内存资源。当然我们在Action中有时也会使用request,session,但我想说的是,不要滥用它,不能是不是都往request中放,这是我们应该注意的。
3 楼 mercyblitz 2010-03-22  
楼主要获取HttpServletRequest,很容易,建立一个ServletRequestListener,当requestInitialized方法调用之后,把Request对象放到ThreadLocal里面即可。
2 楼 cnlw1985 2010-03-22  
S2的标签用着不爽,还是jstl强大
1 楼 gouflv 2010-03-22  
1. 你说的第一种情况吃力不讨好, 估计没人会这样做(除非没看过demo)
2. jstl? 怎么不用S2的标签库呢
3. request确实少用, 但还是习惯在父类注入request和session

相关推荐

    struts2中获得request对象

    本文将详细讲解在Struts2中获取`request`对象的几种常见方法,以及它们的适用场景。 1. **Action上下文(ActionContext)** `ActionContext`是Struts2的核心组件之一,它封装了与当前请求相关的所有上下文信息,...

    struts2使用request、response

    本文将详细介绍如何在Struts2中使用request和response。 #### 二、Struts2中request与response的获取方式 在Struts2中,可以通过以下几种方式来获取request和response对象: 1. **使用Struts2提供的拦截器:** - ...

    struts2 获取request

    struts2 获取request session对象

    Struts2获取request的四种方式

    这种方式与第一种方式相似,但使用了Struts2提供的`ServletActionContext`来获取Request,而不是从`ActionContext`中获取。 4. **Servlet相关的IoC取得Request等对象的方式** 最后一种方式也是通过注解,但是使用...

    Struts2中获得Request,Response的几种方法

    Struts2中获得Request,Response的几种方法,有代码作为参考。

    struts2中request和session的获取

    在Struts2框架中,对request和session的管理和获取是实现Web应用中用户交互和状态维护的重要手段。本文将深入探讨Struts2中如何获取request和session,以及这两种对象的作用和应用场景。 ### Struts2框架简介 ...

    Struts2的Action中获得request response session几种方法

    以下将详细介绍如何在Struts2的Action中获取request、response、session。 ### 1. 使用ActionContext获取request、response、session Struts2的Action可以通过`ActionContext`来间接获取`request`、`response`和`...

    基于Struts2的留言板系统.zip

    在基于Struts2的留言板系统中,我们主要会涉及到以下几个关键知识点: 1. **Struts2框架**: Struts2是Apache软件基金会的一个开源项目,它是Struts1的后续版本,提供了更丰富的功能和更好的性能。它通过拦截器实现...

    Struts2学习笔记(三) Struts2中访问request,session,和application对象

    // 从request中获取属性 public String execute() { String receivedMessage = message; // 这里可以从请求中获取message // ... } } ``` 接下来是session对象,它比request具有更长的生命周期,可以跨多个...

    Struts2上传文件(直接用request)

    Struts2上传文件(直接用request)

    基于Struts2学生选课管理系统.zip

    《基于Struts2的学生选课管理系统详解》 在IT领域,构建高效且用户友好的管理信息系统是提升工作效率的重要手段。本文将深入探讨一个基于Struts2框架的学生选课管理系统,该系统利用Java技术栈和MySQL数据库,为...

    struts2的学生管理系统

    在"Struts2的学生管理系统"项目中,我们可以看到一个简单的实例,它展示了如何使用Struts2框架来构建一个学生信息管理的系统。 首先,让我们深入了解Struts2的核心概念。Struts2框架的主要组件包括Action类、配置...

    struts2环境搭建+struts2 新闻发布系统+struts2 留言板

    struts2环境搭建+struts2 新闻发布系统+struts2 留言板 struts2环境搭建:基础框架搭建,简单易上手,...struts2 留言板:struts2+jquery 直接导入myecplise中即可使用,很好用,可以在此基础上添加并完善项目将更完美。

    基于Struts2的个人信息管理系统

    基于Struts2的个人信息管理系统是使用这一框架来设计和实现的一个典型示例,它涵盖了用户管理、行程管理和文件操作等多个核心功能。 在用户管理模块中,Struts2提供了丰富的动作类(Action)和结果(Result)配置,...

    struts2访问application、session以及request等web资源的示例代码

    在实际应用中,通常会结合Struts2的拦截器(Interceptor)来处理这些域数据,例如,可以在预处理(preintercept)阶段将数据放入域,然后在后处理(postintercept)阶段取出使用。 此外,Struts2还提供了Action上...

    struts2的新闻管理系统

    通过这个新闻管理系统,新手可以学习到如何使用Struts2搭建一个完整的web应用,包括控制器的设计、模型与视图的交互、用户交互处理以及错误处理等方面的知识。同时,这个项目也可以作为进一步学习其他Java web技术,...

    struts2标签使用方法

    Struts2 允许在页面中使用自定义组件,这完全能满足项目中页面显示复杂、多变的需求。 Struts2 标签分类 Struts2 标签库可以分为三大类:UI 标签、非 UI 标签和 Ajax 标签。 UI 标签 UI 标签主要用于生成 HTML ...

    基于struts2+hibernate在线书店系统

    **基于Struts2+Hibernate在线书店系统的详解** 本项目是一个基于Struts2和Hibernate框架的简单在线书店系统,采用MySQL作为后台数据库,旨在实现网上书店的基本业务功能,并且具有清晰的分层架构。以下是该系统的...

    基于Struts2的学生选课管理系统

    《基于Struts2的学生选课管理系统》 在IT领域,构建高效、易用的管理系统是提升工作效率的关键。本文将深入探讨一个基于Struts2框架、采用MySQL数据库的学生选课管理系统,解析其核心技术和应用场景。 首先,...

    Struts2开发的电子商务系统

    在这个"Struts2开发的电子商务系统"中,我们可以通过分析其组件和功能来深入理解这个项目。 首先,让我们从MVC模式开始。在MVC模式中,模型负责管理业务逻辑和数据,视图负责呈现用户界面,而控制器接收用户请求并...

Global site tag (gtag.js) - Google Analytics