`
laotu5i0
  • 浏览: 145461 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

托管 Bean 页面传值的使用方法和技巧

    博客分类:
  • jsf
阅读更多

最近开始学习JSF基础,发现比较重要的一点,就是如何用编程方式访问托管Bean。看了一些JSF的实例,不过大多都是用JSF1.1来实现的。虽然在JSF1.2的环境中也可以很好运行,但是在编译的时候会看到降级的消息。这里找了一些资料总结一下JSF1.1和JSF1.2访问托管Bean的方法。

一、从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");
    }
   
    
    
// Using ValueExpression. NOTE: this is implemented since JSF 1.2!   
    public 

分享到:
评论

相关推荐

    信通商务网2025修正版

    中国电子商务平台,打造中国最具影响力的企业电子商务平台,商机信息,产品资料,企业名录,行业展览会,商务新闻。

    经典文学作品阅读体验.doc

    经典文学作品阅读体验

    python-30.判断 2 的幂-反正你没它快.py

    python-30.判断 2 的幂——反正你没它快.py

    基于随机森林实现特征选择降维及回归预测 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    元胞自动机模拟病毒传染(SEIR模型) 附Python代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    2004-2020年各省货运量数据

    2004-2020年各省货运量数据 1、时间:2004-2020年 2、来源:国家统计j、统计nj 3、指标:行政区划代码、地区、年份、货运量(万吨) 4、范围:31省

    ADC推理软件AI程序

    ADC推理软件AI程序

    【轴承故障检测】滚动轴承中进行基于振动的故障诊断研究 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    java-springboot+vue景区民宿预约系统实现源码(完整前后端+mysql+说明文档+LunW+PPT).zip

    java-springboot+vue景区民宿预约系统实现源码(完整前后端+mysql+说明文档+LunW+PPT).zip

    漫画作品与增强现实体验.doc

    漫画作品与增强现实体验

    漫画作品改编舞台剧经验.doc

    漫画作品改编舞台剧经验

    ,,ABC-DQ:基于MATLAB Simulink的三相静止坐标系到两相静止坐标系(Clark变)到两相旋转坐标系变(Park变)的仿真模型 仿真条件:MATLAB Simulink R2015b

    ,,ABC_DQ:基于MATLAB Simulink的三相静止坐标系到两相静止坐标系(Clark变)到两相旋转坐标系变(Park变)的仿真模型。 仿真条件:MATLAB Simulink R2015b ,MATLAB Simulink;三相静止坐标系;两相静止坐标系;Clark变换;Park变换;仿真模型;R2015b,MATLAB Simulink中的Clark-Park变换仿真模型研究

    武汉东湖高新集团智慧园区 22页PPT(21页).pptx

    在智慧城市建设的大潮中,智慧园区作为其中的璀璨明珠,正以其独特的魅力引领着产业园区的新一轮变革。想象一下,一个集绿色、高端、智能、创新于一体的未来园区,它不仅融合了科技研发、商业居住、办公文创等多种功能,更通过深度应用信息技术,实现了从传统到智慧的华丽转身。 智慧园区通过“四化”建设——即园区运营精细化、园区体验智能化、园区服务专业化和园区设施信息化,彻底颠覆了传统园区的管理模式。在这里,基础设施的数据收集与分析让管理变得更加主动和高效,从温湿度监控到烟雾报警,从消防水箱液位监测到消防栓防盗水装置,每一处细节都彰显着智能的力量。而远程抄表、空调和变配电的智能化管控,更是在节能降耗的同时,极大地提升了园区的运维效率。更令人兴奋的是,通过智慧监控、人流统计和自动访客系统等高科技手段,园区的安全防范能力得到了质的飞跃,让每一位入驻企业和个人都能享受到“拎包入住”般的便捷与安心。 更令人瞩目的是,智慧园区还构建了集信息服务、企业服务、物业服务于一体的综合服务体系。无论是通过园区门户进行信息查询、投诉反馈,还是享受便捷的电商服务、法律咨询和融资支持,亦或是利用云ERP和云OA系统提升企业的管理水平和运营效率,智慧园区都以其全面、专业、高效的服务,为企业的发展插上了腾飞的翅膀。而这一切的背后,是大数据、云计算、人工智能等前沿技术的深度融合与应用,它们如同智慧的大脑,让园区的管理和服务变得更加聪明、更加贴心。走进智慧园区,就像踏入了一个充满无限可能的未来世界,这里不仅有科技的魅力,更有生活的温度,让人不禁对未来充满了无限的憧憬与期待。

    自驾游中行程时间灵活调整.doc

    自驾游中行程时间灵活调整

    ,,基于蒙特卡洛法的概率潮流 以IEEE33节点的电网为研究对象 建立了光伏和风电的概率出力模型 采用蒙特卡洛法进行随机抽样 之后基于抽样序列进行概率潮流计算 最后得到电网的电压概率出力曲线 程序

    ,,基于蒙特卡洛法的概率潮流 以IEEE33节点的电网为研究对象 建立了光伏和风电的概率出力模型 采用蒙特卡洛法进行随机抽样 之后基于抽样序列进行概率潮流计算 最后得到电网的电压概率出力曲线 程序有基于matpower和非matpower(效果好一点) ,核心关键词:蒙特卡洛法; 概率潮流; IEEE33节点电网; 光伏风电概率出力模型; 随机抽样; 电压概率出力曲线; matpower; 非matpower方法。,基于蒙特卡洛法的电网概率潮流分析:IEEE33节点光伏风电模型构建与验证

    基于视觉检测的机械臂药品自动分类与搬运仿真系统实现与优化(含详细可运行代码及解释)

    内容概要:本文详细介绍了基于视觉检测的机械臂药品自动分类与搬运仿真的实现方法。首先通过搭建环境和加载相关模型,接着利用 OpenCV 对摄像头捕获的画面进行药瓶识别,再通过 PyBullet 实现机械臂路径规划及其动作控制,最后通过主循环不断地完成对药物的分类抓取操作。为增强系统性能和稳定性进行了多项改进:采用先进的YOLOv8模型实现更精准的物体检测、增加更细致的夹爪开合逻辑提高物品抓取的成功率,同时加入碰撞检测机制保障运动过程的安全性。该仿真是用Python编程语言开发,并涉及多领域的技术集成。 适用人群:适用于自动化设备研究开发的技术专家或从事机器人相关专业学习的研究人员。 使用场景及目标:可用于研究自动化药房、医院仓库管理等医疗物资自动处理流程的设计;帮助理解并实践如何构建一个完整的机器人视觉引导下的机械手作业体系,以及针对具体应用场景提出有效的改进建议和技术路线图。 其他说明:为了使系统更接近真实环境,开发者还可以继续探索更多先进的机器视觉算法,并深入探讨机械臂硬件层面的选择,以期打造出更加智能化的产品应用于各行各业。

    初识Python-公共课-pdf.zip

    初识Python-公共课-pdf.zip

    Anaconda 2023 State of Data Science Report.pdf

    anaconda

    ,,VSC-HVDC仿真模型 Kundur’s 4-machine 2-area power system.pscad柔性直流输电仿真模型,同步机VSGVSM模型,还有多端如张北直流电网以及基本mmc

    ,,VSC-HVDC仿真模型 Kundur’s 4-machine 2-area power system.pscad柔性直流输电仿真模型,同步机VSGVSM模型,还有多端如张北直流电网以及基本mmc逆变器,自己为biye网上收集的一些觉得有用的基础模型,找这个模型就搜了好久,可以传授找模型的一些地方,怕麻烦的可以拿模型,学习基础用还是可以的。 另外可代接电流型HVDCPSCAD的模型设计。 ,VSC-HVDC仿真模型; Kundur's 4-machine 2-area 模型; 柔性直流输电仿真模型; 虚拟同步机VSGVSM模型; 多端直流电网模型; MMC逆变器模型; 模型搜索资源; 模型交易或共享平台; 电流型HVDCPSCAD模型设计。,基于多端柔性直流输电的VSC-HVDC仿真模型研究:含Kundur四机两区电力系统与VSGVSM模型应用

    56页-智慧双碳园区建设方案.pdf

    在智慧城市建设的大潮中,智慧园区作为其中的璀璨明珠,正以其独特的魅力引领着产业园区的新一轮变革。想象一下,一个集绿色、高端、智能、创新于一体的未来园区,它不仅融合了科技研发、商业居住、办公文创等多种功能,更通过深度应用信息技术,实现了从传统到智慧的华丽转身。 智慧园区通过“四化”建设——即园区运营精细化、园区体验智能化、园区服务专业化和园区设施信息化,彻底颠覆了传统园区的管理模式。在这里,基础设施的数据收集与分析让管理变得更加主动和高效,从温湿度监控到烟雾报警,从消防水箱液位监测到消防栓防盗水装置,每一处细节都彰显着智能的力量。而远程抄表、空调和变配电的智能化管控,更是在节能降耗的同时,极大地提升了园区的运维效率。更令人兴奋的是,通过智慧监控、人流统计和自动访客系统等高科技手段,园区的安全防范能力得到了质的飞跃,让每一位入驻企业和个人都能享受到“拎包入住”般的便捷与安心。 更令人瞩目的是,智慧园区还构建了集信息服务、企业服务、物业服务于一体的综合服务体系。无论是通过园区门户进行信息查询、投诉反馈,还是享受便捷的电商服务、法律咨询和融资支持,亦或是利用云ERP和云OA系统提升企业的管理水平和运营效率,智慧园区都以其全面、专业、高效的服务,为企业的发展插上了腾飞的翅膀。而这一切的背后,是大数据、云计算、人工智能等前沿技术的深度融合与应用,它们如同智慧的大脑,让园区的管理和服务变得更加聪明、更加贴心。走进智慧园区,就像踏入了一个充满无限可能的未来世界,这里不仅有科技的魅力,更有生活的温度,让人不禁对未来充满了无限的憧憬与期待。

Global site tag (gtag.js) - Google Analytics