kagamihogeの日記

kagamihogeの日記です。

What does the InternalResourceViewResolver do in Spring MVC?をテキトーに訳した

http://javarevisited.blogspot.jp/2017/08/what-does-internalresourceviewresolver-do-in-spring-mvc.html を読んだ。

What does the InternalResourceViewResolver do in Spring MVC?

InternalResourceViewResolverはSpring MVCフレームワークViewResolverの実装で、"hello"などの論理的なビュー名を、ServletやWEB-INFフォルダー内に配置されるjspファイルなどの内部的な物理リソースへの解決を担当します。このクラスはUrlBasedViewResolverのサブクラスで、Springコントローラーが返す論理的なビュー名を実際の物理的なビューへ変換するのに、"prefix"と"suffix"を使います。たとえば、ユーザがURL/homeにアクセスしてHomeControllerが"home"を返すとすると、DispatcherServletはInternalResourceViewResolverに問い合わせて、webアプリケーションが必要とする実際の物理的なビューを参照するためにprefixとsuffixを使用します。たとえば、prefixが"/WEB-INF/views/"でsuffixが".jsp"の場合、"home"はInternalResourceViewResolverによって"/WEB-INF/home.jsp"に解決されます。

このため、WEB-INFディレクトリ内にJSPファイルを配置する場合、それらのJSPファイルに直接アクセス(例:URLの直接入力)できなくするのが望ましいです。そうする場合、コントローラーだけがそれらのファイルにアクセス可能です。

How to configure InternalResorveViewResolver in Spring MVC

以下に示すように、Java ConfigurationとXML configurationのどちらかでViewResolver を設定できます。

Configuring ViewResolver using XML in Spring

以下はSpringでview resolverを設定するXMLの例で、XMLベースでSpringプロジェクトを動かしている場合には以下のようにします。

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    prefix="/WEB-INF/" suffix=".jsp" /> 

Configuring ViewResolver using Java Configuration

Spring 3.0以降はXMLではなくJavaでview resolverを設定できます。internal resource view resolverを設定するには以下のようにします。

@Bean
  public ViewResolver viewResolver() {
    InternalResourceViewResolver irv = new InternalResourceViewResolver();
    irv.setPrefix("/WEB-INF/");
    irv.setSuffix(".jsp");

    return irv;

  }

XMLでもJavaでもSpringでinternal resource view resolverを設定する方法は簡単です。

Important points about InteralResourceViewResolver in Spring MVC

Spring MVCフレームワークの便利なこのクラスについて、以下に知っておいたほうが良い点を述べます。springプロジェクトの処理の流れを知るのに役立つかと思います。

1. 複数のViewResolverをチェーンさせる場合、InternalResourceViewResolverは常に最後にする必要があり、これはビュー名を解決しようとするとき基底のリソースが本当に存在するかどうかに関係無く解決が行われるためです。

2. Spring MVCフレームワークのフロントコントローラDispatcherServletのデフォルトview resolverはInternalResourceViewResolverhです。

3. デフォルトでは、InternalResourceViewResolverInternalResourceView(つまりServletJSP)を返しますが、以下のようにviewClass属性でJstlViewを返すように設定できます。

/**
   * Sets the default setViewClass view class to requiredViewClass: by default
   * InternalResourceView, or JstlView if the JSTL API is present.
   */
  public InternalResourceViewResolver() {
    Class viewClass = requiredViewClass();
    if (viewClass.equals(InternalResourceView.class) && jstlPresent) {
      viewClass = JstlView.class;
    }
    setViewClass(viewClass);
  }

  /**
   * このresolverはInternalResourceViewが必要。
   */
  @Override
  protected Class requiredViewClass() {
    return InternalResourceView.class;
  }

JstlViewの利点はJSTL tagsで、これはLocaleとSpringに設定したメッセージリソースを取得できます。表示メッセージのフォーマットにJSTLタグを使う場合には特に重要です。

JSTLのフォーマットタグは通貨や日付などをロケール固有のフォーマットで適切に行うにはLocaleが必要です。このメッセージタグは、Springのメッセージソースと、HTMLのレンダリングをするのに適切なメッセージ選択を行うためのLocaleを使用します。JstlViewクラスの詳細についてはSpring in Action by Craig Wallsを参照してください。

4. InteralResourceViewResolverSpring frameworkが提供するview resolerのうちの一つで、場合によっては以下のクラスのほうが便利な場合があります。

  • BeanNameViewResolver - Springのアプリケーションコンテキスト内のbeanで、ビュー名とbean IDが同一かどうか、でviewを解決します。たとえば、id = "home"のbeanがありコントローラーが論理的なビュー名"home"を返す場合、BeanNameViewResolverによる解決はこのbeanになります。
  • FreeMarkerViewResolver - FreeMarkerのテンプレートとしてビューを解決します。
  • JasperReportsViewResolver - JasperReportの定義としてビューを解決します。
  • XsltViewResolver - XSLT変換の結果としてレンダリングするためのビューを解決します。

