使用WebCenter和JDeveloper开发Portlet.docx
- 文档编号:8693379
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:14
- 大小:300.20KB
使用WebCenter和JDeveloper开发Portlet.docx
《使用WebCenter和JDeveloper开发Portlet.docx》由会员分享,可在线阅读,更多相关《使用WebCenter和JDeveloper开发Portlet.docx(14页珍藏版)》请在冰豆网上搜索。
使用WebCenter和JDeveloper开发Portlet
使用WebCenter和JDeveloper开发JSFPortlet
Web入口(portal)程序是一些在单独页面上的独立Web组件的集合。
这些可插拔的用户接口组件,被称为portlets。
它们被用来处理请求和在portlet容器中产生动态内容。
由于portlets可以从不同的数据源获得数据,因此,一个入口程序可以用一个统一的界面(这个界面的数据将来自不同的,互相割裂的数据源)为用户提供交互界面。
对于Java开发人员来说,JavaPortlet规范(JPS)将会帮助他们来建立和使用portlets组件。
这个规范是基于JSR168和基于WebServices的远程Portlets(WSRP)标准的。
事实上,Oracle已经在它的Java开发工具----OracleWebCenter框架中提供了对这个标准的支持,这个开发框架可以开发JSF程序,并且在其中集成了基于ADF-based的Oracle框架。
开发人员可以在其中使用内嵌AJAX组件和portlets来建立JSF应用程序。
Oracle最新的OracleJDeveloper10IDE中WebCenter预配置版本OC4J,这个版本将提供一个JSR168标准的portlet容器,可以使用它来开发基于WSRP1.0/WSRP2.0标准的portlets。
开发人员可以在JDeveloper10中建立portlet应用程序,并可使用WebCenter框架或任何支持JSR168标准的容器来发布程序。
最后,开发人员可以使用应用程序或入口程序来通过注册一个WSRP生产者(producer)来运行WebCenter或其它入口程序中的portlet。
本文将带领读者开发一个基于JSR168和WSRP2.0规范的JSFportlet,并在WebCenter框架中来运行它。
这个portlet将使用Oracle数据源和数据表。
一、建立开发环境
首先我们得安装Oracle10g数据库(包括例子数数库),并选择建立Oracle数据库实例,ORCL,以及使用SQL*Plus或其他的SQL运行工具来执行如下的SQL以建立本例要使用的数据表:
CREATETABLEOE.Catalog(IDVARCHAR(25)
PRIMARYKEY,JournalVARCHAR(25),PublisherVARCHAR(25),
EditionVARCHAR(25),TitleVarchar(255),AuthorVarchar(25));
INSERTINTOOE.CatalogVALUES('catalog1','OracleMagazine',
'OraclePublishing','May-June2006','TuningYourViewObjects','SteveMuench');
INSERTINTOOE.CatalogVALUES('catalog2','OracleMagazine','OraclePublishing','July-August2006','EvolvingGridManagement','DavidBaum');
INSERTINTOOE.CatalogVALUES('catalog3','OracleMagazine','OraclePublishing','July-August2005','TuningUndoTablespace','KimberlyFloss');
二、建立一个JSFPortlet
在这部分,我们将使用Oracle数据库作为数据源建立一个JSF应用程序,然后将这个JSF程序转换为portlet。
这个JSF应用程序由一个使用SQL查询动态产生的DataTable组成。
首先,在JDeveloper中选择File->New建立一个JDeveloper工程,然后使用在NewGallerywizard中的General->Application。
指定一个工程名后,选择WebCenter应用程序作为应用程序模板。
在建立完WebCenter工程后,所有的数据和资源都会在如图1的ApplicationsNavigator中显示出来。
这个应用程序由用于建立portlet的Portlets工程和用于建立JSF视图页的ViewController工程组成,portlets可以在这个工程中被嵌入。
图1.WebCenter工程效果图
在这里我们将使用WebCenter框架中的JSF-Portlet桥来编写JSF应用程序,这就意味着JSF应用程序将是基于JSR168portlets的。
我们可以选择Tools->Project项来加入JSF-Portlet桥所需的库。
我们还需要加入ADFFaces运行时库和OracleJDBC库。
接下来,我们将使用如下的步骤在WebCenter框架中实现和发布JSF应用程序:
1.在"ApplicationsNavigator"中选择Portlets工程,并选择File->New
2.在新Gallery模板中,选择Categories中的WebTier->JSF,然后选择JSFJSP项,单击OK。
3.当JSFJSP模板启动后,单击Next,选择J2EE1.4作为Web应用程序的版本,然后再次单击Next。
4.指定input.jsp作为文件名后,单击Next。
5.在一个新的管制Bean中选择AutomaticallyExposeUIComponents,并指定PortletBean作为类名,然后单击Next。
6.选择默认的tag库,JSFCore1.0和JSFHTML1.0,然后单击Next。
7.选择默认的HTML选择,然后单击Next。
8.单击Finish按钮后,在Portlets工程中建立一个JSF页(也就是input.jsp)和一个faces-config.xml发布文件。
下面我们来建立一个portlet。
一个portlet需要一个portlet.xml文件,因此,我们按如下步骤在Portlets工程中加入一个portlet.xml文件。
1.选择File->New
2.在NewGallerywizard中,从Catagories菜单中选择FilterBy->AllTechnologiesandselectGeneral->DeploymentDescriptors
3.选择portlet.xml,并单击OK
图2显示了我们的JSFportlet应用程序的目录结构。
图2JSFPortlet应用程序的目录结构
现在,我们准备在应用程序中加入JSF组件。
在ComponentPalette中,选择JSFHTML,并将以下内容加入到input.jsp页中:
1.一个输出标签
2.一个输入文本字段
3.一个命令按钮
4.一个数据表
在JSF页中的文本字段指定一个SQL查询。
当一个用户单击建立数据表命令时,PortletBean.java类中的commandButton_action方法被调用,然后一个数据表被动态地创建。
PortletBean.java中的部分代码如下:
packageportlet.backing;
......
publicclassPortletBean{
........
publicStringcommandButton_action(){
ResultSetrs=null;
try{
InitialContextinitialContext=newInitialContext();
javax.sql.DataSourceds=
(javax.sql.DataSource)initialContext.lookup("java:
comp/env/jdbc/OracleDBConnectionDS");
java.sql.Connectionconnection=ds.getConnection();
Statementstmt=
connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs=stmt.executeQuery((String)inputText1.getValue());
dataTable1.setBorder(5);
dataTable1.setCellpadding("1");
dataTable1.setVar("catalog");
HtmlOutputTextheaderComponent1=newHtmlOutputText();
headerComponent1.setId("headerComponent1");
headerComponent1.setValue("CatalogId");
column1.setHeader(headerComponent1);
HtmlOutputTextheaderComponent2=newHtmlOutputText();
headerComponent2.setId("headerComponent2");
headerComponent2.setValue("Journal");
column2.setHeader(headerComponent2);
HtmlOutputTextheaderComponent3=newHtmlOutputText();
headerComponent3.setId("headerComponent3");
headerComponent3.setValue("Publisher");
column3.setHeader(headerComponent3);
HtmlOutputTextheaderComponent4=newHtmlOutputText();
headerComponent4.setId("headerComponent4");
headerComponent4.setValue("Edition");
column4.setHeader(headerComponent4);
HtmlOutputTextheaderComponent5=newHtmlOutputText();
headerComponent5.setId("headerComponent5");
headerComponent5.setValue("Title");
column5.setHeader(headerComponent5);
HtmlOutputTextheaderComponent6=newHtmlOutputText();
headerComponent6.setId("headerComponent6");
headerComponent6.setValue("Author");
column6.setHeader(headerComponent6);
HtmlOutputTextcolumn1Text=newHtmlOutputText();
column1Text.setId("htmlOutputText1");
ValueBindingvb=
FacesContext.getCurrentInstance().getApplication().createValueBinding("#{catalog.ID}");
column1Text.setValueBinding("value",vb);
column1.getChildren().add(column1Text);
HtmlOutputTextcolumn2Text=newHtmlOutputText();
column2Text.setId("htmlOutputText2");
vb=
FacesContext.getCurrentInstance().getApplication().createValueBinding("#{catalog.JOURNAL}");
column2Text.setValueBinding("value",vb);
column2.getChildren().add(column2Text);
HtmlOutputTextcolumn3Text=newHtmlOutputText();
column3Text.setId("htmlOutputText3");
vb=
FacesContext.getCurrentInstance().getApplication().createValueBinding("#{catalog.PUBLISHER}");
column3Text.setValueBinding("value",vb);
column3.getChildren().add(column3Text);
HtmlOutputTextcolumn4Text=newHtmlOutputText();
column4Text.setId("htmlOutputText4");
vb=
FacesContext.getCurrentInstance().getApplication().createValueBinding("#{catalog.EDITION}");
column4Text.setValueBinding("value",vb);
column4.getChildren().add(column4Text);
HtmlOutputTextcolumn5Text=newHtmlOutputText();
column5Text.setId("htmlOutputText5");
vb=
FacesContext.getCurrentInstance().getApplication().createValueBinding("#{catalog.TITLE}");
column5Text.setValueBinding("value",vb);
column5.getChildren().add(column5Text);
HtmlOutputTextcolumn6Text=newHtmlOutputText();
column6Text.setId("htmlOutputText6");
vb=FacesContext.getCurrentInstance().getApplication().createValueBinding("#{catalog.AUTHOR}");
column6Text.setValueBinding("value",vb);
column6.getChildren().add(column6Text);
ResultSetDataModeldataModel=newResultSetDataModel();
dataModel.setWrappedData(rs);
dataTable1.setValue(dataModel);
}catch(SQLExceptione){
System.out.println(e.getMessage());
}catch(javax.naming.NamingExceptione){
System.out.println(e.getMessage());
}
returnnull;
}
}
在输入文本框中被指定的SQL查询在commandButton_action方法中运行,并为数据表产生一个结果集。
下面将显示input.jsp的全部代码:
<%@pagecontentType="text/html;charset=windows-1252"%><%@tagliburi="prefix="f"%><%@tagliburi="prefix="h"%> view> formid="form1"> outputLabelvalue="SQL"binding="#{backing_input.outputLabel1}" id="outputLabel1"/> inputTextid="inputText1"binding="#{backing_input.inputText1}"/> commandButtonid="commandButton1"value="CreateDataTable" binding="#{backing_mandButton1}" action="#{backing_mandButton_action}"/> dataTableid="dataTable1"rows="5"binding="#{backing_input.dataTable1}"> columnid="column1"binding="#{backing_input.column1}"/> columnid="column2"binding="#{backing_input.column2}"/> columnid="column3"binding="#{backing_input.column3}"/> columnid="column4"binding="#{backing_input.column4}"/> columnid="column5"binding="#{backing_input.column5}"/> columnid="column6"binding="#{backing_input.column6}"/> dataTable> form>
view>
接下来我们应为每一个动态JSP组件指定一个ID。
如果我们不这么做,JSF框架将在portlet标记中产生重复的ID,当portlet运行时会产生以下错误:
DuplicatecomponentID…foundinview.
AninternalerrorhasoccurredinmethodgetMarkup()
编辑web.xml和portlet.xml文件,在web.xml中加入以下context-param结点:
在web.xml中加入以下ADFFacesfilter过滤器:
按着如下步骤编辑portlet.xml文件:
1.使用
2.指定一个portlet类oracle.portlet.server.bridges.jsf.FacesPortlet
3.为默认页指定一个结点
代码如下:
4.为BridgeLifecycleListenerslistener类指定一个
oracle.portlet.server.bridges.jsf.adf.ADFFacesBridgeLifecycleListener
下面将显示portlet.xml文件的完整内容:
xmlversion="1.0"encoding="UTF-8"standalone="yes"?
> xsi: schemaLocation=" xmlns: xsi="http: //www.w3.org/2001/XMLSchema-instance" xmlns=" oracle.portlet.server.bridges.jsf.adf.ADFFacesBridgeLifecycleListener
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 WebCenter JDeveloper 开发 Portlet