JSF开发人员应该知道的5种有用方法

这篇文章的目的是总结一些JSF开发人员可以在日常工作中使用的便捷方法。 实用程序类是将所有方法放在一起的好地方。 我会称此类为FacesAccessor。 第一种方法可能是最常用的方法。 它以给定名称返回托管bean。

必须按faces-config.xml或注释注册该bean。 注入是好的,但是有时如果很少调用bean,则不必将bean相互注入。

public static Object getManagedBean(final String beanName) {FacesContext fc = FacesContext.getCurrentInstance();Object bean;try {ELContext elContext = fc.getELContext();bean = elContext.getELResolver().getValue(elContext, null, beanName);} catch (RuntimeException e) {throw new FacesException(e.getMessage(), e);}if (bean == null) {throw new FacesException("Managed bean with name '" + beanName+ "' was not found. Check your faces-config.xml or @ManagedBean annotation.");}return bean;
}

使用:

@ManagedBean
public class PersonBean {...
}PersonBean personBean = (PersonBean)FacesAccessor.getManagedBean("personBean");// do something with personBean

第二种方法对JSF组件开发人员以及所有想要评估给定值表达式#{…}并将结果设置为给定值的人都非常有用。

public static void setValue2ValueExpression(final Object value, final String expression) {FacesContext facesContext = FacesContext.getCurrentInstance();ELContext elContext = facesContext.getELContext();ValueExpression targetExpression = facesContext.getApplication().getExpressionFactory().createValueExpression(elContext, expression, Object.class);targetExpression.setValue(elContext, value);
}

使用:
我个人将这种方法用于“注销功能”。 用户注销后,他/她将看到一个特殊的“注销页面”。 “注销页面”使用来自sesion作用域bean的用户设置(例如主题,语言等)。 但是由于会话无效,因此该会话作用域bean不再存在。 该怎么办? 这是我的注销方法中的代码片段。

UserSettings userSettings = (UserSettings) FacesAccessor.getManagedBean("userSettings");// invalidate session
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
HttpSession session = (HttpSession) ec.getSession(false);
session.invalidate();// create new session
((HttpServletRequest) ec.getRequest()).getSession(true);// restore last used user settings because login / logout pages reference "userSettings"
FacesAccessor.setValue2ValueExpression(userSettings, "#{userSettings}");// redirect to the specified logout page
ec.redirect(ec.getRequestContextPath() + "/views/logout.jsf");

第三种方法将变量映射到给定的值表达式#{…}。 它使用javax.el.VariableMapper将表达式分配给指定的变量,以便对该变量的任何引用都将被EL评估中的表达式替换。

public static void mapVariable2ValueExpression(final String variable, final String expression) {FacesContext facesContext = FacesContext.getCurrentInstance();ELContext elContext = facesContext.getELContext();ValueExpression targetExpression =facesContext.getApplication().getExpressionFactory().createValueExpression(elContext, expression, Object.class);elContext.getVariableMapper().setVariable(variable, targetExpression);
}

使用:
假设“ PersonBean”是一个具有“ name”属性的托管Bean,“ PersonsBean”是一个包含“ PersonBean”的许多实例(作为数组,集合或映射)的Bean。 以下代码允许将“ personBean”用作对具有“ name” Oleg的特定bean的引用。

FacesAccessor.mapVariable2ValueExpression("personBean", "#{personsBean.person['Oleg']}");

在facelets页面中,这样说一下personDetail.xhtml,我们可以编写:

<html xmlns="http://www.w3.org/1999/xhtml"xmlns:ui="http://java.sun.com/jsf/facelets"xmlns:h="http://java.sun.com/jsf/html">
<ui:composition>...<h:inputText value="#{personBean.name}"/>...
</ui:composition>
</html>

注意,参考“ personBean”是在Java中设置的。 还可以通过ui:include / ui:param以声明的方式在facelet中使用此映射。

<html xmlns="http://www.w3.org/1999/xhtml"xmlns:ui="http://java.sun.com/jsf/facelets">
<ui:composition>...<ui:include src="personDetail.xhtml"><ui:param name="personBean" value="#{personsBean.person['Oleg']}"/></ui:include>...
</ui:composition>
</html>

接下来的两个方法用于以编程方式创建MethodExpression / MethodExpressionActionListener。 如果您通过“ binding”属性使用组件绑定或在Java中创建一些模型类,则它们非常方便。

