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

jsf 开发

这篇文章的目的是总结一些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以声明的方式在facelets中使用此映射。

<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

jsf 开发

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

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

相关文章

程序员应该如何规划自己的人生与书写履历?

今天,甚至过去,大多数人都是由自己来设计他们的职业生涯的。 无论你正要启程,还是已经奋斗多年,以下内容都会对您的职业生涯有所助益。几条重要的职业规划提示。1. 学习的步伐不停止 古人说,活到老,学到老。终身学习应该是您的座右铭。 世界在不断变化,每个人都在寻找各…

浅谈多线程——NSThread

上一篇文章中我们大致了解了GCD的模式和方法&#xff0c;在iOS开发中除了GCD之外&#xff0c;还有NSThread和NSOperation两种多线程方式。 1.NSThread - a - 使用NSThread开辟多线程进行子任务处理&#xff1a;类方法和初始化方法 使用类方法不需要创建对象就可以直接开辟多线程…

小程序思考与回答

1.全局scss $:考虑引入 4.import url 引入css 的区别 5.uniapp 中不需要scope 页面样式也不会相互影响&#xff1f; 6.文件上传 oss? 二、引入qs这个库&#xff0c;更好的处理网络请求传参。 三、图片文件转为base64 好处&#xff1a; 1、减少了下载图片的http请求数&#x…

2021年程序员可以做哪些副业?

哈喽&#xff0c;大家好&#xff0c;我是孙叫兽&#xff0c;本期内容给大家分享程序员搞副业的一期节目&#xff0c;欢迎大家一起学习。 1.程序员为什么要做副业&#xff1f; 副业意味着自由 时至今日&#xff0c;仍然有一大群程序员还天真地认为从事副业是一种压迫。但事实是&…

学习Apache Camel –实时索引推文

在大多数软件开发项目中&#xff0c;有一点需要使应用程序开始与其他应用程序或第三方组件通信。 无论是发送电子邮件通知&#xff0c;调用外部api&#xff0c;写入文件还是将数据从一个地方迁移到另一个地方&#xff0c;您都可以推出自己的解决方案或利用现有框架。 对于Jav…

【坑】执行Consumer的时候发生java.net.UnknownHostException错误

【时间】&#xff1a; 2016/4/8 17:30 【问题】&#xff1a; kafka执行Consumer实例的时候&#xff0c;发生了一下错误。 kafka配置文件server.properties如下&#xff1a; zookeeper配置文件zoo.cfg内容如下&#xff1a; consumer的实现代码如下&#xff1a; 其中静态类的定义…

如何上架自己的应用到各大应用商店?

大家好&#xff0c;我叫孙叫兽&#xff0c;本期给大家分享的内容是如何上架自己的应用到应用商店&#xff0c;感谢大家的阅读&#xff01;1.上架各大应用商店需要准备哪些材料&#xff1f;上架各大安卓应用商店&#xff08;腾讯应用宝、阿里应用商店、百度手机助手、华为应用市…

ifram 表单post 方法免密登录的实现

iframe默认使用的是get请求,所以外面要使用form表单的post请求实现免密码跳转系统。 html写法: <!DOCTYPE html> <html><head><meta charset="utf-8"><title>使用iframe的post请求提交网页</title></head><style>…

时间复杂度和空间复杂度[数据结构]

參考&#xff1a;本文为小甲鱼教学视频的学习笔记。 1、为什么要学习时间复杂度和空间复杂度&#xff1f;你说一个算法好另外一个算法不好&#xff0c;有什么推断根据&#xff1f;哪个算法效率高&#xff1f;怎么推断&#xff1f;那么就要学习时间和空间复杂度了。思考&#xf…

js编码解码decodeURI()与decodeURIComponent()的区别

区别&#xff1a; encodeURIComponent()对/?:&$,#进行编码&#xff0c;encodeURI()不会 如果url的query和path传参中含有这些字符会被不正确的截断&#xff0c;拿到的参数会是错误的&#xff0c;一般都会用encodeURIComponent()进行编码、decodeURIComponent进行解码 en…

gitlab将分支代码合并到master上

1、首先在test分支上进行git add .git commit -m "test"git push 2、切换到master上git checkout mastergit merge test git push

堆栈跟踪 堆栈跟踪_过滤日志中无关的堆栈跟踪行

堆栈跟踪 堆栈跟踪我喜欢堆栈痕迹。 不是因为我喜欢错误&#xff0c;而是因为发生错误的那一刻&#xff0c;堆栈跟踪是无价的信息源。 例如&#xff0c;在Web应用程序中&#xff0c;堆栈跟踪向您显示完整的请求处理路径&#xff0c;从HTTP套接字到过滤器&#xff0c;Servlet&am…

js检测数组对象中是否有重复值

判断数组对象里的某个值是否都是同一个值 isRepeat(arr)> {var hash {};for(let i0;i<arr.length;i){if (!hash[arr[i].externalUserId]) {hash[arr[i].externalUserId] true;}}if(Object.keys(hash).length<arr.length){return true}else{return false}}isRepeat(a…

关于phpcmsv9更新缓存出现链接被重置的问题

今天安装phpcmsv9后更新缓存出现链接被重置的错误&#xff0c;。。找了半天原因。。。原来是apache配置里面的keepAlive显示的是off,,应该将其改为on...然后重新启动apache.... 转载于:https://www.cnblogs.com/yxwkf/p/5373718.html

VUE使用vue-seamless-scroll自动滚动表格数据,对表格数据排序无效的解决办法

使用vue-seamless-scroll循环表格数据&#xff0c;建议使用v-for,ul li 的形式便于操作属性&#xff0c;elemengt ui table可能不好处理兼容性问题及属性设置&#xff0c;尤其是一个页面添加多个表格及效果。 VUE : 排序 this.$refs.seamlessScroll.reset() 效果图

前端常见的加密算法介绍

一、前言 在信息安全越来越受重视的今天&#xff0c;前端的各种加密也变得更加重要。通常跟服务器的交互中&#xff0c;为保障数据传输的安全性&#xff0c;避免被人抓包篡改数据&#xff0c;除了 https 的应用&#xff0c;还需要对传输数据进行加解密。 目前常见的加密算法可…

一时冲动:“通往瓦尔哈拉之路的冒险”

通过所有有关Java 9和Project Jigsaw的讨论&#xff0c;我们不应忽视Java的另一重大变化。 希望在第10版或第11版中&#xff0c; Valhalla项目能够实现并介绍价值类型和专业化。 那么这是怎么回事&#xff0c;项目进展如何&#xff0c;面临什么挑战&#xff1f; 几天前&#x…

小程序分包

一、小程序分包 微信文档写的够清楚了 使用分包 | 微信开放文档 &#xff08;1&#xff09;常规分包注意点&#xff1a; 每个分包只能引用主包和自己的资源 &#xff08;2) 独立分包注意点&#xff1a;特别麻烦 懒得用了吧 独立分包中不能依赖主包和其他分包中的内容 …

git提交代码到自己的分支,并合并到主分支的完整流程。

我在分支sml ,主分支master git status git add . git commit -m"xxx" git pull origin master git push git checkout master git pull origin master git merge sml git push

解决Sublime Text3莫名的中文乱码问题

有好几回用Sublime Text3写着中英混杂的文字的时候&#xff0c;会突然就弹出警告说什么编码不行&#xff0c;然后点击确定后&#xff0c;原来的中文全都乱码了&#xff1a; 然后即使按ctrlz撤回也没用&#xff0c;重新打开也没用&#xff0c;用记事本的转换ansi、unicode等方式…