Springのview resolverのそれぞれの種類について知るにはBryan Hassen氏のIntroduction to Spring MVC 4を参照してください。

5. Spring MVCでViewResolverを使う最大のメリットは、ビューのレンダリングとコントローラーのリクエストハンドリングを切り離せる点です。つまり、コントローラーはビューのレンダリングに使われる技術について知らなくてもよい、ということです。

返すのは論理的なビュー名だけで、この名前でJSP, FreeMarker template, Apache tilesなどのビュー技術を解決します。また、論理的なビュー名が同一であればコントローラーを変更することなくビューレイヤを変更できることも意味します。

以上が、Spring MVCでInternalResourceViewResolverがが何をしているか、もしくはInternalResourceViewResolverの役割、の解説になります。Spring MVCの便利なこのクラスは、Java Springの使用者は知っておいたほうが良いでしょう。Spring MVCのビュー解決の考え方は、Springの採用面接やSpring certificationの点でも重要です。Spring certificationを受ける場合、Spring MVCのビュー解決の考え方の知識を確認するのにDavid MayerのSpring Mock examで公開されている設問を見ておくことを推奨します。

WildFly 10のCache-Controlヘッダ変更

standalone.xmlの以下の箇所を編集する。

        <subsystem xmlns="urn:jboss:domain:undertow:3.1">
            <buffer-cache name="default"/>
            <server name="default-server">
                <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/>
                <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true"/>
                <host name="default-host" alias="localhost">
                    <location name="/" handler="welcome-content"/>
                    <filter-ref name="server-header"/>
                    <filter-ref name="x-powered-by-header"/>
                    <filter-ref name="cache-control" predicate="path-suffix['.html']"/><!-- ここ(predicateの中は適宜編集)と -->
                </host>
            </server>
            <servlet-container name="default">
                <jsp-config/>
                <websockets/>
            </servlet-container>
            <handlers>
                <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
            </handlers>
            <filters>
                <response-header name="server-header" header-name="Server" header-value="WildFly/10"/>
                <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
                <response-header name="cache-control" header-name="Cache-Control" header-value="no-cache"/><!-- これを追加 -->
            </filters>
        </subsystem>

個々のURLで任意のヘッダーを返すには、素朴にやるならHttpServletResponse#setHeaderする。

   @RequestMapping("/i.html")
    public String i2(HttpServletResponse response) {
        response.setHeader("Cache-Control", "asdasdf");
        return index();
    }

参考URL

アトラス作品ファンのオフ会 真・眼鏡祭Ⅱ(2017/07/15)に行ってきた

f:id:kagamihoge:20170723143501j:plain

7/15 真・眼鏡祭Ⅱ - TwiPla(開催済み)に行ってきました。これはその個人的なイベントレポートになります。当日の様子についてはtwitterハッシュタグ #眼鏡祭0715から追えます。

当日は天候には恵まれましたが、朝から既にかなりの暑さでした。会場のキリストンカフェ東京 (Christon cafe 東京)では、乾杯の前にお水の用意をして頂いたり、有志提供の塩飴・塩タブレットが配られたりもしました。人数は今回も安定して200人オーバーで密度も中々で、色々な意味で今回は暑さが印象に残りました。

眼鏡祭はコスプレ可能な大規模オフ会

眼鏡祭とは、ペルソナを中心としたアトラスファンによる大規模なオフ会です。眼鏡の由来はペルソナ4のオフ会から出発したためで、同作品のファンが中核に居ますが、現在まで少しずつ形を変えつつ今は広くアトラスファンが集う場となっています。人数の多さやコスプレが目立ちますが、実情は単なるオフ会です。つまり、何か催事がある訳では無く、ゲーム・アニメ・マンガの話題で盛り上がる場でしかありません。

眼鏡祭はコスプレが可能で、おおむね6~7割は何らかのコスプレをします。上記引用ツイートは毎回恒例のコスプレ参加者に集まってもらっての集合写真です。毎回少しずつ傾向が違うのですが、今回はかなりバラけた感があります。とはいえペルソナ5がやはり強く、佐倉双葉が沢山居たのが目を引きました。P5のメイン・サブキャラクターの、制服・私服の夏・冬のバリエーションで個々のレイヤーさんの個性が出るのが面白い所です。もちろん、いままでの作品の根強いファンによるコスプレも相変わらず素晴らしく、この空間にアトラス作品という軸のコスプレが集まる光景は、何度見ても圧倒的です。

