一、配置JBuilder9开发环境
Struts1.1比Struts1.0功能增强了很多。比如:提供DynaActionForms,可不用编写任何代码创建动态的ActionForm;多应用支持允许定义多个struts-config.xml配置文件等等。但JBuilder 9只直接支持Struts1.0,不直接支持Struts1.1,下面让我们来看看怎样让JBuilder 9支持Struts1.1。
1、获得Struts1.1 首先到Struts网站http://struts.apache.org/下载 jakarta-struts-1.1,具体下载页面为http://archive.apache.org/dist/struts/struts-1.1/,下载的是一个压缩包,将其解压后的整个目录复制到<Jbuilder的安装目录>/extras目录下。
2、在Jbuilder9中添加struts1.1
启动Jbuilder开发环境,选择菜单中的Tools,再选择Configure libraries,接着在Configure Libraries对话框创建一个新的library ,我们命名为Struts1.1,把jakarta-struts-1.1/lib目录下所有的jar添加到新的library里,在library Settings里设置Framework为Struts,点OK,设置完成.
3、接下来看看设置是否成功:
File-->New创建一个web application, 在Web Application wizard的JSP/Servlet frameworks中我们看到了Struts 1.1选择框,设置成功!接下来就可以在JBuilder9里使用Struts1.1开发Web Application了
二、一个简单的Struts Web应用实例
创建一个Struts Web应用有以下几个步骤:
(1) 定义并创建所有视图(Jsp页面)
(2) 创建视图中用到的所有ActionForm,并在struts-config.xml文件中添加ActionForm的配置信息。
(3) 创建应用控制器的组件─Action
(4) 定义视图和控制器之间的关系,也就是修改struts-config.xml文件
(5) 在部署描述符web.xml文件中添加Struts组件的部分。
(6) 运行应用程序
本例将创建一个简单的图书查询的例子,首先创建一个名为library的工程,然后创建一个StrutsLib的WebApplication.
1、创建视图
在File菜单中选择New…,在Object Gallery中选择JavaServerPage,如图,单击Ok按钮,创建一个Jsp页面
创建的Jsp名成为index.jsp,不选择Generate sample bean和Generate error page两项,单击Next按钮,进入如图所示页面。
在Tag Libraries中选择Struts1.1框架的标签库struts-bean、struts-html、struts-logic、struts-template 4项,这样Jbuilder生成一个包含上面4个标签库的Jsp页面。
Index.jsp中含有两个变量bookName和queryResult,具体代码如下:
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %>
<html:html>
<head>
<title>图书查询系统</title>
</head>
<body>
<h1 align="center">图书查询系统</h1>
<h2 align="center">请输入查询信息:</h2>
<html:form method="post" action="/queryBookAction">
<p align="center">书名:<html:text property="bookName"/>
<p align="center"><html:submit property="submit" value="提交"/>
</p>
<p align="center">查询结果:<html:text property="queryResult" size="25"/></p>
</html:form>
</body>
</html:html>
使用这些Struts标签的前提是部署描述符web.xml文件中必须添加引用struts-html.tld应用的内容,该tld文件描述了struts中的所有HTML标签库,Jbuilder会在web.xml文件中自动添加这些内容。
Jbuilder提供了将普通的文件转换成符合struts标准的Jsp页面的工具,使用方法是,在Project Pane中选择要转换的Jsp文件,右击该文件,选择Conversion wizard,按照提示一步一步进行即可。
2、创建模型ActionForm
单击File|New…菜单项,调出Object Gallery,选择Web标签,单击ActionForm,将ActionForm的名称修改为queryBookForm,其他保持默认值不变。如图所示
这里WebApp指定queryBookForm所在的Web应用名,Struts config是指的是本queryBookForm使用的配置文件struts-config.xml。Package指定该queryBookForm所在的包,Base class中的org.apache.struts.action.ActionForm是Struts实现的一个ActionForm的基类,任何ActionForm是Struts都必须继承这个类,单击Next按钮,进入下一步Field definition for ActionForm,如图所示
在这里可以定义ActionForm中的数据成员,方法有两种:
第一种方法是单击Add from Jsp…按钮,然后选择相应的jsp文件,这里我们选择前面创建的index.jsp,Jbuilder会将index.jsp中含有的所有变量加入queryBookForm中。
第二种方法是单击Add…按钮手动添加
单击Next按钮进入下一步Select additional optional,如图所示
这一步是询问用户是否在配置文件struts-config.xml中添加新创建的queryBook的配置信息,选中Add to struts-config.xml复选框,让Jbuilder自动在struts-config.xml文件中添加配置信息。Creat/replace reset() method body选项询问用户是否在queryBookForm中添加reset()方法,该方法用来重置queryBookForm中的数据成员,本例不选择创建该方法,单击Finish按钮完成后,可以看到左边Project pane中的library节点下出现新创建的queryBookForm.java文件。
相应地,Jbuilder在struts配置文件struts-config.xml中自动添加了queryBookForm的配置信息,具体内容如下:
<form-beans>
<form-bean name="queryBookForm" type="library.queryBookForm" />
</form-beans>
这里谈谈<form-beans/>元素,它是<form-bean/>的父元素,它只有一个作用,就是充当<form-bean/>元素的容器,每添加一个ActionForm就要在<form-beans/>下添加一个<form-bean/>子元素。它包含两个属性,name属性指ActionForm这个bean的具体名称,而且struts-config.xml中<action-mapping/>元素要用这个名称将该ActionForm和一个Action绑定,Type属性是指实现这个ActionForm的具体类的名称。
3. 创建Action
这里认为Action属于Struts框架的控制器组件,共同组成控制器的组件还有ActionServlet大多数Struts应用程序含有一个ActionServlet类实现和多个Action类的实现。
单击File|New..菜单项,调出objectGallery,选择web标签。单击Action,选择创建一个新的Action,在Action中填入要创建的Action的名称queryBookAction,其他保持默认值不变,如图所示
这里的Base class是org.apches都要直接继承这个类。单击Next,进入第二步configuration in form action
这里需要用户指定几个struts-config.xml文件中<action/>元素的属性值,Action path是指queryBookAction在网站中的相对路径,它必须以”/”字符开头,是一个必选属性。FormBean name属性指的是queryBookAction所操作的饿数据模型ActionForm的名称,它是一个可选属性,这里选择刚刚创建的queryBookForm,Scope属性用来指定绑定到该Action的有效范围,设定为request,它也是一个可选属性,如果设置为true,则调用ActionForm的validate()方法,该方法的作用是检测提交的ActionForm的数据是否有效。Input Jsp属性是指原来提交数据的页面,设为/index.jsp.出现错误的地方可能有两个,分别是ActionForm或Action,如果出现错误,ActionForm或Action回返回ActionErrors对象,该属性也是可选的。设置完以上属性之后,单击Finish按钮,完成queryBookAction的创建。
双击library节点下创建的queryBookAction.java文件,对该文件进行修改,下面是queryBookAction.java的代码片断
public class queryBookAction extends Action {
public ActionForward execute(ActionMapping actionMapping,
ActionForm actionForm,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) {
/**@todo: complete the business logic here, this is just a skeleton.*/
queryBookForm queryBookForm=(queryBookForm)actionForm;
String bookName=queryBookForm.getBookName();
if ((bookName=="JBuild9") || (bookName.equals("JBuild9"))){
queryBookForm.setQueryResult("Bookfound");
return (actionMapping.findForward("success"));
}
else{
return (actionMapping.findForward("failure"));
}
}
}
从httpServletRequest对象中得到请求中含有的数据,然后对得到的数据进行处理。最后返回一个ActionForward对象给控制器ActionServlet,ActionServlet会把request转发给相应的页面,完成这个动作需要用到return actionMapping.findForward()这个语句。如if语句和else语句中的两条return语句。
这两条语句的意思分别是返回success和failue对应的文件。为了找到对应的文件,还要在struts-config.xml中添加两个forward属性。具体做法是,双击StrutsLib节点下的struts-config.xml,打开该文件,找到下面的内容:
<action-mappings>
<action name="queryBookForm"
type="library.queryBookAction"
input="/index.jsp"
scope="request"
path="/queryBookAction" />
</action-mappings>
将其改为:
<action-mappings>
<action name="queryBookForm"
type="library.queryBookAction"
input="/index.jsp"
scope="request"
path="/queryBookAction" >
<forward name="success" path="/index.jsp"/>
<forward name="failure" path="/error.jsp"/>
</action>
</action-mappings>
注: 1. 在strut1.1中不再支持perform方法了,所以需要将Jbuilder原来自动生成的perform方法更名为execute.
2. 编译structs所遇到的错误及解决方法:
javax.servlet.jsp.JspException: Cannot find ActionMappings or ActionFormBeans collection
后来发现是下面这句少了 "/",也就是<forward>元素的结束符号
<forward name="success" path="/index.jsp">