Manual de práctica de Java Xiaobai-Fase 5-SpringMVC Framework (día02)

Tabla de contenido

SpringMVC

Recibir el valor del parámetro de solicitud

Adquisición de HttpServletRequest

Diseñar parámetros de solicitud como parámetros de método, usando la anotación @RequestParam

Utilice tipos encapsulados para recibir parámetros de solicitud (encapsular en objetos Bean mediante mecanismos automáticos)

3 formas de obtener sugerencias de parámetros 

Pasar valor a la página (el controlador reenvía los datos a la página de la plantilla)

Reenviar datos a través de HttpServletRequest

Reenviar datos a través de ModelMap

Utilice ModelAndView para reenviar datos

Almacenamiento de sesiones

Sobre la desaparición de Session:

Respecto a los datos almacenados en la Sesión:

Vista de redireccionamiento

Usar RedirectView

Usar redireccionamiento: prefijo

Acerca de la diferencia entre reenvío y redirección


SpringMVC

Recibir el valor del parámetro de solicitud

Hay varios métodos para que la solicitud web de Spring MVC envíe datos al controlador

  1. Obtener usando HttpServletRequest
  2. Utilice la anotación @RequestParam
  3. Utilice un mecanismo automático para encapsular en un objeto Bean
     

Adquisición de HttpServletRequest

  • Utilice HttpServletRequest para obtener un ejemplo
  • Inyección automática de parámetros de primavera HttpServletRequest
  • Las ventajas son sencillas y las desventajas deben manejar usted mismo la conversión de tipos de datos.
  • En la lista de parámetros del método para procesar la solicitud, agregue un HttpServletRequesttipo de parámetro. En el proceso de procesamiento de la solicitud, llame al getParameter()método del objeto de parámetro para obtener el parámetro de solicitud;
@ 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";
}

Diseñar parámetros de solicitud como parámetros de método, usando la anotación @RequestParam

  • Spring inyectará automáticamente los parámetros del formulario en los parámetros del método (con el mismo nombre)
  • Use la anotación @RequestParam para asignar nombres inconsistentes
  • Ventajas: los tipos de parámetros se convierten automáticamente, pero pueden producirse excepciones de conversión de tipos

Los parámetros de solicitud enviados por el cliente se pueden declarar directamente como los parámetros del método de procesamiento de la solicitud, y los parámetros se pueden declarar directamente como el tipo de datos deseado, por ejemplo:

// 【处理注册请求】
@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";
}

Al utilizar este enfoque, debe asegurarse de que los parámetros de solicitud enviados por el cliente sean coherentes con los nombres de los parámetros del método que utiliza el servidor para procesar la solicitud. Si los nombres son inconsistentes, de forma predeterminada, el parámetro correspondiente en el método de solicitud de procesamiento del lado del servidor será null!

Si el servidor decide no usar el nombre del parámetro del método como el nombre del parámetro de solicitud que el cliente debe enviar, también puede agregar un @RequestParamcomentario antes del parámetro del método para especificar el nombre del parámetro, por ejemplo:

public String handleReg(@RequestParam("username") String aaaaa, String password)

De acuerdo con los comentarios en el código anterior, el cliente debe enviar los parámetros de solicitud de acuerdo usernamecon passwordestos dos nombres.

Utilice tipos encapsulados para recibir parámetros de solicitud ( encapsular en objetos Bean mediante mecanismos automáticos )

  • Ejemplo de uso de un mecanismo automático para encapsular en atributos de Bean
  • Defina la entidad Usuario, el nombre del atributo es el mismo que el nombre del componente de formulario <form>
  • Ejemplos de uso de mecanismos automáticos para encapsular parámetros de entidad
  • Definir los parámetros del tipo de usuario en el método de procesamiento del componente del controlador

Puede personalizar la clase de antemano, declarar todos los parámetros de solicitud que deben recibirse como atributos de esta clase y, al mismo tiempo, generar métodos Set / Get para estos atributos:

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 + "]";
	}

}

Luego, declare el tipo de datos personalizado como un parámetro del método de procesamiento de la solicitud.

// 【处理注册请求】
@RequestMapping("handle_reg.do")
@ResponseBody
public String handleReg(User user) {
    System.out.println("UserController.handleReg()");

    System.out.println(user);

    return "Over";
}

Con este enfoque, debe asegurarse de que el nombre del parámetro de solicitud enviado por el cliente sea el Usermismo que el nombre del atributo en la clase anterior , y que Usercada atributo de la clase tenga un método Set / Get con un nombre canónico.

3 formas de obtener sugerencias de parámetros 

  • De los 3 métodos anteriores, ¡no 1.1se recomienda usarlos bajo ninguna circunstancia!
  • Generalmente, cuando el número de parámetros es pequeño y fijo (número o significado), se utiliza el método preferido 1.2;
  • Cuando el número de parámetros es grande o no fijo, se utiliza el método preferido 1.3.
  • ¡Los métodos anteriores se pueden combinar y usar al mismo tiempo!


Pasar valores a la página (el controlador reenvía los datos a la página de la plantilla )

Reenviar datos a través de HttpServletRequest

Agregue un HttpServletRequesttipo de parámetro a la lista de parámetros del método de procesamiento de la solicitud . Cuando sea necesario mostrar algunos datos en la página, llame al setAttribute(String name, Object value)método del objeto de parámetro para encapsular los datos en el HttpServletRequestobjeto de solicitud:

