19


设备特定的用户界面框架

Content Delivery Server 的 Subscriber Portal 组件是一个基于浏览器的应用程序,可通过 PC 或订户设备进行访问。由于不同设备使用的浏览器功能不同,所以 Content Delivery Server 提供了用于生成 Subscriber Portal 页面(对页面进行定制,以适应不同设备的功能)的框架。此框架仅适用于在订户设备上运行的 Subscriber Portal 版本,不适用于在 PC 上运行的版本。

运行在移动设备上的 Subscriber Portal 版本是使用 Apache Struts(有关此框架的信息,请参见 http://jakarta.apache.org/struts/)创建的。此产品为使用基于 WML 和 XHTML 的浏览器的设备提供 Subscriber Portal 页面。所提供的页面适用于很多设备。但是,如果支持的设备未正确显示 Subscriber Portal 页面,或者要使用设备的特殊功能,则可以创建专用于该设备的 Subscriber Portal 页面。

本章包含以下主题:


19.1 框架概述

Subscriber Portal 由使用 JavaServer PagesTM 技术创建的页面(JSPTM 页面)组成。这些 JSP 页面由 XML 文件(说明要生成的页面)和 XSL 样式表(说明如何显示页面元素)生成。为每个样式表生成某个版本的 Subscriber Portal,即一组 JSP 页面。每组页面都存储在一个其名称与样式表名称相同的子目录中。这些子目录位于以下位置:

server-domain 是为配置文件中的 app.server.domain 属性指定的值。

当 Catalog Manager 管理员向支持的设备列表中添加设备时,为设备指定的功能之一就是浏览器类型。为设备指定的浏览器类型决定使用的页面版本。

19.1.1 页面定义

Struts 框架用于生成基于设备的 Subscriber Portal。在下列情况下,Content Delivery Server 扩展了 Struts 标记库,以确保字符采用 XML 或 WML 编码:

下表标识了包含页面定义(基于设备的 Subscriber Portal)的文件。这些文件位于 $CDS_HOME/deployment/deployment-name/markup_generation/page-defs 目录中。有关这些文件的使用信息,请参见 19.1.3 进程和页面使用


表 19-1 Subscriber Portal 页面的 XML 文件

文件名

描述

_campaign.xml

显示单个活动的详细信息。

_catalog_menu.xml

显示链接列表,并用于显示以下列表:类别、内容、促销、查找结果、我的下载以及我的愿望列表。

_confirm_unsubscribe.xml

提示订户确认取消订阅某项内容的请求。

_detail.xml

显示某项内容的详细信息。

_device_error_msg.xml

显示错误消息。

_device_unsupported.xml

通知订户不支持正在使用的设备。

_download.xml

提示订户下载某项内容。

_enter_coupon.xml

提示订户提供兑换礼券所需的信息。

_gift_cancel_confirm.xml

提示订户确认取消礼品订阅的请求。

_gift_cancel_success.xml

确认已取消礼品订阅。

_gift_details.xml

显示发送给订户的礼品的详细信息。

_locale_selection.xml

提示订户选择其语言首选项。

_login.xml

提示订户进行登录。

_login_disabled.xml

防止订户进行登录,如果订户试图登录到禁用的帐户,或者连续三次输入错误密码时,将显示该页面。

_main_menu.xml

显示订户登录时显示的主菜单。

_manage_category.xml

允许订户选择希望查看的类别。

_my_gifts_menu.xml

显示订户赠予礼品和订户接收礼品的链接。只有当订户赠予或接收到至少一个礼品时,才会显示相关的链接。

_preview.xml

显示图像预览或播放音频文件预览。对于音频文件,页面将显示用于重放预览的链接。

_preview_list.xml

如果有多个预览,则会显示一个预览列表。预览是使用内容提供商或目录管理员提供的标题进行标识的;如果未提供任何标题,则使用默认标题进行标识。

注 - 如果包含多个预览文件且第一个文件是音频文件,则使用 _preview.xml 页面,并且订户只能使用第一个文件。

_purchase_confirm.xml

提示订户确认购买内容的请求。

_search.xml

提示订户输入查找条件。

_share_content.xml

允许订户与其他订户共享某项内容。

_share_content_confirm.xml

提示订户确认共享内容的请求。

_share_content_receive.xml

向共享内容接收者显示该内容的详细信息。

_share_content_success.xml

确认已使用指向共享内容的链接发送消息。

_sms_sent.xml

通知订户在 SMS 消息中已发送请求的内容。

_unsub_success.xml

确认订户已不再订阅某项内容。

_user_admin_menu.xml

提供用于管理帐户的选项,例如设置语言和管理类别。


 

基于设备的 Subscriber Portal 页面仅使用 XML 定义一次。然后将使用每个现有的样式表处理 XML 文件,为每个所需的 Subscriber Portal 版本生成 JSP 页面。下表介绍了可以在每个页面中使用的元素。


表 19-2 页面 元素

元素

描述

break

list 元素的 item 元素中、在 navbar 元素中的 link 元素之间或者在 text 元素内插入单个换行符。

button

提供一个表单按钮,并用来提交数据。该元素出现在表单元素的下方。按钮可以包含以下元素:

  • align - 按钮的水平对齐方式,仅用于生成 WML 卡片。有效值为 leftcenterright。默认值为 center
  • label - 按钮上显示的字符串。此元素通常包含 <jsp> 标记,该标记又包含 <bean:encodedmessage><bean:encodedwrite> 标记。
  • name - 处理表单的处理程序用于标识按钮的字符串。

divider

在页面中的 view 元素或 form 元素下方的元素之间添加一条水平线。

field

在表单中提供一个字段,用户可以在其中输入信息。

一个 field 可以包含以下元素:

  • name - 字段的名称。该名称映射到表单 Bean。
  • type - 字段类型。有效值为 textpasswordhiddenselect
  • label - 表单上显示的标签。此元素通常包含 <jsp> 标记(其中包含 <bean:encodedmessage><bean:encodedwrite> 标记),它仅适用于 textpasswordselect 类型的字段。
  • size - 字段的大小。此元素仅适用于 textpassword 类型的字段。
  • maxlength - 用户可以输入的数据的最大长度。此元素仅适用于 textpassword 类型的字段。
  • value - 字段显示的默认值。
  • optionoptionlist - 类型为 select 的字段的项列表。请参见本表中 option、optionlist 的说明。
  • multiple - 表示能否选择多个项的标志。将此元素设置为 true 可允许选择多个项。设置为 false 则只允许选择单个项。
  • format - 字段的输入掩码,仅用于生成 WML 卡片。此元素仅适用于 textpassword 类型的字段。有关有效值,请参见 WML 规范。
  • required - 表示字段是否为必需字段的标志,仅用于生成 WML 卡片。此元素仅适用于 text 或 password 类型的字段。将此元素设置为 true 可表示字段为必需字段。设置为 false 则表示字段不是必需字段。默认值为 false

form

说明页面的表单,它出现在 view 元素的下方。view 只能有一个 formform 可以包含以下元素:

  • action - 提交表单时将数据发送到的 URL。
  • button - 表单上的按钮。一个表单可以包含多个按钮。请参见本表中 button 的说明。
  • field - 表单上的字段。一个表单可以包含多个字段。请参见本表中 field 的说明。
  • divider - 请参见本表中 divider 的说明。
  • image - 请参见本表中 image 的说明。
  • jsp - 请参见本表中 jsp 的说明。
  • list - 请参见本表中 list 的说明。
  • navbar - 请参见本表中 navbar 的说明。
  • text - 请参见本表中 text 的说明。

可通过使用提供的样式表,在表单底部显示 button 元素。所有其他元素将按照出现顺序进行显示。

image

为页面提供一个图像,它出现在 view 元素或 form 元素的下方。图像可以包含以下元素:

  • name - 包含图像的文件名。样式表为该图像提供路径和后缀。默认路径为 http://host:port/subscriber/static/media/device,默认后缀为 gif。例如,如果图像为 /static/media/device/logo.gif,则将 name 设置为 logo。如果包含了路径元素,则不要包含此元素。
  • path - 包含图像的文件所在的 URL 路径,例如,http://server1.com/web/images/logo.gif。如果包含了 name 元素,则不要包含此元素。
  • alt - 图像的替换文本。此元素通常包含 <jsp> 标记,该标记又包含 <bean:encodedmessage><bean:encodedwrite> 标记。

jsp

包含使用 JSP 技术语法(JSP 语法)的代码。此元素可以出现在任何元素的下方,并且不包含任何元素。请将代码包含在 CDATA 部分中,以使 XML 页面定义保持有效。代码可以包含以下 JSP 语法:

  • 指令,如 include 指令
  • 脚本元素和变量
  • 操作
  • 定制标记,如 Struts 提供的 LogicBeanHTML 标记。

例如,以下代码段说明了如何使用脚本元素和变量设置 title 元素的值:

<title>
  <jsp><!CDATA[<%=title%>]]></jsp>
