Spring MVC数据验证


用户的输入一般是随意的,为了保证数据的合法性,数据验证是所有 Web 应用必须处理的问题。

在 Spring MVC 框架中有以下两种方法可以验证输入数据:

  • 利用 Spring 自带的验证框架。
  • 利用 JSR 303 实现。

数据验证分为客户端验证和服务器端验证,客户端验证主要是过滤正常用户的误操作,通过 JavaScript 代码完成。服务器端验证是整个应用阻止非法数据的最后防线,通过在应用中编程实现。

客户端验证

在大多数情况下,使用 JavaScript 进行客户端验证的步骤如下:

  • 编写验证函数。
  • 在提交表单的事件中调用验证函数。
  • 根据验证函数来判断是否进行表单提交。

客户端验证可以过滤用户的误操作,是第一道防线,一般使用 JavaScript 代码实现。但仅有客户端验证是不够的,攻击者还可以绕过客户端验证直接进行非法输入,这样可能会引起系统异常,为了确保数据的合法性,防止用户通过非正常手段提交错误信息,必须加上服务器端验证。

服务器端验证

Spring MVC 的 Converter 和 Formatter 在进行类型转换时是将输入数据转换成领域对象的属性值(一种 Java 类型),一旦成功,服务器端验证器就会介入。也就是说,在 Spring MVC 框架中先进行数据类型转换,再进行服务器端验证。

服务器端验证对于系统的安全性、完整性、健壮性起到了至关重要的作用。在 Spring MVC 框架中可以利用 Spring 自带的验证框架验证数据,也可以利用 JSR 303 实现数据验证。

自定义 Spring 验证器

自定义 Spring 验证器时需要实现的 Validator 接口和工具类 ValidationUtils。

Validator接口

创建自定义 Spring 验证器需要实现 org.springframework.validation.Validator 接口,该接口有两个接口方法:

boolean supports(Class<?> klass)
void validate(Object object,Errors errors)

当 supports 方法返回 true 时,验证器可以处理指定的 Class。validate 方法的功能是验证目标对象 object,并将验证错误消息存入 Errors 对象。

往 Errors 对象存入错误消息的方法是 reject 或 rejectValue,这两个方法的部分重载方法如下:

void reject(String errorCode)
void reject(String errorCode,String defaultMessage)
void rejectValue(String filed,String errorCode)
void rejectValue(String filed,String errorCode,String defaultMessage)

在一般情况下只需要给 reject 或 rejectValue 方法一个错误代码,Spring MVC 框架就会在消息属性文件中查找错误代码,获取相应错误消息。具体示例如下:

if(goods.getGprice() > 100 || goods.getGprice() < 0){
    errors.rejectValue("gprice","gprice.invalid");  // gprice.invalid为错误代码
}

ValidationUtils 类

org.springframework.validation.ValidationUtils 是一个工具类,该类中有几个方法可以帮助用户判定值是否为空。
例如:

if(goods.getGname()==null || goods.getGname().isEmpty()) {
    errors.rejectValue("gname","goods.gname.required")
}

再如:

if(goods.getGname() == null || goods.getGname().trim().isEmpty()) {
    errors.rejectValue("gname","goods.gname.required")
}

上述 if 语句可以编写成:

//gname为goods对象的属性
ValidationUtils.rejectIfEmptyOrWhitespace(errors,"gname","goods.gname.required");

Spring MVC验证器应用实例

使用一个应用 springMVCDemo08 讲解 Spring 验证器的编写及使用。该应用中有一个数据输入页面 addGoods.jsp,效果如图 1 所示。
在这里插入图片描述
有一个数据显示页面 goodsList.jsp,效果如图 2 所示。
在这里插入图片描述
编写一个实现 org.springframework.validation.Validator 接口的验证器类 GoodsValidator,验证要求如下:

  • 商品名和商品详情不能为空。
  • 商品价格在 0 到 100。
  • 创建日期不能在系统日期之后。

