一、控制器接收各类请求参数
代码测试环境:
接收各类参数的控制器--ParamsController
package com.ssm.chapter15.controller; @Controller @RequestMapping("/params") public class ParamsController { // 各种控制器方法 }
先看一下目录结构:
这里需要知道的知识点是,WebContent文件夹下的.jsp文件都可以通过http://localhost:8080/工程名/文件名.jsp直接访问。
而WEB-INF里面的文件,必须通过Spring MVC 中的Controller控制器产生映射才能访问。
1.接收普通请求参数
params.jsp文件的内容如下,其中action="./params/commonParams.do"表示提交按钮按下后,跳转到action指定的页面。
<%@page contentType="text/html" 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>参数</title> <!-- 加载Query文件-->
<script src="https://code.jquery.com/jquery-3.2.0.js"></script> <!-- 此处插入JavaScript脚本 -->
</head> <body> <!-- 根据你的需要改变请求url --> <form id="form" action="./params/commonParams.do"> <table> <tr> <td>角色名称</td> <td><input id="roleName" name="roleName" value="" /></td> </tr> <tr> <td>备注</td> <td><input id="note" name="note" /></td> </tr> <tr> <td></td> <td align="right"><input type="submit" value="提交" /></td> </tr> </table> </form> </body> </html>
而对应的控制器方法:commonParams方法
@Controller @RequestMapping("/params") public class ParamsController { @RequestMapping("/commonParams") public ModelAndView commonParams(String roleName, String note) { System.out.println("roleName =>" + roleName); System.out.println("note =>" + note); ModelAndView mv = new ModelAndView(); mv.setViewName("index"); return mv; }
这里因为当前Spring MVC 比较智能化,如果传递进来的参数名称和HTTP的保存一致,意思就是传递进来的参数名称为roleName和note,而params.jsp中<input id="roleName" name="roleName" value="" />和<input id="note" name="note" />两个参数名称都和roleName和note一致,因此,可以获取到params.js中提交的参数。
测试:首先输入访问表单,输入任意参数,并提交
然后,正确跳转到./params/commonParams.do?roleName=mingcheng¬e=beizhu,这一URL,说明参数传递成功。
但是,在参数很多的情况下,再使用这样的方式,显然所写方法的参数就会非常多,这是应该考虑到使用一个POJO来管理这些参数。在没有任何注解的情况下,Spring MVC 也有映射POJO的能力。
新建一个角色参数类,将两个参数封装到类中:
package com.ssm.chapter14.pojo; public class RoleParams { private String roleName; private String note;
/*getter and setter*/ }
然后增加控制器方法:由于上面的POJO的属性和HTTP参数(jsp文件中的参数)一一对应了,然后在commonParamPojo方法中将POJO类对象RoleParams roleParams当成方法的参数,也可以在没有任何注解的情况下实现参数的有效传递。
@RequestMapping("/commonParamPojo") public ModelAndView commonParamPojo(RoleParams roleParams) { System.out.println("roleName =>" + roleParams.getRoleName()); System.out.println("note =>" + roleParams.getNote()); ModelAndView mv = new ModelAndView(); mv.setViewName("index"); return mv; }
另外,还需要修改jsp中的action成<form id="form" action="./params/commonParamPojo.do">才能进行测试。
2.使用@RequestParam注解获取参数
前面的两种情况,仅仅在参数名称和jsp文件中的参数名称一一对应时才有效。那么,如果修改jsp中的参数名称,例如,<td><input id="role_name" name="role_name" value="" /></td>将roleName修改成role_Name,此时由于参数不一致,就无法再进行自动对应传递了。
可以用@RequestParam注解获取参数的方式解决这个问题:使用@RequestParam("role_name")来讲HTTP的参数名称(即jsp文件中的参数名称)和传递进去的roleName参数一一对应。
@RequestMapping("/requestParam") //使用@RequestParam("role_name")指定映射HTTP参数名称 public ModelAndView requestParam(@RequestParam("role_name") String roleName, String note) { System.out.println("roleName =>" + roleName); System.out.println("note =>" + note); ModelAndView mv = new ModelAndView(); mv.setViewName("index"); return mv; }
同样,修改action,然后也可以得到正确的测试结果:
3.使用URL传递参数
一些网站使用URL的形式传递参数,对于一些业务比较简单的应用是非常常见的,如果想把获得数据库中id为1的role的信息,那么就写成/params/getRole/1,这里的1就代表角色编号,只不过是在URL中传递。Spring MVC 也提供了支持。
需要通过@RequestMapping注解和@PathVariable注解协作完成。其中,
@RequestMapping("/getRole/{id}")中的{id}表示处理器需要接受一个由URL组成的参数,且参数名称为id
@PathVariable("id")的意思是获取定义在@RequestMapping中参数名称为id的参数,这样就可以在方法内获取这个参数了
然后通过劫色服务类获取角色对象,并将其绑定到视图中,将视图设置为JSON视图。
//注入角色服务对象 @Autowired RoleService roleService; //{id}代表接收一个参数 @RequestMapping("/getRole/{id}") //注解@PathVariable表示从URL的请求地址中获取参数 public ModelAndView pathVariable(@PathVariable("id") Long id) { Role role = roleService.getRole(id); ModelAndView mv = new ModelAndView(); //绑定数据模型 mv.addObject(role); //设置为JSON视图 mv.setView(new MappingJackson2JsonView()); return mv; }
测试结果:
4.传递JSON参数
5.接收列表数据和表单序列化
二、重定向
1.
三、保存并获取属性参数
1.
2.
3.