個人的には、レイヤーさんとの距離が極めて近いので、写真を撮ったり色々話を聞きやすい点も眼鏡祭のポイントだと考えています。

コスプレ中心のイベントや撮影会では無いので注意事項色々

まず、200人が集まる大規模なイベントなのでどうしてもトラブルや不満とは無縁でいられません。いくつか注意事項があり、これを守れない方・破ってしまった方には、運営から何らかの対処が行われます。コスプレ関連でいえば、撮影の際には必ず許可を得ること、また、SNS等へのアップロードに関しても許可を得ること、とされています。また、更衣室もお店のフロアや部屋を暗幕で区切っただけなため、照明や荷物置き場の設備はコスイベと比較すれば十分とは言えません。

f:id:kagamihoge:20170723142037j:plain

とはいえ、これらルールは大人同士が楽しくオフ会を過ごすためのマナー程度のものです。基本的にはほとんど意識する程のものではないです。

初めてひとりで参加しても楽しめるかどうか

この辺りはステマめいてはいますが実際の声を拾うのが良いでしょう。

とはいえ、正直、200人のオフ会にひとりで来るのは相当な度胸があるといって良いでしょう。この辺りは運営側の知恵の凝らしどころで、毎回マイナーチェンジを繰り返しつつ色々なやり方を試みています。

参加者にはそれぞれ上記のような名札が配布されます。また、SNSのIDを印刷したシールも配られるので、これを交換した後ほどフォローしあう等に用います。交換の際、一言メモを残すのが有効で、相手が何のコスプレをしていたか、何のゲームを薦められたか、などを記しておくと後で思い出しやすくなります。

毎回記念品としてノベルティも配られるのですが、これらを交換しあったりするのも一つの手です。

とはいえ、最後の最後に頼れるのは自分次第としか言い様がありません。しかし幸か不幸か眼鏡祭は人で一杯であり、セクハラ一発退場とかを除けば、コミュニケーション上の多少の失敗は許されるというか目立たないのが実情です。また、大人で優しいコミュニティを大事にする人が多いので、あまり気にしない人も多く、見た目の派手さに反して敷居の低いオフ会ではないか、と思います。なんだかんだで毎回1~2割は新規勢でもあります。

みんなで作られる眼鏡祭

眼鏡祭は、イベント会社を使っているわけではなく、運営スタッフは全員有志です。比較的わかりやすいものでいうと、会場の開始前後のレイアウト変更は有志による力仕事です。また、何かとトラブルになりやすい更衣室の管理も同様です。

加えて、参加告知用のイラストを描いて頂ける方もいて、こちらはRTなり何なりで目にした方も多いでしょう。

勿論、これ以外にも仕事は多岐に渡ります。各テーブルの進行・案内を務めるコミュニティリーダー、会場案内、受付、名簿管理に参加費管理あたりは当日我々の目に触れるところです。これ以外にも、一般の参加者の見えないところで、企画を出したり進捗を管理したり、様々な事務作業が多数待ち構えていることは簡単に想像できます。

眼鏡祭は参加者皆で支えるもの、というのは実際に行ってみれば言われずとも何となく伝わるし、そうであれば自分も何か出来ることはないか、となるのも人情というものです。私は運営スタッフでは無いので確たることは言えませんが、お手伝い希望に関しては主催のマソー(@muscle_bomber)さん | Twitterに気軽に聞いてみるのが良いと思います。

以降のイベント

眼鏡祭はある意味ポータルであり、これを基点に色々なイベントに顔を出して友好を深める切欠に使うのも一つの手段です。単なる飲み会の8/12 真・眼鏡祭Ⅱ おかわり会 二杯目 - TwiPla、マソーさんのお誕生日会も兼ねたイベントで8月26日(土) 夏の盆(ぽん)まつり - TwiPlaなど。8/2のPERSONA SUPER LIVE P-SOUND BOMB2017に行く人も多いかと思われます。

また、関西眼鏡祭の次回も決定したようです。東京に関してはまだ確定では無いようですが11月のようです*1

最後に

最後になりましたが、主催のマソーさんはじめ眼鏡祭運営スタッフの皆さん、同じテーブルとなった死神コミュの方々、このレポートを書くに当たり勝手ながら引用ツイートをさせて頂いた方々、当日自分が何していたかを知っている人はがんばったのは分かるけどコスプレとしては……まぁがんばっているのを生暖かく見守りつつ相手をしてくれた方々、大変楽しい時間を過ごせました。何かのイベントで会う機会があればコンゴトモヨロシク。

リンク