有一个方法来创建使用h的HTML链接:outputLink的,其他JSF标记或代码,以创建非faces请求(HTTP GET)与请求参数?
比如我有以下的导航规则
<navigation-rule>
<navigation-case>
<from-outcome>showMessage</from-outcome>
<to-view-id>/showMessage.jsf</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
在我的网页我想输出下面的HTML代码:
<a href="/showMessage.jsf?msg=23">click to see the message</a>
我可以只写在页面的HTML代码,但我想使用的导航规则,以在单个配置文件中定义的所有URL。
这是一个有趣的想法。 我很好奇,想知道它是如何在实践中平移出来。
获取导航规则
导航由处理NavigationHandler 。 获取NavigationHandler的保持并不难,但API不公开其使用的规则。
在我看来,您可以:
- 解析faces-config.xml中在初始化并存储在应用程序上下文的规则( 容易 )
- 实现自己的NavigationHandler忽略faces-config.xml中的规则或补充他们自己的规则文件,并以某种方式暴露了其规则集( 可行的,但需要一些工作 )
- 嘲笑自己的FacesContext中并将其传递给现有的导航处理程序( 真的很难作出相同的线程2点FacesContext的对象并存,效率极其低下 )
现在,你有另外一个问题了。 你要去哪里保持映射来查找的意见? 在豆类硬编码呢?
使用导航规则
关闭手,我能想到的,你可以构建从后端含参数的URL两种方式。 两者都涉及确定某种形式的豆。
<managed-bean>
<managed-bean-name>navBean</managed-bean-name>
<managed-bean-class>foo.NavBean</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
资源:
package foo;
import java.io.IOException;
import java.io.Serializable;
import java.net.URLEncoder;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
public class NavBean implements Serializable {
private String getView() {
String viewId = "/showMessage.faces"; // or look this up somewhere
return viewId;
}
/**
* Regular link to page
*/
public String getUrlLink() {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext extContext = context.getExternalContext();
String viewId = getView();
String navUrl = context.getExternalContext().encodeActionURL(
extContext.getRequestContextPath() + viewId);
return navUrl;
}
/**
* Just some value
*/
public String getValue() {
return "" + System.currentTimeMillis();
}
/**
* Invoked by action
*/
public String invokeRedirect() {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext extContext = context.getExternalContext();
String viewId = getView();
try {
String charEncoding = extContext.getRequestCharacterEncoding();
String name = URLEncoder.encode("foo", charEncoding);
String value = URLEncoder.encode(getValue(), charEncoding);
viewId = extContext.getRequestContextPath() + viewId + '?' + name
+ "=" + value;
String urlLink = context.getExternalContext().encodeActionURL(
viewId);
extContext.redirect(urlLink);
} catch (IOException e) {
extContext.log(getClass().getName() + ".invokeRedirect", e);
}
return null;
}
}
得到
对于GET请求,您可以使用UIParameters设定值,让渲染器构建参数列表。
<h:outputLink value="#{navBean.urlLink}">
<f:param name="foo" value="#{navBean.value}" />
<h:outputText value="get" />
</h:outputLink>
POST
如果你想设置一个POST操作过程中的URL到视图,您可以使用一个动作重定向(按一个按钮或commandLink调用)做到这一点。
<h:commandLink id="myCommandLink" action="#{navBean.invokeRedirect}">
<h:outputText value="post" />
</h:commandLink>
笔记
需要注意的是ExternalContext.encodeActionURL用于字符串编码。 这是生产代码,可跨上下文(portlet的,诸如此类)的良好做法。 如果你是编码链接到图像或下载文件,您将使用encodeResourceURL。
使用PrettyFaces试过吗? 这是一个开源JSF扩展,专门设计,使可收藏的JSF页面/ JSF有可能的GET请求。
PrettyFaces -搜索引擎优化,动态参数,书签和导航为JSF / JSF2
你有没有考虑一个形式?
<h:form>
<h:commandLink value="Click to see the message" action="#{handler.outcome}" />
<h:inputHidden id="msgId" value="#{bean.msgId}"/>
</h:form>
你可以使用嵌套param标签一个commandLink。 这是基本相同hubbardr上面说的:
<h:form>
<h:commandLink value="click here" action="${handler.outcome}">
<f:param name="msgId" value="${bean.id}" />
</h:commandLink>
</h:form>
然后在你的后盾豆你需要做的:
Map requestMap = FacesContext.getCurrentInstance()
.getExternalContext().getRequestParameterMap();
String msgId = (String) requestMap.get("msgId");
然后做你需要做的。
文章来源: How to create a GET request with parameters, using JSF and navigation-rules?