Spring mvc 接受请求的输入三种方式总结
Spring mvc 接受请求的输入三种方式总结
在Spring Boot的学习过程中,写过一篇关于在Spring Boot中是如何接受请求的输入的,博客地址在这里:
http://blog.csdn.net/u010412719/article/details/69788227
其实,Spring mvc与Spring Boot中接受请求的输入的方式基本一样。
为加深印象,本篇博文主要是记录下Spring mvc接受请求的输入的三种方式。
1、路径参数
2、查询参数
3、表单参数
下面分别进行介绍
1、路径参数 @PathVariable
为便于使用类似于:localhost:8080/test/{para}的路径地址来传递参数,首先要注意的是:将工程中web.xml中的url-pattern指定为/。具体为:<url-pattern>/</url-pattern>
。
说到这里,springmvc中url-pattern /和/*的区别是什么呢,可能有部分人刚开始和我一样,不怎么清楚,这里交代一下;
< url-pattern > / : 会匹配到/login这样的路径型url,不会匹配到模式为.jsp这样的后缀型url,即:.jsp不会进入spring的 DispatcherServlet类
< url-pattern > /* : 会匹配.jsp,会出现返回jsp视图时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错。总之,/* 会匹配所有url:路径型的和后缀型的url(包括/login,.jsp,.js和*.html等)
回到正题,Spring mvc允许我们在@RequestMapping路径中添加占位符,占位符永大括号括起来。路径中的其他部分与所处理的请求完全匹配,但是占位符部分可以是任意的值。
下面的代码使用了占位符,将name作为url的一部分。
具体代码如下:
@Controller
public class ParaController {
@RequestMapping(value = "/testPathVariable/{name}",method = RequestMethod.GET)
public String testPathVariable(@PathVariable("name") String name,Model model){
model.addAttribute("name",name);
return "pathVariable";
}
}
在上面的代码中,使用了@PathVariable注解来获得请求路径上的参数,不管占位符部分的值时多少,都会传递到处理器方法的name参数中。
上面代码中利用了另外一个知识点:将模型中的数据传递到视图中。pathVariable.jsp的内容如下:
<html>
<body>
<h2>Hello ${name}!</h2>
</body>
</html>
测试结果如下:
上面是只有一个参数的情况,如果有多个参数,只需要使用多个@PathVariable即可。
2、查询参数 @RequestParam
当获取类似于url=localhost:8080/testRequestParam?name=XXX&age=18中包括的参数name和age。在Springmvc和SpringBoot中都是使用@RequestParam来完成,实现代码如下:
@Controller
public class ParaController {
@RequestMapping(value = "/testRequestParam",method = RequestMethod.GET)
public String testRequestParam(@RequestParam(value = "name",required = true) String name ,
@RequestParam(value = "age" ,defaultValue = "18") int age,
Model model){
model.addAttribute("name",name);
model.addAttribute("age",age);
return "requestParam";
}
}
@RequestParam注解中的三个属性介绍如下:
1、value:参数名字,即入参的请求参数名字,与url中出现的名称一致。
2、required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;
3、defaultValue:默认值
更多可以参考这篇博文:
http://www.cnblogs.com/wangchuanfu/p/5913310.html。
requestParam.jsp内容如下:
<html>
<body>
<h2>name: ${name}!</h2>
<h2>age: ${age}!</h2>
</body>
</html>
测试了三种情况的测试结果如下:
第一种测试情况:路径中既包括name也包括age
第二种测试情况:路径中仅包括name
第三种测试情况:路径中既不包括name也不包括age。(由于在代码中将name的required设置为true,因此会报错)
3、接受表单处理
使用表单包括两个方面:展现表单以及处理用户通过表单提交的数据。
因此,具体步骤如下所示:
1)首先,我们需要在控制器中编写一个请求处理方法来展现注册表单。
2)编写相应的注册表单JSP文件
3)在控制器中编写一个方法来接受表单处理并对提交表单的数据进行处理。
具体实现代码如下:
1)展现注册表单
/**
* 展现注册表单
* */
@RequestMapping(value = "/register",method = RequestMethod.GET)
public String showRegistrationForm(){
return "registerForm";
}
2) 编写注册表单:registerForm.jsp
<html>
<body>
<h2>register page</h2>
<form method="post">
Name: <input type="text" name="username"/><br>
Password:<input type="password" name="password"/><br>
<input type="submit" value="Register"/>
</form>
</body>
</html>
注意:这里的form标签中并没有设置action属性,在这种情况下,当表单提交时,它会提交到与展现时相同的URL路径上。也就是说,它会提交到:localhost:8080/register路径上。
如果我们设置action属性为:action="/processRegister"
;则会将表单数据提交到:localhost:8080/processRegister
3)接受表单处理,并进行处理
@RequestMapping(value = "/register",method = RequestMethod.POST)
public String processRegistration(User user,Model model){
model.addAttribute("user",user);
return "displayUserInfo";
}
注意:@RequestMapping注解中的vale
displayUserInfo.jsp内容如下:
<html>
<body>
<h2>username: ${user.username}</h2>
<h2>password: ${user.password}</h2>
</body>
</html>
这里使用了User对象来接受表单数据,是直接将user对象保存到了Model对象中传递给视图,在视图displayUserInfo.jsp中进行显示。
其中,User类的代码如下:
public class User {
private String username;
private String password;
public User() { //必须要有无參构造函数,否则报错
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
//getter setter method...
}
4)测试验证
在第一次测试过程中,遇到了如下的错误:错误提示相当清楚,就是User类缺少构造函数。