根据上述要求,按照如下步骤完成 springMVCDemo08 应用。
1)创建应用
创建 springMVCDemo08 应用,并导入 Spring MVC 的相关 JAR 包。另外,需要使用 JSTL 标签显示数据,所以需要导入 JSTL 的 JAR 包。
在这里插入图片描述
2)创建数据输入页面
在 WEB-INF 目录下创建文件夹 jsp,并在该文件夹中创建数据输入页面 addGoods.jsp。代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>添加商品</title>
</head>
<body>
    <form:form modelAttribute="goods"
        action="${pageContext.request. contextPath }/goods/save" method="post">
        <fieldset>
            <legend> 添加一件商品 </legend>
            <P>
                <label>商品名:</label>
                <form:input path="gname" />
            </p>
            <p>
                <label>商品详情:</label>
                <form:input path="gdescription" />
            </p>
            <P>
                <label>商品价格:</label>
                <form:input path="gprice" />
            </p>
            <P>
                <label>创建日期:</label>
                <form:input path="gdate" />
                (yyyy-MM-dd)
            </p>
            <p id="buttons">
                <input id="reset" type="reset">
                <input id="submit" type="submit" value="添加">
            </p>
        </fieldset>
        <!-- 取出所有验证错误 -->
        <form:errors path="*" />
    </form:form>
</body>
</html>

3)编写模型类
在 src 目录下创建 pojo 包,并在该包中定义领域模型类 Goods,封装输入参数。在该类中使用 @DateTimeFormat(pattern=“yyyy-MM-dd”)格式化创建日期。

模型类 Goods 的具体代码如下:

package pojo;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
public class Goods {
    private String gname;
    private String gdescription;
    private double gprice;
    // 日期格式化(需要在配置文件中配置FormattingConversionServiceFactoryBean)
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date gdate;
 	getter/setter省略

4)编写验证器类
在 src 目录下创建 validator 包,并在该包中编写实现 org.springframework.validation.Validator 接口的验证器类 GoodsValidator,使用 @Component 注解将 GoodsValidator 类声明为验证组件。具体代码如下:

package validator;
import java.util.Date;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import pojo.Goods;
@Component
public class GoodsValidator implements Validator {
    @Override
    public boolean supports(Class<?> klass) {
        // 要验证的model,返回值为false则不验证
        return Goods.class.isAssignableFrom(klass);
    }
    @Override
    public void validate(Object object, Errors errors) {
        Goods goods = (Goods) object; // object要验证的对象
        // goods.gname.required是错误消息属性文件中的编码(国际化后对应的是国际化的信息)
        ValidationUtils.rejectIfEmpty(errors, "gname", "goods. gname.required");
        ValidationUtils.rejectIfEmpty(errors, "gdescription",
                "goods.gdescription.required");
        if (goods.getGprice() > 100 || goods.getGprice() < 0) {
            errors.rejectValue("gprice", "gprice.invalid");
        }
        Date goodsDate = goods.getGdate();
        // 在系统时间之后
        if (goodsDate != null && goodsDate.after(new Date())) {
            errors.rejectValue("gdate", "gdate.invalid");
        }
    }
}

5)编写错误消息属性文件
在 WEB-INF 目录下创建文件夹 resource,并在该文件夹中编写属性文件 errorMessages.properties。文件内容如下:

goods.gname.required=请输入商品名称
goods.gdescription.required=请输入商品详情
gprice.invalid=价格为0~100
gdate.invalid=创建日期不能在系统日期之后

Unicode 编码(MyEclipse 带有将汉字转换成 Unicode 编码的功能)的属性文件内容如下:

goods.gname.required=\u8BF7\u8F93\u5165\u5546\u54C1\u540D\u79F0
goods.gdescription.required=\u8BF7\u8F93\u5165\u5546\u54C1\u8BE6\u60C5
gprice.invalid=\u4EF7\u683C\u4E3A0~100
gdate.invalid=\u521B\u5EFA\u65E5\u671F\u4E0D\u80FD\u5728\u7CFB\u7EDF\u65E5\u671F\u4E4B\u540E

