SpringMVC框架接收请求参数处理(02)

1.接收参数处理方式

1.1 【不推荐】通过HttpServletRequest

在处理请求的方法中,添加HttpServletRequest对象作为参数,在方法体中,直接调用参数对象的getParameter()或类似功能的方法,即可获取请求参数:

@RequestMapping("handle_reg.com")
public String handleReg(HttpServletRequest request) {

    System.out.println("UserController.handleReg()");
    
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    Integer age = Integer.valueOf(request.getParameter("age"));
    String phone = request.getParameter("phone");
    String email = request.getParameter("email");
    
    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 null;
    
}

1.2 【推荐】在处理请求的方法中声明同名参数

假设用户提交的参数是username=root,则参数名是username,当需要获取这个参数的值时,直接在处理请求的方法中声明String username即可,框架会把root值直接用于调用处理请求的方法,即String username的值就已经是root了:

@RequestMapping("handle_reg.com")
public String handleReg(
        String username, String password,Integer age, 
        String phone, String email) {

    System.out.println("[2] username=" + username);
    System.out.println("[2] password=" + password);
    System.out.println("[2] age=" + (age + 1));
    System.out.println("[2] phone=" + phone);
    System.out.println("[2] email=" + email);   

    return null;

}

使用这种做法时,可以无视数据类型,例如希望age是Integer类型的,则直接声明为Integer类型即可,无须自行转换!

使用这种做法时,必须保证提交的请求参数的名称,与处理请求的方法中的参数名称是一致的!如果不一致,则处理请求的方法中,对应的参数值会是null值!

如果参数名称无法统一,后续有解决方案(使用@RequestParam注解)。

这种做法最大的缺陷是:不适用于数据项目太多的表单!否则,会导致处理请求的方法中需要添加大量的参数!

1.3 【推荐】使用自定义类型获取多项数据

假设请求参数中包含多项数据,例如:username=admin&password=123456&age=22&phone=13900139001&email=admin%40tedu.cn,而这些数据都可以封装在同一个类型中,则直接使用该类型作为处理请求的参数即可:

@RequestMapping("handle_reg.com")
public String handleReg(User user) {

    System.out.println("[3] username=" + user.getUsername());
    System.out.println("[3] password=" + user.getPassword());
    System.out.println("[3] age=" + (1 + user.getAge()));
    System.out.println("[3] phone=" + user.getPhone());
    System.out.println("[3] email=" + user.getEmail());

    return null;

}

这种做法,适用于请求参数较多的场合!

注意:如果请求参数的参数名称,与类中的属性名称不一致,则类对象中对应的属性值为null!

注意:这种做法可以与前序介绍的第2种做法组合来使用!

2.控制器的响应:

2.1响应方式

【转发】
在转发过程中,客户端只发出过1次请求!在浏览器的地址栏中,也只会显示第1次请求的路径!转发是在服务器内部完成的,可以传递数据!
【重定向】
当服务器响应重定向时,客户端会发出第2次请求!最终,在浏览器的地址栏中,会显示第2次请求的路径!由于是2次不同的请求,基于Http协议是无状态协议,没有经过特殊处理(Session/Cookie/数据库存取……)的数据是无法在2次请求之间传递的!
至于常见的响应码,这里就不列举了,相信大家都可以通过网络资源整理出来……
数据的转发:
【不推荐】将转发的数据封装在HttpServletRequest对象中
可以为处理请求的方法添加HttpServletRequest request参数,当需要转发数据时,将数据封装在request中即可,后续也不需要显式的执行转发,在SpringMVC的控制器中,默认的响应方式就是转发。

@RequestMapping("handle_reg.com")
public String handleReg(User user, HttpServletRequest request) {
    // 假定输入的用户名已经被占用
    // 提示:您输入的用户名XXX已经被占用
    request.setAttribute("msg","您输入的用户名" + user.getUsername() + "已经被占用!");
    // 返回视图名,也可以理解为文件的文件名
    return "error"; // 页面:/WEB-INF/error.jsp
}

JSP代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Error Message</title>
</head>
<body>
<h1>
${msg }
</h1>
</body>
</html>

【不推荐】使用ModelAndView
可以将处理请求的方法的返回值设置为ModelAndView类型,该类型的常用构造方法有:

ModelAndView()
ModelAndView(String viewName)
ModelAndView(String viewName, Map<String, ?> model)

当需要转发数据时,可以使用以上3种中的最后一种:

@RequestMapping("handle_reg.com")
public ModelAndView handleReg(String username) {
    String viewName = "error";
    Map<String, Object> model = new HashMap<String, Object>();
    model.put("msg","[2] 您输入的用户名" + username + "已经被占用!");
    ModelAndView mav = new ModelAndView(viewName, model);
    return mav;
}

由于这种方式使用相对比较复杂,所以,一般不推荐使用这种做法!
【推荐】使用ModelMap封装需要转发的数据
使用ModelMap的流程与使用HttpServletRequest完全相同,即:方法的返回值依然使用String类型,在方法中声明该参数,然后在方法体中直接封装数据,最后,返回视图名:

@RequestMapping("handle_reg.com")
public String handleReg(String username,ModelMap modelMap) {
    modelMap.addAttribute("msg","[3] 您输入的用户名" + username + "已经被占用!");
    return "error";
}

2. 小结

2.1 关于获取请求参数,首先,并不推荐使用HttpServletRequest,主要原因是相对比较原始,编码比较繁琐!而声明同名参数,或声明对象,都是推荐的做法,至于使用哪一种,可以根据参数的数量及数据是否适合被封装到同一个类中,综合评定,并且,这2种做法可以组合使用!

2.2在SpringMVC中,转发数据共有3种做法:

第1种使用HttpServletRequest的做法简单直接.

但是,并不推荐这样处理,主要是因为框架已经帮我们处理了request需要执行的任务,而我们在编写代码时应该尽量不干预框架的处理过程。

第2种使用ModelAndView

这种是框架的核心处理方式.但是,因为使用方式过于麻烦,所以,也不推荐这样使用。

第3种使用ModelMap

使用简洁,推荐使用。

附:重定向

在SpringMVC中,当需要重定向时,首先,应该保证处理请求的方法的返回值是String类型(与转发一样),然后,返回值使用redirect:作为前缀即可,例如:

@RequestMapping("handle_reg.com")
public String handleReg() {
    // 假设注册成功,需要登录
    return "redirect:login.do";
}

需要注意的是:在redirect:右侧的不是视图名,而是重定向的目标的路径,可以是绝对路径,也可以是相对路径。
当处理的请求的返回值类型是String时,如果返回值使用redirect:作为前缀,是重定向,否则,是转发!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值