public static MethodExpression createMethodExpression(String valueExpression,Class<?> expectedReturnType,Class<?>[] expectedParamTypes) {MethodExpression methodExpression = null;try {FacesContext fc = FacesContext.getCurrentInstance();ExpressionFactory factory = fc.getApplication().getExpressionFactory();methodExpression = factory.createMethodExpression(fc.getELContext(), valueExpression, expectedReturnType, expectedParamTypes);} catch (Exception e) {throw new FacesException("Method expression '" + valueExpression + "' could not be created.");}return methodExpression;
}public static MethodExpressionActionListener createMethodActionListener(String valueExpression,Class<?> expectedReturnType,Class<?>[] expectedParamTypes) {MethodExpressionActionListener actionListener = null;try {actionListener = new MethodExpressionActionListener(createMethodExpression(valueExpression, expectedReturnType, expectedParamTypes));} catch (Exception e) {throw new FacesException("Method expression for ActionListener '" + valueExpression+ "' could not be created.");}return actionListener;
}

使用:
在我的一个项目中,我以编程方式创建了带有菜单项的PrimeFaces MenuModel。

MenuItem mi = new MenuItem();
mi.setAjax(true);
mi.setValue(...);
mi.setProcess(...);
mi.setUpdate(...);
mi.setActionExpression(FacesAccessor.createMethodExpression("#{navigationContext.setBreadcrumbSelection}", String.class, new Class[] {}));UIParameter param = new UIParameter();
param.setId(...);
param.setName(...);
param.setValue(...);
mi.getChildren().add(param);

您想在这里分享什么好方法吗? 欢迎使用提示/技巧。

参考: 5种有用的方法JSF开发人员应该从我们的JCG合作伙伴 Oleg Varaksin的“软件开发思想”博客中了解到。


翻译自: https://www.javacodegeeks.com/2012/04/5-useful-methods-jsf-developers-should.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android项目编码规范,Android 项目规范

Android 项目规范本文档的目的是定义项目规范。这些应遵循整个 Android 项目以帮助我们保持整洁和统一的代码库。 &#x1f642;

Java创建WebService服务及客户端实现

简介 WebService是一种服务的提供方式&#xff0c;通过WebService&#xff0c;不同应用间相互间调用变的很方便&#xff0c;网络上有很多常用的WebService服务&#xff0c;如&#xff1a;http://developer.51cto.com/art/200908/147125.htm&#xff0c;不同的语言平台对…

01-17权限管理

管理页面&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equi…

Java静态方法可能会产生代码异味

代码气味的定义 &#xff08;来自维基百科&#xff09;&#xff1a; “程序源代码中任何可能表明存在更深层问题的症状。” 在Java中&#xff0c; 静态方法允许您在“类范围”内执行代码&#xff0c;而不是像成员方法这样的实例范围。 这意味着&#xff0c;它们依赖于类级别的变…

android json 解析图片,JSON解析并获取android中的图像

我想解析包含字符串和图像的JSON对象。我的代码正在工作&#xff0c;但它加载图像太慢。我想加载另一个asynctask或服务的图像&#xff0c;以减少加载时间。我怎样才能做到这一点&#xff1f;哪一个是最好的方法使用asynctask或服务&#xff1f;这里是我的代码JSON解析并获取an…

Node Express4.x 片段视图 partials

1.在Express 4.x使用片段视图&#xff0c;需要引入partials模块 步骤&#xff1a; 1.在全局中安装express-partials模块&#xff1a; 2.在本地模块中安装express-partials,将模块安装到package.json中&#xff1a; 3.在入口文件(如&#xff1a;app.js)中引入模块&#xff1a; v…

bzoj1690:[Usaco2007 Dec]奶牛的旅行(分数规划+spfa判负环)

PS:此题数组名皆引用&#xff1a;戳我 题目大意&#xff1a;有n个点m条有向边的图&#xff0c;边上有花费&#xff0c;点上有收益&#xff0c;点可以多次经过&#xff0c;但是收益不叠加&#xff0c;边也可以多次经过&#xff0c;但是费用叠加。求一个环使得收益和/花费和最大&…

安全密码存储–请勿做的事和Java示例

安全存储密码的重要性 作为软件开发人员&#xff0c;我们最重要的职责之一就是保护用户的个人信息。 没有我们应用程序的技术知识&#xff0c;用户别无选择&#xff0c;只能相信我们正在履行这一责任。 令人遗憾的是&#xff0c;在密码方面&#xff0c;软件开发社区的记录不一。…

红米note4x Android7,红米Note4X能升级安卓7.0吗?红米Note4X如何升级Android7.0?

