
开发人员:Java


Oracle JDeveloper 10g 与 ADF
示例代码






作者:Andrei Cioroianu
了解如何建立一个 Java 企业版应用程序,以对 Web 层使用 Ajax、JavaServer Faces 和 ADF Faces,对业务逻辑使用 EJB3。
2007 年 3 月发布
企业应用程序可以使用 Ajax 提供更好的 Web 界面,从而提升客户的制造效益。在许多状况下,可以提交部分完成的字段以从服务器应用程序获得有用信息。例如,服务器可以执行一些初期验证,也可以使用个别客户输入来建议空白表单域的值,从而推动数据输入过程的速度。Ajax 还可用于连接数据馈送,显示其信息但不刷新整个页面。
在本文中ejb3 programmer guide,我们将介绍一个简单应用程序,它包括一个使用 Ajax 连接到 ad 馈送的 Web 页面。用户键入提交到一个控制器 servlet,该 servlet 调用一个 EJB 组件的业务技巧来选取个性化的 ad。该业务方式使用 DHTML 返回一个在 JSP 页面中用于生成 Ajax 响应的实体,然后将该实体插入 Web 页面中。下图展现了应用程序的体系结构:

图 1
我将使用 Oracle JDeveloper 向导建立应用程序的模块和用户界面。您将知道怎么建立实体、会话 bean、Ajax 控制器 servlet、生成 Ajax 响应的 JSP 页面,以及基于 ADF Faces 的 JSF 表单。在本文的最终一部分,您将看到可用于建立、初始化和删除 XMLHttpRequest 对象的可重用的 JavaScript 函数。您还将学习一些 Ajax 技巧,如使用回调包装、使用 Ajax 提交表单数据,以及在 Web 浏览器中避免内存泄漏。
在本部分中,我将使用 JDeveloper 的 EJB 向导建立一个简单的实体和一个 EJB 会话模块,该插件的业务方式将借助 Ajax-EJB 控制器从一个 Ajax 客户端进行调用。启动 JDeveloper 并建立一个新的名为ajaxejb 的项目。
在Applications 导航器中,右键点击新构建的项目并单击New。在New Gallery 窗口的右侧面板中,展开Business Tier 节点并选取EJB。然后,在该窗口的左侧面板中选取Entity (JPA/EJB 3.0) 并单击OK:

图 2
跳过Create JPA/EJB 3.0 向导的 Welcome 页面,提供AdEntity 作为Entity Class 的名称。该向导还将修改Entity Name 域:

图 3
该向导的下一步允许您选取一个继承选项。我们将No inheritance 用于这第一个示例:

图 4
第三步允许您输入一个表名,选择一个模式并提供实体的超类:

图 5
第四步允许您设置默认 id field 和 version field。在本例子中,取消选中Include @Version field 选项,将@Id field 的名称变更为keyword,并为keyword 域选择String 类型:

图 6
单击Next 查看该实体的选取选项,然后点击Finish。JDeveloper 将在Application Sources 文件夹的ajaxejb 程序包中创建AdEntity:

图 7
现在,您可以使用 JDeveloper 的向导向该实体添加新的域和方式。在Structure 导航器中,右键点击Fields 并单击New Field。提供域的名称,选择其类别并单击OK:


图 8
添加url 域以后,重复同样的过程添加另一个名为content 的域。下面是AdEntity 的源代码:
package ajaxejb;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
@Entity
@NamedQuery(name = "AdEntity.findAll",
query = "select o from AdEntity o")
public class AdEntity implements Serializable {
@Id
private String keyword;
public String url;
public String content;
public AdEntity() {
}
public String getKeyword() {
return keyword;
}
public void setKeyword(String keyword) {
this.keyword = keyword;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
在下面子部分中,我将介绍怎么建立一个使用AdEntity 的无状况会话 bean。
在Applications 导航器中,右键点击ajaxejb 项目并单击New。在New Gallery 窗口的右侧面板中,展开Business Tier 节点并选取EJB。然后,在该窗口的左侧面板中选取Session Bean (EJB 1.1/2.x/3.0) 并单击OK:

图 9
跳过Create Session Bean 向导的 Welcome 页面,提供AdSession 作为 EJB 的名称,选择Stateless 会话类型,选择Container 事务类型,您可以选取指示 JDeveloper 来Generate Session Facade Methods:

图 10
接下来,您可以借助外观选择要公开的方式:

图 11
第三步允许您输入 bean 类的名称。输入ajaxejb.AdSessionBean 并单击Next:

图 12
第四步允许您选取 EJB 将实行的接口。可以使用本地接口ejb3 programmer guide,因为我们将使用单个 OJ 实例在 JDeveloper 中测试实例应用程序。然而在制造环境中,我们也许期望使用专用的 ad 服务器(也可以是一个集群)来运行会话 bean。调用 bean 的步骤的控制器 servlet 可以部署在多台 Web 服务器上,也可用于不同的 Web 应用程序中。通过指示 JDeveloper 生成一个名为ajaxejb.AdSession 的Remote Interface,我们一直无法借助 JDeveloper 的嵌入式 OJ 服务器运行实例应用程序,并且在制造环境中带有最大的灵活性。然而,如果我们坚信我们期望将会话 bean 和控制器 servlet 部署在同一台服务器上,本地接口将提供更好的性能。也可以在同一个 bean 中同时推进远程和本地接口。在本实例中,我们将仅实施远程接口:

图 13
单击Next 查看该会话 bean 的选取选项,然后点击Finish。JDeveloper 将在Application Sources 文件夹的ajaxejb 程序包中创建AdSessionBean:

图 14
我们以后使用 JDeveloper 提供的向导添加一个名为selectAd() 的业务方式。在Structure 导航器中,右键点击Methods 并左击New Method。在Bean Method Details 对话框中,输入selectAd 方法名,选择ajaxejb.AdEntity 返回类型,输入String userInput 参数并点击OK:

图 15
JDeveloper 将更新AdSession 接口和AdSessionBean 类。下面是AdSession 接口的源代码:
package ajaxejb;
import java.util.List;
import javax.ejb.Remote;
@Remote
public interface AdSession {
Object mergeEntity(Object entity);
Object persistEntity(Object entity);
List<adentity> queryAdEntityFindAll();
void removeAdEntity(AdEntity adEntity);
AdEntity selectAd(String userInput);
}
JDeveloper 生成的AdSessionBean 类包括会话外观方法,后面跟着一个selectAd() 方法:
package ajaxejb;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless(name="AdSession")
public class AdSessionBean implements AdSession {
@PersistenceContext(unitName="ajaxejb")
private EntityManager em;
public AdSessionBean() {
}
public Object mergeEntity(Object entity) {
return em.merge(entity);
}
public Object persistEntity(Object entity) {
em.persist(entity);
return entity;
}
/**
select o from AdEntity o */
public List<adentity> queryAdEntityFindAll() {
return em.createNamedQuery("AdEntity.findAll").getResultList();
}
public void removeAdEntity(AdEntity adEntity) {
adEntity = em.find(AdEntity.class, adEntity.getKeyword());
em.remove(adEntity);
}
public AdEntity selectAd(String userInput) {
...
}
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-121815-1.html
到处流窜
他自己说的