SpringMVC の共通アノテーション
1, @Controller
SpringMVC では、コントローラー Controller Responsible DispatcherServlet によって分散されたリクエストを処理する場合、ビジネス処理層によって処理された後、ユーザーによってリクエストされたデータがモデルにカプセル化され、そのモデルが表示のために対応するビューに返されます。 SpringMVC は、コントローラーを定義するための非常に簡単な方法を提供します。特定のクラスを継承したり、特定のインターフェイスを実装したりする必要はありません。@Controller を使用してクラスをコントローラーとしてマークし、@ などのいくつかのアノテーションを使用するだけです。 RequestMapping と @RequestParam を使用して定義し、外部からコントローラーにアクセスできるようにする、URL リクエストとコントローラー メソッド間のマッピング。また、ControllerはHttpServletRequestやHttpServletResponseなどのHttpServletオブジェクトに直接依存せず、Controllerのメソッドパラメータを通じて柔軟に取得することができます。
@Controller はクラスをマークするために使用され、これでマークされたクラスは SpringMVC コントローラー オブジェクトです。ディスパッチ プロセッサは、アノテーションが付けられたクラスのメソッドをスキャンし、メソッドに @RequestMapping アノテーションが付けられているかどうかを検出します。 @Controller はコントローラー クラスを定義するだけで、@RequestMapping アノテーションが付けられたメソッドが実際にリクエストを処理するプロセッサーとなります。クラス上で @Controller マークを使用するだけでは、そのクラスが SpringMVC のコントローラー クラスであるとは言えません。これは、現時点では Spring がそれを認識していないためです。では、Spring を使用してそれを認識するにはどうすればよいでしょうか?この時点で、このコントローラー クラスを Spring に渡して管理する必要があります。方法は2通りあります。
(1) SpringMVC設定ファイルにMyControllerのBeanオブジェクトを定義します。
(2) SpringMVC 設定ファイルで、@Controller とマークされたコントローラーの場所を Spring に指示します。
<!--方式一--> <bean class="com.host.app.web.controller.MyController"/> <!--方式二--> < context:component-scan base-package = "com.host.app.web" />//路径写到controller的上一层(扫描包详解见下面浅析)
2. @RequestMapping
RequestMapping は、リクエスト アドレス マッピングを処理するために使用されるアノテーションであり、クラスまたはメソッドで使用できます。クラスで使用すると、リクエストに応答するクラス内のすべてのメソッドがこのアドレスを親パスとして使用することを意味します。
RequestMapping アノテーションには 6 つの属性がありますが、以下では 3 つのカテゴリに分けて説明します (対応する例は以下にあります)。
1. 値、メソッド;
値: リクエストの実際のアドレスを指定します。指定されたアドレスは URI テンプレート モード (後で説明します);
メソッドも可能です: リクエストされたメソッド タイプ (GET、POST、PUT、DELETE など) を指定します;
2、consums、production
consumes: リクエストを処理するための送信コンテンツ タイプ (Content-Type) を指定しますapplication/json 、 text/html など;
生産: 返されるコンテンツ タイプを指定すると、リクエスト ヘッダーの (Accept) タイプに指定されたタイプが含まれる場合にのみ返されます。
#3, params, headersparams: 指定されたリクエストは、このメソッドで処理される前に、特定のパラメータ値が含まれている必要があります。 headers: このメソッドがリクエストを処理するには、指定されたリクエストに特定の指定されたヘッダー値が含まれている必要があります。3, @Resource と @Autowired
@Resource と @Autowired は Bean インジェクションに使用されますが、実際には @Resource は Spring のアノテーションではありません。は javax.annotation.Resource であり、インポートする必要がありますが、Spring はこのアノテーションの注入をサポートしています。 1. 共通点どちらもフィールドとセッターメソッドに記述できます。両方がフィールドに記述されている場合は、セッター メソッドを記述する必要はありません。 2. 違い(1)@Autowired@Autowired は Spring によって提供されるアノテーションであり、org.springframework.beans.factory.annotation パッケージをインポートする必要があります。 Autowired; byType に従ってのみ挿入します。public class TestServiceImpl { // 下面两种@Autowired只要使用一种即可 @Autowired private UserDao userDao; // 用于字段上 @Autowired public void setUserDao(UserDao userDao) { // 用于属性的方法上 this.userDao = userDao; } }@Autowired アノテーションは、タイプ (byType) に従って依存オブジェクトをアセンブルします。デフォルトでは、依存オブジェクトが存在する必要があります。null 値が許可される場合は、その required 属性を false に設定できます。名前 (byName) でアセンブルしたい場合は、 @Qualifier アノテーションと組み合わせて使用できます。次のように:
public class TestServiceImpl { @Autowired @Qualifier("userDao") private UserDao userDao; }(2) @Resource@Resource は、J2EE によって提供される ByName によってデフォルトで自動的に挿入され、パッケージ javax.annotation.Resource をインポートする必要があります。 @Resource には、name と type という 2 つの重要な属性があり、Spring は @Resource アノテーションの name 属性を Bean の名前に解決し、type 属性は Bean のタイプに解決します。したがって、name 属性が使用される場合は byName 自動挿入戦略が使用され、type 属性が使用される場合は byType 自動挿入戦略が使用されます。 name 属性も type 属性も指定されていない場合は、リフレクション メカニズムを通じて byName 自動挿入戦略が使用されます。
public class TestServiceImpl { // 下面两种@Resource只要使用一种即可 @Resource(name="userDao") private UserDao userDao; // 用于字段上 @Resource(name="userDao") public void setUserDao(UserDao userDao) { // 用于属性的setter方法上 this.userDao = userDao; } }
注: @Resource を setter メソッドに置くのが最善です。これは、オブジェクト指向の考え方に沿っており、プロパティを直接操作するのではなく、set および get を通じてプロパティを操作するためです。@リソース アセンブリ シーケンス: ① 名前と型を同時に指定した場合、アセンブリの Spring コンテキストから一致する Bean のみが検索されます。見つかった場合は例外がスローされます。 ② name を指定すると、アセンブリのコンテキストから名前 (id) に一致する Bean が検索され、Bean が見つからない場合は例外がスローされます。 ③type を指定すると、アセンブリのコンテキストから類似した一致する一意の Bean が検索されますが、Bean が見つからない場合、または複数の Bean が見つかった場合は例外がスローされます。
④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。
4、@ModelAttribute和 @SessionAttributes
代表的是:该Controller的所有方法在调用前,先执行此@ModelAttribute方法,可用于注解和方法参数中,可以把这个@ModelAttribute特性,应用在BaseController当中,所有的Controller继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。
@SessionAttributes即将值放到session作用域中,写在class上面。
具体示例参见下面:使用 @ModelAttribute 和 @SessionAttributes 传递和保存数据
5、@PathVariable
用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。如:
@Controller public class TestController { @RequestMapping(value="/user/{userId}/roles/{roleId}",method = RequestMethod.GET) public String getLogin(@PathVariable("userId") String userId, @PathVariable("roleId") String roleId){ System.out.println("User Id : " + userId); System.out.println("Role Id : " + roleId); return "hello"; } @RequestMapping(value="/product/{productId}",method = RequestMethod.GET) public String getProduct(@PathVariable("productId") String productId){ System.out.println("Product Id : " + productId); return "hello"; } @RequestMapping(value="/javabeat/{regexp1:[a-z-]+}", method = RequestMethod.GET) public String getRegExp(@PathVariable("regexp1") String regexp1){ System.out.println("URI Part 1 : " + regexp1); return "hello"; } }
6、@requestParam
@requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name"),它有三个常用参数:defaultValue = "0", required = false, value = "isApp";defaultValue 表示设置默认值,required 铜过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。
7、@ResponseBody
作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
8、@Component
相当于通用的注解,当不知道一些类归到哪个层时使用,但是不建议。
9、@Repository
用于注解dao层,在daoImpl类上面注解。
推荐教程:《Java教程》
以上がSpringMVC の共通アノテーションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。