</title>

要在页面顶部包含代码,请将此元素的 header 属性设置为 true。如果将该属性设置为 false 或者未显示该属性,则会按照 jsp 元素的出现顺序来生成这些元素中的代码。

link

提供一个页面链接,它出现在 list 元素的 navbar 元素或 item 元素的下方。link 包含以下元素:

  • name - 页面上显示的文本。此元素通常包含 <jsp> 标记,该标记又包含 <bean:encodedmessage><bean:encodedwrite> 标记。
  • url - 链接指向的 URL。按照样式表,该值为 Java 类文件中的方法的参数,并且必须包含 jsp 元素,该元素又包含有效的 String 文字或 String 变量。请参见此元素的说明末尾的示例。
  • accesskey - 指明是否包含要访问项的快捷键的标志。设置为 true,则包括访问键。设置为 false 或省略元素,则不包括访问键。如果浏览器无法处理访问键,则忽略此属性。

例如,以下代码段显示指向 Subscriber Portal 外部页面的链接。

<link>
  <name>Yahoo</name>
  <url><jsp>"http://wap.yahoo.com"</jsp></url>
</link>

要指明链接可用于下载购买内容,请将此元素的 download 属性设置为 true。样式表将使用此属性来确定用于某些设备和内容类型的标记。

list