在属性文件创建完成后需要告诉 Spring MVC 从该文件中获取错误消息,则需要在配置文件中声明一个 messageSource bean,具体代码如下:

<!-- 配置消息属性文件 -->
<bean id="messageSource"
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="/WEB-INF/resource/errorMessages" />
</bean>

6)编写 Service 层
在 src 目录下创建 service 包,并在该包中编写一个 GoodsService 接口。具体代码如下:

package service;
import java.util.ArrayList;
import pojo.Goods;
public interface GoodsService {
    public boolean save(Goods g);
    public ArrayList<Goods> getGoods();
}

GoodsServiceImpl 实现类具体代码如下:

package service;
import java.util.ArrayList;
import org.springframework.stereotype.Service;
import pojo.Goods;
@Service
public class GoodsServiceImpl implements GoodsService {
    // 使用静态集合变量goods模拟数据库
    private static ArrayList<Goods> goods = new ArrayList<Goods>();
    @Override
    public boolean save(Goods g) {
        goods.add(g);
        return true;
    }
    @Override
    public ArrayList<Goods> getGoods() {
        return goods;
    }
}

7)编写控制器类
在 src 目录下创建 controller 包,并在该包中编写控制器类 GoodsController,在该类中使用 @Resource 注解注入自定义验证器。另外,在控制器类中包含两个处理请求的方法,具体代码如下:

package controller;
import javax.annotation.Resource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Validator;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import pojo.Goods;
import service.GoodsService;
@Controller
@RequestMapping("/goods")
public class GoodsController {
    // 得到一个用来记录日志的对象,这样在打印信息的时候能够标记打印的是哪个类的信息
    private static final Log logger = LogFactory.getLog(GoodsController.class);
    @Autowired
    private GoodsService goodsService;
    // 注解验证器相当于"GoodsValidator validator=new GoodsValidator () ; "
    @Resource
    private Validator validator;
    @RequestMapping("/input")
    public String input(Model model) {
        // 如果model中没有goods属性,addGoods.jsp会抛出异常
        // 因为表单标签无法找到modelAttribute属性指定的form backing object
        model.addAttribute("goods", new Goods());
        return "addGoods";
    }
    @RequestMapping("/save")
    public String save(@ModelAttribute Goods goods, BindingResult result,
            Model model) {
        this.validator.validate(goods, result); // 添加验证
        if (result.hasErrors()) {
            return "addGoods";
        }
        goodsService.save(goods);
        logger.info("添加成功");
        model.addAttribute("goodsList", goodsService.getGoods());
        return "goodsList";
    }
}

8)编写配置文件
在 WEB-INF 目录下编写配置文件 springmvc-servlet.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:mvc="http://www.springframework.org/schema/mvc"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    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/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!-- 使用扫描机制扫描包 -->
    <context:component-scan base-package="controller" />
    <context:component-scan base-package="service" />
    <context:component-scan base-package="validator" />
    <!-- 注册格式化转换器,因为用到日期转换 -->
    <bean id="conversionService"
        class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    </bean>
    <!-- 配置视图解析器 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
    <!-- 配置消息属性文件 -->
    <bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="/WEB-INF/resource/errorMessages" />
    </bean>
</beans>

9)创建数据显示页面
在 WEB-INF/jsp 目录下创建数据显示页面 goodsList.jsp。核心代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <table>
        <tr>
            <td>商品名</td>
            <td>商品详情</td>
            <td>商品价格</td>
            <td>创建日期</td>
        </tr>
        <c:forEach items="${goodsList }" var="goods">
            <tr>
                <td>${goods.gname }</td>
                <td>${goods.gdescription }</td>
                <td>${goods.gprice }</td>
                <td>${goods.gdate }</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

10)创建 web.xml 文件
在 WEB-INF 目录下创建 web.xml 文件,在该文件中配置 Spring MVC 的核心控制器 DispatcherServlet 和字符编码过滤器,具体代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
    <!--配置DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--避免中文乱码-->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>
             org.springframework.web.filter.CharacterEncodingFilter
        </filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

