`

Jsf Bean 之间调用

    博客分类:
  • Jsf
阅读更多

一、从JSF页面传递参数给托管Bean
虽然利用h:commandLink 和h:commandButton组件,可以通过action和actionListener来触发托管Bean中的方法,但是不能向这些方法中传递参数。对于动态传递参数,不是不可以实现,这点可以通过使用f:attribute来实现。而且f:attribute也可以很好的和actionListener联合使用。
例子:



<h:commandLink actionListener="#{myBean.action}">
        
<f:attribute name="attrname1" value="attrvalue1" />
        
<f:attribute name="attrname2" value="attrvalue2" />
        ...   
        
<h:outputText value="Click here" />
    
</h:commandLink>
    
    
<h:commandButton value="Press here" actionListener="#{myBean.action}">
        
<f:attribute name="attrname1" value="attrvalue1" />
        
<f:attribute name="attrname2" value="attrvalue2" />
        ...
    
</h:commandButton>

这些属性可以通过父组件的getAttributes()方法取到,父组件可以通过传递给actionListener的ActionEvent实例取到



public void action(ActionEvent event) 
    
...{   
        String attrvalue1 
= (String) event.getComponent().getAttributes().get("attrname1");
        String attrvalue2 
= (String) event.getComponent().getAttributes().get("attrname2");
        ...
    }

变量attrvalue1和attrvalue2包含从f:attribute set进来的值。
另一个欠文雅的方式就是通过f:param组件来传值,这个只是对h:commandLink起效。



<h:commandLink action="#{myBean.action}">
        
<f:param name="paramname1" value="paramvalue1" />
        
<f:param name="paramname2" value="paramvalue2" />
        ...
        
<h:outputText value="Click here" />
    
</h:commandLink>

这些参数可以通过FacesContext的getRequestParameterMap()方法取到。通过下面的方法,可以获取任何写在command块中f:param的值。



public static String getFacesParamValue(String name) 
    
...{   
        
return (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(name);
    }

上面的方法可以用在任何Bean的方法中。举例



public void action() 
    
...{   
        String paramvalue1 
= getFacesParamValue("paramname1");   
        String paramvalue2 
= getFacesParamValue("paramname2");   
        ...
    }

变量paramvalue1和paramvalue2包含从f:param set进来的值。
不过要注意,属性的名字要唯一,而且不能用其他组件的属性名,比如:"id", "name", "value","binding", "rendered",等。

二、从JSF页面传递组件属性到托管Bean
f:attribute组件也可以用来访问,任何绑定在托管Bean的UI组件的属性。这些属性值可以通过父组件的getAttributes()来获得。因为不能以方法参数的方式传值给托管Bean绑定的UI组件的getter和setter方法,这时f:attribute就会非常有用。这里有个UI组件绑定到托管Bean的基础例子



<h:outputText binding="#{myBean.myText}" value="#{myBean.myTextValue}">
        
<f:attribute name="attributename" value="attributevalue" />
    
</h:outputText>

 



托管Bean代码:

import javax.faces.component.html.HtmlOutputText;
public class MyBean 
...{   
    
private HtmlOutputText myText; 
    
    
public HtmlOutputText getMyText() 
    
...{   
        
return myText;  
    }
   
    
    
public String getMyTextValue() 
    
...{       
        
return (String) myText.getAttributes().get("attributename");   
    }

    
    
public void setMyText(HtmlOutputText myText) 
    
...{       
        
this.myText = myText;
    }

}

三、在请求之间传递对象(Passing objects from request to request)
如果有一个request范围内的托管Bean,在下一个请求中想要重用这个bean的属性,参数,或者对象,但是不想一遍又一遍的初始化这个Bean。可以用h:inputhidden来解决这个问题。这里有个简单的例子:



<h:form>   
        ...
        
<h:inputHidden value="#{myBean.value}" />
      ...
    
</h:form>

另一种方法就是用SessionMap来保存那些需要保存在session中的值。



public class MyBean 
...{   
    
public Object getMyValue() 
    
...{       
        
return FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("MyBeanMyValue"); 
    }
   
    
    
public void setMyValue(Object myValue) 
    
...{       
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(
"MyBeanMyValue", myValue);
    }
  
      
    
// This might be useful.   
    private void resetSessionValue(Object myKey) 
    
...{       
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove(myKey);
    }

}

四、在托管Bean之间通信
实践时会有多个托管Bean。如果设计需要,可以利用getSessionMap()在托管Bean之间通信。
一个例子,有两个托管Bean:



<managed-bean>
        
<managed-bean-name>myBean1</managed-bean-name>
        
<managed-bean-class>mypackage.MyBean1</managed-bean-class>
        
<managed-bean-scope>request</managed-bean-scope>
    
</managed-bean>
    
<managed-bean>
        
<managed-bean-name>myBean2</managed-bean-name>
        
<managed-bean-class>mypackage.MyBean2</managed-bean-class>
        
<managed-bean-scope>session</managed-bean-scope>
    
</managed-bean>

托管Bean myBean1和myBean2是支撑Bean MyBean1.java和MyBean2.java的实例,它们可以通过JSF页面来访问。不管它们的managed-bean-scope是request还是session。如果managed-bean-scope被设置成session,在整个session范围内可以使用同一个Bean的实例;如果managed-bean-scope被设置成request,那么每个request(form action)每次会创建一个Bean的实例。

用下面的方法,可以为每个托管Bean set和get static的参数。可以把它写成protected方法,放在一个超类中,让每个托管Bean继承,这会非常有用,或者写入一个Util类中,自己选择。

 



public class MySuperBean 
...{   
    
protected static Object getSessionValue(Object myKey) 
    
...{       
        
return FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(myKey);
    }
   
    
    
protected static void setSessionValue(Object myKey, Object myValue) 
    
...{       
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(myKey, myValue);
    }

}


public class MyBean1 extends MySuperBean 
...{   
    
public void myMethod() 
    
...{       
        String myValue 
= "value1";       
        setSessionValue(
"MyBean1MyValue", myValue);
        ...   
    }

}

public class MyBean2 extends MySuperBean 
...{   
    
public void myMethod() 
    
...{       
        String myValue 
= (String) getSessionValue("MyBean1MyValue");
        ...   
    }

}

五、在托管Bean中访问另一个托管Bean
如果有很多托管Bean,想要从其中一个托管Bean访问其他的托管Bean,这里有六中方法。
可以使用:
  1)getVariableResolver
  2)createValueBinding
  3)getELResolver (since JSF 1.2)
  4)createValueExpression (since JSF 1.2)
  5)getRequestMap
  6)getSessionMap.
举例:假设有两个托管Bean



<managed-bean>
    
<managed-bean-name>myBean1</managed-bean-name>
    
<managed-bean-class>mypackage.MyBean1</managed-bean-class>
    
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>myBean2</managed-bean-name>
    
<managed-bean-class>mypackage.MyBean2</managed-bean-class>
    
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

托管Bean myBean1和myBean2是支撑Bean MyBean1.java和MyBean2.java的实例,它们可以通过JSF页面来访问。不管它们的managed-bean-scope是request还是session。
只是要注意的是,getRequestMap在托管Bean被设置成request的时候使用,getSessionMap在托管Bean被设置成session的时候使用。



<h:form>   
    
<h:commandButton action="#{myBean1.action1}" value="action1" />
    
<h:commandButton action="#{myBean1.action2}" value="action2" />
    
<h:commandButton action="#{myBean1.action3}" value="action3" />
    
<h:commandButton action="#{myBean1.action4}" value="action4" />
    
<h:commandButton action="#{myBean1.action5}" value="action5" />
    
<h:commandButton action="#{myBean1.action6}" value="action6" />
    
<h:outputText binding="#{myBean2.text}" />
</h:form>

MyBean1.java:

package mypackage;
import javax.faces.context.FacesContext;
public class MyBean1 
...{    
    
// Using VariableResolver. NOTE: this is deprecated since JSF 1.2!   
    public void action1() 
    
...{       
        FacesContext context 
= FacesContext.getCurrentInstance();       
        MyBean2 myBean2 
= (MyBean2) context.getApplication().getVariableResolver().resolveVariable(context, "myBean2");
        myBean2.getText().setValue(
"action1");   
    }
   
    
    
// Using ValueBinding. NOTE: this is deprecated since JSF 1.2!   
    public void action2() 
    
...{       
        FacesContext context 
= FacesContext.getCurrentInstance(); 
        MyBean2 myBean2 
= (MyBean2) context.getApplication().createValueBinding("#{myBean2}").getValue(context);       
        myBean2.getText().setValue(
"action2");   
    }
   
    
    
// Using ELResolver. NOTE: this is implemented since JSF 1.2!  
    public void action3() 
    
...{       
        FacesContext context 
= FacesContext.getCurrentInstance();
        MyBean2 myBean2 
= (MyBean2) context.getELContext().getELResolver().getValue(context.getELContext(), null"myBean2");
        myBean2.getText().setValue(
"action3");
    }
   
    
    
color: #008000

分享到:
评论
1 楼 sxlkk 2009-02-19  
不知道你是否用myfaces中的t标签呢
这个标签有个<t:saveState value="#{后台bean}"></t:saveState>
保存后台Bean的形式,这样就不用传参数了,后台bean就不会从新构造了,传到后台的信息都不会丢失,也就没必要用参数传递了

相关推荐

    JSF调用的JAR包

    JSF的组件模型允许开发者通过拖放组件构建用户界面,而EL则使得在视图层和后台Bean之间传递数据变得简单。通过结合这些JAR包提供的功能,开发者可以构建出高效、可维护的Java Web应用程序。 在实际开发中,除了这些...

    JSF 资源 managed bean 课件

    - **使用EL表达式引用Bean**:通过`#{beanName.propertyName}`语法可以在JSF页面中引用Bean的属性。 - **数据绑定**:可以直接将表单字段与Bean的属性进行绑定,从而简化数据处理流程。 - **事件监听**:可以定义...

    JSF 标签,前后台交换代码

    - **动作事件**:JSF标签可以包含`action`或`actionListener`属性,当用户执行操作(如点击按钮)时,会调用后台Bean中对应的方法。例如,`&lt;h:commandButton action="#{bean.submit}" /&gt;`会在用户点击按钮时执行`...

    JSF入门(一)

    JSF组件有一个明确的生命周期,包括六步:恢复视图、应用请求值、处理验证、更新模型值、调用后处理和渲染响应。在每个阶段,JSF都会执行特定的任务,如解析请求参数、验证用户输入、更新bean的属性等。 **6. ...

    JSF的工作方式 JSF架构 JSF模型 JSF事件类型

    5. **调用应用程序(Invoke Application)**:在这个阶段,JSF会调用应用程序中的方法来处理事件。例如,如果用户点击了一个按钮,JSF会执行对应的动作方法,该方法通常在管理Bean中定义。 6. **呈现响应(Render ...

    jsf第一个例子 jsf架包 jsf实例

    7. **jsf实例**:在实际应用中,JSF实例通常指的是一个运行时的JSF应用程序,它包含了配置、组件、Managed Beans以及它们之间的交互。 在“Login”示例中,我们可能看到以下代码片段: ```xml &lt;!-- login.xhtml --...

    采用 JSF +后台Bean开发 大学学生管理系统

    3. **生命周期管理**:JSF有明确的组件生命周期,包括初始化、应用请求值、处理验证、更新模型值、调用应用逻辑和渲染响应等阶段。 4. **可扩展性**:JSF允许开发者自定义组件、渲染器和事件处理器,以满足特定需求...

    jsf入门实例教程

    这里,`h:inputText`和`h:commandButton`是JSF组件,`#{bean.name}`和`#{bean.submit}`则是EL(Expression Language)表达式,用于绑定到后台Bean的属性和方法。 **四、JSF Managed Bean** Managed Bean是JSF中的...

    jsf api

    它是JSF组件和底层Servlet容器之间的桥梁。 **4. ManagedBean** ManagedBean是JSF中的业务对象,通常用于存储和处理数据。开发者可以定义ManagedBean,声明其属性和方法,并通过EL(Expression Language)在页面上...

    JSF中文教程jsf

    **数据绑定** 是JSF的一个关键特性,它将组件的值与后台bean的属性直接关联。这使得界面的更改能够直接影响到模型,反之亦然。**Managed Beans** 是JSF中的业务逻辑载体,它们负责处理应用的业务规则和数据管理。 *...

    jsf+spring 实例

    - 使用JSF页面调用Spring服务:在JSF的XHTML页面中,通过EL表达式直接引用Spring Bean的方法。 **5. JBoss服务器** JBoss是基于Java EE的开源应用服务器,它支持JSF和Spring的部署。开发者需要将配置好的Web应用...

    JSF API帮助文档

    **FacesContext** 是JSF的核心上下文对象,它在整个JSF生命周期中充当了组件、bean和其他服务之间的通信桥梁。 **导航** 在JSF中是通过配置文件(faces-config.xml)或编程方式实现的,决定了根据用户的操作如何...

    JSF ppt课件 java serve face

    2. **JSF生命周期**:JSF有六个主要阶段:恢复视图、应用请求值、处理验证、更新模型值、调用应用业务逻辑和渲染响应。在这些阶段中,开发者可以插入自定义的行为,比如在验证失败时返回错误信息。 3. **组件模型**...

    JSF实例源代码下载

    4. **EL(Expression Language)**:EL是JSF中的一个表达式语言,用于从后台bean中获取和设置值,以及调用方法。例如,`#{bean.property}`表示访问名为`bean`的bean的`property`属性。 5. ** Managed Beans**:在...

    JSF和Spring集成.doc

    - `lookupBean(String beanName)` 方法则是用于从 JSF 中查找 bean,它通过 `ValueBinding` 来获取 JSF 管理的 bean。 2. **使用框架** - 文档中提到了第二种方法是使用框架来实现集成,虽然没有详细描述具体的...

    JSF sample

    JSF自动管理Bean的生命周期,并提供依赖注入(DI)功能,允许Bean之间进行通信。 **生命周期和事件处理** JSF有七种不同的生命周期阶段,包括恢复视图、应用请求值、验证、更新模型值、调用应用逻辑、呈现响应和...

    jsf中文使用教程jsf中文使用教程

    2. **Managed Bean**:Managed Bean是JSF中的核心组件,用来存储和处理数据。 3. **Navigation Handler**:负责处理页面间的跳转。 4. **Converter和Validator**:Converter转换数据类型,Validator验证用户输入。 ...

    各种jsf标签Java语言

    通过在配置文件中声明,或者使用注解如`@ManagedBean`和`@ViewScoped`,可以在JSF中创建和管理这些Bean。 ### Facelets Facelets是JSF的默认视图技术,它是一种XML方言,用于创建JSF页面。Facelets允许开发者使用...

Global site tag (gtag.js) - Google Analytics