Spring MVCにおけるリクエストとレスポンスの処理

Spring MVCにおけるリクエストとレスポンスの処理

Spring MVCでのデータレスポンス

01-Spring MVCのデータレスポンス-データレスポンス方式(理解)

  1. ページ遷移

文字列を直接返す

ModelAndViewオブジェクトを使用して返す

2) データの書き戻し

文字列を直接返す

オブジェクトまたはコレクションを返す

02-Spring MVCのデータレスポンス-ページ遷移-文字列形式で返す(応用)

03-Spring MVCのデータレスポンス-ページ遷移-ModelAndView形式1で返す(応用)

ControllerのメソッドからModelAndViewオブジェクトを返し、ビュー名を設定する

@RequestMapping(value="/quick2")
    public ModelAndView save2(){
        /*
            Model: モデル データを格納するためのもの
            View: ビュー データを表示するためのもの
         */
        ModelAndView modelAndView = new ModelAndView();
        // モデルデータを設定
        modelAndView.addObject("username","itcast");
        // ビューネームを設定
        modelAndView.setViewName("success");

        return modelAndView;
    }

04-Spring MVCのデータレスポンス-ページ遷移-ModelAndView形式2で返す(応用)

Controllerのメソッドの引数にModelAndViewを直接宣言し、メソッド内で作成せず、そのまま使用することでビューを設定し、ページ遷移を行うことができる

 @RequestMapping(value="/quick3")
    public ModelAndView save3(ModelAndView modelAndView){
        modelAndView.addObject("username","itheima");
        modelAndView.setViewName("success");
        return modelAndView;
    }
@RequestMapping(value="/quick4")
    public String save4(Model model){
        model.addAttribute("username","博学谷");
        return "success";
    }

05-Spring MVCのデータレスポンス-ページ遷移-ModelAndView形式3で返す(応用)

Controllerメソッドの引数に直接標準のHttpServeltRequestオブジェクトを宣言することで、そのオブジェクトを使用してデータをセットできる

@RequestMapping(value="/quick5")
    public String save5(HttpServletRequest request){
        request.setAttribute("username","酷丁鱼");
        return "success";
    }

06-Spring MVCのデータレスポンス-データの書き戻し-文字列を直接書き戻す(応用)

Spring MVCフレームワークによって注入されたresponseオブジェクトを使用し、response.getWriter().print("hello world")でデータを書き戻す。この場合、ビューの遷移は不要であり、ビジネスメソッドの戻り値はvoidとする。

書き戻す文字列を直接返すが、これはSpring MVCフレームワークに文字列がビューではなくHTTPレスポンスボディに直接返されることを知らせるために@ResponseBodyアノテーションが必要である

@RequestMapping(value="/quick7")
    @ResponseBody  // Spring MVCにビューの遷移を行わず、データレスポンスを行うことを示す
    public String save7() throws IOException {
        return "hello itheima";
    }

    @RequestMapping(value="/quick6")
    public void save6(HttpServletResponse response) throws IOException {
        response.getWriter().print("hello itcast");
    }

07-Spring MVCのデータレスポンス-データの書き戻し-json形式の文字列を書き戻す(応用)

@RequestMapping(value="/quick8")
    @ResponseBody
    public String save8() throws IOException {
        return "{\"username\":\"zhangsan\",\"age\":18}";
    }

手動でJSON形式の文字列を構築するのは煩雑であるため、複雑なJavaオブジェクトをJSON形式の文字列に変換する必要がある場合、Web開発で学んだJSON変換ツールJacksonを使用する。Jacksonを使ってJSON形式の文字列に変換し、文字列を返す

@RequestMapping(value="/quick9")
    @ResponseBody
    public String save9() throws IOException {
        User user = new User();
        user.setUsername("lisi");
        user.setAge(30);
        // JSON変換ツールを使用してオブジェクトをJSON形式の文字列に変換して返す
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(user);

        return json;
    }

08-Spring MVCのデータレスポンス-データの書き戻し-オブジェクトまたはコレクションを返す(応用)