为页面提供一个项目列表,它出现在 view 元素或 form 元素的下方。list 元素包含一个或多个 item 元素。item 元素包含 link 元素、break 元素或 jsp 元素(包含写入文本的代码,例如,<bean:encodedmessage><bean:encodedwrite>)。

navbar

提供了一套成组显示的链接,例如 okcancel 或者 yesno。这些链接按导航间隔自动分隔。navbar 元素出现在 view 元素或 form 元素的下方,并包含一个或多个 link 元素和 navspacer 元素。要指定导航栏的方向,请设置 orientation 属性。有效值为 horizontalvertical。默认值为 vertical

注 - 某些浏览器可能无法对链接进行分组。

navspacer

在导航栏中划分链接,它出现在 navbar 元素下方的 link 元素之间。

注 - navbar 中的链接是使用 navspacers 自动划分的。可以使用 navspacer 元素进一步划分链接。

optionoptionlist

说明了类型为 select 的字段中包含的项列表,它们出现在 field 元素的下方。如果项列表已知,则使用 option。如果列表是动态生成的,则使用optionlistoption 包含以下元素:

  • name - 项的名称。
  • value - 指定给项的值。

按照样式表,optionlist 元素的值必须为有效的 HTML 语句,这些语句包含 select 语句的所有 option 元素。可以将 jsp 元素用于生成有效 HTML 选项标记的代码,例如:

<optionlist>
  <jsp><![CDATA[<%=getOptions()%>]]></jsp>
</optionlist>

</optionlist>

getOptions 方法应返回一个字符串,其中包含类似于以下示例的选项元素:

<option value=”1”>One</option>
<option value=”2”>Two</option>
<option value=”3”>Three</option>

<option value="3">Three</option>

text

