ホームページ  >  記事  >  Java  >  SpringMVC で一般的に使用されるアノテーション タグの包括的な概要

SpringMVC で一般的に使用されるアノテーション タグの包括的な概要

不言
不言オリジナル
2018-09-17 17:24:321428ブラウズ

この記事は、SpringMVC でよく使用されるアノテーション タグの概要を示したものです。必要な方は参考にしていただければ幸いです。

1、SpringMVC の @Controller
、コントローラー コントローラーは DispatcherServlet による処理を担当します 分散リクエスト。ビジネス処理層で処理された後、ユーザーがリクエストしたデータをモデルにカプセル化し、そのモデルを対応するビューに返します。 プレゼンテーションを行います。 SpringMVCでは非常にシンプルな定義のControllerが提供されています メソッドを使用する場合、特定のクラスを継承したり、特定のインターフェイスを実装したりする必要はありません。 @Controller を使用してクラスをコントローラーとしてマークするだけです。 次に、@RequestMapping や @RequestParam などのいくつかのアノテーションを使用して、URL リクエストとコントローラーを定義します。 メソッド間のマッピング、このようなコントローラーは外部からアクセスできます。さらに、Controller は HttpServletRequest に直接依存しません。 HttpServletResponse およびその他の HttpServlet オブジェクトは、コントローラーのメソッド パラメーターを通じて柔軟に取得できます。 ######@コントローラ クラスをマークするために使用されます。これでマークされたクラスは SpringMVC コントローラーです。 物体。ディスパッチ プロセッサは、アノテーションが付けられたクラスのメソッドをスキャンし、メソッドに @RequestMapping アノテーションが付けられているかどうかを検出します。 @コントローラ コントローラー クラスを定義するだけで、@RequestMapping アノテーションが付けられたメソッドが実際にリクエストを処理するプロセッサーになります。 @Controllerを使用するだけです クラスをマークしても、現時点では Spring がそれを認識していないため、それが SpringMVC のコントローラー クラスであるとは言えません。それで、春をどうするか どうすればそれを認識できるのでしょうか?この時点で、このコントローラー クラスを Spring に渡して管理する必要があります。方法は2通りあります。

(1) SpringMVC設定ファイルにMyControllerのBeanオブジェクトを定義します。

(2) SpringMVC 設定ファイルで、@Controller とマークされたコントローラーの場所を Spring に指示します。

4be262255b516871461ad965e8d23d21

5f9624476ad6f53ac16a49b38dd7db21

6895d73a2db23db65dab7f5efe8fab21 简单类型的转换操作由ConversionService配置的转换器来完成);因为使用request.getParameter()方式获取参数,所以可以处理get 方式中queryString的值,也可以处理post方式中 body data的值;
B)用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容,提交方式GET、POST;
C) 该注解有两个属性: value、required; value用来指定要传入值的id名称,required用来指示参数是否必须绑定;

示例代码:

@Controller  @RequestMapping("/pets")  
@SessionAttributes("pet")  
public class EditPetForm {  
   @RequestMapping(method = RequestMethod.GET)  
public String setupForm(@RequestParam("petId") int petId, ModelMap model) {  
      Pet pet = this.clinic.loadPet(petId);  
  model.addAttribute("pet", pet);  
  return "petForm";  
  }
}

@RequestBody

该注解常用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;
它是通过使用HandlerAdapter 配置的HttpMessageConverters来解析post data body,然后绑定到相应的bean上的。
因为配置有FormHttpMessageConverter,所以也可以用来处理 application/x-www-form-urlencoded的内容,处理完的结果放在一个MultiValueMap75a3fb28d4a91b809a3d166443f982d7里,这种情况在某些特殊需求下使用,详情查看FormHttpMessageConverter api;

示例代码:

@RequestMapping(value = "/something", method = RequestMethod.PUT)  
public void handle(@RequestBody String body, Writer writer) throws IOException {  
 writer.write(body);  
}

(4)、@SessionAttributes, @ModelAttribute
@SessionAttributes:
该注解用来绑定HttpSession中的attribute对象的值,便于在方法中的参数里使用。
注解有value、types两个属性,可以通过名字和类型指定要使用的attribute 对象;

示例代码:

@Controller  @RequestMapping("/editPet.do")  
@SessionAttributes("pet")  
public class EditPetForm {  
   // ...   }

@ModelAttribute
该注解有两个用法,一个是用于方法上,一个是用于参数上;
用于方法上时:  通常用来在处理@RequestMapping之前,为请求绑定需要从后台查询的model;
用于参数上时: 用来通过名称对应,把相应名称的值绑定到注解的参数bean上;要绑定的值来源于:
A) @SessionAttributes 启用的attribute 对象上;
B) @ModelAttribute 用于方法上时指定的model对象;
C) 上述两种情况都没有时,new一个需要绑定的bean对象,然后把request中按名称对应的方式把值绑定到bean中。
用到方法上@ModelAttribute的示例代码:

@ModelAttribute  public Account addAccount(@RequestParam String number) {  
   return accountManager.findAccount(number);  
}

这种方式实际的效果就是在调用@RequestMapping的方法之前,为request对象的model里put(“account”, Account)。
用在参数上的@ModelAttribute示例代码:

@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)  
public String processSubmit(@ModelAttribute Pet pet) {  
    
}

首先查询 @SessionAttributes有无绑定的Pet对象,若没有则查询@ModelAttribute方法层面上是否绑定了Pet对象,若没有则将URI template中的值按对应的名称绑定到Pet对象的各属性上。

6、800009db30a8fa460ae4612106b5fc2e浅析

component-scan 默认扫描的注解类型是 @Component,不过,在 @Component 语义基础上细化后的 @Repository, @Service 和 @Controller 也同样可以获得 component-scan 的青睐
有了611dfb857b03b245adf9fd6566a6e09a,另一个3ab4923dd4897a2e4901803c1be54ba6标签根本可以移除掉,因为已经被包含进去了
另外3ab4923dd4897a2e4901803c1be54ba6还提供了两个子标签
1. 26a5ae0501be8ed0509db17865653b93 //指定扫描的路径
2. c994226caba8f30588ac538746abe431 //排除扫描的路径
611dfb857b03b245adf9fd6566a6e09a有一个use-default-filters属性,属性默认为true,表示会扫描指定包下的全部的标有@Component的类,并注册成bean.也就是@Component的子注解@Service,@Reposity等。
这种扫描的粒度有点太大,如果你只想扫描指定包下面的Controller或其他内容则设置use-default-filters属性为false,表示不再按照scan指定的包扫描,而是按照26a5ae0501be8ed0509db17865653b93指定的包扫描,示例:

<context:component-scan base-package="com.tan" use-default-filters="false">
       <context:include-filter type="regex" expression="com.tan.*"/>//注意后面要写.*</context:component-scan>

当没有设置use-default-filters属性或者属性为true时,表示基于base-packge包下指定扫描的具体路径

<context:component-scan base-package="com.tan" >
       <context:include-filter type="regex" expression=".controller.*"/>
       <context:include-filter type="regex" expression=".service.*"/>
       <context:include-filter type="regex" expression=".dao.*"/>
</context:component-scan>

效果相当于:

<context:component-scan base-package="com.tan" >
       <context:exclude-filter type="regex" expression=".model.*"/>
</context:component-scan>

注意:本人尝试时无论哪种情况26a5ae0501be8ed0509db17865653b93和c994226caba8f30588ac538746abe431都不能同时存在。

以上がSpringMVC で一般的に使用されるアノテーション タグの包括的な概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。