个人工具

Hello Duke!

Kevin

1. 概述

本文用一个非常简单的例子“helloDuke",介绍如何在 Apusic OperaMasks 下进行应用的开发。"helloDuke" 应用中只有两个页面,分别是:greeting.jsp 和 sameName.jsp。

当你在 greeting.jsp 页面中输入你的名字时,会在同一个页面中显示 "Hello your name" 的字样,如果你输入的名字也叫 "Duke" ,则会导航到 sameName.jsp 页面中,如下图所示。

整个程序的目录结构如下:

helloDuke
--duke.gif
--greeting.jsp
--sameName.jsp
--WEB-INF
--web.xml
--faces-config.xml
--classes
--helloduke
--UserBean.class

下面就让我们来完成此应用。

2. 应用的开发

2.1. greeting.jsp

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<f:view>
<h:form>
<h2>Hello, my name is Duke. What is yours?</h2>
<h:graphicImage url="duke.gif"></h:graphicImage>
<h:outputText value="#{userBean.result}"/><br>
<h:inputText value="#{userBean.name}"></h:inputText>
<h:commandButton value="sayHello" action="#{userBean.sayHello}"/>
</h:form>
</f:view>

上述的 outputText 、 inputText 以及 commandButton 分别绑定了一个 Managed Bean "userBean",下面我们就来声明此 Managed Bean。

3. userBean

package helloduke;

public class UserBean {

private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getResult() {
if(this.name == null || "".equals(name.trim())) return "Please input your name.";
else return "Hello " + name;
}

public Object sayHello() {
if("duke".equalsIgnoreCase(name)) return "duke";
return null;
}
}

在greeting.jsp中,outputText 绑定 userBean 的 result 属性;inputText 绑定 name 属性;commandButton 的 action 绑定 sayHello 方法。在sayHello方法中,当返回 "duke" 字符串时,意味着要导航到其它页面,否则,继续使用此页面。

4. sameName.jsp

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<f:view>
<h2>Hi, we have the same name "Duke"!</h2>
<h:graphicImage url="duke.gif"></h:graphicImage>
<a href="/articles/helloDuke/html_single/greeting.jsp">return</a>
</f:view>

sameName.jsp非常简单,仅仅显示一些文本。

5. faces-config.xml

faces-config.xml 是 JSF 核心配置文件,以下是其详细内容。

<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
version="1.2">
<managed-bean>
<managed-bean-name>userBean</managed-bean-name>
<managed-bean-class>helloduke.UserBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<navigation-rule>
<display-name>greeting</display-name>
<from-view-id>/greeting.jsp</from-view-id>
<navigation-case>
<from-outcome>duke</from-outcome>
<to-view-id>/sameName.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>

在上述文件中,我们声明了 Managed Bean: "userBean",它的生命周期是session级别,并且定义了导航条件:即当从 greeting.jsp 中返回 "duke" 时,则导航到 sameName.jsp。

6. web.xml

由于 JSF 是建立在 JSP/Servlet 基础之上的,因此,我们还需要在 web.xml 中增加为运行 JSF 而必需的一些配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<description>helloDuke</description>
<display-name>helloDuke</display-name>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
</web-app>

7. 部署并运行应用

至此,整个应用已经开发完毕,我们需要将此应用部署在 Apusic应用服务器 5.0 上或者 Tomcat 6.x上。

在 Apusic 5.0 上部署应用请参考 这里

在Tomcat上部署应用需要确保已经将 Apusic OperaMasks 部署到 Tomcat 上,可以参考 这里

然后通过浏览器打开url: http://localhost:6888/helloDuke/greeting.faces ,即可正常访问应用。

8. 高级特性

上文中,我们用的全部是 JSF 标准的、常规的做法,但 Apusic OperaMasks 并不仅仅提供了这些功能,我们还能够做得更多、更好。

8.1. Ajax Enable

在greeting.jsp页面中,当你输入name,点击“sayHello”钮钮,可以观察到,整个页面是重新刷新并加载的。我们现在希望将它变成 Ajax Enabled ,无需更改任何一行代码,只需在 faces-config.xml 中增加如下配置:

<application>
<default-render-kit-id>AJAX</default-render-kit-id>
</application>

