任何人都可以澄清我们如何在一般情况下使用,或者在现实世界中使用这个代码片段?
<f:metadata>
<f:viewParam id="id" value="#{bean.id}" />
<f:viewAction action="#{bean.init}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud) 什么时候应该使用f:viewActionor preRenderView事件来初始化页面的数据而不是使用@PostConstruct注释?基于支持bean的范围类型使用一个或另一个的基本原理例如,如果支持bean是@RequestScoped,那么在呈现视图之前选择使用f:viewAction或preRenderView覆盖@PostConstruct初始化支持bean是不相关的,因为两者会结果是一样的吗?
f:viewAction或preRenderView
<f:metadata>
<f:viewAction action="#{myBean.initialize}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
<f:metadata>
<f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
要么
@PostConstruct
public class MyBean
{
@PostConstruct
public void initialize()
{
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个网络应用程序,用户可以直接发送到某些特定页面(例如他可以查看或编辑项目的页面).为此,我们提供了一个特定的网址.这些网址位于外电流网络的应用程序(即,它们可以存在于另一网络的应用程序,或电子邮件).
网址看起来像http://myserver/my-app/forward.jsf?action=XXX¶m=YYY,其中:
from-outcome任何JSF的行动navigation-case中faces-config.xml.例如,我可以拥有这些网址:
http://myserver/my-app/forward.jsf?action=viewItem&actionParam=1234http://myserver/my-app/forward.jsf?action=editItem&actionParam=1234当然,我有一个Java类(bean),它将检查一些安全性约束(即允许用户查看/编辑相应的项目?),然后将用户重定向到正确的页面(例如edit.xhtml,view.xhtml或access-denied.xhtml).
目前的实施
目前,我们有一个完成前进的基本方法.当用户单击该链接时,将调用以下XHTML页面:
<html>
<body id="forwardForm">
<h:inputHidden id="myAction" binding="#{forwardBean.hiddenAction}"/>
<h:inputHidden id="myParam" binding="#{forwardBean.hiddenActionParam}"/>
<h:commandButton id="forwardBtn" actionListener="#{forwardBean.doForward}" style="display: none;"/>
</body>
<script type="text/javascript">
document.getElementById('forwardForm:forwardBtn').click();
</script>
</html>
Run Code Online (Sandbox Code Playgroud)
如您所见,我<h:inputHidden>在Java bean中绑定了两个组件.它们将用于存储both action和actionParamrequest参数(使用FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("actiontParam");)的值.我还提供了doForward在呈现页面时立即调用的方法,该方法将(再次)用户重定向到真实页面.方法是:
public void doForward(ActionEvent evt) {
FacesContext facesContext = FacesContext.getCurrentInstance();
String redirect = // define the navigation rule that must be …Run Code Online (Sandbox Code Playgroud) 目前,我正在使用JSF 2.0,Tomcat 7和MongoDB开发一个Web项目.我有一个很大的问题,如何处理数据库中用户的会话管理和身份验证/授权.
我想要的结构如下:只有登录用户才能创建事件,每个人都可以看到创建的事件.
create.xhtml - >仅适用于已登录的用户.events.xhtml - >为大家公开.我计划的基本结构是:
create.xhtml)login.xhtml@SessionScoped进入比赛)问题是:
@SessionScoped注释?在Create.java或
LoginManager.java?这些的执行顺序是什么?
这是一个关于可能的f:event事件名称的问题:JSF 2事件列表?
preRenderComponent
preRenderView
postAddToView
preValidate
postValidate
Run Code Online (Sandbox Code Playgroud)
我想检查用户是否保存在会话bean中,如果没有重定向到登录站点,这需要在view-param转换阶段之前发生,因为使用的转换器依赖于登录的用户.'preValidate'似乎是在转换后发生的,因此我需要更早的事件.
<f:event type="preRenderView" listener="#{beanA.checkLoggedIn()}"/>
<f:viewParam name="param" value="#{beanB.param}" converter="#{beanB.converter}" required="true"/>
Run Code Online (Sandbox Code Playgroud)
我也可以在'beanB'中加入'checkLoggedIn()',但是试图使用一个单独的请求范围的bean来进行检查,以便我可以轻松地重用它.
我想在我的4个支持bean中的@PostConstruct中进行重定向.正如我从以下问题中学到的: JSF PostConstruct异常处理 - 重定向 我知道我应该使用:
@PostConstruct
public void init() {
if (shouldRedirect) {
try {
FacesContext.getCurrentInstance().getExternalContext().redirect("bolagsSok_company.xhtml");
return;
} catch (IOException e) {
//do nothing
}
}
....
}
Run Code Online (Sandbox Code Playgroud)
这适用于我的2个Backing bean ...但是对于其他两个,非重定向的xhtml文件仍然调用支持bean而不重定向.我已经确认(使用调试),支持bean确实调用了两个FacesContext.getCurrentInstance().getExternalContext().redirect("bolagsSok_company.xhtml");并返回; 声明.
有什么线索可能是错的?
我想知道如果某个c:ifclausule是否可以重定向用户true?
<c:if test="#{loginController.authenticated}">
//redirect to index page
</c:if>
Run Code Online (Sandbox Code Playgroud) 我从什么可以<f:metadata>,<f:viewParam>和<f:viewAction>开始?
我有一个预呈现视图事件监听器:
<f:metadata>
<f:event type="preRenderView" listener="#{loginBean.performWeakLogin()}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
它调用以下方法:
public String performWeakLogin() {
FacesContext facesContext = FacesContext.getCurrentInstance();
String parameter_value = (String) facesContext.getExternalContext().getRequestParameterMap().get("txtName");
if (parameter_value != null && parameter_value.equalsIgnoreCase("pippo")) {
try {
return "mainPortal";
} catch (IOException ex) {
return null;
}
} else {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
和以下导航规则:
<navigation-rule>
<from-view-id>/stdPortal/index.xhtml</from-view-id>
<navigation-case>
<from-outcome>mainPortal</from-outcome>
<to-view-id>/stdPortal/stdPages/mainPortal.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
Run Code Online (Sandbox Code Playgroud)
但是,它不执行导航.它使用命令按钮时,如下所示:
<p:commandButton ... action="#{loginBean.performWeakLogin()}" />
Run Code Online (Sandbox Code Playgroud) 我是JSF的新手(2).
在Struts中,我们可以从URL调用一个动作app.action.这会调用一个动作并返回一个结果页面,比如一个JSP(最初没有JSP/HTML).
如何在JSF中完成同样的事情?(我知道如何从.xhtml调用一个动作)即直接从URL调用托管bean并获取结果页面.
我目前正在使用PhaseListener如下方法来执行用户授权.
private PhaseId phaseId = PhaseId.RESTORE_VIEW;
@Override
public void afterPhase(PhaseEvent event) {
FacesContext fc = event.getFacesContext();
boolean isOnAllowedPage = false;
String[] allowedPages = choseRightPages(); // chose pages for role
for (String s : allowedPages) {
if (fc.getViewRoot().getViewId().lastIndexOf(s) > -1) {
isOnAllowedPage = true;
break;
}
}
if (!isOnAllowedPage) {
NavigationHandler nh = fc.getApplication().getNavigationHandler();
nh.handleNavigation(fc, null, "prohibited");
}
}
Run Code Online (Sandbox Code Playgroud)
它做我想要的,但我没有看到它列在如何处理数据库中的用户的身份验证/授权?而这个名为"使用phaselistener问题的授权"的Coderanch主题也提到了以下内容:
您不应该将与JSF紧密相关的授权结合在一起.更好地利用容器管理的身份验证和/或作用于覆盖受保护页面的url模式的简单过滤器.
我并不完全理解在执行用户授权时使用a PhaseListener而不是a 的限制Filter.有人可以向我解释一下吗?
我尝试从FacesContext获取外部上下文,并获得NullPointerException:
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
Run Code Online (Sandbox Code Playgroud)
什么可能导致问题?
jsf ×9
jsf-2 ×7
java ×3
viewaction ×2
database ×1
events ×1
java-ee ×1
jsf-1.2 ×1
listener ×1
navigation ×1
redirect ×1
security ×1
servlets ×1
viewparams ×1