-1

私はsturts2 webapplicationを開発しています。ユーザー名とパスワードのフィールドを持つログインページを持っています。ユーザーが値を含むフォームを送信するとすぐに、ログインを検証しています。ユーザーが有効なユーザー名とパスワードを提供すると、ホームページにリダイレクトされます。ホームページをリダイレクトしているときに、将来使用するためにセッションにデータを設定するスレッドを呼び出す必要があります。これを行う方法 ?

私がしたことは

import com.opensymphony.xwork2.ActionContext;

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

runnable を実装する新しいクラスを追加しました。

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 に格納されている値はスレッドごとに一意です。

新しい Thread を作成するだけなので、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 コンストラクターに渡すことです。しかし、CONtext が ThreadSafe であるかどうかはわかりません。

于 2012-10-05T17:44:26.443 に答える
1

なぜデータを入れるために新しいスレッドを開始する必要があるのか​​疑問に思っていますsession

(あなたがやりたいと言っていることですが、実際には投稿されたコードでは行いません。代わりに何かを入れますrequest)。

アクションからSessionAwareインターフェイスを実装するだけです。

ユーザーのHTTPセッション属性へのアクセスが必要なアクションは、このインターフェースを実装する必要があります。

これにより、後続のリクエストで使用できるオブジェクトを配置できるマップにアクセスできるようになります。

一般的な用途は、名前などのキャッシュされたユーザーデータやショッピングカートです。

これは必須ではありませんが、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
}

それはうまくいきません。このメソッドは、return 呼び出しの後に終了します。最初に新しいスレッドを作成するメソッドを呼び出してみてください。

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

}
于 2012-10-05T14:05:32.977 に答える