然后重新启动应用,你可以发觉,整个应用已经是自然而然的 Ajax Enabled 的应用了。

8.2. Rich Form

目前,整个应用风格是中规中矩的,我们希望改变一下应用的外观,在 web.xml 中增加如下配置:

<context-param>
<param-name>org.operamasks.faces.FORM_RICH</param-name>
<param-value>true</param-value>
</context-param>

重新启动应用,界面风格变成这样:

不是很明显?好吧,让我们将它变成 MaxOS 风格:在 web.xml 中再增加以下参数:

<context-param>
<param-name>org.operamasks.faces.SKIN</param-name>
<param-value>aqua</param-value>
</context-param>

重新启动应用,界面风格变成这样:

8.3. 简化 faces-config.xml

回顾上述开发过程,我们发觉,在开发的过程中,始终要维护 face-config.xml,无疑,这是一件非常琐碎的事情,Apusic OperaMasks 能够带来哪些额外帮助呢?

8.3.1. Managed Bean 的 Annotaiton 声明

看到 faces-config.xml 中 userBean 的声明,让我们想到了什么?对,非常类似于ejb-jar.xml。即然 ejb 3.0 用 Annotation 来取代 xml 的配置,那么为什么 JSF中不能用 Annotation 来取代 faces-config.xml 中的声明呢?这就是 Apusic OperaMasks 带给我们的第一个好处。让我们把 UserBean 改成这样:

import org.operamasks.faces.annotation.ManagedBean;
import org.operamasks.faces.annotation.ManagedBeanScope;

@ManagedBean(name="userBean", scope=ManagedBeanScope.SESSION)
public class UserBean {

private String name;
......
}

然后 ,我们把 faces-config.xml 中 ManagedBean的声明去掉,重新启动应用,应用正常运行。

8.3.2. 隐式导航规则

为了从 greeting.jsp中导航至 sameName.jsp,我们需要在 UserBean的sayHello 方法中返回 "duke",然后还需要在 faces-config.xml 中配置相应的导航规则,事实上,如此一来,将导航规则放置在两个地方,只会影响到用户的注意力,给用户添麻烦而已, 而我们希望能够在一个地方统一指定。如是,我们将 UserBean 改成这样:

import org.operamasks.faces.annotation.ManagedBean;
import org.operamasks.faces.annotation.ManagedBeanScope;

@ManagedBean(name="userBean", scope=ManagedBeanScope.SESSION)
public class UserBean {

private String name;

......

public Object sayHello() {
if("duke".equalsIgnoreCase(name)) return "/sameName.jsp";
return null;
}
}

此使用隐式导航规则,我们还需要在web.xml中增加如下配置:

<context-param>
<param-name>org.operamasks.faces.IMPLICIT_NAVIGATION</param-name>
<param-value>true</param-value>
</context-param>

然后,我们把faces-config.xml 中导航规则的配置去掉,重新启动应用,应用正常运行。

8.4. 更多...

事实上,Apusic OperaMasks 能够带给我们更多,远不止本文中描述的这些特性,就让我们开始 Apusic OperaMasks 之旅吧!

8.5. 参考

本文中的 helloDuke 应用,可以从 这里 直接下载获取。

如果你希望了解如何在 Apusic Studio 中完成 helloDuke 的应用,请点击这里

8.2. Rich Form本地没有实现

张贴人: 时光@timer 2007-08-13 16:52

我按照上面的步骤一步步的做下来的,就是8.2. Rich Form没有实现。 1.按照上述所讲,部署在Apusic 5.0没有添加/lib下的6个.jar包,我手动添加了还是不行 2.在Tomcat6.X下运行时,按钮显示不出来,页面报js错误,说“Ext”和"OM"未定义

Tomcat6.x下按钮不显示的设置

张贴人: 赵家龙 2007-09-08 22:40

原因: 我在Tomcat6.0中运行Duke时,也发现此问题。

解决办法: (可以参见Apusic OperaMasks在Tomcat上的安装与部署) 1。把必要的jar拷贝到Tomcat\bin目录中。

不然会找不到 http://java.sun.com/jsf/html 。 2。一定要在下载代码中的web.xml文件中加入

ResourceServlet org.operamasks.faces.render.resource.ResourceServlet ResourceServlet /_global/*