文章
开发人员:Java
Oracle Workshop 对 Java EE 5 Web 标准的支持学习如何使用 Oracle Workshop for WebLogic 开发 Java EE Web 应用程序。 作者:Andrei Cioroianu 2008 年 8 月发布 在很长的一段时间中,J2EE 看起来是一项强大且复杂的技术。但是,如果花时间对其进行充分了解后,您会发现这是一个用于构建基于组件的可伸缩多层企业应用程序的绝妙解决方案。 Java EE 5 保留了老版 J2EE 的功能,但新版本更为简单且易于使用。本文探讨 Java EE 5 的一些新特性,并指导您使用 Oracle Workshop(以前称为 BEA Workshop)构建一个简单的 Web 应用程序。您将从中学习如何设置 Web 项目、构建基于 JavaServer Faces (JSF) 的表单、定义页面导航规则、创建带批注的会话 EJB、在 JSF 管理的 bean 中使用相关性注入、将应用程序打包到 EAR 文件中以及将其部署到本地或远程 Oracle WebLogic 服务器。 使用 Java EE 5 和 Oracle Workshop 可以简化开发在 Java EE 5 中,JSP 和 JSF 标准通过统一表达式语言进行了更好的集成,这意味着任何自定义 JSP 标记(包括标记文件)现在可在其属性中使用延迟值和方法。几个 JSTL 标记(如 <c:forEach>)支持延迟表达式,且可结合 JSF 组件使用。些外,您可安全地将 JSF 标记和 HTML 内容混合,无需显式地在 Web 页面中使用 <f:verbatim>,因为 JSF 呈现已得到改进,可以为您自动生成那些 <f:verbatim> 组件。 Java EE 的批注可以很好地替代基于 XML 的 EJB 部署描述符,因为在进行更改时您要编辑的文件会更少。此外,EJB 的持久性现在基于普通传统 Java 对象 (POJO) 模型。批注可用于任何基于 Java 的组件中,包括 EJB、Servlet 和 JSF 管理的 bean。 好处是巨大的。例如,如果您需要一个会话 bean,您只需对接口及其实施进行批注。然后,如果您想从 Web 层调用它,可以通过 @EJB 批注将对 EJB 组件的引用注入到 JSF 管理的 bean,并由应用服务器处理衔接。本文的示例应用程序将向您介绍如何实施 JSF 表单,该表单使用辅助 bean 与模拟语言转换服务的 EJB 组件进行交互。 尽管有这些改进,使用文本编辑器编写 Java EE 应用程序代码仍然不是一个明智的选择。幸运的是,现代 Java IDE 可以显著提升开发人员的生产率。Oracle Workshop 是一个优秀的开发工具,它利用许多向导和编辑器对 Eclipse 进行了扩展。它支持最重要的 Java EE 标准,包括 Servlets 2.5、JSP 2.1、JSF 1.2、JSTL 1.2、EJB 3、JAX-WS 和 JAXB 2.0。 Workshop 的一个独特的特性是 AppXRay 技术,它可用于分析众多类型的源文件,包括 Java 类、Web 页面和配置文件。本文将对代码自动完成和验证功能,以及文件浏览和相关性可视化功能( AppXplorer 和 AppXaminer 提供)进行介绍,这些功能所收集的信息可用于改善开发体验。 Web 项目设置本节将向您介绍如何创建和配置 Web 项目。您将使用 Workshop 的 Dynamic Web Project 向导和 JSF 框架的 Faces Configuration 编辑器。 创建 Web 项目单击 File > New > Project...在 New Project 窗口中,展开 Web 节点,选择 Dynamic Web Project。然后单击 Next。 输入 WebPrj 作为名称,保持 Oracle WebLogic Server v10.3 目标运行时不变,使用 Default Configuration for Oracle WebLogic Server v10.3,如要使用 EJB,请选择 Add project to an EAR 复选框,在 EAR Project Name 文本域中输入 EarPrj,然后单击 Next。 在以下页面中,保持默认选项不变,然后单击 Finish。 Workshop 将创建 Web 项目,其中包含一个 WebContent 文件夹,在其中您会发现一个 index.jsp 页面,该页面将请求从 pages 子文件夹转发到 welcome.jsp。您可能希望用 index.jsp 中的 <c:redirect> 替换 <jsp:forward>,以避免 Web 浏览器中的相对 URL 出现问题。 <%@ page language="java" contentType="text/html;charset=UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c:redirect url="/pages/welcome.jsf"/> WEB-INF 文件夹包含配置文件(weblogic.xml、web.xml 和 faces-config.xml),可使用 Workshop 进行编辑。 配置 Web 项目New Project 向导生成的 web.xml 文件已经包含 JSF 配置,如以下清单中所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" ... version="2.5">
<display-name>WebPrj</display-name>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<listener>
<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
<servlet>
<servlet-name>faces</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>faces</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>faces</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>resources.application</param-value>
</context-param>
</web-app>
Oracle WebLogic Server 10g 第 3 版支持 Java EE 5 针对 web.xml 和 faces-config.xml 定义的新标准 XML 模式。如果要更改配置(如添加新上下文参数或 servlet/filter 映射),双击 web.xml 文件,然后右键单击 Deployment Descriptor Elements 列表中的对应项。 如果要编辑 Weblogic 特定选项,双击 weblogic.xml,这些选项分在 6 个选项卡中:General、Libraries、Container、JSP、Security 和 Session。第 7 个选项卡供您查看配置文件的源代码。以下屏幕截图显示了与 JSP 相关的选项。 Web 项目也有一个 src 文件夹,其中的 resources 程序包中含有 application.properties 资源包,该资源包在 faces-config.xml 文件中进行配置。 JSF 配置在 Project Explorer中,展开 WebPrj/ WebContent/ WEB-INF,然后双击 faces-config.xml 文件Workshop 将打开 Faces Configuration 编辑器,您可在其中设置 JSF 组件、转换器、管理的 bean、导航规则、引用的 bean、呈现器工具包以及验证器。现在,为 JSF 页创建并配置辅助 bean。右键单击 Managed Beans,然后单击 New Managed Bean… 在显示的对话框中,输入 backingBean 名称(以小写字母开始),使用默认的 request 范围,选择 New Bean 单选按钮,然后单击 New。 在 New Java Class 窗口中,输入 webprj 程序包、 BackingBean 类名称,添加 java.io.Serializable 接口,然后单击 Finish。 您将返回至 Managed Bean Tag 窗口。单击 Next。 单击向导中的 Add 按钮。 Workshop 将打开 Managed Property Tag 窗口。输入 fromLang 属性名称、 String 类,然后单击 OK。 针对 toLang、 source 和 result 属性重复前面的两个步骤。在 Managed Bean Tag 中,您可以看到四个属性。单击 Finish。 Workshop 的向导会将 <managed-bean> 元素添加至 faces-config.xml 文件中,该文件包含的源代码如下所示。按 Ctrl+S 保存 faces-config.xml。
<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee" ... version="1.2">
<application>
<message-bundle>resources.application</message-bundle>
<locale-config>
<default-locale>en</default-locale>
</locale-config>
</application>
<managed-bean>
<managed-bean-name>backingBean</managed-bean-name>
<managed-bean-class>webprj.BackingBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
</faces-config>
Workshop 还将在 webprj 程序中创建 BackingBean.java 文件,该程序包位于 Java Resources/src 文件夹中。打开该文件,您会看到在 Faces Configuration 编辑器中定义的四个 bean 属性。添加一个公共方法 translateAction(),该方法应当返回 translated 字符串。在本文稍后部分将修改该方法。按 Ctrl+S 保存 BackingBean.java 文件,该文件的源代码如以下清单所示。
package webprj;
import java.io.Serializable;
public class BackingBean implements Serializable {
private String fromLang;
private String toLang;
private String source;
private String result;
public String translateAction() {
return "translated";
}
public String getFromLang() {
return fromLang;
}
public void setFromLang(String string) {
fromLang = string;
}
public String getToLang() {
return toLang;
}
public void setToLang(String string) {
toLang = string;
}
public String getSource() {
return source;
}
public void setSource(String string) {
source = string;
}
public String getResult() {
return result;
}
public void setResult(String string) {
result = string;
}
}
开发 JSF 页面在本节中,您将学习如何使用 Workshop 的 Design Palette、Form Tag 向导和 Smart Editor 为辅助 bean 开发 JSF 表单。您还将学习如何使用 Faces Configuration 编辑器来定义导航规则,然后使用 AppXaminer 来可视化相关性。 创建 JSF 表单如前所述,Web 项目的 WebContent/pages 文件夹中包含一个 welcome.jsp 页面。在 Project Explorer 中双击该文件。您将注意到该 Web 页面使用 <h:outputText> 组件显示一些来自资源包的消息。按住 Ctrl 键,将鼠标移至 welcome.message 上,它将变为一个链接。 如果您单击它,Workshop 的 AppXRay 将让您直接进入 application.properties 文件,您可在其中编辑消息。将它更改为 This is a simple JSF application,然后保存文件。 返回至 welcome.jsp,您会注意到 Design 视图中的变化。展开 Design Palette 中的 JSF HTML 选项卡,将 Form 拖入 welcome.jsp 页,置于 </body> 结束标记前。 Workshop 将打开 Form Tag 向导。单击 Form Bean 旁边的图标。 在 Choose Bean / Property 窗口中,选择 backingBean,然后单击 OK。 返回至 Form Tag 向导,单击 Form Action 域旁边的第二个图标。 在 Choose Method 窗口中,选择 backingBean 的 translateAction() 方法,然后单击 OK。 单击 Form Tag 向导的 Next 按钮。
取消选中 backingBean 的 result 属性,然后单击 Next。 在以下屏幕中,将 fromLang 和 toLang 字段的 Input Type 更改为 Menu。然后,移动列表最后的 source 字段(使用 Down 按钮)将其 Input Type 更改为 Text Area,然后单击 Next。 当到达 Form Tag 向导的最后一页时,单击 Finish。 Workshop 的向导将在 welcome.jsp 页面中添加表单。 定义表单元素的样式类要自定义表单元素的外观,您必须创建一个 CSS 文件。右键单击 WebPrj 的 WebContent 文件夹,单击 New > Other,展开 Web,选择 CSS,然后单击 Next。 输入 style.css 作为文件名,然后单击 Finish。 将以下样式类添加到新建文件中,然后使用 Ctrl+S 保存更改。
.TextAreaClass { background-color: #DDEEFF; border-width: thin; }
.SelectMenuClass { background-color: #DDFFDD; border-width: medium; }
返回至 welcome.jsp 页,展开 Design Palette 中的 HTML,将 Import CSS File 拖放到 Web 页面的 <head> 元素。 在 Choose File 窗口中,选择 style.css 文件,然后单击 OK。 Workshop 将在 Web 页中插入 <link href="../style.css" rel="stylesheet" type="text/css"/> 元素。 使用 Smart Editor 完成表单选择 Web 页的 fromLang 组件,单击 Properties > Smart Editor,向下滚动直到您找到 Items Properties,然后单击 Static Items 旁边的图标。 在 Edit Select Item List 窗口中,添加少许语言并单击 OK。 注意向导如何在 <h:selectOneMenu> 中添加 <f:selectItem> 组件。再次选择 fromLang 组件,选中 Smart Editor 中的 Required。您将看到必要的属性添加到 <h:selectOneMenu> 标记中。 对于同一 fromLang 组件,在 Smart Editor 的 Style Class 中输入 SelectMenuClass。 针对 toLang 组件重复上述步骤。然后,将 required="true" rows="5" cols="40" styleClass="TextAreaClass" 属性添加到 <h:inputTextarea> 组件。注意 Workshop 中页面视图的变化,其中反映了属性的修改。 按 Ctrl+S 保存 welcome.jsp 文件,其源代码如下所示。 <%@ page language="java" contentType="text/html;charset=UTF-8"%> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<f:view>
<f:loadBundle basename="resources.application" var="bundle"/>
<html>
<head>
<title><h:outputText value="#{bundle['welcome.title']}"/></title>
<link href="../style.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<h3><h:outputText value="#{bundle['welcome.heading']}"/></h3>
<p><h:outputText value="#{bundle['welcome.message']}"/></p>
<h:form id="backingBeanForm">
<h:panelGrid columns="3">
<h:outputText value="From Lang:"/>
<h:selectOneMenu id="fromLang" value="#{backingBean.fromLang}"
required="true" styleClass="SelectMenuClass">
<f:selectItem itemLabel="English" itemValue="en"/>
<f:selectItem itemLabel="French" itemValue="fr"/>
<f:selectItem itemLabel="Spanish" itemValue="sp"/>
</h:selectOneMenu>
<h:message for="fromLang"/>
<h:outputText value="To Lang:"/>
<h:selectOneMenu id="toLang" value="#{backingBean.toLang}"
required="true" styleClass="SelectMenuClass">
<f:selectItem itemLabel="English" itemValue="en"/>
<f:selectItem itemLabel="French" itemValue="fr"/>
<f:selectItem itemLabel="Spanish" itemValue="sp"/>
</h:selectOneMenu>
<h:message for="toLang"/>
<h:outputText value="Source:"/>
<h:inputTextarea id="source" value="#{backingBean.source}"
required="true" rows="5" cols="40" styleClass="TextAreaClass"/>
<h:message for="source"/>
</h:panelGrid>
<h:commandButton action="#{backingBean.translateAction}" value="Submit"/>
</h:form>
</body>
</html>
</f:view>
定义导航规则双击 faces-config.xml 文件,激活 Faces Configuration 编辑器,右键单击 Navigation Rules,然后单击 New Navigation Rule… Workshop 将显示 Navigation Rule Tag 向导。单击 Source Page 域的第一个图标。 在 Choose File 窗口中,选择 welcome.jsp 页面,然后单击 OK。 返回至 Navigation Rule Tag 向导,单击 OK。 在 Faces Configuration 编辑器中,右键单击 /pages/welcome.jsp 导航规则,然后单击 New Navigation Case… 在 Navigation Case Tag 窗口中输入 translated 结果,然后单击 Destination Page 域的第二个图标。 展开 WebContent 文件夹,选择 pages,输入 result.jsp 作为文件名,然后单击 Next。 选择 New JSF JSP 并单击 Next。 选择 application 资源包,然后单击 Finish。 返回至 Navigation Case Tag 窗口后,单击 OK。 Workshop 的向导将创建 result.jsp 页,并将以下 <navigation-rule> 元素插入 faces-config.xml。因此,当用户单击 welcome.jsp 页的 Submit 按钮时,JSF 框架将调用 translateAction(),这会返回 translated 结果。然后,HTTP 请求转发至 result.jsp。
<faces-config ...>
<navigation-rule>
<from-view-id>/pages/welcome.jsp</from-view-id>
<navigation-case>
<from-outcome>translated</from-outcome>
<to-view-id>/pages/result.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
打开 result.jsp 页面,添加 <h:outputText> 组件,显示 backingBean.result 属性。下一部分将修改 translateAction() 以调用 EJB 方法,并将返回值存储在辅助 bean 的 result 属性中。
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<f:loadBundle basename="resources.application" var="bundle"/>
<html>
<head>
</head>
<f:view>
<body>
<h3>Translated Result</h3>
<p><h:outputText value="#{backingBean.result}"/></p>
</body>
</f:view>
</html>
单击 File > Save All 保存编辑过的文件,使用 Workshop 的 AppXaminer 实现相关性的可视化。右键单击 AppXplorer 中的 welcome.jsp 页面,然后单击 Show AppXRay Dependencies。 如果您双击任一节点,Workshop 将打开所选的文件。 在 JSF 页面中使用会话 Bean本节将向您介绍如何创建一个通过辅助 bean 从 JSF 页调用其方法的会话 bean。您将学习如何使用 @Remote、 @Stateless 和 @EJB 批注。 创建 EJB 项目单击 File > New > Project...在 New Project 窗口中,展开 EJB 节点,选择 EJB Project。然后单击 Next。 输入 EjbPrj 作为名称,保持 Oracle WebLogic Server v10.3 目标运行时不变,使用 Default Configuration for Oracle WebLogic Server v10.3,选择 Add project to an EAR 复选框,在 EAR Project Name 组合框中选择 EarPrj,然后单击 Next。 在以下页面中,保持默认选项不变,然后单击 Finish。 构建无状态会话 Bean展开 Project Explorer 中的 EjbPrj,右键单击 ejbModule 并从上下文菜单中选择 New > Interface。 输入 ejbprj 作为程序包名称,提供 Translator 接口名称,然后单击 Finish。 在 Translator.java 文件中,导入 javax.ejb.Remote,在接口声明前添加 @Remote 批注,按如下清单所示定义 translate() 方法,然后保存文件。
package ejbprj;
import javax.ejb.Remote;
@Remote
public interface Translator {
public String translate(String fromLang, String toLang, String source);
}
再次右键单击 ejbModule,并从上下文菜单中选择 New > Class。 输入 ejbprj 作为程序包名称,提供 TranslatorBean 类名称,添加 ejbprj.Translator 接口,然后单击 Finish。 在 TranslatorBean.java 文件中,导入 javax.ejb.Stateless,在接口声明前添加 @Stateless 批注,按如下清单所示实施 translate()。
package ejbprj;
import javax.ejb.Stateless;
@Stateless
public class TranslatorBean implements Translator {
public String translate(String fromLang, String toLang, String source) {
return "Translated from " + fromLang + " to " + toLang + ": " + source;
}
}
通过辅助 Bean 与会话 Bean 交互重新打开 Web 项目的 BackingBean.java 文件,导入 ejbprj.Translator 和 javax.ejb.EJB,定义专用的 Translator tr 字段,该字段由 @EJB(name="Translator") 提供批注,在 translateAction() 方法中添加结果 result = tr.translate(fromLang, toLang, source);。
package webprj;
import ejbprj.Translator;
import javax.ejb.EJB;
import java.io.Serializable;
public class BackingBean implements Serializable {
...
@EJB(name="Translator")
private Translator tr;
public String translateAction() {
result = tr.translate(fromLang, toLang, source);
return "translated";
}
...
}
单击 File > Save All 保存编辑过的 Java 文件。 打包与部署本节将向您介绍如何构建 EAR 文件,以及如何使用 Workshop 进行本地和远程部署。通常情况下,在开发和测试期间使用本地部署,当应用程序可用于生产环境时或要向同事或客户展示时进行远程部署,当有其他人处理部署时可以构建一个 EAR 文件。 本地部署右键单击 WebPrj 的 WebContent 文件夹中的 index.jsp 页,单击 Run As > Run on Server,输入服务器的主机名,选择 Oracle WebLogic Server 10.3,然后单击 Next。 确保服务器类型为 Local,选择 Domain Directory,然后单击 Next。 单击 Finish 部署项目,启动 Web 应用程序。 您应当看到应用程序运行于 Workshop 的内嵌 Web 浏览器中。 远程部署如果您想在远程的 WebLogic 服务器上部署应用程序,右键单击 WebPrj 的 WebContent 文件夹中的 index.jsp 页,然后单击 Run As > Run on Server,选择 Manually define a new server,输入服务器的名称,选择 Oracle WebLogic Server 10.3,然后单击 Next。 选择 Remote 服务器类型,输入 Remote Host、 Port、 User 和 Password 信息,然后单击 Next 和 Finish。 导出 EAR 文件如果您想分发应用程序,则需要构建 EAR 文件。使用 Workshop 可以轻松完成创建。右键单击 Project Explorer 中的 EarPrj,单击 Export > EAR File with JSP pre-compilation,提供一个目标 EAR 文件,然后单击 Finish。 结论希望您已了解在 JSF 和 EJB 标准经过改进和简化后,Java EE 开发已变得多么的轻松。使用 Oracle Workshop,您可以通过专门的向导、编辑器、组件选项板和属性表更快地构建和配置应用程序。此外,使用 Oracle Workshop 的 AppXRay 技术,您还可以快速地浏览文件,该技术还提供了代码自动完成和验证特性,从而最大限度地减少了您参考文档的需要,显著降低了开发和测试时间。 Andrei Cioroianu 是 Devsphere 的创始人,该公司主要提供 Java EE 开发和 Web 2.0/Ajax 咨询服务。他自 1997 年开始使用 Java 和 Web 技术,有着 10 多年的解决复杂技术问题和全程管理商业产品、定制应用程序和开源框架的专业经验。您可以通过 www.devsphere.com 的联系人名单联系 Andrei。 |
||||||||||||||||||||||||||||||||||