Spring MVCがオブジェクトまたはコレクションをJSON文字列に変換し、書き戻す機能を提供する。ハンドラアダプタにメッセージ変換パラメータを設定し、Jacksonを使用してオブジェクトまたはコレクションを変換するように指定する必要がある。そのため、spring-mvc.xmlに以下の設定を行う必要がある:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
            </list>
        </property>
    </bean>

@RequestMapping(value="/quick10")
    @ResponseBody
    // Spring MVCがUserをJSON形式の文字列に自動的に変換することを期待
    public User save10() throws IOException {
        User user = new User();
        user.setUsername("lisi2");
        user.setAge(32);
        return user;
    }

09-Spring MVCのデータレスポンス-データの書き戻し-オブジェクトまたはコレクションを返す2(応用)

メソッドに@ResponseBodyを追加することでJSON形式の文字列を返すことができるが、この設定は面倒でコードが多くなるため、mvcのアノテーションドライバーを使用して上記の設定を代替することが可能である

<mvc:annotation-driven/>

Spring MVCの各コンポーネントでは、ハンドラマッピング、ハンドラアダプタ、ビューリゾルバがSpring MVCの3大コンポーネントと呼ばれる。

<mvc:annotation-driven />を使用すると、RequestMappingHandlerMapping(ハンドラマッピング)およびRequestMappingHandlerAdapter(ハンドラアダプタ)が自動的にロードされる。Spring-xml.xmlファイルに<mvc:annotation-driven />を追加することで、アノテーションハンドラおよびアダプタの設定を置き換えられる。

さらに<mvc:annotation-driven />を使用すると、デフォルトでJacksonが統合され、オブジェクトやコレクションをJSON形式の文字列に変換する。

10-Spring MVCのデータレスポンス-知識要点のまとめ(理解・記憶)

1) ページ遷移

文字列を直接返す

ModelAndViewオブジェクトを使用して返す

2) データの書き戻し

文字列を直接返す

HttpServletResponseオブジェクトで直接データを書き戻す、HttpServletRequestオブジェクトでデータを戻す、Modelオブジェクトでデータを戻す、または@ResponseBodyで文字列データを書き戻す

オブジェクトまたはコレクションを返す

@ResponseBody+<mvc:annotation-driven/>

Spring MVCにおけるリクエスト

11-Spring MVCのリクエスト-リクエストパラメータの取得-リクエストパラメータの種類(理解)

クライアントからのリクエストパラメータ形式は:name=value&name=value……で、サーバー側ではリクエストパラメータを取得し、必要に応じてデータをカプセル化する。Spring MVCは以下のタイプのパラメータを受け取ることができる:

基本型パラメータ

POJO型パラメータ

配列型パラメータ

コレクション型パラメータ

12-Spring MVCのリクエスト-リクエストパラメータの取得-基本型パラメータの取得(応用)

Controllerのビジネスメソッドのパラメータ名はリクエストパラメータのnameと一致する必要があり、パラメータ値は自動的にマッピングされる。また、自動的な型変換が行われる。

自動型変換とはStringから他の型への変換を指す

http://localhost:8080/itheima_springmvc1/quick9?username=zhangsan&age=12

@RequestMapping(value="/quick11")
    @ResponseBody
    public void save11(String username,int age) throws IOException {
        System.out.println(username);
        System.out.println(age);
    }

13-Spring MVCのリクエスト-リクエストパラメータの取得-POJO型パラメータの取得(応用)

ControllerのビジネスメソッドのPOJOパラメータのプロパティ名はリクエストパラメータのnameと一致し、パラメータ値は自動的にマッピングされる。

package com.itheima.domain;

public class User {

    private String username;
    private int age;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", age=" + age +
                '}';
    }
}


@RequestMapping(value="/quick12")
    @ResponseBody
    public void save12(User user) throws IOException {
        System.out.println(user);
    }

14-Spring MVCのリクエスト-リクエストパラメータの取得-配列型パラメータの取得(応用)

