1. 概要

このクイック記事では、Spring MVC – WebUtils ServletRequestUtilsに組み込まれているWebリクエストユーティリティについて説明します。

2. WebUtilsおよびServletRequestUtils

ほとんどすべてのアプリケーションで、着信HTTPリクエストからいくつかのパラメータをフェッチする必要がある状況に直面しています。

そのためには、次のような非常に多忙なコードセグメントを作成する必要がありました。

HttpSession session = request.getSession(false);
if (session != null) {
    String foo = session.getAttribute("parameter");
}

String name = request.getParameter("parameter");
if (name == null) {
    name = "DEFAULT";
}

WebUtilsServletRequestUtilsを使用すると、1行のコードでそれを実行できます。

これらのユーティリティがどのように機能するかを確認するために、簡単なWebアプリケーションを作成してみましょう。

3. サンプルページ

URLをリンクできるようにするには、サンプルページを作成する必要があります。 テンプレートエンジンとしてSpringBootThymeleafを使用します。 それらに必要な依存関係を追加する必要があります。

簡単なフォームでページを作成しましょう。

<form action="setParam" method="POST">
    <h3>Set Parameter:  </h3>
    <p th:text="${parameter}" class="param"/>
    <input type="text" name="param" id="param"/>
    <input type="submit" value="SET"/>
</form>
<br/>
<a href="other">Another Page</a>

ご覧のとおり、POSTリクエストを開始するためのフォームを作成しています。

ユーザーを次のページに転送するリンクも1つあり、セッション属性から送信されたパラメーターが表示されます。

そして、2番目のページを作成しましょう:

Parameter set by you: <p th:text="${parameter}" class="param"/>

4. 使用法

ビューの作成が完了したので、コントローラーを作成し、 ServletRequestUtils を使用して、リクエストパラメーターをフェッチします。

@PostMapping("/setParam")
public String post(HttpServletRequest request, Model model) {
    String param 
      = ServletRequestUtils.getStringParameter(
        request, "param", "DEFAULT");

    WebUtils.setSessionAttribute(request, "parameter", param);

    model.addAttribute("parameter", "You set: " + (String) WebUtils
      .getSessionAttribute(request, "parameter"));

    return "utils";
}

ServletRequestUtilsgetStringParameter APIを使用して、リクエストパラメーター名paramをフェッチする方法に注意してください。 コントローラに値が入力されていない場合、デフォルト値がリクエストパラメータに割り当てられます。

そしてもちろん、セッション属性に値を設定するために使用されるWebUtilsのうちのsetSessionAttributeAPIに注意してください。 セッションがすでに存在するかどうかを明示的にチェックしたり、バニラサーブレットにリンクしたりする必要はありません。 Springはその場で構成します。

同様に、次のセッション属性を表示する他のハンドラーを作成しましょう。

@GetMapping("/other")
public String other(HttpServletRequest request, Model model) {
    
    String param = (String) WebUtils.getSessionAttribute(
      request, "parameter");
    
    model.addAttribute("parameter", param);
    
    return "other";
}

アプリケーションを作成するために必要なのはこれだけです。

ここで注意すべき1つの簡単なポイントは、 ServletRequestUtils には、必要に応じて要求パラメーターを自動的に型キャストするいくつかのすばらしい組み込み機能があることです。

リクエストパラメータをLongに変換する方法は次のとおりです。

Long param = ServletRequestUtils.getLongParameter(request, "param", 1L);

同様に、リクエストパラメータを他のタイプに変換できます。

boolean param = ServletRequestUtils.getBooleanParameter(
  request, "param", true);

double param = ServletRequestUtils.getDoubleParameter(
  request, "param", 1000);

float param = ServletRequestUtils.getFloatParameter(
  request, "param", (float) 1.00);

int param = ServletRequestUtils.getIntParameter(
  request, "param", 100);

もう1つの注意点は、 ServletRequestUtils には、要求パラメーターをフェッチするための別のメソッド getRequiredStringParameter(ServletRequest request、String name)があることです。 違いは、パラメーターが着信要求で見つからない場合、ServletRequestBindingExceptionをスローすることです。 これは、重要なデータを操作する必要がある場合に役立つことがあります。

以下はサンプルコードスニペットです。

try {
    ServletRequestUtils.getRequiredStringParameter(request, "param");
} catch (ServletRequestBindingException e) {
    e.printStackTrace();
}

また、アプリケーションをテストするための1つの単純なJUnitテストケースを作成することもできます。

@Test
public void givenParameter_setRequestParam_andSetSessionAttribute() 
  throws Exception {
      String param = "testparam";
 
      this.mockMvc.perform(
        post("/setParam")
          .param("param", param)
          .sessionAttr("parameter", param))
          .andExpect(status().isOk());
  }

5. 結論

この記事では、WebUtilsServletRequestUtilsを使用すると、定型的なコーディングのオーバーヘッドを大幅に削減できることがわかります。 ただし、一方で、Springフレームワークへの依存度は確実に高まります。これが懸念事項である場合は、この点に注意してください。

いつものように、ソースコードはGitHubから入手できます。