我有一个Web应用程序,可以将用户直接发送到某些特定页面(例如,他可以查看或编辑项目的页面)。为此,我们提供了一个特定的URL。这些网址位于 外
电流网络的应用程序(即,它们可以存在于另一网络的应用程序,或电子邮件)。
网址看起来像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=1234
http://myserver/my-app/forward.jsf?action=editItem&actionParam=1234
当然,我有一个Java类(豆),将检查一些安全方面的限制(即是/允许查看用户编辑相应的项目吗?),然后将用户重定向到正确的页面(如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>
如您所见,我<h:inputHidden>
在Java
bean中绑定了两个组件。它们将用于存储action
和actionParam
请求参数的值(使用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 used in order to redirect the user to the adequate page...
NavigationHandler myNav = facesContext.getApplication().getNavigationHandler();
myNav.handleNavigation(facesContext, null, redirect);
}
此解决方案有效,但是我有两个问题:
所以我的问题是 如何重构此重定向/转发功能?
技术信息
Java 1.6,JSF 1.2,Facelets,Richfaces
将GET查询参数设置为托管属性,faces-config.xml
以便您无需手动收集它们:
<managed-bean>
<managed-bean-name>forward</managed-bean-name>
<managed-bean-class>com.example.ForwardBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>action</property-name>
<value>#{param.action}</value>
</managed-property>
<managed-property>
<property-name>actionParam</property-name>
<value>#{param.actionParam}</value>
</managed-property>
</managed-bean>
这样,请求forward.jsf?action=outcome1&actionParam=123
将使JSF将action
和actionParam
参数设置为action
和的actionParam
属性ForwardBean
。
创建一个小的视图forward.xhtml
(如此之小,它在默认响应缓冲(通常2KB适合),这样它就可以通过navigationhandler被重置了,否则,你已经增加了servletcontainer的配置响应缓冲区),它调用bean方法上beforePhase
的的f:view
:
<!DOCTYPE html>
<html xmlns:f="http://java.sun.com/jsf/core">
<f:view beforePhase="#{forward.navigate}" />
</html>
该ForwardBean
可以是这样的:
public class ForwardBean {
private String action;
private String actionParam;
public void navigate(PhaseEvent event) {
FacesContext facesContext = FacesContext.getCurrentInstance();
String outcome = action; // Do your thing?
facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, null, outcome);
}
// Add/generate the usual boilerplate.
}
在navigation-rule
不言自明的(注意,<redirect />
这将做分录ExternalContext#redirect()
,而不是ExternalContext#dispatch()
在幕后):
<navigation-rule>
<navigation-case>
<from-outcome>outcome1</from-outcome>
<to-view-id>/outcome1.xhtml</to-view-id>
<redirect />
</navigation-case>
<navigation-case>
<from-outcome>outcome2</from-outcome>
<to-view-id>/outcome2.xhtml</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
另一种方法是forward.xhtml
用作
<!DOCTYPE html>
<html>#{forward}</html>
并更新navigate()
要在其上调用的方法@PostConstruct
(将在bean的构造和所有托管属性设置之后调用):
@PostConstruct
public void navigate() {
// ...
}
它具有相同的效果,但是视图方面并不是真正的自我记录。它基本上所做的就是打印ForwardBean#toString()
(并在不存在时隐式构造bean)。
对于JSF2用户,请注意,有一种使用传递参数的更简洁的方法,<f:viewParam>
以及一种通过处理重定向/导航的更可靠的方法<f:eventtype="preRenderView">
。
本文向大家介绍如何使用jQuery进行页面重定向?,包括了如何使用jQuery进行页面重定向?的使用技巧和注意事项,需要的朋友参考一下 要重定向到jQuery中的另一个网页,请使用。您可以尝试运行以下代码以重定向到另一个网页- 示例
我有一个链接。当用户单击此链接时,页面将被重新加载。我是这样做的。。。。。。 html JS 在控制器中,我使用了javascript,这对我来说似乎很糟糕。我怎么能用angularjs做
问题内容: 我正在用Node.js和猫鼬编写一个Webapp。如何对通话结果进行分页?我想要一个与SQL 相当的功能。 问题答案: 在通过Rodolphe提供的信息仔细研究了Mongoose API之后,我想出了以下解决方案:
问题内容: 我有一个PHP include,它需要一段时间才能加载,因为PHP必须获取很多数据。我不想放慢整个网页的加载,以等待包含此内容,那么如何使用ajax加载该包含内容呢?我不希望通过单击按钮来触发Ajax,而只是希望它在页面加载时加载包含,因此,如果您查看下面的示例,则会在显示内含代码的同时显示“更多HTML内容”。 php仍在加载中。 问题答案: 如果您使用的是jQuery,则可以使用他
问题内容: 我已经通过Ajax调用通过隐藏的iframe读取了Facebook加载页面的地方…这是真的吗? 问题答案: Facebook使用他们称为BigPipe的东西,它将页面分成一堆小小的“小页面”,这些小页面分别通过AJAX加载。 在下图中,浅蓝色突出显示的区域是单个的小页面。
我想停止重新加载页面时,我没有选择类别和点击提交按钮。有人能帮我吗? null null