3

MainControllerという1つから継承した2つのコントローラーがあります。すべてのコントローラーのスコープは「セッション」です。MainControllerには、1つの変数があります。インデックス、次のとおりです。

@Controller
public class C1 extends MainController {
    @RequestMapping(value="/action1") 
    public void Action1() {
        System.out.print(Index);
    }
}

@Controller
public class C2 extends MainController {
    @RequestMapping(value="/action2") 
    public void Action2() {
        System.out.print(Index);
    }
}


public class MainController {

    protected int Index = 0;

    @ModelAttribute("BeforeRequest")
    public void BeforeRequest(HttpServletRequest request) {
        if (request.getRequestURI().contains("action1")) {
            Index++;
        }
    }
}

「Action1」が実行されると、MainControllerでインデックスが1(ModelAttributeアノテーション)増加します。C1では、変数はリクエストごとに1ずつ増加しますが、C2では(定義どおり)0のままです。

インデックスの現在の値をC2に「注入」することは可能ですか?

4

4 に答える 4

4

ユーザーがサイトにアクセスした回数を数えたい場合は、いくつかの方法があります。簡単な方法の1つは、リクエスト数を増やしてユーザーのセッションに配置するすべてのリクエストにマップされるサーブレットフィルターを作成することです。

これはweb.xmlに含まれます:

<filter>
    <filter-name>RequestCountFilter</filter-name>
    <filter-class>com.mycompany.RequestCountFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>RequestCountFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

フィルタの実装は次のようになります。

public class RequestCountFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpSession session = request.getSession();
        Integer requestCount = session.getAttribute("requestCount") == null 0 : session.getAttribute("requestCount");
        session.setAttribute("requestCount", ++requestCount);         
        chain.doFilter(req, res);
    }
    public void init(FilterConfig config) throws ServletException {
        // init code goes here
    }
    public void destroy() {
        // clean up goes here
    }
}
于 2013-03-25T21:41:47.813 に答える
1

C1とC2はMainControllerのサブクラスですが、Springが起動すると、それぞれのインスタンスが作成されるため、変数のコピーが2つありますIndex

最も簡単な方法は、インデックス変数を静的にして、オブジェクトではなくクラスインスタンスに属するようにすることです。

各C1とC2のコンストラクターでデバッグステートメントを出力してみてください。スプリングブートすると、両方が異なるオブジェクトインスタンスであることがわかります。

于 2013-03-25T21:51:36.440 に答える
1

私はコントローラー自体をセッションスコープに入れませんでした。

むしろ、セッションスコープにインデックス変数を保持するセッションオブジェクトを実装し、これをコントローラーに配線します。

少なくとも3つの利点があります。

  • 小さなセッション
  • 静的な必要はありません
  • 拡張が簡単:ベースインデックスを継承するコントローラーではない別の場所でこのインデックスが突然必要になった場合
于 2013-03-26T06:24:39.760 に答える
0

マーティン・フレイが書いたように、私は自分の問題を解決しました。インデックスをセッションBeanとして作成しましたが、コントローラーはスコープリクエストにすることができます。

問題を解決するための主なタグは、BeanXMLのscope= "session"およびaop:scoped-proxyでした。

改善されたコードは次のとおりです。

@Controller
@Scope("request")
public class C1 extends BaseController {


    @RequestMapping(value="/action1")
    public void Action1() {
        System.out.println("Action1: " + Index.getIndex());
    }
}

@Controller
@Scope("request")
public class C2 extends BaseController {

    @RequestMapping(value="/action2")
    public void Action2() {
        System.out.println("Action2: " + Index.getIndex());
    }
}

そしてBaseControllerは:

public class BaseController {

    @Autowired
    protected BeanSession Index;

    @ModelAttribute("BeforeRequest")
    public void BeforeRequest(HttpServletRequest request) {
        if (request.getRequestURI().contains("action1")) {
            Index.setIndex(Index.getIndex() + 1);
        }
    }

    public BeanSession getIndex() {
        return Index;
    }

    public void setIndex(BeanSession index) {
        Index = index;
    }

}

BeanSessionクラス:

public class BeanSession {

    private int Index;

    public BeanSession() {
        this.Index = 1;
    }


    public int getIndex() {
        return Index;
    }

    public void setIndex(int index) {
        Index = index;
    }

}

そしてxmlでのBean定義:

<bean id="BeanSession_Bean" class="controller.BeanSession" scope="session" >
    <aop:scoped-proxy/>
</bean>

<bean id="BaseController_Bean" class="controller.BaseController">
    <property name="Index" ref="BeanSession_Bean" />
</bean>

そして、それは私が望むように機能します。

于 2013-03-26T20:07:17.687 に答える