Controllerのビジネスメソッドの配列名はリクエストパラメータのnameと一致し、パラメータ値は自動的にマッピングされる。

@RequestMapping(value="/quick13")
    @ResponseBody
    public void save13(String[] strs) throws IOException {
        System.out.println(Arrays.asList(strs));
    }

15-Spring MVCのリクエスト-リクエストパラメータの取得-コレクション型パラメータの取得1(応用)

コレクションパラメータを取得する際には、それをPOJOにラップする必要がある。

<form action="${pageContext.request.contextPath}/user/quick14" method="post">
        <%--最初のUserオブジェクトのusername ageを示す--%>
        <input type="text" name="userList[0].username"><br/>
        <input type="text" name="userList[0].age"><br/>
        <input type="text" name="userList[1].username"><br/>
        <input type="text" name="userList[1].age"><br/>
        <input type="submit" value="送信">
    </form>

package com.itheima.domain;

import java.util.List;

public class VO {

    private List<User> userList;

    public List<User> getUserList() {
        return userList;
    }

    public void setUserList(List<User> userList) {
        this.userList = userList;
    }

    @Override
    public String toString() {
        return "VO{" +
                "userList=" + userList +
                '}';
    }
}


@RequestMapping(value="/quick14")
    @ResponseBody
    public void save14(VO vo) throws IOException {
        System.out.println(vo);
    }

16-Spring MVCのリクエスト-リクエストパラメータの取得-コレクション型パラメータの取得2(応用)

Ajaxを使用して送信する場合、contentTypeをjson形式に指定することで、@RequestBodyを使用してコレクションデータをPOJOでラップせずに直接受け取ることが可能である

<script src="${pageContext.request.contextPath}/js/jquery-3.3.1.js"></script>
    <script>
        var userList = new Array();
        userList.push({username:"zhangsan",age:18});
        userList.push({username:"lisi",age:28});

        $.ajax({
            type:"POST",
            url:"${pageContext.request.contextPath}/user/quick15",
            data:JSON.stringify(userList),
            contentType:"application/json;charset=utf-8"
        });

    </script>

@RequestMapping(value="/quick15")
    @ResponseBody
    public void save15(@RequestBody List<User> userList) throws IOException {
        System.out.println(userList);
    }

17-Spring MVCのリクエスト-リクエストパラメータの取得-静的リソースアクセスの有効化(応用)

静的リソースをロードする必要がある場合、例えばjQueryファイルなど、Google Developer ToolsでパケットをキャプチャするとjQueryファイルが読み込まれないことが分かる。これはSpring MVCのフロントコントローラDispatcherServletのurl-patternが/に設定されているため、すべてのリソースをフィルター処理するためである。以下の2つの方法で静的リソースを除外できる:

• spring-mvc.xmlファイルで除外するリソースを指定する

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

<mvc:default-servlet-handler/>タグを使用する

<!--リソースアクセスを有効にする-->
    <!--<mvc:resources mapping="/js/**" location="/js/"/>
    <mvc:resources mapping="/img/**" location="/img/"/>-->

    <mvc:default-servlet-handler/>

18-Spring MVCのリクエスト-リクエストパラメータの取得-グローバルな文字エンコーディングフィルターの設定(応用)

POSTリクエスト時にデータが文字化けする場合、エンコーディングフィルターを使用してフィルターをかけることができる。

<!--グローバルフィルターを設定する-->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

19-Spring MVCのリクエスト-リクエストパラメータの取得-パラメータバインディングアノテーション@RequestParam(応用)

リクエストパラメータ名とControllerのビジネスメソッドのパラメータ名が一致しない場合は、@RequestParamアノテーションを使用して明示的にバインドする必要がある

<form action="${pageContext.request.contextPath}/quick16" method="post">
    <input type="text" name="name"><br>
    <input type="submit" value="送信"><br>
</form>


@RequestMapping(value="/quick16")
    @ResponseBody
    public void save16(@RequestParam(value="name",required = false,defaultValue = "itcast") String username) throws IOException {
        System.out.println(username);
    }

