我是Spring MVC的新手,我对这个验证器示例的工作原理有以下疑问:
所以我有这个搜索。jsp页面,用户可以通过两个字段(产品名称和产品所属类别)搜索产品:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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=ISO-8859-1">
<title>Search</title>
<jsp:include page="/WEB-INF/views/include/head-include.jsp" />
</head>
<body>
<div class="container">
<h2>Search Products</h2>
<div class="form-group form">
<form:form name="input" method="get"
modelAttribute="product" action="products">
<div>
<label>Name: </label>
<form:input type="text" path="name" class="form-control" />
<form:errors path="name" />
</div>
<div>
<label>Category:</label>
<form:select path="category.id" class="form-control" >
<form:option path="category.id" value="0" label="--- All Categories ---"/>
<form:options path="category.id" items="${categories}" itemLabel="name" itemValue="id" />
</form:select>
</div>
<div>
<input type="submit" value="Submit" class="form-control">
</div>
</form:form>
</div>
<h2>Search Results:</h2>
<c:forEach var="product" items="${results}">
<c:out value="${product.name}"/> <br/>
</c:forEach>
</div>
</body>
</html>
因此,在本教程中,我们将对实现自定义验证器的前一个视图的两个字段的输入进行一些限制。在特定情况下,用户必须:
1) 用户必须插入产品名称或类别
2) 名称长度必须至少由3个字符组成。
3) 用户只能按名称或类别进行选择,但不能在产品模型对象的其他字段上进行选择
为了实现这个自定义验证器,我们创建了这个productSearchValidator类,它实现了Spring Validator接口:
package com.packtpub.springmvc.chocolatestore;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import com.packtpub.springmvc.chocolatestore.model.Product;
@Component
public class ProductSearchValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return Product.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
Product product = (Product) target;
String name = product.getName();
if (!StringUtils.hasLength(name) && (product.getCategory() == null || product.getCategory().getId() == 0)) {
errors.rejectValue("name", "required", "Either name or category is required");
} else if ((product.getCategory() == null || product.getCategory().getId() == 0) && name.trim().length() < 3) {
errors.rejectValue("name", "tooShort", "Please enter at least 3 letters");
}
}
}
据我所知,supports()方法表示是否可以从该验证器验证类的特定实例,validate()方法实现特定的验证逻辑。
好的,对我来说validate()方法很清楚(它实现了前面3个指定的限制)。
我不明白的是,支持()方法到底是如何
@Override
public boolean supports(Class<?> clazz) {
return Product.class.isAssignableFrom(clazz);
}
具体是如何工作的?什么代表它的输入参数(clazz类)?什么代表返回的布尔值?(Product.class.isAssignableFrom(clazz)evaluation的含义是什么?)
Tnx
support()方法说明是否可以从这个验证器验证类的特定实例
没有。它表示验证器是否支持特定的类。验证对象时,对象本身不会传递给support()
。传递给support()
的是对象的类。
因此,在验证Product
的实例之前,Spring会使用Product调用
作为参数。supports()
。类
在验证SubClassOfProducts
的实例之前,Spring调用support()
,将SubClassOfProduct.class
作为参数。
在这两种情况下,由于Product.class可从Product.class/SubClass OfProduct.class分配,因此该方法返回true。如果您试图用该验证器验证用户,它将返回false。的确,你能做到
Product p = someProductInstance;
你也可以做
Product p = someSubClassOfProductInstance;
但你做不到
Product p = someUserInstance;
这就是产品。班isAssignableFrom(clazz)
的意思是。
看到相关的javadocs,基本上解释了我刚才解释的:
我正在学习Spring核心认证,我对Spring如何处理JDBC查询有一些疑问: 因此,为了获得一个作为int值的简单对象,我使用queryForObject()方法,将sql stattment和我期望从该方法接收的对象类型传递给它。 好的,这很简单,我认为这是可以的。 2)查询输入到Map对象中的整个表行:因此,如果我不需要单个值(可以在表的特定行的单个列中,或者类似前面的示例),我可以使用q
我们知道主存域很少:年轻的、终生的(旧的gen)和PermGen。 年轻领域分为伊甸园和幸存者(有两个)。 OldGen用于生存的对象。 MaxTenuringThreshold防止对象过早地被最终复制到OldGen空间。这很清楚,也很容易理解。 但是它是如何工作的呢?垃圾回收器如何处理这些在MaxTenuringThreshold之前仍然存在的对象,以何种方式?它们位于何处? 对象被复制回幸存者
我正在学习Spring核心认证,我对Spring如何处理bean生命周期有一些疑问,特别是bean后处理器。 所以我有了这个模式: 我很清楚这意味着什么: 然后在bean创建阶段执行以下步骤: > 每个bean都在缺省情况下被急切地实例化(按照正确的顺序创建,并注入其依赖项)。 在依赖注入之后,每个bean都会经历一个后处理阶段,在这个阶段中可能会进行进一步的配置和初始化。 > 初始化器:如果指示
这是一个简单的错误:我在对象的格式字符串中使用了而不是。但我完全困惑于我的测试结果与错误的格式字符串。 以下代码: @Jan建议依赖toString()方法可能会有问题,所以我定义了一个日期格式,以与上面相同的代码打印。下面是附加输出:
我几乎理解了尾递归是如何工作的,以及它与普通递归之间的区别。我只是不明白为什么它不要求堆栈记住它的返回地址。 在尾递归函数中调用函数本身后没有什么可做的,但对我来说这没有意义。
最近我正在学习Java8个特性,所以我从lambda表达式开始,然后我遇到了Java流API,现在我正在尝试围绕流API中的方法,它们是如何工作的? 我对lambda表达式的理解是,如果我们想将lambda表达式传递给该方法,那么我们需要使用单个未实现的方法(Java 8接口可以有默认实现)创建一个与lambda表达式的签名匹配的接口。然后,传递lambda表达式的方法可以通过调用接口方法来执行l