提供页面文本,它出现在 view 元素或 form 元素的下方。text 元素通常包含 <jsp> 标记,该标记又包含 <bean:encodedmessage><bean:encodedwrite><html:encodederrors> 标记,并且还可以包含一个或多个 breaklink 元素。该元素可具有以下属性:

  • alignment - 有效值为 leftrightcenter
  • type - 有效值为 errorbold

title

提供页面使用的标题,它出现在 view 元素的下方。title 元素通常包含 <jsp> 标记,该标记又包含 <bean:encodedmessage><bean:encodedwrite> 标记。

view

用于说明页面,它是最顶端元素。此元素包含以下元素:

对于基于 WML 的浏览器,视图表示一个卡片。对于基于 HTML 的浏览器,视图表示正文。

该元素可具有以下属性:

  • main - 设置为 true 可在页面上包含标题和脚注图像。设置为 false 则不包括这些图像。
  • error - 设置为 true 可将页面标识为错误页面。只能有一个页面定义将此属性设置为 true

 

以下代码示例显示了包含一个表单的页面。此样例为 $CDS_HOME/dist/cds/markup_generation/page_defs/_login.xml 文件。


代码样例 19-1 带有表单的样例页面
<?xml version="1.0"?>
<view>
  <title>
    <jsp><![CDATA[<bean:encodedmessage key="device.login.title"/>]]></jsp>
  </title>
  <jsp><![CDATA[<logic:messagesPresent>]]></jsp>
  <text type="error">
    <jsp><![CDATA[<html:encodederrors/>]]></jsp>
  </text>
  <jsp><![CDATA[</logic:messagesPresent>]]></jsp>
  <form>
    <action>
      <jsp>Web.getWeb().getActionURL2(SubscriberConstants.ACTION_DEVICE_LOGIN, 
           (UrlParams)null, response)</jsp>
    </action>
    <field>
      <name>username</name>
      <type>text</type>
      <size>10</size>
      <maxlength>40</maxlength>
      <label>
        <jsp><![CDATA[<bean:encodedmessage key="device.login.username"/>]]></jsp>
      </label>
    </field>
    <field>
      <name>password</name>
      <type>password</type>
      <size>10</size>
      <maxlength>40</maxlength>
      <label>
        <jsp><![CDATA[<bean:encodedmessage key="device.login.password"/>]]></jsp>
      </label>
    </field>
    <button>
      <name>
        <jsp><![CDATA[<%=SubscriberConstants.BUTTON_SUBMIT%>]]></jsp>
      </name>
      <label>
        <jsp><![CDATA[<bean:encodedmessage key="device.login.loginLink"/>]]></jsp>
      </label>
    </button>
  </form>
</view>

 

以下代码示例显示了包含到其他页面的链接的页面。此样例为 $CDS_HOME/dist/cds/markup_generation/page_defs/_main_menu.xml 文件。


代码样例 19-2 带有链接的样例页面
<?xml version="1.0"?>
<view main=”true”>
  <title>
    <jsp><![CDATA[<bean:encodedmessage key="device.menu.main.title"/>]]></jsp>
  </title>
  <list>
    <jsp><![CDATA[<logic:iterate id="element" 
         name="<%=SubscriberConstants.ATTR_MENU_LIST%>" 
         type="com.sun.content.server.subscriberportal.common.ListItem" 
         indexId="index">]]></jsp>
    <item>
      <link>
        <name>
          <jsp><![CDATA[<bean:encodedwrite name="element" 
               property="name"/>]]></jsp>
        </name>
        <accesskey>true</accesskey>
        <url>
          <jsp>element.getUrl()</jsp>
        </url>
      </link>
    </item>
    <jsp><![CDATA[</logic:iterate>]]></jsp>
  </list>
</view>

 

19.1.2 样式表

样式表提供各种模板,以说明定义 JSP 页面所用的每一个元素的显示方式。有关这些元素的信息,请参见表 19-2。样式表解释 XML 页面定义,为给定设备或设备类创建 JSP 页面。

设置样式表以根据所使用的设备功能来确定标记的显示形式。例如,当 XML 定义指定链接时,使用某种类型浏览器的样式表可能以某种颜色显示链接,而使用另一种类型浏览器的样式表可能以下划线显示链接。

