Java Xiaobai実践マニュアル-フェーズ5-SpringMVCフレームワーク(day02)

目次

SpringMVC

受信要求パラメーター値

HttpServletRequestの取得

@RequestParamアノテーションを使用して、リクエストパラメータをメソッドパラメータとして設計します

カプセル化された型を使用して要求パラメーターを受け取ります(自動メカニズムを使用してBeanオブジェクトにカプセル化します)

パラメータの提案を取得する3つの方法 

ページに値を渡します(コントローラーはデータをテンプレートページに転送します)

HttpServletRequestを介してデータを転送する

ModelMapを介してデータを転送する

ModelAndViewを使用してデータを転送する

セッションストレージ

セッションの消滅について:

セッションに保存されたデータについて:

ビューをリダイレクトする

RedirectViewを使用する

リダイレクトを使用する:プレフィックス

転送とリダイレクトの違いについて


SpringMVC

受信要求パラメーター値

Spring MVCWebリクエストがコントローラーにデータを送信する方法はいくつかあります

  1. HttpServletRequestを使用して取得します
  2. @RequestParamアノテーションを使用する
  3. 自動メカニズムを使用して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";
}

リクエスト処理メソッドの戻り値のタイプがStringtypeの場合、転送を実行する場合は、"forward:视图名称"この形式を使用できます。転送はデフォルトの動作で"视图名称"あるため、forward:プレフィックスを明示的に追加せずに直接返すことができます

転送とリダイレクトの違いについて

  • 転送はサーバーの内部動作であり、「コントローラーは(データの有無にかかわらず)ビューコンポーネントに要求を転送します」と具体的に表されます。クライアントの場合、要求は1つだけ発行され、これだけが認識されます。このリクエストのパスは、クライアントのブラウザでは、アドレスバーに表示されるURLも変更されません。同時に、これはサーバーの内部動作であるため、コントローラーは任意のデータをビューコンポーネントに渡すことができます。コードを書くという観点から、転送するとき、指定する必要があるのはビュー名だけです!
  • リダイレクトの本質は、クライアントがサーバーに初めてリクエストを送信した後、サーバーが302レスポンスコードとターゲットパスで応答することです。クライアントがこのレスポンスを受信した後、レスポンスコードは302であるため、2番目のリクエストはパス(ターゲット)は、最初のリクエストでのサーバー側の応答のターゲットパスです!したがって、一般に、リダイレクトは少なくとも2つの要求と応答の相互作用で発生します。これは複数の要求であり、後続の要求のターゲットパスがクライアントに認識されているため、クライアントのブラウジングでは、ブラウザで次のURLが表示されます。アドレスバーが変わります!同時に、プロセス全体が複数のリクエストであるため、サーバー側の複数の異なるコントローラークラス(同じコントローラーですが、リクエストの処理方法が異なります)によって処理され、処理プロセスにつながります。デフォルトで複数回リクエストするで生成されたデータは共有または送信できません!コードを書くという観点から、リダイレクトするときは、ターゲットパスを指定する必要があります!

 

おすすめ

転載: blog.csdn.net/c202003/article/details/107170012