SpringMVCの詳細

1. @RequestMapping()

  • 基本的な使い方

アノテーションを介してプロセッサメソッドへのパスのマッピングを実現します

使用できるクラスとメソッド。メソッドで使用されると、メソッドがプロセッサになり、指定されたパスにマップされることを意味します。クラスでは、構成されたパスがこのクラスのすべてのプロセッサの親パスとして使用されることを意味します。

@Controller
@RequestMapping("")
public class UserController {
    
    
    @RequestMapping("/regist.form")
    public void registUser(){
    
    
        System.out.println("user regist...");
    }
}
  • 注釈属性

1)値:リクエストパスを指定します

2)メソッド:現在のプロセッサの送信メソッドを指定する要求

3)params:リクエストを制限するために使用され、現在のプロセッサで処理されるためには、指定されたリクエストパラメータが含まれている必要があります

4)ヘッダー:現在のプロセッサで処理されるリクエストに指定された名前を含める必要があるリクエストヘッダーを制限するために使用されます

  • プロセッサメソッドでサポートされているパラメータと戻り値の型

サポートされているメソッドパラメータタイプ:

  • HttpServletRequest:現在のリクエストのオブジェクトを表します

  • HttpServletResPonse:現在の応答のオブジェクトを表します

  • HttpSession:現在の会話を表します

  • WebRequest:SpringMVCは、RequestとSessionの組み合わせに相当するオブジェクトを提供し、これら2つのしきい値の属性を操作できます。

  • InputStream、OutputStream、Reader、Writer:リクエストで取得された入力ストリームとレスポンスで取得された出力ストリームを表します

  • 渡さ@PathVariable@RequestParam宣言されたメソッドパラメータ

    - @PathVariable:リクエストパスの指定された部分を取得して、指定されたメソッドパラメータに割り当てることができます

    - @RequestParam:指定されたリクエストパラメータを指定されたメソッドパラメータに割り当てます。このコメントを記述しない場合、同じ名前のリクエストパラメータがデフォルトでメソッドパラメータに割り当てられます。

  • メソッドパラメータを渡し@CookieValue@RequestHeader宣言する

    - @CookieValue

    - @RequestHeader

サポートされている戻り値のタイプ:

  • ModelAndView:モデルとビューをカプセル化するModelAndViewオブジェクトを返します
    /**
     * 返回一个封装了模型和视图的ModelAndView对象
     * @return
     */
    @RequestMapping("/test01.form")
    public ModelAndView test01(){
     
     
        ModelAndView mav=new ModelAndView();
        mav.addObject("attr1","val1");
        mav.addObject("attr2","val2");
        mav.setViewName("test01");

        return mav;
    }
  • Stringオブジェクト:Stringオブジェクトを返します。これは、ビューの名前(mav.jsp)を返すのと同じです。
    /**
     * 返回一个String对象,相当于返回视图的名称(mav.jsp)
     * @return
     */
    @RequestMapping("/test02.form")
    public String test02(Model model){
     
     
        model.addAttribute("attr1","val1");
        model.addAttribute("attr2","val2");
        return "test01";
    }
  • void:voidを返し、現在のプロセッサのパス名をビュー名として自動的に使用して返します
 /**
     * 返回一个void,自动采用当前处理器的路径名作为视图名返回
     * @return
     */
    @RequestMapping("/test03.form")
    public void test03(Model model){
     
     
        model.addAttribute("attr1","val1");
        model.addAttribute("attr2","val2");
    }
  • メソッドは@ResponseBodyで装飾されています。デフォルトでは、返されたオブジェクトはjsonに変換され、出力に書き込まれます。
  • 上記の戻り値に加えて、返されたコンテンツはモデル内のデータと見なされ、返されるビュー名は現在のプロセッサのパス名と同等です。

2.リクエストパラメータの取得

  • 直接入手
 //直接获取,SpringMVC自动将对应名称的参数传入,并自动进行类型转换
    @RequestMapping("/pt02.form")
    public void test02(String name,int age){
    
    
        System.out.println(name+"#"+age);
    }

さらに、リクエストパラメータ名が対応するパラメータ名と一致しない場合は、@ RequestParam( "name")を使用して対応する関係を指定できます。

 @RequestMapping("/pt03.form")
    public void test03(@RequestParam("name") String username, int age){
    
    
        System.out.println(username+"#"+age);
    }
  • 要求されたオブジェクトの取得
//请求的对象获取
    @RequestMapping("/pt04.form")
    public void test04(HttpServletRequest request, HttpServletResponse response){
    
    
        String name=request.getParameter("name");
        int age=Integer.parseInt(request.getParameter("age"));
        System.out.println(name+"#"+age);
    }