Content Delivery Server 随产品提供了以下样式表。这些样式表位于 $CDS_HOME/deployment/deployment-name/markup_generation/stylesheets 目录中。

这些样式表适用于很多设备。但是,如果无法在设备上正确显示 Subscriber Portal 页面,则可以创建新样式表来定义元素的其他显示方式。只有未正确显示的元素才需要包含在新的样式表中。例如,如果设备使用 XHTML-Alternate.xsl 样式表,只有链接和字段显示效果不佳时,才创建样式表,导入 XHTML-ALternate.xsl 并且包含只有链接和字段的定义。

19.1.3 进程和页面使用

以下各节介绍了 Subscriber Portal 主要功能的常规进程。这些说明标识在设备上显示给订户的页面,以及用于生成页面的文件。有关这些文件的信息,请参见表 19-1

19.1.3.1 登录进程

下图显示了登录到 Subscriber Portal 的进程,以及订户登录后可用的选项。该图之后的描述标识了用于每个页面的 XML 文件。

图 19-1 登录进程


从设备登录到 Subscriber Portal 的进程图。此进程以文本形式进行说明。

1. 由 _login.xml 生成的 CDS 登录页面,是显示给订户的第一个页面。

2. 如果登录成功,则显示由 _main_menu.xml 生成的 Subscriber Portal 主页面。如果登录失败,则会在 CDS 登录页面上显示错误。如果禁用了此订户帐户,或者连续三次登录失败,则将显示已禁用登录的页面(由 _login_disabled.xml 生成)。

3. 在主菜单页面,可进行以下操作:

19.1.3.2 查看内容进程

下表显示了查看可用内容的进程。

图 19-2 查看内容进程


从设备查看内容的进程图。此进程以文本形式进行说明。

1. 当订户单击主菜单上的“获得内容”时,将显示“选择类别”页面(由 _catalog_menu.xml 生成)。该页面显示订户可用的类别列表。

2. 当订户单击类别列表中的类别名称时,将显示“选择内容”页面(由 _catalog_menu.xml 生成)。该页面显示订户可用的内容及内容包列表。

3. 当订户单击内容列表中的某项内容时,将显示“购买内容”或“内容详细资料”页面(均由 _detail.xml 生成)。

有关这些选项的描述,请参见 19.1.3.9 购买或下载进程

19.1.3.3 查找内容进程

下表显示了查找内容的进程。

图 19-3 查找内容进程


从设备查找内容的进程图。此进程以文本形式进行说明。

1. 当订户单击主菜单上的“查找内容”时,将显示“查找内容”页面(由 _search.xml 生成)。该页面提示订户输入查找条件。

2. 查找完成后,将显示“查找结果”页面(由 _catalog_menu.xml 生成)。该页面显示与查找条件匹配的内容列表。

19.1.3.4 设置首选项进程

下表显示设置首选项的进程。

图 19-4 设置首选项进程


从设备设置首选项的进程图。此进程以文本形式进行说明。

当订户单击主菜单上的“设置”时,将显示“设置”页面(由 _user_admin_menu.xml 生成)。该页面提供以下选项:

19.1.3.5 查看促销进程

只有在 Vending Manager 中设置了活动,并且在订户配置文件中启用了接收促销通知的选项,主菜单页上才会显示“促销”选项。当订户单击“促销”时,将显示“促销”页面(由 _catalog_menu.xml 生成)。该页面显示可用的促销的列表。

当订户选择促销时,将显示促销的详细信息(由 _campaign.xml 生成)。当订户单击促销中包含的某项内容时,将显示“购买内容”页面(由 _detail.xml 生成)。从该页面,订户可以下载或为朋友购买此项内容。有关购买进程的信息,请参见 19.1.3.9 购买或下载进程

19.1.3.6 查看我的下载列表进程

只有订户先前购买了内容,才可以使用主菜单页上的“我的下载”列表。当订户单击“我的下载”时,将显示“我的下载”页面(由 _catalog_menu.xml 生成)。该页面显示订户已购买的内容列表。

