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%是一些常见问题的解决方案,将在下一章节

介绍。

posted on 2011-12-28 12:35  洛克恩  阅读(591)  评论(1)    收藏  举报