11)测试应用
发布 springMVCDemo08 应用并启动 Tomcat 服务器,然后通过地址“http://localhost:8080/springMVCDemo08/goods/input”测试应用。

当输入价格大于 100 元时,下面会提示“价格为0~100”的信息,如图 3 所示。
在这里插入图片描述

JSR 303 验证

对于 JSR 303 验证,目前有两个实现,一个是 Hibernate Validator,一个是 Apache BVal。本教程采用的是 Hibernate Validator,注意它和 Hibernate 无关,只是使用它进行数据验证。

Hibernate Validator

1. 下载与安装 Hibernate Validator
用户可以通过地址“https://sourceforge.net/projects/hibernate/files/hibernate-validator/”下载 Hibernate Validator,本教程选择的是 hibernate-validator-4.3.2.Final-dist.zip。

首先将下载的压缩包解压,然后将 \hibernate-validator-4.3.2.Final\dist 目录下的 hibernate-validator-4.3.2.Final.jar 和 \hibernate-validator-4.3.2.Final\dist\lib\required 目录下的 jboss-logging-3.1.0.Final.jar、validation-api-1.0.0. GA.jar 复制到应用的 \WEB-INF\lib 目录下。
2. 配置属性文件与验证器
如果将验证错误消息放在属性文件中,那么需要在配置文件中配置属性文件,并将属性文件与 Hibernate Validator 关联,具体配置代码如下:

<!-- 配置消息属性文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <!-- 资源文件名 -->
    <property name="basenames">
        <list>
            <value>/WEB-INF/resource/errorMessages</value>
        </list>
    </property>
    <!-- 资源文件编码格式 -->
    <property name="fileEncodings" value="utf-8" />
    <!-- 对资源文件内容缓存的时间,单位为秒 -->
    <property name="cacheSeconds" value="120" />
</bean>
<!-- 注册校验器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <!-- hibernate 校验器 -->
    <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
    <!-- 指定校验使用的资源文件,在文件中配置校验错误信息,如果不指定则默认使用 classpath下的 ValidationMessages.properties -->
    <property name="validationMessageSource" ref="messageSource" />
</bean>
<!--开启 Spring的 Valid 功能 -->
<mvc:annotation-driven conversion-service="conversionService" validator="validator" />

3. 标注类型
JSR 303 不需要编写验证器,但需要利用它的标注类型在领域模型的属性上嵌入约束。
1)空检查

  • @Null:验证对象是否为 null。
  • @NotNull:验证对象是否不为 null,无法检查长度为 0 的字符串。
  • @NotBlank:检查约束字符串是不是 null,以及被 trim 后的长度是否大于 0,只针对字符串,且会去掉前后空格。
  • @NotEmpty:检查约束元素是否为 null 或者是 empty。

示例如下:

@NotBlank(message="{goods.gname.required}") //goods.gname.required为属性文件的错误代码
private String gname;

2)boolean 检查

  • @AssertTrue:验证 boolean 属性是否为 true。
  • @AssertFalse:验证 boolean 属性是否为 false。

示例如下:

@AssertTrue
private boolean isLogin;

3)长度检查

  • @Size(min=,max=):验证对象(Array、Collection、Map、String)长度是否在给定的范围之内。
  • @Length(min=,max=):验证字符串长度是否在给定的范围之内。

示例如下:

@Length(min=1,max=100)
private String gdescription;

4)日期检查

  • @Past:验证 Date 和 Callendar 对象是否在当前时间之前。
  • @Future:验证 Date 和 Calendar 对象是否在当前时间之后。
  • @Pattern:验证 String 对象是否符合正则表达式的规则。

示例如下:

@Past(message="{gdate.invalid}")
private Date gdate;

5)数值检查
在这里插入图片描述
示例如下:

@Range(min=10,max=100,message="{gprice.invalid}")
private double gprice;

