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

本文介绍了JSF中托管Bean的多种交互方式,包括通过f:attribute和f:param组件传递参数,利用h:inputHidden和SessionMap保持状态,以及通过不同方法在托管Bean间通信。
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 void action4()     ...{               FacesContext context = FacesContext.getCurrentInstance();         MyBean2 myBean2 = (MyBean2) context.getApplication().getExpressionFactory().createValueExpression(context.getELContext(), "#{myBean2}", MyBean2.class).getValue(context.getELContext());         myBean2.getText().setValue("action4");       }          // Using RequestMap. NOTE: myBean2 should be request scoped!       public void action5()     ...{               Object object = FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("myBean2");         // This only works if myBean2 is request scoped.               if (object != null)         ...{                       MyBean2 myBean2 = (MyBean2) object;             myBean2.getText().setValue("action5");               }       }           // Using SessionMap. NOTE: myBean2 should be session scoped!       public void action6()     ...{               Object object =  FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("myBean2");         // This only works if myBean2 is session scoped.               if (object != null)         ...{                     MyBean2 myBean2 = (MyBean2) object;             myBean2.getText().setValue("action6");         }       } } MyBean2.java: package mypackage; import javax.faces.component.html.HtmlOutputText; public class MyBean2 ...{       private HtmlOutputText text;           public HtmlOutputText getText()     ...{               return text;       }           public void setText(HtmlOutputText text)     ...{               this.text = text;       } }
送带损坏与对象检测数据集 一、基础信息 • 数据集名称:送带损坏与对象检测数据集 • 图片数量: 训练集:645张图片 验证集:185张图片 测试集:92张图片 总计:922张工业监控图片 • 训练集:645张图片 • 验证集:185张图片 • 测试集:92张图片 • 总计:922张工业监控图片 • 分类类别: Hole(孔洞):送带表面的孔洞损坏。 Human(人类):工作区域中的人类,用于安全监控。 Other Objects(其他对象):非预期对象,可能引起故障。 Puncture(刺穿):送带被刺穿的损坏。 Roller(滚筒):送带滚筒部件。 Tear(撕裂):送带撕裂损坏。 impact damage(冲击损坏):由于冲击导致的损坏。 patch work(修补工作):已修补的区域。 • Hole(孔洞):送带表面的孔洞损坏。 • Human(人类):工作区域中的人类,用于安全监控。 • Other Objects(其他对象):非预期对象,可能引起故障。 • Puncture(刺穿):送带被刺穿的损坏。 • Roller(滚筒):送带滚筒部件。 • Tear(撕裂):送带撕裂损坏。 • impact damage(冲击损坏):由于冲击导致的损坏。 • patch work(修补工作):已修补的区域。 • 标注格式:YOLO格式,包含边界框类别标签,适用于目标检测任务。 • 数据格式:图像数据来源于工业监控系统,适用于计算机视觉分析。 二、适用场景 • 工业自动化检测系统开发:用于构建自动检测送带损坏异物的AI模型,实现实时监控预防性维护,减少停机时间。 • 安全监控应用:识别人类其他对象,提升工业环境的安全性,避免事故人员伤害。 • 学术研究与创新:支持计算机视觉在制造业、物流自动化领域的应用研究,促进AI技术与工业实践的融合。 • 教育与培训:可用于培训AI模型或作为工业工程自动化教育的案例数据,帮助学习者理解实际应用场景。 三、数据集优势 • 多样化的类别覆盖:包含8个关键类别,涵盖多种损坏类型对象,确保模型能够处理各种实际工业场景,提升泛化能力。 • 精准的标注质量:采用YOLO格式,边界框标注准确,由专业标注人员完成,保证数据可靠性模型训练效果。 • 强大的任务适配性:兼容主流深度学习框架(如YOLO、TensorFlow、PyTorch),可直接用于目标检测任务,并支持扩展至其他视觉任务需求。 • 突出的工业价:专注于工业送带系统的实际需求,帮助提升生产效率、降低维护成本,并增强工作场所安全,具有较高的实际应用价
一、基础信息 • 数据集名称:垃圾废弃物目标检测数据集 • 图片数量: 训练集:1124张图片 验证集:375张图片 总计:1499张图片 • 训练集:1124张图片 • 验证集:375张图片 • 总计:1499张图片 • 分类类别:包含60多个垃圾废弃物类别,如气溶胶、铝泡罩包装、电池、破碎玻璃、卡片泡罩包装、香烟、透明塑料瓶、瓦楞纸箱、薯片袋、一次性食品容器、一次性塑料杯、饮料罐、饮料纸盒、鸡蛋盒、泡沫杯、泡沫食品容器、食品罐、食物垃圾、垃圾袋、玻璃瓶、玻璃杯、玻璃罐、杂志纸、餐盒、金属瓶盖、金属盖、普通纸、其他纸箱、其他塑料、其他塑料瓶、其他塑料容器、其他塑料杯、其他塑料包装、纸袋、纸杯、纸吸管、披萨盒、塑料瓶盖、塑料薄膜、塑料手套、塑料盖、塑料吸管、塑料餐具、聚丙烯袋、拉环、绳子、废金属、鞋子、一次性购物袋、六罐环、涂抹管、可挤压管、泡沫塑料片、纸巾、厕纸管、特百惠、未标记垃圾、包装纸等。 • 标注格式:YOLO格式,包含边界框类别标签,适用于目标检测任务。 • 数据格式:图片来源于实际场景,细节清晰。 二、适用场景 • 垃圾自动分类系统开发:数据集支持目标检测任务,帮助构建能够自动识别分类垃圾物品的AI模型,用于智能垃圾桶或回收系统,提升废弃物管理效率。 • 环保应用研发:集成至环保废弃物管理应用,提供实时垃圾识别功能,促进回收环境保护,支持可持续发展倡议。 • 学术研究与创新:支持计算机视觉与环保领域的交叉研究,助力发表垃圾识别AI技术相关学术论文,推动技术创新。 • 教育与培训:可用于学校或培训机构,作为垃圾分类AI目标检测教学的重要资源,培养环保意识技术能力。 三、数据集优势 • 精准标注与多样性:每张图片经过准确标注,确保边界框定位精确;包含多种垃圾类别,覆盖常见废弃物,提升模型的泛化能力鲁棒性。 • 任务适配性强:标注兼容主流深度学习框架(如YOLO等),可直接用于目标检测任务,并支持扩展到其他视觉任务,如分类或分割。 • 实际应用价:专注于垃圾识别,为环保、废弃物管理回收提供重要数据支撑,有助于减少污染促进循环经济。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值