目次
@RequestParamアノテーションを使用して、リクエストパラメータをメソッドパラメータとして設計します
カプセル化された型を使用して要求パラメーターを受け取ります(自動メカニズムを使用してBeanオブジェクトにカプセル化します)
ページに値を渡します(コントローラーはデータをテンプレートページに転送します)
HttpServletRequestを介してデータを転送する
リダイレクトを使用する:プレフィックス
SpringMVC
受信要求パラメーター値
Spring MVCWebリクエストがコントローラーにデータを送信する方法はいくつかあります
- HttpServletRequestを使用して取得します
- @RequestParamアノテーションを使用する
- 自動メカニズムを使用してBeanオブジェクトにカプセル化する
HttpServletRequestの取得
- HttpServletRequestを使用して例を取得します
- Springの自動パラメータインジェクションHttpServletRequest
- 長所は単純明快であり、短所はデータ型変換を自分で処理する必要があります
- リクエストを処理するメソッドのパラメータリストに、パラメータの
HttpServletRequest
タイプを追加します。リクエストを処理するプロセスgetParameter()
で、パラメータオブジェクトのメソッドを呼び出してリクエストパラメータを取得します。
@ RequestMapping("/login-action1.form")
public String checklogin1(HttpServletRequest req){
String name = req.getParameter("name' );
String pwd = req.getParameter("pwd");
System.out.println(name);
System.out.println(pwd);
User user = userService.login(name, pwd);
//..省略处理过程
return "success";
}
@RequestParamアノテーションを使用して、リクエストパラメータをメソッドパラメータとして設計します
- Springはフォームパラメータをメソッドパラメータ(同じ名前)に自動的に挿入します
- @RequestParamアノテーションを使用して、一貫性のない名前をマップします
- 利点:パラメーター型は自動的に変換されますが、型変換の例外が発生する可能性があります
クライアントによって送信された要求パラメーターは、要求を処理するメソッドのパラメーターとして直接宣言でき、パラメーターは、次のように、目的のデータ型として直接宣言できます。
// 【处理注册请求】
@RequestMapping("handle_reg.do")
@ResponseBody
public String handleReg(String username, String password, Integer age, String phone, String email) {
System.out.println("UserController.handleReg()");
System.out.println("username=" + username);
System.out.println("password=" + password);
System.out.println("age=" + age);
System.out.println("phone=" + phone);
System.out.println("email=" + email);
return "Over";
}
このアプローチを使用する場合、クライアントから送信されたリクエストパラメータが、サーバーがリクエストの処理に使用するメソッドのパラメータの名前と一致していることを確認する必要があります。名前に一貫性がない場合、デフォルトでは、サーバー側の処理要求メソッドの対応するパラメーターはnull
!になります。
サーバーがメソッドのパラメーター名をクライアントが送信する必要のある要求パラメーター名として使用しないことを決定した場合は、メソッドパラメーターの前に@RequestParam
コメントを追加して、パラメーター名を指定することもできます。次に例を示します。
public String handleReg(@RequestParam("username") String aaaaa, String password)
上記のコード内のコメントによると、クライアントはしなければならないリクエストパラメータを提出合わせてusername
持つpassword
これら二つの名前!
カプセル化された型を使用して要求パラメーターを受け取ります(自動メカニズムを使用してBeanオブジェクトにカプセル化します)
- 自動メカニズムを使用してBean属性にカプセル化する例
- ユーザーエンティティを定義します。属性名は<form>フォームコンポーネントの名前と同じです。
- 自動メカニズムを使用してエンティティパラメータをカプセル化する例
- コントローラコンポーネントの処理方法でユーザータイプパラメータを定義する
事前にクラスをカスタマイズし、このクラスの属性として受け取る必要のあるすべての要求パラメーターを宣言すると同時に、これらの属性のSet / Getメソッドを生成できます。
package cn.tedu.spring;
public class User {
private String username;
private String password;
private Integer age;
private String phone;
private String email;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + ", age=" + age + ", phone=" + phone
+ ", email=" + email + "]";
}
}
次に、カスタムデータ型をリクエストの処理方法のパラメータとして宣言します。
// 【处理注册请求】
@RequestMapping("handle_reg.do")
@ResponseBody
public String handleReg(User user) {
System.out.println("UserController.handleReg()");
System.out.println(user);
return "Over";
}
このアプローチを使用して、クライアントによって送信されたリクエストパラメータ名が上記のUser
クラスの属性名と同じUser
であり、クラスの各属性に正規名のSet / Getメソッドがあることを確認する必要があります。
パラメータの提案を取得する3つの方法
- 上記の3つの方法のうち、
1.1
どのような状況でも使用することはお勧めしません。 - 一般に、パラメーターの数が少なく、固定されている場合(数または意味)、推奨される方法が使用され
1.2
ます。 - パラメータの数が多い場合や固定されていない場合は、推奨される方法が使用され
1.3
ます。 - 上記の方法を組み合わせて同時に使用することができます!
ページに値を渡します(コントローラーはデータをテンプレートページに転送します)
HttpServletRequestを介してデータを転送する
リクエストを処理するメソッドのパラメータリストHttpServletRequest
にパラメータのタイプを追加します。ページにデータを表示する必要があるsetAttribute(String name, Object value)
場合は、パラメータオブジェクトのメソッドを呼び出して、データをHttpServletRequest
リクエストオブジェクトにカプセル化します。
// 【处理登录请求】
@RequestMapping("handle_login.do")
public String handleLogin(String username, String password, HttpServletRequest request) {
System.out.println("UserController.handleLogin()");
System.out.println("username=" + username);
System.out.println("password=" + password);
// 假设root/1234是正确的用户名/密码
// 判断用户名
if ("root".equals(username)) {
// 用户名正确,需要判断密码
if ("1234".equals(password)) {
// 密码也正确,登录成功
// 暂不考虑登录成功后的处理
} else {
// 登录失败,密码错误
String errorMessage = "登录失败,密码错误!";
request.setAttribute("msg", errorMessage);
return "error";
}
} else {
// 登录失败,用户名错误
String errorMessage = "登录失败,用户名不存在!";
request.setAttribute("msg", errorMessage);
return "error";
}
return "Over.";
}
Thymeleaf
フレームは現在使用されているため、HTMLテンプレートページではThymeleaf
、コントローラーにカプセル化されたHttpServletRequest
パラメーターを次の式で取得できます。
<h1 style="color:red">操作失败!<span th:text="${msg}"></span>!</h1>
ModelMapを介してデータを転送する
ModelMapパラメータオブジェクトの使用例
Controller処理メソッドにModelMapタイプパラメータを追加すると、HttpServletRequestの属性を使用してモデルデータがJSPページに渡されます。
@ RequestMapping(" /login-action5.form")
public String checkLogin5(String name, String pwd,
ModelMap model){
User user = userService.login(name, pwd);
model.addAttribute("user", user);
return "success' ;
}
使用ModelMap
順方向データ・プラクティスをしての使用HttpServletRequest
データを転送するには、ほぼ同じです!例えば:
/ 【处理登录请求】
@RequestMapping("handle_login.do")
public String handleLogin(String username, String password, ModelMap modelMap) {
System.out.println("UserController.handleLogin()");
System.out.println("username=" + username);
System.out.println("password=" + password);
// 假设root/1234是正确的用户名/密码
// 判断用户名
if ("root".equals(username)) {
// 用户名正确,需要判断密码
if ("1234".equals(password)) {
// 密码也正确,登录成功
// 暂不考虑登录成功后的处理
} else {
// 登录失败,密码错误
String errorMessage = "登录失败,密码错误!!";
modelMap.addAttribute("msg", errorMessage);
return "error";
}
} else {
// 登录失败,用户名错误
String errorMessage = "登录失败,用户名不存在!!";
modelMap.addAttribute("msg", errorMessage);
return "error";
}
return "Over.";
}
ModelAndViewを使用してデータを転送する
ModeAndViewオブジェクトの使用例
Controllerの処理メソッドが完了すると、表示ビュー名とモデルデータを含むModelAndViewオブジェクトが返されます。
@ RequestMapping("/login-action.form")
public ModelAndView checkLogin4(String name, String pwd){
User user = userService.login(name, pwd);
Map<String, Object> data = new HashMap<String, Object>();
data.put("user", user);
return new ModelAndView("success",data);
}
リクエストをModelAndView
タイプとして処理するメソッドの戻り値タイプを宣言します。メソッドがModelAndView
オブジェクトを返す前に、ビュー名とデータをオブジェクトにカプセル化する必要があります。次に例を示します。
// 【处理登录请求】
@RequestMapping("handle_login.do")
public ModelAndView handleLogin(String username, String password) {
System.out.println("UserController.handleLogin()");
System.out.println("username=" + username);
System.out.println("password=" + password);
// 假设root/1234是正确的用户名/密码
// 判断用户名
if ("root".equals(username)) {
// 用户名正确,需要判断密码
if ("1234".equals(password)) {
// 密码也正确,登录成功
// 暂不考虑登录成功后的处理
} else {
// 登录失败,密码错误
String errorMessage = "MAV:登录失败,密码错误!!";
Map<String, Object> model = new HashMap<String, Object>();
model.put("msg", errorMessage);
ModelAndView mav = new ModelAndView("error", model);
return mav;
}
} else {
// 登录失败,用户名错误
String errorMessage = "MAV:登录失败,用户名不存在!!";
Map<String, Object> model = new HashMap<String, Object>();
model.put("msg", errorMessage);
ModelAndView mav = new ModelAndView("error", model);
return mav;
}
return null;
}
セッションストレージ
リクエストの処理方法のパラメータリストでは、HttpSession
型パラメータを直接追加してセッション内のデータにアクセスできます。パラメータを追加した後、現在のメソッド本体で、セッションにデータを保存したり、のデータを取り出したりできます。セッション。もちろん、データが保存されている限り、ビューコンポーネントは、セッションの有効期間中にセッション内のデータを直接取得することもできます。
セッションの消滅について:
-
サーバーがシャットダウンまたは再起動されます。
-
タイムアウト;
-
ブラウザを閉じます。
セッションに保存されたデータについて:
-
ユーザーのID、ユーザー名など、ユーザーのIDの一意のID。
-
ユーザー名、アバターなど、頻繁にアクセスされるデータ。
-
他のテクノロジーを使用して転送または共有するのに不便なデータ。
HttpServletRequestのgetSession()メソッドを使用してアクセスできます
@RequestMapping("/login-action5.form")
public String checkLogin5(String name, String pwd,
ModelMap model, HttpServletRequest req){
User user = userService.login(name, pwd);
req.getSession().setAttribute("loginUser", user);
model.addAttribute("user", user);
return "success";
}
ビューをリダイレクトする
Spring MVCは、デフォルトで転送を使用してビューを検索します。リダイレクトする必要がある場合は、次の方法を使用できます。
-
RedirectViewを使用する
-
リダイレクトを使用する:プレフィックス
ModelAndViewオブジェクト、RedirectViewメソッドを使用して、サンプルコードをリダイレクトできます
public ModelAndView checkLogin(){
RedirectView view = new RedirectView("login.form");
return new ModelAndView(view);
}
リクエストの処理方法(コントローラの要求処理方法)の戻り値の型があるときはString
タイプ、リターンを"redirect:目标路径"
リダイレクトすることができます!
サンプルコード:
public String checkLogin(){
return "redirect:login.form";
}
リクエスト処理メソッドの戻り値のタイプが
String
typeの場合、転送を実行する場合は、"forward:视图名称"
この形式を使用できます。転送はデフォルトの動作で"视图名称"
あるため、forward:
プレフィックスを明示的に追加せずに直接返すことができます。
転送とリダイレクトの違いについて
- 転送はサーバーの内部動作であり、「コントローラーは(データの有無にかかわらず)ビューコンポーネントに要求を転送します」と具体的に表されます。クライアントの場合、要求は1つだけ発行され、これだけが認識されます。このリクエストのパスは、クライアントのブラウザでは、アドレスバーに表示されるURLも変更されません。同時に、これはサーバーの内部動作であるため、コントローラーは任意のデータをビューコンポーネントに渡すことができます。コードを書くという観点から、転送するとき、指定する必要があるのはビュー名だけです!
- リダイレクトの本質は、クライアントがサーバーに初めてリクエストを送信した後、サーバーが302レスポンスコードとターゲットパスで応答することです。クライアントがこのレスポンスを受信した後、レスポンスコードは
302
であるため、2番目のリクエストはパス(ターゲット)は、最初のリクエストでのサーバー側の応答のターゲットパスです!したがって、一般に、リダイレクトは少なくとも2つの要求と応答の相互作用で発生します。これは複数の要求であり、後続の要求のターゲットパスがクライアントに認識されているため、クライアントのブラウジングでは、ブラウザで次のURLが表示されます。アドレスバーが変わります!同時に、プロセス全体が複数のリクエストであるため、サーバー側の複数の異なるコントローラークラス(同じコントローラーですが、リクエストの処理方法が異なります)によって処理され、処理プロセスにつながります。デフォルトで複数回リクエストするで生成されたデータは共有または送信できません!コードを書くという観点から、リダイレクトするときは、ターゲットパスを指定する必要があります!