0

Struts2 をコントローラーとして使用して Web サイトを開発し、それを Spring および Hibernate と統合して、ビジネス ロジックと DB の処理を​​行いました。Web サイトの URI はhttp://my.domian.com/URIです。この {URI} は、管理 cms を通じて動的に生成されます。各 uri のサーブレットへのマッピングは、次のように Apache mod_rewrite を使用して行われます。

RewriteCond %{HTTP_HOST} ^www\.domain\.com
RewriteRule ^([a-zA-Z0-9_-]+)$ /dynamic\.action?f=$1 [QSA,L]  

(さらに情報を得る前に、これは適切で適切なアプローチですか?)

Struts 構成は、次のような一般的なアカデミックなものです。

<package name="Default" extends="struts-default" namespace="/">  
    ...  
    <action name="dynamic" class="DynamicContentAction">  
        <result name="index">/content/web/dynamic/index.jsp</result>  
    </action>  
</package>

DynamicContentAction は ActionSupport を拡張し、ServletRequestAware、ServletContextAware を実装しています。いくつかのこと (サブドメインとして識別される現在の訪問言語など) をチェックし、要求された uri が有効かどうかをデータベースで調べ、その uri のコンテンツを生成し、いくつかのランタイム グローバル変数を設定しています (現在訪問しているページ ID、現在訪問している言語によるレイアウト構成など...) をこのサーブレットの Request オブジェクトに配置します。

1 人のユーザーが同時に要求する動的ページが多すぎる場合を除き、すべてが適切に表示され、完全に機能することさえあります。私の場合、「Too Many」は少なくとも 9 ~ 10 ページです。この場合、別の例外がスローされます。HttpServletRequest リクエストが null の場合もあれば、ServletContext servletContext が null の場合もあれば、問題ない場合もありますが、ランタイム変数は null であり、ビジネス ロジックまたはデータベース クエリで使用されます。

私はそれについてグーグルで調べたところ、このアクションが「リクエストごと」にインスタンス化されていることがわかりました。そうじゃない?リクエストごとにアクションがある場合、この競合または「nullability の問題」の何が問題になっていますか。ストラットのスレッド化を超えて、そのアクションでスレッドのようなことを行う必要がありますか?

あなたが私を助けてくれたり、方向性を教えてくれたりしたら、とてもありがたいです。

4

1 に答える 1

0

これは、DynamicContentAction.java の簡略化されたバージョンです。

public class DynamicContentAction extends ActionSupport implements ServletRequestAware, ServletContextAware {
    private HttpServletRequest request;
    private ServletContext servletContext;

    private ResourceSelectorService resourceSelectorService;

    private String f = null;

    public String execute() {
        if ( f != null ) {
            HashMap<String, Object> resolvedURI = resourceSelectorService.resolveURI(f);

            if ( resolvedURI.get("ERROR").equals(true) ) {
                //Generating nice 404 error page content
            } else {
                //Generating Content
                //and put it on request object as:
                //request.setAttribute("attrName", resourceContent);
            }
        }

        else {
            //Generating nice 404 error page content
        }

        request = null;
        servletContext = null;

        f = null;

        return "index";
    }

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

    @Override
    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;  
    }

    public void setF(String f) {
        this.f = f;
    }

    public String getF() {
        return f;
    }
}

この投稿を書いているときに、このクラスがスレッドセーフではないことを知りました。それは...ですか?そのため、以下のように少し変更しました。

これが DynamicContentAction.java の新しいバージョンです

public class DynamicContentAction extends ActionSupport {
    private ResourceSelectorService resourceSelectorService;

    private String f = null;

    public String execute() {
        if ( f != null ) {
            final HttpServletRequest request = ServletActionContext.getRequest();
            final ServletContext servletContext = ServletActionContext.getServletContext();

            HashMap<String, Object> resolvedURI = resourceSelectorService.resolveURI(f);

            if ( resolvedURI.get("ERROR").equals(true) ) {
                //Generating nice 404 error page content
            } else {
                //Generating Content
                //and put it on request object as:
                //request.setAttribute("attrName", resourceContent);
            }
            f = null;
        }

        else {
            //Generating nice 404 error page content
        }

        return "index";
    }

    public void setF(String f) {
        this.f = f;
    }

    public String getF() {
        return f;
    }
}

Null の問題はほとんどなくなりましたが、生成されたコンテンツにはまだ競合があります。たとえば、ユーザーが開こうとした場合:

http:// www.domain.com/A
http:// www.domain.com/B
http:// www.domain.com/C
http:// www.domain.com /D
http://www.domain.com/E

同時に、すべてのページがブラウザーでレンダリングされますが、A のコンテンツが A と B に表示されます。C は正しく、 DとEの内容も間違っています。

于 2010-11-01T14:03:18.037 に答える