-1

我正在开发一个 sturts2 web 应用程序,我有一个带有用户名和密码字段的登录页面。一旦用户提交带有值的表单,我正在验证登录,如果用户提供有效的用户名和密码,它将被重定向到主页。在重定向主页时,我必须调用一个线程,在该线程中我在会话中设置一些数据以供将来使用。这该怎么做 ?

我所做的是

import com.opensymphony.xwork2.ActionContext;

if( loginSuccess(userInfo) ) {
    initializeDatas(); // calling thread after userInfo bean validated
    // redirecting to home page
    return HOME_PAGE;
}

我添加了一个实现可运行的新类。

class intilalizer implements Runnable {
    @Override
    public void run() {
        try {
            System.out.println("Started to set values ");
            List<String> iphoneSdks = new ArrayList<String>();
            List<String> iphoneOSSdks = IosSdkUtil.getMacSdks(MacSdkType.iphoneos);
            List<String> simSdks = IosSdkUtil.getMacSdks(MacSdkType.iphonesimulator);
            List<String> macSdks = IosSdkUtil.getMacSdks(MacSdkType.macosx);
            iphoneSdks.addAll(iphoneOSSdks);
            iphoneSdks.addAll(simSdks);
            iphoneSdks.addAll(macSdks);

            ActionContext context = ActionContext.getContext();
            System.out.println("context ===> " + context); // here i am getting null value
            String httpRequest = ServletActionContext.HTTP_REQUEST;
            System.out.println("httpRequest =====> " + httpRequest);
            Object object = context.get(httpRequest);
            System.out.println(object);
            HttpServletRequest req = (HttpServletRequest) object;

            req.setAttribute(REQ_IPHONE_SDKS, iphoneSdks);
            req.setAttribute(REQ_IPHONE_SIMULATOR_SDKS, simSdks);
            System.out.println("Value initialized@@@@");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

我正进入(状态

java.lang.NullPointerException
    at com.photon.phresco.framework.actions.intilalizer.run(Login.java:286)
    at java.lang.Thread.run(Thread.java:680)

我在线收到此错误。

ActionContext context = ActionContext.getContext();
System.out.println("context ===> " + context); // here i am getting null value
4

3 回答 3

2

来自 Struts 2 JavaDoc

ActionContext 是线程本地的,这意味着存储在 ActionContext 中的值对于每个线程都是唯一的

您只需创建一个新线程,因此您的 ThreadLocal 变量在那里不可用。你应该这样做:

import com.opensymphony.xwork2.ActionContext;

if( loginSuccess(userInfo) ) {
   ActionContext context = ActionContext.getContext(); 
   initializeDatas(context); // calling thread after userInfo bean validated
   // redirecting to home page
   return HOME_PAGE;
}

最好的方法是将上下文传递给 Thread 构造函数。但我不确定上下文是线程安全的。

于 2012-10-05T17:44:26.443 回答
1

我只是想知道为什么你需要启动一个新线程来放入一些数据session

(你说你想做的事情,但你实际上并没有在发布的代码中做,而是把东西放进去request)。

您可以简单地从您的操作中实现 SessionAware 接口。

想要访问用户的 HTTP 会话属性的操作应该实现这个接口。

这将使他们能够访问 Map ,他们可以在其中放置可供后续请求使用的对象。

典型用途可能是缓存的用户数据,例如姓名或购物车。

这不是强制性的,但它是从 Actions 中访问会话的最佳实践,而不是询问 ActionContext:

您可以通过询问 ActionContext 或实现 SessionAware 来获取会话属性。实施 SessionAware 是首选

如果需要,这里有一个小例子:http ://www.splinter.com.au/how-to-use-sessions-with-struts-2/

于 2012-11-22T14:31:39.670 回答
0
if( loginSuccess(userInfo) ) {
    // redirecting to home page
    return HOME_PAGE;
    initializeDatas(); // calling thread after userInfo bean validated
}

那是行不通的。该方法将在返回调用后结束。尝试首先调用创建新线程的方法。

if( loginSuccess(userInfo) ) {
    // redirecting to home page
    initializeDatas(); // calling thread after userInfo bean validated
    return HOME_PAGE;

}
于 2012-10-05T14:05:32.977 回答