20-Spring MVCのリクエスト-リクエストパラメータの取得-Restfulスタイルのパラメータ取得(応用)

Restfulはソフトウェアアーキテクチャスタイルであり、設計スタイルであり、標準ではない。これは一連の設計原則と制約条件を提供し、クライアントとサーバー間のソフトウェアの設計に使用される。このスタイルに基づくソフトウェアはより簡潔で階層的であり、キャッシュ機構の実装も容易になる。

Restfulスタイルのリクエストは「URL+リクエストメソッド」でリクエストの目的を表す。HTTPプロトコルの4つの操作方法の動詞は以下の通りである:

GET:リソースを取得する

POST:リソースを新規作成する

PUT:リソースを更新する

DELETE:リソースを削除する

例:

/user/1 GET : ID = 1 の user を取得する

/user/1 DELETE: ID = 1 の user を削除する

/user/1 PUT: ID = 1 の user を更新する

/user POST: user を新規作成する

上記のURL /user/1 の中の1は取得するリクエストパラメータであり、Spring MVCではプレースホルダーを使用してパラメータをバインドできる。URL /user/1 は /user/{id} と書くことができ、プレースホルダー {id} は1の値に対応する。ビジネスメソッドでは @PathVariable アノテーションを使用してプレースホルダーをマッチングして取得することができる。

http://localhost:8080/itheima_springmvc1/quick17/zhangsan

@RequestMapping(value="/quick17/{name}")
@ResponseBody
 public void save17(@PathVariable(value="name") String username) throws IOException {
        System.out.println(username);
 }

21-Spring MVCのリクエスト-リクエストパラメータの取得-カスタム型変換器の設定(応用)

Spring MVCは既に多くの一般的な型変換器を提供しており、例えばクライアントから送られた文字列をint型に変換してパラメータを設定する。

しかし、すべてのデータ型が変換器を提供していないため、提供されていない場合はカスタム変換器を定義する必要がある。例えば日付型データはカスタム変換器が必要である。

public class DateConverter implements Converter<String, Date> {
    public Date convert(String dateStr) {
        // 日付文字列を日付オブジェクトに変換して返す
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = format.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

@RequestMapping(value="/quick18")
    @ResponseBody
    public void save18(Date date) throws IOException {
        System.out.println(date);
    }

22-Spring MVCのリクエスト-リクエストパラメータの取得-Servlet関連APIの取得(応用)

Spring MVCは、標準のServlet APIオブジェクトをコントローラメソッドの引数として使用して注入することをサポートしており、よく使用されるオブジェクトは以下の通り:

HttpServletRequest

HttpServletResponse

HttpSession

@RequestMapping(value="/quick19")
    @ResponseBody
    public void save19(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        System.out.println(request);
        System.out.println(response);
        System.out.println(session);
    }

23-Spring MVCのリクエスト-リクエストパラメータの取得-リクエストヘッダー情報の取得(応用)

@RequestHeaderを使用してリクエストヘッダー情報を取得でき、これはWeb段階で学んだrequest.getHeader(name)に相当する。

@RequestHeaderアノテーションの属性は以下の通り:

value:リクエストヘッダー名

required:このリクエストヘッダーを必須とするか

@RequestMapping(value="/quick20")
    @ResponseBody
    public void save20(@RequestHeader(value = "User-Agent",required = false) String user_agent) throws IOException {
        System.out.println(user_agent);
    }

@CookieValueを使用して指定されたCookieの値を取得できる

@CookieValueアノテーションの属性は以下の通り:

value:Cookie名を指定する

required:このCookieを必須とするか

 @RequestMapping(value="/quick21")
    @ResponseBody
    public void save21(@CookieValue(value = "JSESSIONID") String jsessionId) throws IOException {
        System.out.println(jsessionId);
    }

タグ: Spring MVC データレスポンス リクエストパラメータ モデルアンドビュー JSON変換

9月11日 22:43 投稿