- mvc:view-controller
当我们发送一个请求时,如果没有找到对应的mapping映射方法即Controller,则会在配置文件springmvc.xml当中匹配mvc:view-controller寻找对应的跳转页面
示例:编写一个测试页面test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>index</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/test">测试无mapping跳转</a>
</body>
</html>
此时并没有配置对应的Controller的mapping方法,因此运行项目后点击链接会报404.
此时,我们只要在springmvc.xml配置文件中添加如下配置即可
<mvc:view-controller path="test" view-name="result"/>
此时重新运行项目再次点击链接即可跳转到/result.jsp页面
注意,如果使用了mvc:view-controller,则要在后面加上<mvc:annotation-driven/>,否则将导致配置好的mapping映射方法即Controller不可用
完整的springmvc.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 扫描指定包下的注解 -->
<context:component-scan base-package="demo1.Controller"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置逻辑视图的前缀 -->
<property name="prefix" value="/"/>
<!-- 配置逻辑视图的后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
<!-- 配置无mapping时的默认跳转页面 -->
<mvc:view-controller path="test" view-name="result"/>
<!-- 解决配置了mvc:view-controller后导致Controller中的mapping无法使用的问题 -->
<mvc:annotation-driven/>
</beans>
- <mvc:annotation-driven/>
<mvc:annotation-driven /> 是一种简写形式
如果不配置<mvc:view-controller>以及<mvc:annotation-driven />时,springmvc会自动注册以下三个Bean:
RequestMappingHandlerMapping
RequestMappingHandlerAdapter
ExceptionHandlerExceptionResolver
如果配置了<mvc:view-controller>而没有配置<mvc:annotation-driven />,此时就不会注册两个bean:
RequestMappingHandlerAdapter
ExceptionHandlerExceptionResolver
RequestMappingHandlerMapping(处理请求映射mapping)没有自动注册,因此导致无法访问配置好的Controller里的mapping映射方法
所以我们在配置<mvc:view-controller>会加上<mvc:annotation-driven />,这样的话就会注册RequestMappingHandlerMapping、RequestMappingHandlerAdapter 、ExceptionHandlerExceptionResolver这三个bean
配置了<mvc:annotation-driven />后会提供以下支持:
数据绑定支持,
@NumberFormatannotation支持,
@DateTimeFormat支持,
@Valid支持,读写XML的支持(JAXB),
读写JSON的支持(Jackson)。
- form标签
3.1简介
在使用SpringMVC的时候我们可以使用Spring封装的一系列表单标签,
这些标签都可以访问到ModelMap中的内容
3.2作用
第一是它会自动的绑定来自Model中的一个属性值到当前form对应的实体对象
第二是它支持我们在提交表单的时候使用除GET和POST之外的其他方法进行提交,包括DELETE和PUT等
3.3使用场景
当编辑时, 跳转到form表单页,传统模式要在跳转前先到数据库查询数据,然后进行表单数据回显
使用form之前一定要保证有对应的bean,没有对应的bean时, 会自动以command为key到request域中查询,当找不到的时候, 会报异常
3.4 使用步骤
3.4.1在需要用到form标签的jsp页面引入标签库
<%@taglib uri="http://www.springframework.org/tags/form" prefix="fm" %>
3.4.2 test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>测试form标签的使用</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/query/1">查询数据展示修改</a>
</body>
</html>
3.4.3创建表单(result.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="fm" %>
<html>
<head>
<title>result.jsp</title>
</head>
<body>
<h1>结果页</h1>
<fm:form modelAttribute="teacher" action="${pageContext.request.contextPath}/update">
姓名:<fm:input path="name"/> <fm:errors path="name" cssStyle="color: red"/><br>
年龄:<fm:input path="age"/> <fm:errors path="age" cssStyle="color: red"/><br>
性别:<fm:radiobutton path="gender" value="0" label="男"/>
<fm:radiobutton path="gender" value="1" label="女"/><br>
爱好:<fm:checkboxes path="hobby" items="${hobbyList}"/> <br>
宠物:<fm:select path="dog.id" items="${dogList}" itemValue="id" itemLabel="name"/> <br>
<input type="submit" value="修改">
</fm:form>
</body>
</html>
3.4.4 success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>success.jsp</title>
</head>
<body>
<h1>修改成功</h1>
</body>
</html>
3.4.5 Teacher包装类
public class Teacher {
private String name;
private Integer age;
private Integer gender;
private String[] hobby;
private Dog dog;
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public Integer getGender() {
return gender;
}
public String[] getHobby() {
return hobby;
}
public Dog getDog() {
return dog;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
", hobby=" + Arrays.toString(hobby) +
", dog=" + dog +
'}';
}
}
3.4.6 Dog包装类
public class Dog {
private Integer id;
private String name;
private String color;
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public void setName(String name) {
this.name = name;
}
public void setColor(String color) {
this.color = color;
}
public String getName() {
return name;
}
public String getColor() {
return color;
}
@Override
public String toString() {
return "Dog{" +
"id=" + id +
", name='" + name + '\'' +
", color='" + color + '\'' +
'}';
}
}
3.4.7 Controller
@Controller
public class TestController {
@RequestMapping("/query/{id}")
public String query(@PathVariable String id, Model model){
System.out.println(id);
Teacher teacher = new Teacher();
teacher.setName("张三");
teacher.setAge(30);
ArrayList<Object> dogList = new ArrayList<>();
Dog dog = new Dog();
dog.setId(1);
dog.setName("旺财");
dog.setColor("黄色");
Dog dog1 = new Dog();
dog1.setId(2);
dog1.setName("小黑");
dog1.setColor("黑色");
dogList.add(dog);
dogList.add(dog1);
ArrayList<Object> hobbyList = new ArrayList<>();
hobbyList.add("篮球");
hobbyList.add("足球");
hobbyList.add("乒乓球");
model.addAttribute("hobbyList", hobbyList);
//设置默认选择的爱好
String[] hobby = new String[]{"篮球"};
teacher.setHobby(hobby);
//设置默认选择的宠物
teacher.setDog(dog);
//设置默认选择的性别0-男 1-女
teacher.setGender(1);
model.addAttribute("teacher",teacher);
model.addAttribute("dogList",dogList);
return "result";
}
@RequestMapping("/update")
public String update(Teacher teacher){
System.out.println(teacher);
return "success";
}
}
3.4.8运行结果
点击链接,将结果展示到result.jsp页面中
修改值如下
点击修改按钮,请求路径为jsp中设置的action路径
后台回传数据如下
补充说明:如果在form标签中没有设置action请求响应路径,则默认为当前路径
- 服务器表单校验
4.1为什么后端要做表单的校验?
如果只使用前端校验的话,且浏览器把JS给禁用掉,那么页面显示就会出问题
4.2 JSR 规范
JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE 6.0 中
JSR 303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解
指定校验规则,并通过标准的验证接口对 Bean 进行验证
4.3 Hibernate Validator
是 JSR 303 的一个参考实现,除支持所有标准的校验注解外,它还支持以下的扩展注解
4.4 常用校验规则
4.4.1 Bean Validation 中内置的约束
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
4.4.2 Hibernate Validator 附加的约束
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
4.5 使用步骤
4.5.1 使用Hibernate-Validator导入jar包
4.5.2 在配置文件springmvc.xml当中添加<mvc:annotation-driven/>
4.5.3 在domain类中添加对应的校验规则
4.5.4 在处理器方法的入参中添加注解@Valid
4.5.5 将错误信息回显到页面中
使用form标签<fm:error path="username"></fm:error>
4.5.6 运行结果
当年龄输入大于200时,会提示我们在包装类中设置的错误信息