(基于上一篇的SpringMVC2代码)

一、从前端获取数据:

第一种方法:通过 HttpRequestServlet获取请求参数

  1. 添加HttpServletRequest参数时,不一定需要添加HttpServletResponse参数。
  2. 当添加参数后,在方法中,调用参数的getParameter(String)方法即可获取请求参数的值,做法同使用Servlet编程。
//第一种: 通过HttpRequestServlet获取请求参数
	 public String handlerRegister(HttpServletRequest request) {
	 try {
	 request.setCharacterEncoding("UTF-8");
	 } catch (UnsupportedEncodingException e) {
	 // TODO Auto-generated catch block
	 e.printStackTrace();
	 }
	 System.out.println("UserController.handlerRegister()");
	 String username = request.getParameter("username");
	 System.out.println("username" + username);
	 String password = request.getParameter("password");
	 System.out.println("password" + password);
	 return null;
}

第二种:通过添加处理请求的方法的参数获取请求参数值

  1. 在处理请求的方法中,声明与前端页面(html/jsp/...)的表单中相同名称的参数,则这个参数将自动被赋上用户提交的值。
  2. 通常要求参数的名称与前端页面的表单中的名称保持一致!如果参数名与表单中使用的名称不同,可以使用 @RequestParam 注解。
  3. 尽管这种方式简单易用,但是,不太适用于提交的数据个数偏多的应用场景,假设某个业务需要用户提交20个数据,则为方法添加20个参数是不合适的!
/*
	 * 第二种:通过添加处理请求的方法参数获取请求的参数
	 */

	 @RequestMapping("/handlerRegister")
	 public String handlerRegister(String username,
	 @RequestParam("password") String pwd, int salary) {
	
	 System.out.println("UserController.handlerRegister()");
	 System.out.println("username" + username);
	 System.out.println("pwd" + pwd);
	 System.out.println("salary" + salary);
	 return null;
	 }

第三种:通过Java Bean直接接收所有请求参数的值

设计一个Java Bean包含所有的请求参数,并且在Java Bean中的属性名与前端页面的表单中使用的名称保持一致,然后,在处理请求的方法中,添加这个Java Bean类型的参数即可使用(类似于以上第2种做法)。

/*
	 * 第三种:通过JavaBean直接接收所有请求参数的值
	 */
	@RequestMapping("/handlerRegister")
	public String handlerRegister(HttpServletRequest request,User user) {
		System.out.println(user);
		return null;
	}

二、向前端发送数据

第一种方法:通过HttpServletRequest封装数据

UserController.java:

@RequestMapping("/handlerRegister")
	 public String handlerRegister(HttpServletRequest request, User user) {
	 // 假设将user已经处理完毕
	 // 通过request封装数据,以转发到jSP
	 request.setAttribute("name", user.getUsername());
	 return "user_register_info";
	 }

 user_register_info.jsp:

<body>
	<center>
		<div id="content-warpper">
			<div id="content">
				<h2>注册成功</h2>
				<!-- EL表达式简化代码 -->
				您的用户名是:${name}, 您的密码是:${pwd}, 您的工资是:${salary}
			</div>
		</div>
	</center>
</body>
  • 在处理请求的方法中添加HttpServletRequest参数。在方法中,调用参数的setAttribute()方法将数据封装。由于Spring的处理过程会默认将请求转发到View组件,在View组件(例如jsp页面)中可以通过EL表达式应用这些数据。转发的行为不需要自己写,Spring会自动完成!

第二种方法,使用ModelAndView

//向前端发送数据的第二种方式:通过ModelAndView封装数据
	 @RequestMapping("/handlerRegister.do")
	 public ModelAndView handlerRegister(User user) {
	 // 假设将user已经处理完毕
	 // ModelAndView包含两部分:model和view
	 ModelAndView mav = new ModelAndView();
	 mav.getModel().put("pwd", 123456);
	 mav.getModel().put("salary", user.getSalary());
	 mav.setViewName("user_register_info");
	
	 return mav;
	 }

第三种,使用ModelMap

@RequestMapping("/handlerRegister.do")
	public String handlerRegister(User user, ModelMap data) {
		// 使用ModelMap
		data.addAttribute("salary", user.getSalary());
		return "user_register_info";
	}
  1. 这种方式的做法与使用HttpServletRequest几乎一致:先在处理请求的方法中添加ModelMap类型的参数,然后在方法中调用参数的addAttribute()方法封装数据即可!
  2. 虽然这种做法从代码上来看与使用HttpServletRequest是相同的,但是推荐使用这种做法(原因待续)。

补充:使用HttpSession:

public String handlerRegister( User user ,HttpServletRequest request) {
    request.getSession().setAttribute("name", user.getUsername());
    return "user_register_info";
   }

注意:由于Session存在的时间相对略长,所以,不要把所有数据都存在Session中!