(一)编写控制器。
注:如果WEB-INF下存在index.jsp,”/”将会优先访问index.jsp,所以需要将index.jsp删除或重命名。
对应的home.jsp
游览器访问:
(二)向视图传递模型
在web应用中,我们常需要把数据渲染到视图中,下面就看看如何用SpringMVC实现查询用户列表的功能。
1.首先定义一个用户bean
2.定义一个获取用户列表的service,这里我直接创建一个List。
3.控制器的编写。
在新的方法里,新加入了一个Model形参(其实就是Map,甚至可以把Model换成Map),这样,users就可以将产生的信息传递到视图。
值得一提的是,在向Model添加数据时,如果不写key,模型的Key将会根据类型推断出(本例中,List<User>就是userList)。
不仅如此,我们甚至可以不使用Model,就像下面这样
因为没有指定请求路径,默认会是方法名“/allUser”。当处理器方法返回对象或集合时,这个值会放到模型中,模型的key会根据类型推断得出。而视图的名称会根据请求的路径推断得出“allUser”。
4.最后是视图的渲染
视图使用了EL表达式和jstl,如果是Servlet3.0话,EL默认是关闭的,需要加上<%@ page isELIgnored="false" %>来开启。
5.测试
三、对请求的处理
在Web中,客户端可以通过表单、url等方式,向服务端提交数据或查询数据。那么SpringMVC是如何对请求数据进行接受的呢?
(一)请求处理
在SpringMVC中,对于表单数据、Url参数都可以通过@RequestParam(“name”)进行接收。在下例中,需要在查询用户时进行分页,这时就需要传递两个参数:
max 从第几个用户开始
count 一次需要查询的用户数
对于这个两个值为空的情况,还需要设置一个默认的值。
(二)路径占位符
SpringMVC提供了路径占位符的功能,这样就可以使Url变Restful
这样,当我们Url为“users/13”时,SpringMVC就会自动截取13并赋值给userId。
对了,如果方法的参数名与占位符的名称一致的话,我们还可以去掉@PathVariable的Value属性,就像下面这样。
四、对表单的处理
(一)表单数据处理
在上面的基础上,我们添加一个注册功能,以此来说明SpringMvc对表单的处理。
- 在Controller中添加访问注册页面的方法
2.创建一个注册页面register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>用户注册</title> </head> <body> <h1>用户注册</h1> <form method="post"> 用户名:<input type="text" name="name"/><br/> 密码:<input type="password" name="password"><br/> <input type="submit" value="提交"> </form> </body> </html>
这里的form标签没有设置action属性。在这种情况下,表单会提交到与展现这个页面相同的URL路径上,如本例的“/register”上。
3.在Controller添加接受表单数据的方法
此处有3点需要注意。
(1)因为表单提交为Post,所以需要在对应的controller也要设置接受post请求。
(2)我们在方法中放了一个User对象,这个对象有id、name、password等属性,这些属性会被请求中同名的参数填充。
(3)当在返回的值前添加“redirect”前缀时,InternalResourceViewResolver视图解析器会将值解析成重定向规则,而不是视图的名称。
(二)校验表单
如果用户在提交表单时忘记填写name或者password,我们目前的程序依然会正常执行,这显然是不合理的,
从Spring3.0开始,SpringMVC提供了对Java校验API的支持,我们可以根据注解方便的进行表单校验。
下表列出了这些注解:
@AssertFalse |
所注解的元素必须为Boolean类型,并且为false |
@AssertTrue |
所注解的元素必须为Boolean类型,并且为true |
@DecimalMax |
所注解的元素必须为数字,并且值要小于等于给定的BigDecimalString值 |
@DecimalMin |
所注解的元素必须为数字,并且值要大于等于给定的BigDecimalString值 |
@Digits |
所注解的元素必须为数字,并且值必须为指定位数 |
@Future |
所注解的元素必须为一个将来的日期 |
@Max |
所注解的元素必须为数字,并且值要小于等于给定的 |
@Min |
所注解的元素必须为数字,并且值要大于等于给定的 |
@NotNull |
所注解的元素必须不为null |
@Null |
所注解的元素必须为null |
@Past |
所注解的元素必须为一个过去的日期 |
@Pattern |
所注解的元素必须匹配给定的正则表达式 |
@Size |
所注解的元素必须为String、集合或数组,且长度要符合给定的范围 |
下面我们就把这些规则应用到我们的User实体中
首先,需要添加Java校验APi的依赖
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> </dependency>
然后在需要验证的实体类添加对应的校验注解:
我们需要在Controller方法启用校验功能它才会生效,如下所示