// 【处理登录请求】
@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.";
}

Dado que el Thymeleafmarco se está utilizando actualmente , en la página de la plantilla HTML, los parámetros Thymeleafencapsulados en el controlador se pueden recuperar a través de expresiones HttpServletRequest, por ejemplo:

<h1 style="color:red">操作失败!<span th:text="${msg}"></span>!</h1>

Reenviar datos a través de ModelMap

Ejemplo de uso del objeto de parámetro ModelMap
Agregue un parámetro de tipo ModelMap al método de procesamiento del controlador y los datos del modelo se pasarán a la página JSP utilizando el atributo de HttpServletRequest.

@ 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' ;
}

¡Utilice ModelMapprácticas de HttpServletRequestreenvío de datos y el uso de reenvío de datos es casi el mismo! P.ej:

/ 【处理登录请求】
@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.";
}

Utilice ModelAndView para reenviar datos

Ejemplo de uso del objeto ModeAndView
Una vez completado el método de procesamiento del controlador, se devuelve un objeto ModelAndView, que contiene el nombre de la vista de visualización y los datos del modelo.

@ 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);
}

 

Declare el tipo de valor de retorno del método que procesa la solicitud como un ModelAndViewtipo. Antes de que el método devuelva un ModelAndViewobjeto, el nombre de la vista y los datos deben encapsularse en el objeto, por ejemplo:

// 【处理登录请求】
@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;
}


Almacenamiento de sesiones

En la lista de parámetros del método de procesamiento de la solicitud, puede agregar directamente HttpSessionparámetros de tipo para acceder a los datos en la sesión. Después de agregar los parámetros, en el cuerpo del método actual, puede guardar datos en la sesión o sacar los datos de Por supuesto, siempre que los datos estén almacenados, el componente de vista también puede obtener directamente los datos en la Sesión durante el período de validez de la Sesión.

Sobre la desaparición de Session:

  • El servidor se apaga o se reinicia;

  • se acabó el tiempo;

  • Cierra el navegador.

Respecto a los datos almacenados en la Sesión:

  • La identificación única de la identidad del usuario, como la identificación del usuario, el nombre de usuario, etc .;

  • Datos a los que se accede con frecuencia, como nombres de usuario, avatares, etc .;

  • Datos que no conviene utilizar otras tecnologías para transferir o compartir.

Puede utilizar el método getSession () de HttpServletRequest para acceder

@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";
}



Vista de redireccionamiento

Spring MVC usa el reenvío para ubicar la vista de forma predeterminada. Si necesita redireccionar, puede usar los siguientes métodos

  • Usar RedirectView

  • Usar redireccionamiento: prefijo

ModelAndView , puede usar el método RedirectView para redirigir, código de muestra

public ModelAndView checkLogin(){
    RedirectView view = new RedirectView("login.form");
    return new ModelAndView(view);
}

Cuando el tipo de valor devuelto del método de procesamiento de la solicitud (método de procesamiento de la solicitud del controlador) es Stringtipo, la devolución "redirect:目标路径"puede ser redirigida.

Código de muestra:

public String checkLogin(){
    return "redirect:login.form";
}

Cuando el tipo de valor de retorno del método de procesamiento de la solicitud es Stringtype, si desea realizar el reenvío, puede usar "forward:视图名称"el formato. Dado que el reenvío es el comportamiento predeterminado, "视图名称"puede regresar directamente sin agregar un forward:prefijo explícitamente .

Acerca de la diferencia entre reenvío y redirección

  • El reenvío es el comportamiento interno del servidor, que se expresa específicamente como "el controlador reenvía la solicitud al componente de vista (con o sin datos)". Para el cliente, solo se ha emitido una solicitud y solo esta se conoce. ¡La ruta de esta solicitud, en el navegador del cliente, la URL que se muestra en la barra de direcciones tampoco cambiará! Al mismo tiempo, dado que este es un comportamiento interno del servidor, el controlador puede pasar datos arbitrarios al componente de vista. Desde el punto de vista de la escritura de código, al reenviar, ¡todo lo que necesita especificar es el nombre de la vista!
  • La esencia de la redirección es que después de que el cliente envía una solicitud al servidor por primera vez, el servidor responde con un código de respuesta 302 y la ruta de destino. Una vez que el cliente recibe esta respuesta, debido a que el código de respuesta es 302, la segunda solicitud ser enviado automáticamente La ruta (destino) es la ruta de destino de la respuesta del lado del servidor en la primera solicitud! Por lo tanto, en general, la redirección ha ocurrido al menos 2 solicitudes e interacciones de respuesta. Debido a que es una solicitud múltiple, y el cliente conoce la ruta de destino de la solicitud posterior, por lo tanto, en la navegación del cliente en el navegador, la URL que se muestra en ¡la barra de direcciones cambiará! Al mismo tiempo, debido a que todo el proceso es de múltiples solicitudes, es procesado por múltiples clases de controlador diferentes en el lado del servidor (el mismo controlador, pero el método de procesamiento de la solicitud es diferente), lo que conducirá al proceso de procesamiento de la solicitud. solicitar varias veces de forma predeterminada Los datos generados en no se pueden compartir ni transmitir! Desde el punto de vista de la escritura de código, al redirigir, ¡debe especificar la ruta de destino!

 

Supongo que te gusta

Origin blog.csdn.net/c202003/article/details/107170012
Recomendado
Clasificación