副标题#e#
第七步、编写Action和JSP。在SpringSide 3.1.4.3中,利用的是Struts 2及 其Convention插件,已经不是前面利用的CodeBehind插件了,关于Convention插 件,这里要再说几句,该插件的大部门成果和 CodeBehind沟通,独一让人有点 疑惑的就是该插件到那边寻找Action类的问题,它会按照 struts.convention.package.locators属性的值来抉择,在该项目中,其值为“ web”,之需要查阅一下 struts.xml文件即可知。这说明,Convention会寻找所 有包括“web”这个单词的包,并在该包及其子包中寻找Action类。这也正是 Action层的包名为personal.youxia.web的原因。
关于SpringSide 3种的Struts的探讨,各人可以看看我之前写的一篇文章 SpringSide 3 中的 Struts 2
ArticleAction的实现思路如下,修改index.jsp,使其重定向到 article.action,该Action默认挪用其list要领显示所有文章,并返回 article.jsp作为其视图。在该视图上,有添加文章的毗连,点击该毗连则会见 article!input.action,这时会挪用ArticleAction的input要领,并返回 article-input.jsp作为其视图,在该视图中输入文章的内容,点击生存,挪用 article!save.action,这时会挪用ArticleAction的save要领以生存数据,假如 要删除文章,则挪用 article!delete.action,这时会挪用ArticleAction的 delete要领。在挪用以上要领的进程中,会自动挪用 prepare系列的要领。
因此,该步调涉及到三个JSP文件和一个Action类,它们别离是
index.jsp
article.jsp
article-input.jsp
ArticleAction.java
index.jsp的修改很简朴,只是让项目一启动后就去会见ArticleAction,而 不是默认的UserAction。index.jsp的代码如下:
<% response.sendRedirect("article.action"); %>
这时,重点进入到ArticleAction中,建设该Action,其代码的框架如下:
package personal.youxia.web;
import personal.youxia.entity.entities.Article;
public class ArticleAction extends CrudActionSupport<Article> {
@Override
public String delete() throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public String list() throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
protected void prepareModel() throws Exception {
// TODO Auto-generated method stub
}
@Override
public String save() throws Exception {
// TODO Auto-generated method stub
return null;
}
public Article getModel() {
// TODO Auto-generated method stub
return null;
}
}
#p#副标题#e#
可以看到,该Action从CrudActionSupport类担任,而CrudActionSupport又 担任自ActionSupport,并实现了ModelDriven和Preparable接口,这样Struts 2 的ModelDriven拦截器和Preparable拦截器就会对我们本身的Action产生浸染。 CrudActionSupport中的 excute要领默认的实现是挪用list要领,所以会见 article.action就便是会见ArticleAction的list要领,该要领的目标是为了列 出所有的文章,所以在该要领中利用了ArticleDao的分页查询,查询功效放在一 个page工具中。在Struts 2中,已经没有了ActionForm的观念,可以直接把 Action工具通报到视图中,为了可以或许在视图中会见page工具,只需要把page工具 作为 ArticleAction的一个属性即可。先在ArticleAction.java中插手几行代码 :
@Autowired
private ArticleManager articleManager;
public void setArticleManager(ArticleManager articleManager) {
this.articleManager = articleManager;
}
private Page<Article> page = new Page<Article>(10);
public Page<Article> getPage() {
return page;
}
可以看到该代码的浸染是为了注入ArticleManager和初始化Page工具,此时 list要领的代码就很是简朴,如下:
@Override
public String list() throws Exception {
page = articleManager.getAll(page);
return SUCCESS;
}
#p#分页标题#e#
由于该要领只是简朴获取一个页面的Acticle,所以代码很简朴,利用 articleManager.getAll要领即可。假如要实现巨大的条件查询,就需要建设一 个包括PropertyFilter工具的列表,然后利用articleManager.search要领举办 查询,为了简化 PropertyFilter工具列表的建设,白衣提供了 HibernateWebUtils.buildPropertyFilters()静态要领供各人利用。
list要领返回的是SUCCESS,因此返回给用户的视图页面为article.jsp,该 页面应该存放在WEB-INF目次的content目次中,这也是Convention插件的一个特 性,这样用户就没有步伐直接会见到视图页面了。在该页面中,可以通过会见 page工具来显示数据,如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="/common/taglibs.jsp"%>
<!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><a href="article!input.action">添加文章 </a></td></tr>
<s:iterator value="page.result">
<tr>
<td>${subject}</td>
<td><a href="article!delete.action?id=${id}">删除 </a></td>
</tr>
<tr>
<td>${content}</td>
</tr>
</s:iterator>
</table>
</body>
</html>
假如数据库中有初始数据的话,该项目运行结果如下图:
到今朝为止,还没有涉及到getModel()、prepareModel()、以及prepare系列 的要领,可是,一旦需要添加可能删除文章,这一系列的要领就有浸染了。在 Struts 2中,由于没有了ActionForm的观念,所有的页面传入参数城市被注入到 Action中,假如不想在Action中搞太多的getter和 setter,最有效的要领就是 提供一个Model工具,这时候拦截器会把页面参数注入到Model中,而在今朝的项 目中,没有比Entity类更适合做 Model工具的了。通过调查CrudActionSupport 基类,可以发明只有在执行save和input要领之前,才会执行 prepareModel要领 ,该要领可以担保getModel要领返回的工具不是一个空指针,而挪用delete要领 之前Model工具没有初始化,可是delete要领只需要一个id作为参数,因此,可 以在Action中增加一个id属性来满意要求。这时候,有窜改的几行代码如下:
private Long id;
private Article article;
public void setId(Long id) {
this.id = id;
}
@Override
protected void prepareModel() throws Exception {
if (id != null) {
article = articleManager.get(id);
} else {
article = new Article();
}
}
public Article getModel() {
return article;
}
@Override
public String delete() throws Exception {
articleManager.delete(id);
return RELOAD;
}
这里需要出格存眷的是delete要领返回的值,为RELOAD,这是一个在基类中 界说好了的字符串。返回该字符串的目标,是为了在delete 要领执行完之后, 不返回任何视图页面,而是以redirect的方法再次挪用article.action,以便显 示删除文章后的功效。因此,需要在 ArticleAction中利用@Result注解,如下 :
@Results( { @Result(name = CrudActionSupport.RELOAD, location = "article.action", type = "redirect") })
颠末如上修改,这时候再运行应用,就发明可以或许删除文章了。
再来实现添加文章的成果,从上面的article.jsp中可以看出,添加文章的链 接为article!input.action,此时,会运行 ArticleAction的input要领,该方 法只是简朴返回article-input.jsp视图文件作为用户输入文章的接口, article- input.jsp的代码如下:
#p#分页标题#e#
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
<form id="inputForm" action="article!save.action" method="post">
<table class="inputView">
<tr>
<td>主题:</td>
<td><input type="text" name="subject" size="40" id="subject" /></td>
</tr>
<tr>
<td>内容:</td>
<td><textarea name="content" id="subject"></textarea></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="提交" />
<input type="button" value="打消" onclick="history.back ()"/>
</td>
</tr>
</table>
</form>
</body>
</html>
而ArticleAction中只需要修改如下几行,由于ModelDriven拦截器已经把网 页中传入的数据注入到了article工具中,所以save要领中只需要执行简朴的保 存操纵即可:
@Override
public String input() throws Exception {
return INPUT;
}
@Override
public String save() throws Exception {
articleManager.save(article);
return RELOAD;
}
至于实现文章的修改成果,那也是通过input要领和save要领实现的,只不外 此时网页参数中会包括一个有效的id,而prepare系列的要了解按照该id先从数据库中提取数据,然后显示在article-input.jsp中,用户修改后,再挪用save 要领生存到数据库中。为淘汰本博文长度,该成果此处不做示范。
通过上面的步调可以发明,利用SpringSide 3中推荐的CRUD一体的模式,可 以有效淘汰Action的数量和JSP文件的数量,每实现一个增删查改成果,只需要 一个Action和两个JSP,可是,措施员必然要对个中的数据流向有富裕的认识, 才气理清它们之间的干系,不至于晕头转向。
到这里各人会发明,ArticleAction谁都可以会见,一点都不安详,所以第八 步我会探讨如何让ArticleAction和SpringSecurity一起事情,至于第九步,当 然是把项目从单数据库情况变动到大都据库情况了。详细内容,且看下回解析!