2.4 - 添加表单:请求重定向
我们有一个产品的列表,但无法注册产品,因此,让我们为添加产品创建一个表单。直接访问jsp页面是很
不好的,所以让我们创建一个空的方法来指向一个jsp页面。
@Resource
public class ProductController {
//...
public void form() {
}
}
那么我们能通过URI:/product/form 来访问,在/WEB-INF/jsp/product/form.jsp中包含如下表单:
<form action="<c:url value='/product/add'/>">
Name: <input type="text" name="product.name" /><br/>
Description: <input type="text" name="product.description" /><br/>
Price: <input type="text" name="product.price" /><br/>
<input type="submit" value="Save" /><br/>
</form>
该表单会使用URI:/product/add 来保存产品,所以我们还需在controller中创建一个保存的方法:
@Resource
public class ProductController {
//...
public void add() {
}
}
看一下输入框的名字:product.name,product.description和product.prict.如果我们接受一个Product类
且命名为product的对象实例作为add方法的参数,VRaptor框架将会用input框中的值自动赋值给
name,description,price字段。product.price字段将会转换成Double类型,该细节将在后面的章节中讲述
。
@Resource
public class ProductController {
//...
public void add(Product product) {
dao.save(product);
}
}
在表单保存成功之后我们一般总是重定向到产品列表页面。要实现这个目标,需要另一个VRaptor组件:
Result。它的责任就是在请求(request)中添加一个属性,转发到不同的视图。为了得到一个Result实例我
们需要在add方法中添加一个Result参数:
@Resource
public class ProductController {
public ProductController(ProductDao dao,Result result) {
this.dao = dao;
this.result = result;
}
}
可以使用下面的方法将请求重定向到列表页面:
result.redirectTo(ProductController.class).list();
这段代码可以理解为:作为一个结果,重定向到ProductController中的list方法。所有的重定向配置都是
100%的java代码,没有使用字符串!因此你不需要担心配置文件。而且当你需要改动list方法名称的时候
,IDE会自动把你整个应用程序中使用该方法的地方都修改掉。
public void add(Product product) {
dao.add(product);
result.redirectTo(ProductController.class).list();
}
你能在后面视图和Ajax章节中深入理解。
2.5 - 如何验证
我们不应该往我们的系统中添加一个没有名字的产品,或者一个价格为负数的产品。所有我们在保存产品
之间,需要对产品的信息进行检验比如产品的名字和价格。如果为校验通过,将重回新增产品的页面并现
实错误消息。
VRaptor的Validator组件实现了这个功能。因此你将改进Controller中的构造方法:
@Resource
public class ProductController {
public ProductController(ProductDao dao,Result result,Validator validator) {
//...
this.validator = validator
}
public void add(Product product) {
validator.checking(new Validations() {
that(!product.getName().isEmpty(),"product.name","name.empty");
that(product.getPrice()>0,"product.price","price.invalid");
});
validator.onErrorUsePageOf(ProductController.class).form();
dao.add(product);
result.redirectTo(ProductController.class).list;
}
}
仔细阅读上面这段校验代码,它需要保证产品的名字不能为空,且产品的价格大于0。如果未通过,则返回
到新增产品页面。因此,如果产品的名字为空,则"name.empty"信息将会添加到"product.name"字段中。
错误信息能用下面的代码获取:
<c:forEach var="error" item="errors">
${error.category} &{error.message}</br>
</c:forEach>
到目前为止,你已经能处理应用程序中90%的问题。剩下的10%是一些常见问题的解决方案,将在下一章节
介绍。
浙公网安备 33010602011771号