注意:

リクエストパラメータの文字化けしたコードは解決されましたか?

  1. 従来の方法:
  • サーバーのデフォルトのリクエストパラメータのエンコーディングを変更して、送信されたエンコーディングと一致するようにします

  • 手動でエンコードおよびデコードして、文字化けした問題を解決します

  • リクエストを通じて、このリクエストに使用するデコードをWebコンテナに通知します。このメソッドが呼び出される前にパラメーターは取得されません。そうしないと、文字化けしたコードを解決できません。

    request.setCharacterEncoding("utf-8");
    

    このメソッドは投稿にのみ有効で、送信の取得には無効です。このメソッドの本質は、コンテナーが要求を処理するために使用するエンコードを設定することです。ただし、getによって送信されるパラメーターはアドレスの後にあるため、このメソッドは無効であり、解決するには手動のエンコードとデコードが必要です。

    name=new String(name.getBytes("iso8859-1"),"utf-8");
    
  1. SpringMVCソリューション:解決するためにサイト全体の文字化けしたフィルターを提供する
    <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>

このメソッドは、POSTによって送信された文字化けしたコードのみを解決でき、getには無効です。この場合、手動でエンコードおよびデコードして解決する必要があります。

3.日付データ処理

SpringMVCでページを解析するときに送信されるリクエストパラメータは、デフォルトでyyyy / MM / ddの形式でデータを解析します。Dateクラスの処理メカニズムに準拠していないため、日付を自動的にカプセル化して日付を付けることはできません。現時点では、アダプターで形式を指定できます。

    /**
     * 请求参数日期格式处理
     * @param binder
     */
    @InitBinder
    public void InitBinder(ServletRequestDataBinder binder){
    
    
        binder.registerCustomEditor(Date.class,
                new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));
    }

@RequestMapping("/pt05.form")
public String test05(String name,String addr,Date data)  {
    
    
        System.out.println(name+"#"+addr+"#"+data);

        return "test02";
    }

4.ファイルのアップロード

ファイルのアップロードには、次の3つの条件が満たされています。

  • フォームは送信後でなければなりません
  • フォームはファイルアップロードアイテムを提供する必要があり、アイテムには名前属性が必要です
  • ポリシーはenctype = "multipart / form-data"属性を設定する必要があります

jsのフォーム:

<form action="${pageContext.request.contextPath}/pt06.form" method="post" enctype="multipart/form-data">
    姓名:<input type="text" name="name"/>
    <br/>
    地址:<input type="text" name="addr"/>
    <br/>
    图像:<input type="file" name="file"/>
    <br/>
    <input type="submit" name="提交">
</form>

dispatcher-servlet.xml中国語のファイルアップロード関連の設定:

    <!--配置文件上传-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--文件体积限制-->
        <property name="maxUploadSize" value="10000000"></property>
        <!--内存缓冲区大小-->
        <property name="maxInMemorySize" value="4096"></property>
        <!--临时文件夹的位置-->
        <property name="uploadTempDir" value="WEB-INF/"></property>
        <!--文件名乱码参数-->
        <property name="defaultEncoding" value="utf-8"></property>
    </bean>

コントローラでのファイルアップロード機能の実現:

    /**
     * 文件上传实现
     *
     * @return
     */
    @RequestMapping("/pt06.form")
    public String test06(String name, String addr, MultipartFile file){
    
    
        System.out.println(name+"#"+addr+"#"+file);

        if(file!=null){
    
    
            try {
    
    
                byte[] data= file.getBytes();

                FileUtils.writeByteArrayToFile(new File("D://"+file.getOriginalFilename()),data);

            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }

        return "test03";
    }

5.パス動的データ収集(RESTFulスタイルの要求パラメーター処理)

  • 通常のリクエストとRESTFulスタイルのリクエスト

    • 通常の取得リクエスト

      http:// localhost:8080 / AnnoSpringMVC_war_exploded / pt06.form?name = tom&age = 18

    • RESTFulリクエスト

      http:// localhost:8080 / AnnoSpringMVC_war_exploded / tom / 18.form

  • SpringMVCによるRESTFulスタイルのリクエストの処理

        /**
         * 路径动态数据获取
         *
         * @return
         */
        @RequestMapping("/{name}/{addr}.form")
        public String test07(@PathVariable String name,@PathVariable String addr){
          
          
            System.out.println(name+"#"+addr);
    
            return "test03";
        }
    

おすすめ

転載: blog.csdn.net/wxplol/article/details/112391703