返回列表 发帖

[Struts2和WW] Struts2+Spring 当Action的Bean设置成Scope="session"时

Struts2+Spring 当Action的Bean设置成Scope="session"时
如果Action有继承SessionAware,  ServletRequestAware, ServletResponseAware这三个接口
那么实现方法应该这样写

  1. private final static ThreadLocal<Map> SESSION_THREADLOCAL = new ThreadLocal<Map>();
  2. private final static ThreadLocal<HttpServletRequest> REQUEST_THREADLOCAL = new ThreadLocal<HttpServletRequest>();
  3. private final static ThreadLocal<HttpServletResponse> RESPONSE_THREADLOCAL = new ThreadLocal<HttpServletResponse>();
  4. public void setSession(Map session) {
  5.   SESSION_THREADLOCAL.set(session);
  6. }
  7. public void setServletRequest(HttpServletRequest request) {
  8.   REQUEST_THREADLOCAL.set(request);
  9. }
  10. public void setServletResponse(HttpServletResponse response) {
  11.   RESPONSE_THREADLOCAL.set(response);
  12. }

  13. public Map getSession(){
  14.   return SESSION_THREADLOCAL.get();
  15. }

  16. public HttpServletRequest getRequest(){
  17.   return REQUEST_THREADLOCAL.get();
  18. }

  19. public HttpServletResponse getResponse(){
  20.   return RESPONSE_THREADLOCAL.get();
  21. }
复制代码
而不要写成
  1. private Map session;
  2. private HttpServletRequest request;
  3. private HttpServletResponse response;

  4. public void setSession(Map session) {
  5.   this.session = session;
  6. }
  7. public void setServletRequest(HttpServletRequest request) {
  8.   this.request = request;
  9. }
  10. public void setServletResponse(HttpServletResponse response) {
  11.   this.response = response;
  12. }

  13. public Map getSession() {
  14.   return session;
  15. }
  16. public HttpServletRequest getRequest() {
  17.   return request;
  18. }
  19. public HttpServletResponse getResponse() {
  20.   return response;
  21. }
复制代码
为什么?
因为当同一个session高并发请求同一个Action的时候,成员变量会被各线程共用,将导致你非常沮丧。

同理,在Action中自己定义的成员变量也会有一样的情况发生。所以也要慎用。

不过这也是双刃剑。用得好的话,还是非常有利的。比如在编辑的时候可以省去很多hidden

[ 本帖最后由 bruceye 于 2010-4-7 16:51 编辑 ]
1

评分人数

青春是那么的耀眼,我该怎样度过?

倚楼听风雨,笑看江湖路。。。

TOP

返回列表