ディレクトリ
序文
毎日JavaでのインタビューでspringMVCはインタビューSpringMVCフレームワークの時に数人の友人と昨日の瞬間を共有する不可欠の一部、および経験をされています。
私たちは、ほとんどの面接のみSpringMVCの実装工程と、この第一層のコンポーネントを理解することがわかった、といくつかは、金型のようなものがあると言ったが、また、いくつかの比較的だますが、より極端にSpringMVC(注釈)は、特定の実装セクションをコメントを求められ、そしてとき恥ずかしいです。
私は、本当の問題の一つで、このレコードを見て私たちは、多くの場合、コメントを調べます。
@RequestMappingアノテーションの属性は何ですか?それぞれ、彼らが行うために使用されていますか?
想像:あなたはこの質問に答えると、あなたは、ほぼ確実性を持っています
RequestMappingインターフェイスのソースコードの解析
次のようにRequestMappingソースインターフェイスは、8つの属性(Spring4.3.8)を定義している、です。
注:パス属性を削除し、それに応じて調整されRequestMappingのバージョン4.1でSpringMVCプロパティ。
@Target({ElementType.METHOD, ElementType.TYPE}) // 可以在方法和类的声明中使用
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";// 指定映射的名称
@AliasFor("path")
String[] value() default {}; // 指定请求路径的地址
@AliasFor("value")
String[] path() default {}; // 指定请求路径的地址
// 指定请求的方式,是一个RequsetMethod数组,可以配置多个方法
RequestMethod[] method() default {};
// 指定参数的类型
String[] params() default {};
// 指定请求头内容
String[] headers() default {};
// 指定数据请求的格式
String[] consumes() default {};
// 指定返回的内容类型
String[] produces() default {};
}
-
ソースコードに示すように、二つの属性@RequestMapping方法は、クラスの宣言に使用することができると言うことである@Target、それぞれElementType.METHODとElementType.TYPEは、あります
-
注釈のプロパティには、名前に加えて(で見ることができる)、文字列を返し、他の全てのメソッドの配列を返す、すなわち、複数の属性値を定義し、例えば値の()およびパス()は、同時に文字列値の複数定義することができます。 URLリクエストを複数の受信
RequestMappingプロパティの説明
1、名前
ここでは名前の注釈方法に対応する属性、メソッド理解しやすいです
@RequestMapping(value = "login",name = "用户登录")
@ResponseBody
public String login() {
return "success";
}
関係者は、文書を言った:これは直接呼び出すことができますように、それはあなたが非常に簡単に静的なページのような形をJSPページ上でそれを使用することができます:
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
...
<a href="${s:mvcUrl('PAC#getAddress').arg(0,'US').buildAndExpand('123')}">Get Address</a>
図2に示すように、値
@Controller
@RequestMapping("user") //此处如果不省略,则为@RequestMapping(value="user")
public class UserController {
@RequestMapping("login")
@ResponseBody
public String login() {
return "success";
}
}
要求された物理アドレスを指定し、アドレスは、URIテンプレートパターン(テンプレートパターン)が指定されてもよいです。
プロパティの値が唯一つのプロパティがありそうならば、デフォルトプロパティの@RequestMappingコメントであるとして、あなたは複数のプロパティがある場合、あなたはプロパティ値の名前を書く必要があり、プロパティ名を省略することができます。それはとしてマークされた次の二つの意味であります
@RequestMapping(value="login")
@RequestMapping("login")
valueプロパティは、ワイルドカードのマッチングをサポートしています。
@RequestMapping(value="login/*");
つまりします。http:// localhost:8080 /ログイン/ 1またはhttp:// localhostを:8080 /ログイン/ハハハことができ、適切にアクセスするためのインタフェース
ここではURLを通じてます。http:// localhost:処理のためにログインすることにより訪問8080 /ユーザー/ login()メソッド
3、パス
値は、パス(値)と同義である(互いにパスと基準値、ソースインタフェースRequestMapping参照)
使用するためのマップとして使用されているどちらのパス属性と一致する属性値を、。
(値=「ログイン」)@RequestMapping、@ RequestMapping(パス=「ログイン」)、両方の場合は(ログインすることができる)にアクセスする方法
path属性は、ワイルドカードのマッチングをサポートしています。
@RequestMapping(path="login/*");
つまりします。http:// localhost:8080 /ログイン/ 1またはhttp:// localhostを:8080 /ログイン/ ABCができ、通常のアクセス
図4に示すように、方法
このようGET、POST、PUT、DELETEなど、要求のタイプを指定します。
@RequestMapping(value = "login",method = RequestMethod.GET)
@ResponseBody
public String login() {
return "success";
}
上記の方法は、この方法が唯一のGETリクエストをサポートしていました。
ここにもなります
@RequestMapping(value = "login",method = {RequestMethod.GET,RequestMethod.POST})
記載されている方法は、同時にGETとPOSTリクエストをサポートすることができます。
何のmethod属性が存在しない場合は、この方法では、すべてのHTTPリクエストをサポートしています。
5、のparams
プロパティが指定されている場合、要求は、要求を実行するために所定のパラメータのparams属性を含める必要があります
@RequestMapping(value = "login",params = "flag")
@ResponseBody
public String login() {
return "success";
}
上述の方法は、パラメータフラグの値が必要とされない、要求フラグパラメータを実行するための要求に含まれなければなりません
http:// localhostを:? 8080 /ログインフラグ= XXX //通常のアクセス
http:// localhost:8080 /ログイン//アクセスできない
@RequestMapping(value = "login",params = "flag=true")
@ResponseBody
public String login() {
return "success";
}
上記フラグパラメータは、要求に含まれている必要があり、その要求が真である前にパラメータ値が実行されなければならない方法
http:// localhostを:? 8080 /ログインフラグ=真//通常のアクセス
http:// localhostを:? 8080 /ログインフラグ= falseを//アクセスできない
http:// localhost:8080 /ログイン//アクセスできない
図6に示すように、ヘッダ
- HTTPの相互作用のための情報が要求メッセージと呼ばれ、クライアントによってHTTPパケット、HTTPパケットを送信した共謀呼ばれ、サーバは、クライアントに返信パケットと呼ばれるHTTP応答パケット、パケットヘッダ部門とメッセージ体組成。
- リクエストヘッダ(リクエスト
ヘッダー):リクエストヘッダは、ブラウザサポートされる言語、リクエストのサーバアドレス、クライアントオペレーティングシステムとして、クライアント環境と要求メッセージのボディについての多くの情報が含まれています。 - レスポンスヘッダ(Rsponseヘッダ):レスポンスヘッダは、コンテンツの長さに応じてなど、サーバのタイプ、日付、およびに応答して符号化されたコンテンツの種類を含む、多くの有用な情報を含んでいます。
このプロパティが指定され、要求ヘッダーは、処理要求方法を行うことが可能であり、ある特定の値を含まなければなりません
このようなChromeブラウザのように:
F12をクリックする(開発者モードに入る)---->ネットワーク---->ページ上の名前をクリック---->ヘッダは以下の私の頭のサンプル要求内のコンピュータがある、右側に見ることができます。
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:JSESSIONID=210075B5E521CWE3CDE938076295A57A
Host:localhost:8080
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93
// 表示只接收本机发来的请求
@RequestMapping(path = "/login", headers="Referer=http://localhost:8080")
public String login() {
return "success";
}
上記の方法、ヘッダは、要求が指定した「リファラー」要求ヘッダおよび値含ま満たさなければならない要求を実行するとき、「HTTP:8080:// localhostと」
7、消費
text / htmlの、プロセスが要求を処理できるようにすることができたときに、アプリケーション/ JSON:プロセスの提出タイプ(Content-Typeの)例の要求を、指定
@RequestMapping(value = "login",consumes = "application/json")
@ResponseBody
public String login() {
return "success";
}
8、生産
返されたコンテンツタイプのコンテンツタイプは、要求のタイプ、要求ヘッダーを返す必要があり(承諾)を含有
@RequestMapping(value = "login",produces = "application/json")
@ResponseBody
public String login() {
return "success";
}
さらに、それはencoding属性は、戻り値を指定することができます生成します
@RequestMapping(value = "login",produces = "application/json,charset=utf-8")
指定された戻り、上記のように、UTF-8でエンコードされました