当订户选择某项内容时,将显示“内容详细资料”页面(由 _detail.xml 生成)。从该页面,订户可以下载项,为朋友购买项,或者告诉朋友该项。有关购买进程的信息,请参见 19.1.3.9 购买或下载进程

19.1.3.7 查看我的愿望列表进程

只有当订户在使用基于 PC 的 Subscriber Portal 浏览内容的过程中将内容添加到愿望列表时,才可以使用主菜单页上的“我的愿望列表”。当订户单击“我的愿望列表”时,将显示“我的愿望列表”页面(由 _catalog_menu.xml 生成)。该页面显示订户已下载的内容列表。

当订户选择某项内容时,将显示“购买内容”页面(由 _detail.xml 生成)。有关购买进程的信息,请参见 19.1.3.9 购买或下载进程

19.1.3.8 查看我的礼品列表进程

只有在订户接收到礼品或为其他订户购买礼品时,才可以使用主菜单页上的“我的礼品”列表。当订户单击“我的礼品”时,将显示“我的礼品”页面(由 _my_gifts_menu.xml 生成)。

如果订户接收到礼品,则“我的礼品”页面中有“已接收礼品”的链接。当订户单击“已接收礼品”链接时,将显示“已接收礼品”页面(由 _catalog_menu.xml 生成)。该页面显示订户已作为礼品接收的内容列表。当订户选择某项内容时,将显示礼品详细信息(由 _gift_details.xml 生成)。要接受礼品,订户应单击“下载礼品”链接,将会显示“下载”页面(由 _download.xml 生成)。

如果订户为其他订户购买了礼品,则“我的礼品”页面中包含“已发送礼品”链接。当订户单击“已发送礼品”链接时,将显示“已发送礼品”页面(由 _catalog_menu.xml 生成)。该页面显示订户作为礼品购买的内容列表。当订户选择某项内容时,将显示礼品详细信息(由 _gift_details.xml 生成)。按订阅收费的内容礼品具有一个取消礼品的选项。如果订户取消礼品订阅,则将显示请求确认页面(由 _gift_cancel_confirm.xml 生成)。如果成功完成请求,则将显示通知页面(由 _gift_cancel_success.xml 生成)。

19.1.3.9 购买或下载进程

下图显示了购买内容或下载已购买内容的进程。购买进程是从“购买内容”页中启动的。下载进程是从“内容详细资料”页中启动的。这两个页面都是由 _detail.xml 文件生成的。

图 19-5 购买进程

从设备购买内容的进程图。此进程以文本形式进行说明。

如果订户尚未购买选定的内容,或者许可证要求重新购买内容,则会显示“购买内容”页。如果订户购买了选定的内容,则会显示“内容详细资料”页面。其中提供了前面所述的以下选项:

只有在管理员为该项设置了试用时,才会在“购买内容”页面上显示试用选项。

仅在“购买内容”页面上显示购买选项。

如果有多个可用预览,则会显示一个预览列表(由 _preview_list.xml 生成)。在选择某个预览时,将会显示“预览”页面(如上所述)。

如果可以预览内容,则会在两个页面上提供预览选项。

两个页面上均提供了礼券选项。

礼品接收者收到的消息包含到礼品的链接。当接收者单击此链接并访问 Subscriber Portal 时,将显示有关礼品的通知(由 _share_content_receive.xml生成)。

两个页面上均提供了礼品选项。

发送给朋友的消息包含到内容的链接。当接收者单击链接并访问 Subscriber Portal 时,将显示有关此内容的通知(由 _share_content_receive.xml 生成)。

两个页面上均提供了共享选项。

仅在“内容详细资料”页面上显示下载选项。

只有在订户具有内容订阅时,才会在“内容详细资料”页面上显示取消订阅选项。


19.2 为特定设备生成页面

在测试系统中生成设备特定的页面,以避免干扰生产系统。如果确信生成的页面正确,则可以将所创建的文件移至生产系统。

要生成为特定设备或设备组定制的 Subscriber Portal 版本,请执行以下操作:

