Beehive Page Flow Tutorial
1) 下载并安装Beehive,J2SE5,ANT 1.6.2 和Tomcat5
2) 修改BEEHIVE_HOME下的beehiveUser.cmd,然后运行它以设定一些classpath
3) 在tomcat中增加一个管理员角色(可选)
CATALINA_HOME/conf/tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="role1" password="tomcat" roles="role1"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="manager" password="manager" roles="manager"/>
</tomcat-users>
4) 启动tomcat(可选)
%CATALINA_HOME%/bin/startup.bat或
ant -f %BEEHIVE_HOME%/ant/buildWebapp.xml start
2. 简单应用开发过程
1) 首先保证如下的目录结构,可以从/samples/netui-blank复制过来。
<Project-Folder>
resources
WEB-INF
Controller.jpf
error.jsp
index.jsp
2) 将Runtime JARs复制到相应文件夹,使用ant命令来完成。
ant -f %BEEHIVE_HOME%/ant/buildWebapp.xml -Dwebapp.dir=<project-Folder> deploy.beehive.webapp.runtime
注意:文件夹及文件的名字不能出现除字母数字下划线之外的符号,如” - ”。
3) 创建JSP文件和JPF文件。
4) 编译和配置page flow,保证此时tomcat已经启动。webApp-Blank是webapp名字,而<project-Folder>是webapp的完整路径。
ant -f %BEEHIVE_HOME%/ant/buildWebapp.xml -Dwebapp.dir=<project-Folder> -Dcontext.path=webApp-Blank build.webapp deploy
注意:如果抛出context path already exists错误,要使用ant命令先undeploy application。然后再使用上面的命令重新编译和配置。
ant -f %BEEHIVE_HOME%/ant/buildWebapp.xml -Dwebapp.dir=<project-Folder> -Dcontext.path=webApp-Blank undeploy
5) 对JPF修改后需要重新编译和配置
ant -f %BEEHIVE_HOME%/ant/buildWebapp.xml -Dwebapp.dir=<project-Folder> -Dcontext.path=webApp-Blank undeploy build.webapp deploy
3. 数据提交
1) JSP文件,添加:
<p>
<netui:form action="processData">
<p>Name:<netui:textBox dataSource="actionForm.name"/>
<p>Age:<netui:textBox dataSource="actionForm.age"/>
<p><netui:button type="submit">Submit</netui:button>
</netui:form>
</p>
2) 代表提交表单的JAVA类
创建代表提交表单的java类。当数据提交时,该类被实例化,表单数据被装载到该类的成员中。
可以把它放在/WEB-INF/src/forms下面。
package forms;
public class ProfileForm
{
private int age;
private String name;
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return this.age;
}
}
3) JPF文件,修改如下:
import org.apache.beehive.netui.pageflow.Forward;
import org.apache.beehive.netui.pageflow.PageFlowController;
import org.apache.beehive.netui.pageflow.annotations.Jpf;
import forms.ProfileForm;
@Jpf.Controller
public class Controller extends PageFlowController
{
@Jpf.Action(
forwards={
@Jpf.Forward(name="success", path="index.jsp")
}
)
public Forward begin()
{
return new Forward("success");
}
@Jpf.Action(
forwards={
@Jpf.Forward(name="success", path="page2.jsp")
}
)
public Forward toPage2()
{
return new Forward("success");
}
@Jpf.Action(
forwards = {
@Jpf.Forward(name = "success", path = "page2.jsp")
}
)
public Forward processData(ProfileForm form)
{
System.out.println("Name: " + form.getName());
System.out.println("Age: " + form.getAge());
return new Forward("success");
}
}
4. 数据显示
1) JSP文件
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ taglib uri="http://beehive.apache.org/netui/tags-html-1.0" prefix="netui"%>
<netui:html>
<head>
<title>displayData.jsp</title>
<netui:base/>
</head>
<netui:body>
<p>Name:<netui:span value="${requestScope.data.name}"/>
<p>Age:<netui:span value="${requestScope.data.age}"/>
</netui:body>
</netui:html>
@Jpf.Action(
forwards = {
@Jpf.Forward(name = "success", path = "displayData.jsp")
}
)
public Forward processData(ProfileForm form)
{
System.out.println("Name: " + form.getName());
System.out.println("Age: " + form.getAge());
getRequest().setAttribute("data", form);
return new Forward("success");
}
5. 数据库控制
1) 插入
@SQL(statement="INSERT INTO EMPLOYEE " +
"(id, fName, lName, title) " +
"VALUES ({emp.id}, {emp.fName}, {emp.lName}, {emp.title})")
public void insertEmployee(Employee emp) throws SQLException;
注意:变量名大小写敏感
2) 查询。注意如果返回为整型,一定要返回Integer,而不是int。
l 返回一个值。title的VARCHAR类型决定了方法返回为String
@SQL(statement="SELECT title FROM EMPLOYEE WHERE id={id}")
public String getEmployeeTitle(int id) throws SQLException;
l 返回一条记录。返回类型可以是用户自定义的对象(如下面的Employee),或者java.util.HashMap对象。如果是前者,用户自定义的对象的成员中必须包含该表的所有column,并且保证二者的变量名一一对应。
@SQL(statement="SELECT * FROM EMPLOYEE WHERE id={id}")
public Employee findEmployee(int id) throws SQLException;
public class Employee
{
public int id;
public String fName;
public String lName;
public String title;
}
l 返回多条记录。返回类型可以是一个数组,或者java.util.Iterator,或者java.sql.ResultSet。如果是Iterator,必须定义iteratorElementType。maxRows定义了最多返回的记录数。
@SQL(statement="SELECT * FROM EMPLOYEE ORDER BY lName", iteratorElementType=Employee.class, maxRows=500)
public Iterator getEmployeesSortedByLastName() throws SQLException;
3) 数据控制定义了两个annotation:SQL和ConnectionDataSource。
l SQL annotation定义了查询语句和相关属性。如果返回多条记录,需要定义iteratorElementType。
public @interface SQL
{
String statement() default "";
int maxRows() default MAXROWS_ALL;
@AnnotationMemberTypes.Optional
Class iteratorElementType() default UndefinedIteratorType.class;
}
l ConnectionDataSource annotation定义了数据控制要获取连接的数据源。
public @interface ConnectionDataSource
{
String jndiName(); // no default ... value is required
}
4) 数据控制相关源码位于/samples/controls-db,可以使用ant脚本ant -f %BEEHIVE_HOME%/samples/controls-db/build.xml build创建dbControljar文件(/samples/controls-db/build/)。然后通过把该jar文件放入classpath来创建自己的数据控制扩展。