9

ここでのQ&Aに従って、JBoss 5で実行されているWebアプリに同様の自動バージョニングシステムを実装したいと思います。この種のことを行うためにすでに何かありますか、それとも自分で何かを書く必要がありますか?明確にするために:私はPHPを使用していません。

PHPについてあまり知らないので、PHP.htaccessなどのTomcat/JBossアナログが何であるかわかりません。独自の自動バージョン管理を作成する必要がある場合、どこから始めればよいですか?原則は明らかです。ファイルのタイムスタンプを使用してURLを書き換えますが、JBoss/Tomcatを使用したURLの書き換えについてはよくわかりません。


アップデート:

Pascal初心者が推奨するアプローチを組み合わせて、私が最終的に得たものは次のとおりです。

1.カスタム<my:script/>とタグなので、どこにでもタグ<my:style/>を表示する必要はありません。<c:url/>

<%@ tag body-content="empty" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ attribute name="src" required="true" rtexprvalue="true" %>
<script src="<c:url value="${src}" />"></script>

2.初心者の手順にかなり厳密に従いますが、web.xmlにマッピングUrlRewriteFilterします。/*

<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

3. CACHE_BUST変数をすべての新しいセッション(多かれ少なかれ...)に挿入し、アプリケーションは タイムスタンプをデプロイします。

// On application deploy:
long CACHE_BUST = System.currentTimeMillis() / 1000;

// later...
session.setAttribute("cacheBust", CACHE_BUST);

4. ...これらのルールを次の場所で使用できるようにしますurlrewrite.xml

<outbound-rule>
    <from>^/static/(css|js|images)/(.*)$</from>
    <to>%{context-path}/static/%{session-attribute:cacheBust}/$1/$2</to>
</outbound-rule>

<rule>
    <from>^/static/\d{10}/(css|js|images)/(.*)$</from>
    <to>/static/$1/$2</to>
</rule>

Pascal初心者の助けに感謝します。

4

3 に答える 3

4

次のソリューションは、リリースごとにバージョン番号をインクリメントするため、本番環境に適しています。

アプローチ:

  • jsp ファイルの js/css/images/static コンテンツ URL に製品リリース番号 (バージョン番号) を追加します。
  • ブラウザは、バージョン番号を含む URL を持つ (js/css/static) ファイルをキャッシュします
  • 新しいバージョンがリリースされると、jsp ファイルには新しいバージョン番号を持つ js/css/static ファイルの URL が含まれるため、ブラウザーは新しい URL のコンテンツを見つけることができないため、呼び出しを行います。

手順:

  • クラスパスに urlrewritefilter.jar を含めます ( http://www.tuckey.org/urlrewrite/から取得します)
  • url パターンで web.xml を更新します。

    <filter>
        <filter-name>urlRewriteFilter</filter-name>
        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    </filter>
    
    <filter-mapping>
      <filter-name>urlRewriteFilter</filter-name>
      <url-pattern>/v/*</url-pattern>
    </filter-mapping>
    
  • jsp ファイルの「abc.js」を更新します。たとえば、

    <html>
        <head>
            <script type="text/javascript" src="<c:url value="/v/js/abc.js"/>"></script>
        </head>
    </html>
    
  • たとえば、urlrewritefilter.xml を記述します。

    <outbound-rule>
        <from>^/v/(css|js|static)/(.*)$</from>
        <to>%{context-path}/v/updateVersionNumberHere/$1/$2</to>
    </outbound-rule>
    
    <rule>
        <from>^/v/updateVersionNumberHere/(css|js|static|images)/(.*)$</from>
        <to>/$1/$2</to>
    </rule>
    

    説明:

    jsp がクライアントに提供されるとき

    • jsp に記載されている URL: /v/js/abc.js
    • 送信ルールを適用した後: /contextPath/v/3.4.5/js/abc.js

    ブラウザが js/css/static ファイルを呼び出すとき

    • 着信 URL: /contextPath/v/3.4.5/js/abc.js
    • ルール適用後: /js/abc.js

ポイント:

  • ブラウザは、url /contextPath/v/3.4.5/js/abc.js を持つ js ファイルをキャッチします。次に、url /contextPath/v/4.5.6/js/abc を持つ可能性がある jsp ファイルの新しいバージョンをデプロイします。 js であるため、ブラウザはキャッシュされた js ファイルを使用する代わりに js ファイルを呼び出します。
  • Maven または同様のビルド ツールを使用すると、バージョンの更新を自動化できます
于 2010-09-15T16:00:15.803 に答える
3

アプリケーションの前面に Apache HTTPD を配置したくない場合は、カスタム サーブレット フィルターを使用するか、既存のUrl Rewrite Filterを再利用できます。このフィルターは Apache に基づいてmod_rewriteおり、同様の機能を提供します。つまり、他の回答の PHP と同じソリューションを実装できます。


以前に URL 書き換えフィルターを見たことがあります。それをどのように使用するか詳しく説明していただけますか?含まれている各 JS/CSS ファイルにラップされた JSP/JSTL 関数を正確に呼び出すわけではないため、この問題にフィルターを適用する方法がよくわかりません。 WAR にあるファイルから変更された日付。

さて、アイデアは、リンク先の回答の「PHPソリューション」を正確に模倣することでした(このオプション1と呼びましょう):

  1. Url Rewrite Filter をセットアップして、発言/css/my.123456.cssする要求を書き換えます。/css/my.css
  2. WAR 内の特定のリソースServletのオブジェクトを取得し、そのリソースへの返されたパスに挿入する を実装します。FileFile#lastModified()
  3. ServletCSS の JSP からそれを呼び出します。

別のアプローチ (オプション 2) は、一意のクエリ文字列を静的コンテンツの URL に追加することです。たとえば、サーバーの起動時間です。

  1. サーバーの起動時間を a からアプリケーション スコープに入れますServletContextListener(キーの下"key"など)。
  2. あなたのJSPで

    <link rel="stylesheet" type="text/css" href="/css/my.css?${key.startupTime}">
    

長所: URL の書き換えはもう必要ありません。短所: 最適ではありませんが (再起動時にコンテンツが要求されます)、許容範囲です。


オプション 1 のステップ 2 を実装するのに役立つコードを Web で検索してo.s.w.s.ResourceServletいるときに、同様のことを行っている Spring を見つけました。そのソース コードを確認できます。しかし、javadoc を注意深く読んでいるうちに、このサーブレットがまさにあなたが探しているものであることがわかりました。次のようにマッピングします。

<servlet>
  <servlet-name>Resource Servlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.ResourceServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>Resource Servlet</servlet-name>
  <url-pattern>/static/*</url-pattern>
</servlet-mapping>

そして、そのapplyLastModifiedプロパティを に設定しますtrue。javadoc についての私の理解は、それがうまくいくはずだということです。これはオプション 3 であり、このサーブレットに依存関係を追加しても問題ない場合、これが IMO の最適なオプションです。

于 2010-04-19T13:38:03.263 に答える
1

Web アプリで次のことを行います。

  1. ビルド プロセスは Subversion リポジトリ番号を取得し、それを Web アプリケーション内のプロパティに格納します。
  2. ビルド プロセスは、次のリビジョン番号を組み込んだ WAR 内の静的アセットのディレクトリ構造も作成します: /assets/1234/styles/...
  3. フィルター/インターセプターは、アセットパス (リビジョン番号を含む) をすべてのリクエストに属性として入れます
  4. Jsp テンプレートは、このアセット パス属性を使用して、アセットの URL を構築します
于 2010-04-22T16:42:59.520 に答える