springMVC 控制器发送参数信息到服务端
目录
一、ModelAndView 代替servlet实现请求页面转发与传递参数
3. 使用 ModelAttribute 实现更改 前端传递的参数
前言
在上一篇文章中简单介绍了一些关于 SpringMVC 接受前台表单传递简单数据类型, SpringMVC 支持原生servletAPI 直接将 HttpServletRequest/HttpServletResponse 作为参数传入handler的方法即可 。
MVC结构中,现在使用SpringMVC的控制器代替原生的servlet,要将接收的参数信息带入到目标页(服务端),有多种方法:ModelAndView ModeMap Map Model --数据放在request作用域
一、ModelAndView 代替servlet实现请求页面转发与传递参数
handler 控制器的方法如下:
//handler/ModelAndView"
@RequestMapping(value="handler/ModelAndView")
public ModelAndView getModelAndView ( Person person) {
//ModelAndView 类对应的对象 作为 返回值
ModelAndView mv = new ModelAndView( "sucess");
mv.addObject("person_ModelAndView",person) ;
return mv;
}
前端的页面中支持以级联的方式(address.cityAddress)将信息存储到实体类对象的参数中。但是所有的前端字段的name要与实体类(Person)的属性对应(包含对象属性) :
<!-- ModelAndView --> <br>ModelAndView <br>
<form action="handler/ModelAndView" method="post">
id: <input name="id" /> <br>
name : <input name="name" /> <br>
provinceAdress : <input name="address.provinceAddress" /> <br>
cityAdress : <input name="address.cityAddress" /> <br>
<input type="submit" value="ModelAndView">
</form>
在目标的 sucess.jsp 中获取前端发出的请求中的参数(经控制器 ModelAndView 转发):
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
sucess....welcome to spring mvc <br/>
==== request:<br/>
${requestScope.person.id } -${requestScope.person.name } -${requestScope.person.address.provinceAddress } -
<!-- ModelAndView 接收 -->
--${requestScope.person.address.cityAddress}<br/><br/>
modelMap==== request:<br/>
<!-- handler/modelMap 接收 -->
${requestScope.person_mm.id } -${requestScope.person_mm.name } -${requestScope.person_mm.address.provinceAddress } -
--${requestScope.person_mm.address.cityAddress}
</body>
</html>
结果如下:
如果出现404错误 ...服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示 说明该项目的依赖有问题,把 spring-web.jar spring-webmvc.jar 从项目中移除重新引入即可。
二、其他方式代替 ModelAndView
其他三种方式 ModeMap Map Model 使用方法基本相似,与 ModelAndView 稍有不同的是在handler 控制器中 对应的函数返回值是 String,
1.ModelMap 代替 ModelAndView
控制器handler 返回值为String类型,实体类也可以作为参数,使用put接收对象,代码如下 :
// handler/modelMap
@RequestMapping(value="handler/modelMap")
public String testModelMap(ModelMap mm ,Person person_mm ) {
mm.put("person_mm", person_mm);//request域
return "sucess"; //view
}
显示效果如下:
红框中地址对应的显示效果,但是上方接收 ModelAndView 的页面也有显示,但是使用2. Map 来转发请求(sucess.jsp没有专门写EL表达式),上方的能显示,下方的显示空白,说明控制器是按照类转发,但是接收值再判断传入数据类型接收前 如果 不是使用控制器中函数内的对象名获取传入的信息,则直接使用该类的信息表达。
2. Map 代替 ModelAndView
基本与 ModelMap 相同,控制器代码如下:
@RequestMapping(value="handler/Map")
public String testMap(Map<String,Object> m,Person person_map) {
//request域
m.put("person_map", person_map);
return "sucess";
}
Model 与 Map ,ModelMap 使用方法没有差异,不再进行赘述。
3. 使用 ModelAttribute 实现更改 前端传递的参数
如果将前端传入的参数信息更新到已有的数据库信息条目中 , ModelAttribute
先模拟查询数据库中的一条数据,将该数据封装成对象,之后将查询出的信息对象写入到map中,现在要修改map中存储的对象信息 。此时就需要使用 ModeAttribute 修饰查询并封装成对象所在的类。 @RequestMapping 执行之前优先执行 @ModeAttribute 修饰的类,传入的参数需要用 @ModeAttribute 修饰该参数。
代码如下(颜群老师示例):
@ModelAttribute//在任何一次请求前,都会先执行@ModelAttribute修饰的方法
//@ModelAttribute 在请求 该类的各个方法前 均被执行的设计是基于一个思想:一个控制器 只做一个功能
public void queryStudentById(Map<String,Object> map) {
//StuentService stuService = new StudentServiceImpl();
//Student student = stuService.queryStudentById(31);
//模拟调用三层查询数据库的操作
Student student = new Student();
student.setId(31);
student.setName("zs");
student.setAge(23);
// map.put("student", student) ;//约定:map的key 就是方法参数 类型的首字母小写
map.put("stu", student) ;//约定:map的key 就是方法参数 类型的首字母小写
}
//修改:Zs-ls
@RequestMapping(value="testModelAttribute")
public String testModelAttribute(@ModelAttribute("stu")Student student) {
student.setName(student.getName());//将名字修改为ls
System.out.println(student.getId()+","+student.getName()+","+student.getAge());
return "success";
}
在请求 该类的各个方法前 均被执行的设计是基于一个思想:一个控制器 只做一个功能