Xpages,faces-config,托管bean和范围变量

时间:2015-09-30 20:07:08

标签: xpages

我的数据库中有一些属性很少会发生变化,但在整个过程中都会被普遍使用。看来这可能是我可以用托管bean做的事情?

<managed-bean>
<managed-bean-name>bu</managed-bean-name>
<managed-bean-class>    </managed-bean-class>
<managed-bean-scope>application</managed-bean-scope> </managed-bean>

我想在applicationScope.bu中找到一个值列表。

我只是编写一个简单的java实现吗?有更简单或更好的方法吗?

3 个答案:

答案 0 :(得分:3)

为了正确实现托管bean,你的faces-config应该包含一个像你一样的块,但你缺少&lt; managed-bean-class&gt;值。这是将在内存中创建的类(在您的情况下, applicationScope )。如果你的bean类有方法可以返回你要查找的值,那么你就是好的。我是bean(托管或POJO)的粉丝,并将这种方法用于一些应用程序。

[编辑] 史蒂夫在他的回答中指出,您对配置的可访问性和数量的需求可能会推动您存储这些值的方式。你如何与他们交流可能会有所不同,我非常倾向于使用托管bean。

对于需要为给定应用程序存储的少量值,我喜欢在XSP属性中设置它们,然后我可以通过XSPContext.getProperty('xsp.property.name');引用它们。

对于更复杂的事情,我倾向于创建一个配置文档,我使用它类似于配置文件,然后我从/存储到值。 [/编辑]

如果您正在寻找一个开始使用托管bean的好地方,或者提供完整的健全检查参考,我建议checking out Per Henrik Lausten's blog post on the subject

简短版本是,要拥有托管bean,您必须拥有:

  1. 一个Java类
    • 使用私有属性(值)构建
    • 通过公共getter / setter方法公开
    • 实现Serializable(java.io.Serializable)
    • 包含一个无参数的构造函数(第一次不能创建任何参数;并不意味着它不能在别处找到值)。
  2. faces-config中的条目(很像你已经概述过)
  3. 绑定通过
    • EL #{beanName.propertyName}(EL使用驼峰式属性名称进行转换,因此getPropertyName()的getter方法在EL中标记为首次显示
    • #{javascript:return beanName.getPropertyName()}的SSJS(完整方法调用
  4. 然后,您可以在表达式语言或SSJS块中使用托管bean的名称(在您的情况下为#34; bu&#34;)。在EL绑定中,请注意属性使用驼峰外壳进行访问;所以 myProperty 的属性由 getMyProperty 公开,但看起来像#{bu.myProperty}。您也可以使用完整的方法名称在SSJS中使用它,例如#{javascript:return bu.getMyProperty();}

    <小时/> 例 这是我in my demo app的数据对象。它位于 viewScope 中,因此它与给定XPage的生命周期一致。

    faces-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <faces-config>
      <managed-bean>
        <managed-bean-name>gotHouse</managed-bean-name>
        <managed-bean-scope>view</managed-bean-scope>
        <managed-bean-class>com.westeros.model.HouseModel</managed-bean-class>
      </managed-bean>
      <!--AUTOGEN-START-BUILDER: Automatically generated by IBM Domino Designer. Do not modify.-->
      <!--AUTOGEN-END-BUILDER: End of automatically generated section-->
    </faces-config>
    

    HouseModel.java *为简洁起见,我在此对其进行了修改。

    package com.westeros.model;
    //...
    public class HouseModel implements Serializable {
        private static final long serialVersionUID = 1L;
        private String name;
    
        //...
        public HouseModel(){}
    
        public void load(String unid){
          // do some load things from the doc's UNID
        }
    
    
        public void setName(String name){
          this.name = name;
        }
        public String getName(){
          return this.name;
        }
        //...
    }
    

    house.xsp (House XPage) *摘录为简洁示例

    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view
        xmlns:xp="http://www.ibm.com/xsp/core">
      <!-- truncating -->
      <div
        class="form-group">
      <xp:label
        for="name"
        value="Name" />
      <xp:inputText
        id="name"
        value="#{gotHouse.name}" />
      </div>
      <!-- truncating -->
    </xp:view>
    

答案 1 :(得分:2)

如果我正确理解您的问题,我不认为托管bean的属性是您希望存储应用程序属性的位置。

我只是将它们放在应用程序登录页面的应用程序范围内。

答案 2 :(得分:2)

您可以使用托管bean的托管属性。 比如这个小豆......

package ch.hasselba.xpages;

import java.io.Serializable;

@SuppressWarnings("serial")
public class MyBean implements Serializable {

    private String dbName;

    public void setDbName(String dbName) {
        this.dbName = dbName;
    }

    public String getDbName() {
        return dbName;
    }

}

...可以在 faces-config.xml

中初始化
<?xml version="1.0" encoding="UTF-8"?>
<faces-config>

    <managed-bean>
        <managed-bean-name>myBean</managed-bean-name>
        <managed-bean-class>ch.hasselba.xpages.MyBean</managed-bean-class>
        <managed-bean-scope>application</managed-bean-scope>

        <managed-property>
            <property-name>dbName</property-name>
            <value>MyName</value>
            <property-class>java.lang.String</property-class>
        </managed-property>
    </managed-bean>

</faces-config>

一旦你接受了bean,值就是&#34;那里&#34;。 F.E. XPage上的标签......

<xp:label
    value="#{myBean.dbName}"
    id="label1">
</xp:label>

...然后将显示 MyName

托管属性可以包含其他bean,并访问运行时属性(例如请求参数),这使得它们极其强大。