SpringMVC入门之四:接收请求的输入

来源:互联网 发布:linux sz 下载目录 编辑:程序博客网 时间:2024/04/29 03:59

SpringMVC允许以多种方式将客户端中的数据传送到控制器的处理器方法中,包括:

  • a、查询参数(Query Parameter)

  • b、表单参数(Form Parameter)

  • c、路径变量(Path Variable)

处理查询参数:

带有查询参数的请求是客户端往服务器发送数据时最简单也最直接的方式。在客户端,查询参数通过在请求路径“?”后添加名值对来实现,如下:

"/spittles?max=23252342&age=2562"

在服务器端怎么接收参数,以及当参数不存在时怎么处理呢?SpringMVC通过@RequestParam参数来获取请求参数,同时,该注解的defaultValue属性可以设置当参数不存在时的默认值。如下:

@RequestMapping(method=RequstMethod.GET)public List<Spittle> spittles(@RequestParam(value="max",defaultValue="10000") long max, @RequestParam(value="count",defaultValue="100") int count){    return repository.findAll();}

尽管defaultValue属性给定的是String类型的值,但是当绑定到方法的max参数时,它会转换为Long型。

通过路径参数接受输入

什么是通过路径参数来查询呢?形如“/spittles?max=1233”的参数传递方式称作查询参数,而形如“/sprittles/1233”则是通过路径参数请求。后者能识别出要查询的资源,而前者描述的是带有参数的一个操作——本质上是通过HTTP发起的RPC。
现在我们已经知道路径参数末尾是客户端传递的变量,是不确定的字符串,那么我们怎么匹配路径和相应的处理器方法呢?
Spring MVC允许我们在@RequestMapping路径中添加占位符。占位符的名称要用大括号(“{”和“}”)括起来。路径中的其他部分要与所处理的请求完全匹配,但是占位符部分可以是任意的值。下面的处理器方法使用了占位符,将spittleID作为路径参数进行匹配:

//"/{spittleID}"进行了路径参数的匹配@RequestMapping(value="/{spittleId}",method=RequestMethod.GET)public String spittle(@PathVariable("spittle") long spittleId, Model model){    model.addAttribute(spittleRepository.findOne(spittleId));    return "spittle";}

spittle()方法的spittleId参数上添加了@PathVariable(“spittle”)注解,这表明在请求路径中,不管占位符部分的值是什么都会传递到处理器方法的spittleId参数中。如果对”/spittles/54321”发送GET请求,那么将会把54321传递进来,作为spittleId的值。如果@PathVariable中没有value属性的话,它会假设占位符的名称与方法的参数名相同,上例中@PathVariable(“spittle”)可以替换为@PathVariable。这能够让代码稍微简洁一些,但是如果想要重命参数的话,则该属性是必须的。

处理表单

SpringMVC的控制器为表单处理提供了良好的支持。使用表单分为两个方面:展现表单和处理用户通过表单提交的数据。
(tips:当form标签没有action属性时,这个表单会被提交到与展现时相同的URL路径上,通过GET和POST方法来区分)

编写处理表单的控制器方法

当处理注册表单时,控制器接收表单数据并将表单数据保存为相应的对象。同时,为了防止重复提交,应该将浏览器重定向到新创建用户的基本信息页面。新添加的处理器方法如下所示:

@RequestMapping(value="/regiter" method=RequestMethod.POST)public String processRegistration(Spitter spitter){    spitterRepository.save(spitter);              //保存spitter对象    return "redirect:/spitter/"+spitter.getUsername();   //重定向到基本信息页面} 

新创建的processRegistration方法接受一个Spitter对象作为参数。这个对象有firstName、lastName、username和password属性,这些属性将会使用请求中同名的参数进行填充。processRegistration方法所做的最后一件事就是返回一个带有重定向格式的String类型的字符串。当InternalResourceViewResolver看到视图格式中的“redirect:”前缀时(”forward:”前缀也一样),它就知道要将其解析为重定向的规则,而不是视图名称,然后会重定向到相应的页面。

校验表单

如果用户在提交表单的时候,username或password文本域为空的话,那么将会导致安全问题。因此,表单验证在服务端尤其重要。
有种处理校验的方式非常初级,那就是在processRegistration方法中添加一系列的if语句来判断。但是这样会把我们的代码弄得一团糟。与其让这些校验逻辑弄乱我们的处理器方法,还不如使用Spring对Java校验API(Java Validation API,又称JSR-303)的支持。从Spring3.0开始,在SpringMVC中提供了对Java校验API的支持。
java校验API定义了多个注解,这些注解可以放到属性上,从而限制这些属性的值。所有的注解都位于javax.validation.constraints包中。下表列出了这些校验注解:
这里写图片描述
应用小实例:

package spittr;public class Spitter{  private Long id;  @NotNull  @Size(min=5,max=16)  private String username;  @NotNull  @Size(min=5,max=25)  private String password;  @NotNull  @Size(min=2,max=30)  private String firstName;  @NotNull  @Size(min=2,max=30)  private String lastName;}

现在,Spitter的所有属性都添加了@NotNull注解,以确保它们的值不为null。类似地,属性上也添加了@Size注解以限制它们的长度在一定范围内。
我们已经为Spitter添加了校验注解,接下来需要修改processRegistration()方法来应用校验功能。启用校验功能的processRegistration()如下所示:

@RequestMapping(value="/register",method=POST)public String processRegistration(@Valid Spitter spitter,Errors errors){  if(errors.hasErrors()){    return "registerForm";  }  spitterRepository.save(spitter);  return "redirect:/spitter/"+spitter.getUsername();}

与最初的processRegistration方法相比,这里有了很大的变化。Spitter参数添加了@Valid注解,这会告知Spring,需要确保这个对象满足校验限制。在Spitter属性上添加校验限制并不能阻止用户提交表单。因此,我们需要处理校验的错误。
如果有校验出现错误的话,那么这些错误可以通过Errors对象进行访问,现在这个对象已作为processRegistration方法的参数。(很重要一点需要注意,Errors参数要紧跟在带有@Valid注解的参数后面,@Valid注解所标注的就是要校验的参数。)现在,出错过后将页面重新定向到注册页面,显示空的表单。后面,我们将在表单中显示最初提交的值并将校验错误反馈给用户。



上一篇:SpringMVC入门之三:控制器&模型
下一篇:SpringMVC入门之五:渲染Web视图概述

1 0
原创粉丝点击