SpringMVC 提交参数的方式和注解详述
来源:互联网 发布:运动仿真软件哪个好 编辑:程序博客网 时间:2024/05/01 09:29
一、四种接收提交参数的方式
1. 方法参数直接接收表单域的值。
简单的表单如下:
<form action="${pageContext.request.contextPath}/submit" method="POST"> <input type="text" name="id" /> <input type="text" name="name" /> <input type="submit" value="提交" /></form>
接收时直接指定参数名称为表单域名:
@RequestMapping("/submit")public String submit(String name, String id){ System.out.println(id); System.out.println(name); return "test";}
2. 使用最初的HttpServletRequest对象的getParameter方法来获取值
@RequestMapping("/submit")public String submit(HttpServletRequest request){ System.out.println(request.getParameter("id")); System.out.println(request.getParameter("name")); return "test";}
3. 用bean来接收
准备一个bean,其中setter/getter可以部分跟对应参数对应。
public class Tag { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("Tag [id=").append(id) .append(", name=").append(name) .append("]"); return builder.toString(); }}
然后接收的时候:
@RequestMapping("/submit")public String submit(Tag tag){ System.out.println(tag); return "test";}
4. 通过发送JSON数据的方式提交,接收仍是bean形式
<script type="text/javascript" src="i/javascript/jquery-latest.js"></script><script type="text/javascript"> $(document).ready(function(){ $("#button").click(function(){ // json数据 var data = {id:$("#id").val(),name:$("#name").val()}; $.ajax({ type:"POST", url:"${pageContext.request.contextPath}/submit.html", data:data }); }); });</script>
接收使用bean,同3
@RequestMapping("/submit")public String submit(Tag tag){ System.out.println(tag); return "test";}
二、多表单域接收方式
1. 方法参数数组方式
表单:
<form action="${pageContext.request.contextPath}/submit.html" method="POST"> <input type="text" name="id" /> <input type="text" name="name" /> <input type="text" name="id" /> <input type="text" name="name" /> <input type="submit" id="button" value="提交" /></form>
接收:
@RequestMapping("/submit")public String submit(String[] id, String[] name){ for(int i=0; i< id.length; i++){ System.out.println(id[i]); System.out.println(name[i]); } return "test";}
2. 用BeanList方式接收
表单:
<form action="${pageContext.request.contextPath}/submit.html" method="POST"> <input type="text" name="tags[0].id" /> <input type="text" name="tags[0].name" /> <input type="text" name="tags[1].id" /> <input type="text" name="tags[1].name" /> <input type="submit" id="button" value="提交" /></form>
要准备一个Bean的List类:
import java.util.List;public class TagList { private List<Tag> tags; public TagList(List<Tag> tags) { this.tags = tags; } public TagList() {} public List<Tag> getTags() { return tags; } public void setTags(List<Tag> tags) { this.tags = tags; }}
接收:
@RequestMapping("/submit")public String submit(TagList tags){ System.out.println(tags.getTags()); return "test";}
这里要注意两点:1. 表单的name属性要跟接收方法参数对应起来;2. name属性要方括号内有数字序号,不能没有序号,没有序号会抛出“Invalid property ‘tags[]’ of bean class”,相对来说还是前面的方法1直观。
三、接收参数时各种常见注解说明
@RequestBody
用在方法上,意义是会使用系统配置的HttpMessageConverter来对请求数据body部分进行解析。然后再把解析后的数据对象提供到方法参数上。
@RequestBody会根据Content-Type来分辨需要处理的内容:
- 常用于:application/json或application/xml等。
- 不能处理 multipart/form-data。
- 默认的application/x-www-form-urlencoded用不用@RequestBody没有关系。
@RequestParam
用于参数上,给参数标识绑定的提交值。比起Request.getParameter()会多做一步将值转换成简单类型。
其属性value指代参数域名称,而required指示是否必须传值,如果required=false则在不传值情况下给参数赋值null。
实际上在提交参数是简单类型的情况下可以忽略该注解,以下两段代码几乎的等同的:
@RequestMapping("/submit")public String submit( @RequestParam(value="id") int req_id, @RequestParam(value="name") String req_name){ System.out.println(req_id); System.out.println(req_name); return "test";}
@RequestMapping("/submit")public String submit(String id, String name){ System.out.println(id); System.out.println(name); return "test";}
如果用@RequestMapping注解的参数是int基本类型,但是required=false,这时如果不传参数值会报错(bad request (400)),因为不传值会赋值为null给int,这是不允许的。解决这个问题的方法是:用包装类型代替基本类型,如使用Integer代替int。
@ModelAttribute
如果用于Controller的方法上,那么通常是当此Controller的每个方法执行前执行,用于提前处理或者给request增加属性等。
如果用于方法的参数上面,有两种情况:
- 如果还有一个对应使用了@ModelAttribute注解的方法,或者是@SessionAttributes注解的SESSION值,那么这个参数会是该方法返回的对象。
- 如果没有对应的方法,那么就是从表单提交或者URL中获取数据对象,实际上不加@ModelAttribute注解效果也一样的。
@RequestMapping("/submit")public String submit(@ModelAttribute Tag tag){ System.out.println(tag); return "test";}
@PathVariable
很方便取得URL的中的值,如:
@Controller@RequestMapping("/test/{testId}")public class TestController { @RequestMapping("/method/{deepId}") public void justdoit(@PathVariable String testId, @PathVariable String deepId) { //... }}
@RequestHeader
取得请求头里面的某项信息:
@RequestMapping("/submit")public String submit(@RequestHeader("User-Agent") String referer){ System.out.println(referer); return "test";}
@SessionAttributes
类级别的注解,作用是注明该Controller所使用的一个SESSION的key,该SESSION会在ModelMap参数里面保存,并且可以从里面使用。如果需要删除该SESSION值,那么得从参数里面传入SessionStatus并调用其setComplete方法。
@Controller@SessionAttributes("testSession")public class PostController extends BaseController { @RequestMapping("/test") public String index(ModelMap modelMap) { modelMap.addAttribute("testSession", new Date()); return "test"; } @RequestMapping("/submit") public String submit(ModelMap modelMap, SessionStatus sessionStatus){ if(modelMap.containsAttribute("testSession")){ System.out.println(modelMap.get("testSession")); sessionStatus.setComplete(); } return "test"; }}
@CookieValue
取特定cookie值
@RequestMapping("/submit")public String submit(@CookieValue("JSESSIONID") String cookie){ System.out.println(cookie); return "test";}
以上是SpringMVC的提交参数获取方式,其实我们还可以直接通过Servlet的各种API来取得相同的数据;这里有个建议就是如果一个项目中使用了一种获取的模式,就一直用相同的方式,会更规范和容易理解。
- SpringMVC 提交参数的方式和注解详述
- springMVC 注解参数传递方式
- 【Springmvc 2】----注解方式参数
- SpringMVC获取jsp页面提交的参数的方式
- SpringMVC以get方式提交参数乱码的解决方案
- SpringMVC 模拟 PUT 提交和 DELETE 方式的提交
- springMVC和其注解方式
- 详述 @Autowired 和 @Resource 注解的区别
- 详述 @Service 和 @Resource 注解的区别
- 详述 @ResponseBody 和 @RequestBody 注解的区别
- Springmvc提交数据的方式
- SpringMVC的注解命名方式
- 注解的方式配置springMVC
- springMVC注解方式的校验
- springMVC入门基础的注解和参数传递
- SpringMVC之注解和参数传递
- 【SpringMVC学习03】SpringMVC中注解和非注解方式下的映射器和适配器总结
- 【SpringMVC学习03】SpringMVC中注解和非注解方式下的映射器和适配器总结
- MySQL和Oracle的delete,truncate
- 在GridView或者ListView的Adapter中使用Glide加载图片,图片被拉伸问题
- 开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- dfs的剪枝问题
- 算法#23--整数反转
- SpringMVC 提交参数的方式和注解详述
- Logstash实践: 分布式系统的日志监控
- 安卓shadow综合控件和布局
- 使用eclipse连接mysql database explorer连接不上的解决办法以及配置
- Android 中使用IDE为Android Studio时候,后台类型从double 改成 int,但是客户端还是显示double问题(JAVA修改Model类型,但是无效)
- C++ 头文件格式和函数注释格式
- 如何使用百度加固服务
- 计算机图书
- 判断是否为js数组对象