这篇文章的目的是总结一些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

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

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

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

  2. Java开发人员应该知道的7种新工具

    通过快速浏览一些最新的创新工具,随时准备锁定和加载. 万一您错过了它,RebelLabs最近发布了Java工具和技术前景的全球调查结果 . 除了著名的工具和成熟的工具外,市场还涌现出鲜有人知的新鲜工具 ...

  3. java 开发人员工具_Java开发人员应该知道的5种错误跟踪工具

    java 开发人员工具 随着Java生态系统的发展,可满足不断增长的请求和用户对高性能需求的Web应用程序成为了新型的现代开发工具. 具有快速新部署的快速节奏环境需要跟踪错误,并以传统方法无法维持的水 ...

  4. java 开发人员工具_Java开发人员应该知道的7种新工具

    java 开发人员工具 通过快速浏览一些最新的,创新的工具,准备好锁定和加载. 万一您错过了它,RebelLabs最近发布了Java工具和技术前景的全球调查结果 . 除了著名的工具和成熟的工具之外,市 ...

  5. Java开发人员应该知道的5种错误跟踪工具

    随着Java生态系统的不断发展,可满足不断增长的请求和用户对高性能需求的Web应用程序成为了新型的现代开发工具. 具有快速新部署的快速节奏环境需要跟踪错误并获得应用程序行为的洞察力,而传统方法无法维持 ...

  6. C#开发人员应该知道的13件事情

    C#开发人员应该知道的13件事情 本文讲述了C#开发人员应该了解到的13件事情,希望对C#开发人员有所帮助. 1. 开发过程 开发过程是错误和缺陷开始的地方.使用工具可以帮助你在发布之后,解决掉一些问 ...

  7. Java开发人员应该知道的5大Spring Boot功能

    您可能已经听说过Spring Boot,这是用不到140个字符创建一个Spring Web应用程序的神奇力量,可以在一条推文中编写这些字符,但这到底意味着什么? 哪些功能可以使Spring Boot具 ...

  8. C# Development 13 Things Every C# Developer Should Know--C#开发人员应该知道的13件事情

    原文链接:https://dzone.com/refcardz/csharp 本文讲述了C#开发人员应该了解到的13件事情,希望对C#开发人员有所帮助. 1. 开发过程 开发过程是错误和缺陷开始的地方 ...

  9. php开发手册要看完吗,9个开发人员应该知道的PHP库

    9个开发人员应该知道的PHP库大多都是国外的资源,不过有了这些PHP库的支持,大家今后进行开发一定能加快速度,不会进行简单的重复劳动. 1. ReCAPTCHA The reCAPTCHA 库让你可以 ...

最新文章

  1. linux 格式化未分配区间,Linux 格式化分区 报错Could not stat --- No such file or directory 和 partprobe 命令...
  2. Swift监听网络状态
  3. python输入完怎么运行-如何在服务器上跑python程序
  4. REST service 化一个数据系统(REST Service 的最佳实践,第 2 部分)
  5. nutch-site参数配置
  6. 使用 SAP BTP 创建一个 Spring Boot Java 应用
  7. python_装饰器
  8. linux 定位 踩内存_运维常见问题故障定位,这里总结全了!
  9. 山石防火墙增加端口映射
  10. Spring MVC-学习笔记(4)数据绑定流程
  11. web操作日志丢失_分享:有赞百亿级日志系统架构设计
  12. ASP.NET 创建网站地图
  13. php管理后台,后台管理主页面 admin.php
  14. 遍历Map集合的四种方式
  15. 开发中最常用的GitHub上 优秀的 Android 开源项目整理(精品)
  16. TMB计算是否要去除驱动突变
  17. 计算机单位 字节,字节是什么意思?字节是什么单位
  18. 广东省的身份证号码开头
  19. 【智库解读】明天系、安邦系、海航系、复星系、联想系、中植系、三胞系、宝能系等27个超级民营金融巨头名单及其持股图揭秘!
  20. 【下载工具】哔哩哔哩视频下载器——(Downkyi)下载姬v1.3.3

热门文章

  1. mybatis_user_guide(3)XML配置
  2. jep290涉及jdk版本_JDK 14 – JEP 361从预览中切换表达式
  3. ubuntu安装jdk语句_JDK 12:实际中的切换语句/表达式
  4. jdk入门_JDK 9 REPL:入门
  5. eap和psk_针对WildFly和EAP运行Java Mission Control和Flight Recorder
  6. 使用Apache Kafka,Kubernetes和Envoy,Istio,Linkerd的服务网格和云原生微服务
  7. API网关和AWS Lambda进行身份验证
  8. 探索适用于Apache Spark的Spline Data Tracker和可视化工具(第2部分)
  9. Java EE 8安全性API:概述
  10. 基于Spring Boot Profile的日志记录示例样本