简单,你只需要实现ModelDriven 接口(即实 现getModel()方法)就可以了,确保ModelDrivenInterceptor 拦截 器已作用于action。
除了会调用action中的setter外,model 首先检查是否有和 setter可以匹配当前的attribute名。如果在model中没有这个 attribute相应的setter,则会再在action上找相应的setter来设 值。
在BlogAction 的例子中我们可以看到如何很灵活地使用这些方 法,首先通过prepare() 方法根据Id获取相应的 Blog model object 或新建一个instance, 然后再根据把request中相应的属性 注入Blog instance中和action中。
以上的两个功能使得现在调用action那么简单 - 调用具体的业 务逻辑,和把数据设在HttpServletRequest供返回用。
public class BlogAction extends ActionSupport
implements ModelDriven, Preparable, ServletRequestAware ...{
private int blogId;
private Blog blog;
private BlogService service = new BlogService();
private HttpServletRequest request;
public void setServletRequest(HttpServletRequest httpServletRequest) ...{
this.request = httpServletRequest;
}
public void setId(int blogId) ...{
this.blogId = blogId;
}
public void prepare() throws Exception ...{
if( blogId==0 ) ...{
blog = new Blog();
} else ...{
blog = service.findById(blogId);
}
}
public Object getModel() ...{
return blog;
}
public String save() ...{
service.create(blog);
return SUCCESS;
}
public String update() ...{
service.update(blog);
request.setAttribute("blog",blog);
return SUCCESS;
}
public String remove() ...{
service.delete(blogId);
return SUCCESS;
}
public String execute() ...{
request.setAttribute("blog",blog);
return SUCCESS;
}
}
将Struts应用迁移到Struts 2(二)(5)
时间:2011-03-24
最后就是说说 list这个用例了。它同样需要访问 HttpServletRequest对象去返回数据给JSP,所以也需要实现 ServletRequestAware 接口。但是,因为它并不需要任何输入值, 所以就不需要实现其他的接口了。以下是它的具体实现:
public class ListBlogsAction extends ActionSupport implements ServletRequestAware ...{
private BlogService service = new BlogService();
private HttpServletRequest request;
public void setServletRequest(HttpServletRequest httpServletRequest) ...{
this.request = httpServletRequest;
}
public String execute() ...{
request.setAttribute("bloglist",service.list());
return SUCCESS;
}
}
这样就完成了我们该实现的action代码了。 在下 一篇文章中,当我们新的Struts2用户界面结合时,我们还会进一 步简化action的代码。
在我们调用action之前,我们必须通过XML配置文件去配置它们 。
在Struts中, 我们习惯用在WEB-INF 目录的"struts- config.xml"配置文件,在这里我们需要配置action form和action 属性。在Struts2中, 用的是在classpath中的"struts.xml"配置 文件, 它看起来好象会稍微复杂一些,因为它需要在配置action 的同时也配置其拦截器。
在Struts中配置 form-beans 节点很容易, 只需要一个唯一的 名字,还有就是继承ActionForm类的class作为type。
<struts-config>
<form-beans>
<form-bean name="blogForm"
type="com.fdar.articles.infoq.conversion.struts.BlogForm"/ >
</form-beans>
...
</struts-config>
在我们的例子中,我们的配置 文件有3点不 |