1. $CDS_HOME/deployment/deployment-name/markup_generation/stylesheets 目录中创建 XSL 样式表。

为新样式表命名,以标识将要使用所生成页面的设备或设备类别。根据设备使用的浏览器类别导入一个父样式表。例如,如果浏览器类别为 XHTML,请在样式表中包含 <xsl:import href="XHTML-Basic.xsl"/> 语句。遵循父样式表的结构。只有在某些元素未正确显示,或者要利用设备提供的高级功能时,才需要模板。

2. 运行 cdsi genmarkup -ss stylesheet 命令,其中 stylesheet 是在 1 中创建的样式表的名称,并且不包括 .xsl 扩展名。

该命令将根据新样式表处理 $CDS_HOME/deployment/deployment-name/markup_generation/page-defs 目录中的所有 XML 文件,并生成一组 JSP 页面。这些结果位于 $CDS_HOME/deployment/deployment-name/markup_generation/jsps/stylesheet 目录中。

3. 将包含已生成 JSP 页面的目录移动到每个应用服务器(已在其中部署了 Subscriber Portal)上的 Subscriber Portal 应用程序目录中。

4. 将样式表名称添加到 $CDS_HOME/deployment/deployment-name/conf/browser.config 文件中。

该文件保留了受支持的浏览器类型的列表,在添加设备时 Catalog Manager 管理员将从该列表中进行选择。例如,如果创建了名为 XHTML-newBrowser.xsl 的样式表来支持新的浏览器类型,则请将以下语句添加到文件中:

      device.markup.browser.option=XHTML-newBrowser

19.3 修改所有设备的页面

如果需要对在移动设备上运行的 Subscriber Portal 版本进行更改,则可以更改页面定义并重新生成 JSP 页面。只有通过移动设备访问 Subscriber Portal 时才能看到所做的更改。对 XML 页面定义所做的更改不会影响 PC 上运行的 Subscriber Portal 版本。

在测试系统上进行更改以避免干扰生产系统。如果确信生成的页面正确,则可以将所创建的文件移至生产系统。

要更改某个页面,请执行以下操作:

1. 在 $CDS_HOME/deployment/deployment-name/markup_generation/page-defs 目录中编辑现有的 XML 文件,或者创建新文件并将其添加到此目录中。

有关文件中可以包含的元素的描述,请参见 19.1.1 页面定义

2. 运行 cdsi genmarkup -ss all 命令。

该命令将根据 $CDS_HOME/deployment/deployment-name/markup_generation/stylesheets 目录中的所有样式表来处理 $CDS_HOME/deployment/deployment-name/markup_generation/page-defs 目录中的所有 XML 文件,并为每个样式表生成一组新的 JSP 页面。每组页面都位于 $CDS_HOME/deployment/deployment-name/markup_generation/jsps/stylesheet 目录中,其中 stylesheet 是用于生成页面的样式表的名称。

3. 将包含已生成 JSP 页面的目录移动到每个应用服务器(已在其中部署了 Subscriber Portal)上的 Subscriber Portal 应用程序目录中。


19.4 添加定制页面

如果您已很好地理解了 Java 技术、XML 和 Struts,则可以向 Subscriber Portal 中添加页面来定制页面流。

本节介绍在显示主菜单之前添加使用条款页面的过程,以此为例说明页面流的定制。要添加该页面,请执行以下操作:

1. 在 $CDS_HOME/deployment/deployment-name/markup_generation/page-defs 目录中,创建用于定义要添加的页面的 XML 文件。

有关可以使用的页面元素信息,请参见 19.1.1 页面定义。该示例的使用条款页面可按以下代码示例所示进行定义。