Hibernate-Validator数据验证实例

创建 springMVCDemo09 应用,该应用实现的功能与《Spring MVC验证器应用实例》节中的 springMVCDemo08 应用相同。springMVCDemo09 所需的 JAR 包如图 1 所示。
在这里插入图片描述
在 springMVCDemo09 应用中不需要创建验证器类 GoodsValidator。另外,Service 层、View 层以及错误消息属性文件都与 springMVCDemo08 应用的相同。与 springMVCDemo08 应用的实现不同的是模型类、控制器类和 Spring MVC 的核心配置文件,具体如下:
1)模型类
在模型类 Goods 中利用 JSR 303 的标注类型对属性进行验证,具体代码如下:

public class Goods {
    //goods.gname.required错误消息 key(国际化后对应的就是国际化的信息)
    @NotBlank(message="{goods.gname.required}")
    private String gname;
    @NotBlank(message="{goods.gdesciption.required}")
    private String gdescription;
    @Range(min=0,max=100,message="{gprice.invalid}")
    private double gprice;
    // 日期格式化(需要在配置文件中配置FormattingConversionServiceFactoryBean)
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Past(message="{gdate.invalid}")
    private Date gdate;
    //省略setter和getter方法
}

2)控制器类
在控制器类 GoodsController 中使用 @Valid 对模型对象进行验证,具体代码如下:

package controller;
import javax.annotation.Resource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Validator;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import pojo.Goods;
import service.GoodsService;
@Controller
@RequestMapping("/goods")
public class GoodsController {
    // 得到一个用来记录日志的对象,这样在打印信息的时候能够标记打印的是哪个类的信息
    private static final Log logger = LogFactory.getLog(GoodsController.class);
    @Autowired
    private GoodsService goodsService;
    @RequestMapping("/input")
    public String input(Model model) {
        // 如果model中没有goods属性,addGoods.jsp会抛出异常
        // 因为表单标签无法找到modelAttribute属性指定的form backing object
        model.addAttribute("goods", new Goods());
        return "addGoods";
    }
    @RequestMapping("/save")
    public String save(@ModelAttribute Goods goods, BindingResult result,Model model) {
        if (result.hasErrors()) {
            return "addGoods";
        }
        goodsService.save(goods);
        logger.info("添加成功");
        model.addAttribute("goodsList", goodsService.getGoods());
        return "goodsList";
    }
}

3)配置文件
配置文件 springmvc-servlet.xml 的代码如下:

ml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    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/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!-- 使用扫描机制扫描包 -->
    <context:component-scan base-package="controller" />
    <context:component-scan base-package="service" />
    <!-- 配置消息属性文件 -->
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <!-- 资源文件名 -->
        <property name="basenames">
            <list>
                <value>/WEB-INF/resource/errorMessages</value>
            </list>
        </property>
        <!-- 资源文件编码格式 -->
        <property name="fileEncodings" value="utf-8" />
        <!-- 对资源文件内容缓存的时间,单位为秒 -->
        <property name="cacheSeconds" value="120" />
    </bean>
    <!-- 注册校验器 -->
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <!-- hibernate 校验器 -->
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
        <!-- 指定校验使用的资源文件,在文件中配置校验错误信息,如果不指定则默认使用 classpath下的 VaiidationMessages.properties -->
        <property name="validationMessageSource" ref="messageSource" />
    </bean>
    <!--开启 Spring的 Valid 功能 -->
    <mvc:annotation-driven conversion-service="conversionService"
        validator="validator" />
    <!-- 注册格式化转换器,因为用到日期转换 -->
    <bean id="conversionService" 
        class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    </bean>
    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

4)测试应用
通过地址“http://localhost:8080/springMVCDemo09/goods/input”测试 springMVCDemo09 应用。

内容出处:http://c.biancheng.net/view/4451.html

发布了96 篇原创文章 · 获赞 396 · 访问量 6219

猜你喜欢

转载自blog.csdn.net/Bonport/article/details/105160403