2012-04-27 19 views
-2

SpringMVCには基本的なアプリケーションがあります。私のすべてのコントローラは、以下に示すスーパークラスを継承しています。 コントローラメソッドに触れるたびにcssFilesjsFilesがリセットされないという問題があります。だから、content/view.jsが読み込まれ、ページビューごとにx+1回が終わることになります。ページを3回ロードした場合、それには4つのcontent/view.jsファイルが含まれます。各ページビューの値をリセットする方法

ページが読み込まれるたびにこれらの値が追加されるのが見えます。なぜこれが起こっているのですか?それをどうやって修正しますか?

public class Controller { 
    private List<String> cssFiles = new ArrayList<String>(); 
    private List<String> jsFiles = new ArrayList<String>(); 

    public Controller() { 
     this.addCss("global"); 

     this.addJs("http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min"); 
     this.includejQueryUI(); 
     this.addJs("global"); 
    } 

    public ModelAndView prepareModel (ModelAndView model) { 

     model.addObject("cssFiles", cssFiles); 
     model.addObject("jsFiles", jsFiles); 

     return model; 
    } 
    public ModelAndView prepareModel (ModelAndView model, String title) { 
     model.addObject("title", title); 

     return prepareModel(model); 
    } 

    /* 
    * Add a css file to the page 
    */ 
    public void addCss (String cssPath) { 
     if (cssPath.indexOf("://") < 1) { 
      cssPath = "/cmt/css/"+cssPath; 
     } 

     cssFiles.add(cssFiles.size(), cssPath); 
    } 

    /* 
    * Add a javascript file to the page 
    */ 
    public void addJs (String jsPath) { 
     if (jsPath.indexOf("://") < 1) { 
      jsPath = "/cmt/js/"+jsPath; 
     } 

     jsFiles.add(jsFiles.size(), jsPath); 
    } 

    /** 
    * Add a Rich Text Editor (TinyMCE) library to the page 
    */ 
    public void includeRichTextEditor() { 
     addJs("../lib/tiny_mce-3.5b3/tiny_mce"); 
    } 

    /** 
    * Add the jQuery UI library to the page 
    */ 
    public void includejQueryUI() { 
     addCss("../lib/jquery-ui-1.8.19/custom-theme/jquery-ui-1.8.19.custom"); 
     addJs("../lib/jquery-ui-1.8.19/jquery-ui-1.8.19.custom.min"); 
    } 
} 

私はまだこの問題の原因を特定するのに苦労しています....アイデアはありますか?親コントローラは常に生きているかのweb.xml

<!-- Standard spring configuration --> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext*.xml</param-value> 
</context-param> 

<!-- Spring Web MVC dispatcher servlet --> 
<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>*.html</url-pattern> 
    <url-pattern>*.json</url-pattern> 
</servlet-mapping> 
+0

あなたの質問とは別に、あなたはページの装飾を行うためにsitemeshを見ましたか?私はcss/jsファイルがこのように提供されるのを見たことはありません。通常、すべてのページを装飾するメインjspxがあり、標準のhtmlを使用しているCSSとjsインクルージョンがすべて含まれています... – Kevin

+0

コントローラは春設定でどのように定義されますか?各リクエストの前にリットを手動でリセットしない場合、コントローラはリクエストスコープになるように定義する必要があります – Dominik

+0

この投稿を自分の設定に更新しました。これはあなたが話していたことですか?私はここで何を調整すべきか分かりません。 – Webnet

答えて

0

私はこのコードをテストしていませんでしたが、私が試してみた何明白なことは、次のとおりです。

public class Controller { 
    private List<String> cssFiles; 
    private List<String> jsFiles; 
....... 
public Controller() { 
     cssFiles = new ArrayList<String>(); 
     jsFiles = new ArrayList<String>(); 
     this.addCss("global"); 
     this.addJs("http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min"); 
     this.includejQueryUI(); 
     this.addJs("global"); 
    } 

あなたがare not reset every time a controller method is touched

にリセットによって何を意味するかellaborateすることができます私はあなたを誤解しましたここで最初の質問は改訂されているバージョンは:あなたは、いくつかのJavaScriptをオーバーライドする必要がある場合

<html> 
<head> 
<!--Above content is header--> 
<!--Specific CSS for edit.jsp here--> 
<!--Or if you want to override css classes inside <style></style>--> 
</head> 
<body> 
<!--Load specific edit.jsp javascript at the end of the body tag--> 
<!--Below content is footer--> 
</body> 
</html> 

、その後置きますhtmlタグの後のedit.jsp固有のjs。あなたの編集ファイルは次のようになります:

<%@include file="header.jsp" %> 
</head> 
<body> 
<!--some edit.jsp content --> 
<%@include file="footer.jsp" %> 
+0

それは動作しません、私はそれを試してみました。 'this.addCss( 'content/edit');'を実行すると、そのユーザーのセッションに提供されるすべてのJavaページには常にそのcssファイルがロードされます。私が必要とするのは、特定のページのみを持つことです。 – Webnet

+0

@Webnet hmm興味深いのはなぜあなたのJSPファイルにCSSスタイルを追加しないのですか?なぜあなたはコントローラからこれをやるのですか? – ant

+0

JS/CSSファイルがロードされる順序を制御するだけでなく、CSSファイルが ''タグ内にロードされ、jsファイルが ''タグの直前にロードされるようにする必要があります。コントローラ内でJSPビューよりも5倍の処理が簡単です。私はCSSハッシュマップや何か私のビュー内に追加することができるものを持っていない限り... – Webnet

0

パートはたぶん、あなたは、コンストラクタで

cssFiles = new ArrayList<String>(); 
jsFiles = new ArrayList<String>(); 

をしたいですか?

親コンストラクタのメソッドをどのように呼び出すのですか?

+0

残念ながら、 JSファイルは、セッションを終了するまでサイト全体にアクセスするすべてのページに含まれています。 – Webnet

0

あなたの意見にjsとcssファイルを追加する方法は間違っていると思います。

サーブレットxml構成ファイルで、cssファイルとjsファイルのリソースハンドラを追加する必要があります。私は同じために次のコードを使用します。

<mvc:resources location="/resources/" mapping="/resources/**" /> 

これは、Webアプリケーションルートの資源フォルダ内のすべてのリソースに対してSpringのDispathcerサーブレットをスキップします。

これを実行した後、必要な場合はいつでも、それらをjspファイルに組み込む必要があります。

Cheeers ...

0

Setの代わりArrayListを使用してみてください。

private Set<String> cssFiles = new HashSet<String>(); 
private Set<String> jsFiles = new HashSet<String>(); 

重複要素のないコレクションです。より正式には、 には、要素e1と要素e2のペアが含まれていないため、要素e1には含まれません。(e2)、および には、1つのヌル要素があります。その名前によって暗示されるように、このインタフェースは数学的集合抽象度を とモデル化する。

-1

ArrayListの代わりにSetを使用してください。

関連する問題