代码样例 19-3 使用条款页面定义
<?xml version="1.0"?>
<!-- Copyright (c) 2003 Sun Microsystems, Inc. All rights reserved -->
<!-- SUN PROPRIETARY/CONFIDENTIAL. -->
<!-- Use is subject to license terms. -->
<view>
  <title>
    <jsp><![CDATA[<bean:encodedmessage key="device.newPage.title"/>]]></jsp>
  </title>
  <text>
    <jsp><![CDATA[<bean:encodedmessage 
         key="device.newPage.instructions"/>]]></jsp>
  </text>
  <navbar orientation="horizontal">
    <link>
      <name>
        <jsp><![CDATA[<bean:encodedmessage 
             key="device.newPage.continue"/>]]></jsp>
      </name>
      <url>
        <jsp>Web.getWeb().getActionURL("/device_direct_url.do", 
             null,response)</jsp>
      </url>
    </link>
  </navbar>
</view>

 

2. 将页面定义中使用的字符串添加到 $CDS_HOME/deployment/deployment-name/localization 目录下的 SubscriberPortalLocaleResource.properties 文件中的每个语言版本。

添加的属性名称对应于为 key 参数指定的值,例如:


device.newPage.title=Terms and Conditions
device.newPage.instructions=Here are the latest updates to the site’s Terms and
Conditions
device.newPage.continue=Continue

 

3. 生成 Subscriber Portal 的所有页面。

a. 运行 cdsi genmarkup -ss all 命令。

该命令将根据 $CDS_HOME/deployment/deployment-name/markup_generation/stylesheets 目录中的所有样式表来处理 $CDS_HOME/deployment/deployment-name/markup_generation/page-defs 目录中的所有 XML 文件,并为每个样式表生成一组新的 JSP 页面。每组页面都位于 $CDS_HOME/deployment/deployment-name/markup_generation/jsps/stylesheet 目录中,其中 stylesheet 是用于生成页面的样式表的名称。

b. 将包含已生成 JSP 页面的目录移动到每个应用服务器(已在其中部署了 Subscriber Portal)上的 Subscriber Portal 应用程序目录中。

4. 为新页面创建包含商业逻辑的处理程序。

该处理程序必须扩展 com.sun.content.server.subscriberportal.device.BaseDeviceHandler 并实现 doExecute 方法。代码样例 19-4 显示了对此方法的调用。有关该类的信息,请参见随 Content Delivery Server 提供的 Javadoc 工具的输出。

将已编译的类放到位于以下任意一个位置的 JAR 文件中:

以下代码示例显示了用于确定是否要显示使用条款页面的样例处理程序。


代码样例 19-4 样例处理程序

package com.sun.content.server.cdsexample;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.sun.content.server.subscriberapi.IApiContext;
 
/**
 * Show a new page if an external service determines that the user needs to 
 * see this page.
 */
public class CheckNewPageHandler extends BaseDeviceHandler
{
    public ActionForward doExecute(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response) 
        throws Exception
    {
        IApiContext apiContext = getApiContext(request);
 
        // ExternalService class needs to be implemented
       boolean showPage = ExternalService.showPage(apiContext.getMobileId());
 
        if (showPage)
            return mapping.findForward(“show_page”);
        else
            return mapping.findForward(“do_not_show_page”);        
    }
}

 

5. 编辑 struts-config.xml 文件以指明在页面流中如何处理页面。

该文件位于以下任意一个位置:

a. 删除以下代码部分:


<action path="/device_provision"
  type="com.sun.content.server.subscriberportal.device.ProvisionUserHandler">
  <forward name="device_select_locale" path="/dv5.do"/>
  <forward name="success" path="/dv42.do"/>
</action>

 

b. 在已删除代码的位置中添加以下代码:


<action path="/device_provision" 
  type="com.sun.content.server.subscriberportal.device.ProvisionUserHandler">
  <forward name="device_select_locale" path="/dv5.do"/>
  <forward name="success" path="/check_new_page.do"/>
</action>
<action path="/check_new_page"
  type=" com.sun.content.server.cdsexample.CheckNewPageHandler">
  <forward name="show_page" path="/device_show_new_page.do"/>
  <forward name="do_not_show_page " path="/device_direct_url.do"/>
</action>
<action path="/device_show_new_page"
  type="com.sun.content.server.subscriberportal.device.ReturnSuccessHandler">
  <forward name="success" path="/View?pg=_new_page.jsp"/>
</action>

 

6. 重新启动服务器。