欢迎来到PPL网站的行业资讯知识分类&#xff0c;你现在观看的这篇文章要和大家分享的是关于红米Note4X能升级安卓7.0吗&#xff1f;红米Note4X如何升级Android7.0&#xff1f;的一些相关内容&#xff0c;希望大家能够感兴趣&#xff0c;并且希望我们能够帮助到你&#xff01;在…

java基础----数字签名算法的介绍

数字签名&#xff08;又称公钥数字签名&#xff09;是一种类似写在纸上的普通的物理签名&#xff0c;但是使用了公钥加密领域的技术实现&#xff0c;用于鉴别数字信息的方法。关于数字签名的介绍&#xff0c;可以参见百度百科&#xff1a;http://baike.baidu.com/view/7626.htm…

Android宫格自动换行,九宫格视图的布局及展示(相册选择)

上周一个朋友带的项目出了点问题&#xff0c;招的ios开发人员在实现选取相册图片后用九宫格的样式展示时遇到了瓶颈&#xff0c;花了将近2周都没有解决。后来在跟我交流的过程中他把项目的图片发给我看了下&#xff0c;看完我就笑了&#xff0c;这就只是个算法的问题&#xff0…

具有LCS方法的通用文本比较工具

常见的问题是检测并显示两个文本&#xff08;尤其是几百行或几千行&#xff09;的差异。 使用纯java.lang.String类方法可能是一种解决方案&#xff0c;但是对于此类操作最重要的问题是&#xff0c;“性能”将不能令人满意。 我们需要一种有效的解决方案&#xff0c;其可能具有…

eclipse 开发 scala

(环境&#xff1a;jdk1.7,scala插件scala-2.1.1.2-site.zip) 1:下载scala插件 http://download.scala-ide.org/sdk/helium/e38/scala211/stable/site2&#xff1a;解压到本地将这两个文件里的jar包全部复制到eclipse的安装目录对应的文件夹里三&#xff1a;重启eclipse这时会提…

关于这个博客

博客主要打算写关于游戏制作方面的内容&#xff0c;包括directx&#xff0c;实时图形知识等等方面的内容&#xff0c;作为一个渣暂时都是一些简单的东西&#xff0c;努力找工作中...... 开这个博客主要目的是为了对自己做的事有个记录吧&#xff0c;并且关于directx方面的东西本…

Quartz Scheduler失火指令说明

有时&#xff0c;Quartz无法在您需要的时间运行您的工作。 这有三个原因&#xff1a; 所有工作线程都忙于运行其他作业&#xff08;可能具有更高的优先级&#xff09; 调度程序本身已关闭 该作业是在过去的开始时间安排的&#xff08;可能是编码错误&#xff09; 您可以通过…

android 代码获取屏幕图像,安卓获取屏幕以及获得像素点 ~ 大树洞

由于一些不可告人的需求&#xff0c;所以开始寻找各种可以实现安卓实时获得屏幕上某个像素点的功能首先&#xff0c;将需求进行拆解&#xff0c;分别为1、获得屏幕2、获得屏幕上一个像素点获得屏幕获得屏幕分为比较多种的方式&#xff0c;在以前大致分为adb screencap 获取当前…

海量端口扫描工具masscan

海量端口扫描工具masscanmasscan号称是互联网上最快的端口扫描工具&#xff0c;可以6分钟扫描整个互联网&#xff0c;每秒可以发送一百万个数据包。为了提高处理速度&#xff0c;masscan定制了TCP/IP栈&#xff0c;从而不影响本地其他TCP/IP的数据传输。masscan提供较为丰富的选…

改进租房练习

代码基本没有改动&#xff0c;函数有变化&#xff0c;老师只用了一个函数&#xff0c;自己做写了4个function&#xff0c;减少了代码量 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio…

Google App Engine JAX-RS REST服务

在本文中&#xff0c;您将学习如何使用JAX-RS参考实现&#xff08;Jersey&#xff09;创建REST服务并将其部署在Google AppEngine上。 先决条件 对于本教程&#xff0c;您将需要&#xff1a; Google AppEngine帐户 Eclipse Galileo&#xff08;3.5.x&#xff09; 适用于Java的…

libnids校验和引起回放包不能正常捕捉

如题 取消校验和校验即可&#xff1a; struct nids_chksum_ctl temp;temp.netaddr 0;temp.mask 0;temp.action 1;nids_register_chksum_ctl(&temp,1); 在init之前。转载于:https://www.cnblogs.com/yaoyuanfeixing/p/6308067.html