http://dev2dev.bea.com.cn/techdoc/wlportal/200312115.html要进一步了解WebLogic Workshop方面的信息,请参照我们WebLogic Workshop FAQ。
1. 在页面流流视图中,为什么看不到由外部页面(即不属于当前页面流目录的页面)引发的动作?
2. 在WebLogic Express上,可以部署使用Java页面流(JPF)和NetUI标签库的web应用吗?
3. 页面流何时被销毁?
4. 如何访问被嵌套页面流的父(嵌套)页面流?
5. 一个JSP页面与定义消息源的JPF文件不在同一个文件夹下,该JSP如何使用此JPF中<netui:error>元素中的消息源?
6. Workshop 8.1支持Strut的DynaValidatorForm吗?
7. 如何为使用排序服务的网格设置初始排序?
8. 如何指定<netui:imageButton>元素中的“action”参数?
9. 在JSP中使用控件时,如何为其指定属性?
10. 为什么存在允许我们使用pageContext.getAttribute和pageContext.setAttribute的<netui:GetData>标签,却不存在类似的<netui:SetData>标签?
11. 如何将动态数据传递给<netui:methodParameter>标签?
12. 如何使第三方或特定于应用的标签库出现在IDE 选项板(Pallette)窗口中?
13. 当在netui-data:repeater中嵌套netui-data:repeater时,如何能够访问最内部repeater中的外部项的属性?
14. 有没有办法将NetUI标签中的XScript表达式绑定到jsp页面中的局部变量?
15. JSLT与XScript之间有什么关系?
16. NetUI的pageContext数据绑定作用域与javax.servlet.http.PageContext属性映射之间有什么关系?
17. 如何对NetUI标签库中的各种标签加以分类,以使其更好理解?
18. 页面流支持Struts Tiles吗?
19. 在页面流数据绑定作用域内,我能够使用的各种可用属性有哪些?
20. 如何从当前页面流的JSP中调用不同页面流中的动作?
问:在页面流流视图(PageFlow View)中,为什么看不到由外部页面(即不属于当前页面流目录的页面)引发的动作?
答:为了使页面流流视图(PageFlow View)看起来更加一目了然,Workshop在流视图中显示了对外部页面(不属于当前页面流目录的页面)的引用,但是没有显示任何由这些外部页面引发的动作。要查看由外部页面引发的动作,您需要在与相应页面所在的目录中打开页面流的流视图。
问:在WebLogic Express上,可以部署使用Java页面流(JPF)和NetUI标签库的web应用吗?
答:答案是肯定的,使用JPF和NetUI标签库的web应用可以被用在WebLogic Express(WLX)上。然而,您不能在WLX上使用控件,因为它们使用了EJB和/或JMS。在Service Pack 2上,页面流和NetUI标签库将能够以一种独立于平台的方式为servlet容器(而不仅仅是WebLogic服务器)上的运行时部署所用。
问:页面流何时被销毁?
答:页面流被销毁的时候是:
a. 流移动到不同的、不可嵌套的页面流时
b. 被嵌套的页面流返回到嵌套它的页面流时
c. 当会话超时并被销毁时。当前Http会话的生存期是页面流能够具有的最长生存期。
注意,这里有一点很重要,即任何被嵌套的页面流都隐藏在嵌套页面流的“栈”中,并且对于当前被嵌套的页面流来说,无需返回到嵌套它的页面流,即可转到外部页面流(从而销毁了嵌套页面流的整个栈)。
问:如何访问被嵌套页面流的父(嵌套)页面流?
答:您可以使用下列方法从被嵌套的页面流中访问嵌套页面流。
PageFlowController parentPageFlow = PageFlowUtils.getNestingPageFlow(getRequest()); |
如果函数
"PageFlowUtils.getNestingPageFlow( getRequest() )" |
返回null,这就意味着被嵌套的页面流是被直接调用的,而不是通过父页面流调用的。
问:一个JSP页面与定义消息源的JPF文件不在同一个文件夹下,该JSP如何使用此JPF中<netui:error>元素中的消息源?
答:如果您正在JSP中引用的消息源被定义为“test”文件夹(位于web项目的根目录下)中页面流的默认消息源,那么通过在“bundle”名称之前添加其后带有文件夹名称的“org.apache.struts.action.MESSAGE”前缀,您可以像下面这样使用<netui:error>元素:
<netui:error bundle="org.apache.struts.action.MESSAGE/test"
value="myerror"></netui:error> |
或者
<netui:errors bundle="org.apache.struts.action.MESSAGE/test" </netui:errors> |
如果您已经在页面流中使用“err”键定义了消息源,如下所示:
* @jpf:message-resources key="err" resources="validation.test.Errors" |
您需要将“org.apache.struts.action.MESSAGE”字符串替换为键值,如下所示:
<netui:error bundle="err/test" value="myerror"></netui:error> |
问:Workshop 8.1支持Struts的DynaValidatorForm吗?
答:Workshop 的8.1版本不支持Struts的DynaValidatorForm。
问:如何为使用排序服务的网格设置初始排序?
答:在版本8.1中,SortFilterService不支持设置过滤器的初始排序。您始终可以在JPF中手动创建一个排序,或者在RowSet控件上的SQL中使用静态的WHERE或ORDER BY子句。关于这些方法惟一的限制是,当为页面添加书签时,排序与过滤器不会反映在所使用的URL中。
问:如何指定<netui:imageButton>元素中的“action”参数?
答:<netui:imageButton>元素不支持“action”参数。它总是前移到与表单相关的默认动作。您可以使用<netui:imageAnchor>元素作为代替,如下所示:
<netui:imageAnchor border="0" action="foo" src="/foo/bar.gif" width="68" height="24"/> |
问:在JSP中使用控件时,如何为其指定属性?
答:不幸的是,当前版本不支持这种行为。但存在其他两种选择:
1. 执行页面流中控件的方法,并将结果存放于request及动作表单中传递给相应的页面。
2. 使用callControl标签的控制属性中的表达式,直接绑定到一个控件,该控件在页面流中被公开为如下形式:
<netui-data:callControl controlId="{pageFlow.myDatabaseControl}" ... /> |
接下来,您可以使用页面流中控件实例上的注解。
问:为什么存在允许我们使用pageContext.getAttribute和pageContext.setAttribute的<netui:GetData>标签,却不存在类似的<netui:SetData>标签?
答:getData标签的作用是,允许JSP作者针对由于数据绑定而产生的对象书写scriptlet。我们不提供setData标签,因为我们要使程序设计模型和工具继续支持它,使其专注于在页面流中添加业务/状态维护逻辑。任何对(session|request).setAttribute的调用多半应该在一个动作(action)内完成。这可以避免页面出现副作用,并使它们更加容易维护。
问:如何将动态数据传递给<netui:methodParameter>标签?
答:我们可以使动态数据可以为<netui:methodParameter>标签所用,具体方法是从pageContext变量来设置并访问它,如下所示:
<%
String s = "name";
pageContext.setAttribute("theName", s);
%>
<netui-data:callControl controlId="productsDBControl"
method="insertProduct">
<netui-data:methodParameter value="{pageContext.theName}"/>>
</netui-data:callControl> |
问:如何使第三方或特定于应用的标签库出现在IDE 选项板(Pallette)窗口中?
答:要在IDE中为Pallette窗口添加一个标签库,您需要:
1. 将标签库JAR添加到相关项目的WEB-INF/lib目录中。
2. 在web.xml中添加一项使其指向标签库的TLD文件,并赋予相应的URI,这使得JSP文件通过该URI引用TLD。
接着,您可以打开一个JSP,查看Insert菜单或标签选项板,以确保标签库中的标签能够显示出来。
问:当在netui-data:repeater中嵌套netui-data:repeater时,如何能够访问最内部repeater中的外部项的属性?
答:您可以访问最内部repeater中外部repeater的属性,具体方法是使用一个形如“{container.container.*}”的表达式,其中第一个容器引用当前的repeater,而第二个容器则引用其父repeater,等等。还有另外一种办法,通过使用netui-data:getData标签,您可以在页面上下文中的外部repeater中设置一个变量,并在形如{pageContext.*}的被嵌套的repeater中访问该变量。
问:有没有办法将NetUI标签中的XScript表达式绑定到jsp页面中的局部变量?
答:<netui-data:getData>标签可以用于计算XScript表达式的值,并将其放置到JSP的pageContext中。接下来就可以在scriptlet中访问pageContext中的变量。例如,
<netui-data:getData resultId="first" value="{actionForm.firstname}"/>
<% String firstName = (String) pageContext.getAttribute("first"); %> |
问:JSLT与XScript之间有什么关系?
答:在当前的版本中,JSTL的表达式语言(EL)与XScript之间没有任何关系。您可以在需要的时候使用JSTL标签,而脚本语言不会彼此干扰。
问:NetUI的pageContext数据绑定作用域与javax.servlet.http.PageContext属性映射之间有什么关系?
答:NetUI的pageContext数据绑定作用域只不过是javax.servlet.http.PageContext属性映射顶部的一层而已。这个上下文的定义是,它访问页面作用域内的名称/值对的映射。例如,下面这种形式是合法的:
<%
pageContext.setAttribute("myPageContextVar", "A Foo String");
%> |
接下来的这两种形式是完全等同的:
<netui:content value="{pageContext.myPageContextVar}"/> |
和
<% out.write(pageContext.getAttribute("myPageContextVar"); %>
|
问:如何对NetUI标签库中的各种标签加以分类,以使其更好理解?
答:对NetUI标签库值的标签进行分类的基本方法是,这些标签是只读的,还是可读写的(即是否与服务器进行数据的交互)。
基于这标准,标签可以被划分为三类:
a. 只读 Read-Only
只读标签有<netui:content>和<netui:label>等等。它们从标签中的“value”属性中读取数据,但不会将数据发回给服务器。
b. 读写单值 Read-Write Single Value
这一类的标签有<netui:textbox>、<netui:textarea>、<netui:checkbox>等等。这些标签需要了解两件事情:
l 在JSP呈现时,在何处获取数据片断。
l 在请求提交时,将数据片断放置到何处。
“数据片断”即为“dataSource”属性的值。请注意,这与javax.sql.Datasource对象没有任何关系。
c. 读写多值 Read-Write multiple value
这一类标签包括<netui:checkBoxGroup>、<netui:select>等等,它们不过是上面一类标签的多值版本罢了。它们同样需要了解从何处获取各种选项,以便从服务器读取并显示给用户。它们可以从“optionsDataSource”属性中获得。“dataSource”属性被用于引用将被写回到服务器上的数据。
问:页面流支持Struts Tiles吗?
答:在当前的版本中,页面流不支持下面这种做法,即通过在页面流中使用Struts-merge功能以求在页面流中使用Struts Tiles。这是因为Tiles要求使用它自己的RequestProcessor,而这会干扰页面流RequestProcessor。然而,我们的确支持Tiles模块与页面流在同一个Web项目中共存与交互。
问:在页面流数据绑定作用域内,我能够使用的各种可用属性有哪些?
答:在页面流数据绑定作用域内,可用的属性包括任何公共字段,以及任何开发人员在特定页面流中定义的公共JavaBean属性。例如,下面的页面流定义了可以与标签属性中的“{pageFlow.name}”绑定的“name”属性。
public class Controller extends PageFlowController
{
public String name;
/**
* @jpf:action
* @jpf:forward name="index" path="index.jsp"
*/
protected Forward begin()
{
return new Forward("index");
}
} |
问:如何从当前页面流的JSP中调用不同页面流中的动作?
答:要从当前页面流的JSP中调用不同页面流中的动作,您可以使用<netui:anchor>标签中的“href”属性。(注意,您不能使用“action”属性,因为它只能用于调用当前页面流中的动作)。您可以构造遵循模式的URI。
"<directory>/<action>.do", |
例如:.,
<netui:anchor href="/otherPageFlow/myMethodOne.do">Do Method
One</netui:anchor> |