如何创建参数,使用JSF和导航规则的GET请求?(How to create a GET reque

2019-07-05 04:09发布

有一个方法来创建使用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。

Answer 1:

这是一个有趣的想法。 我很好奇,想知道它是如何在实践中平移出来。

获取导航规则

导航由处理NavigationHandler 。 获取NavigationHandler的保持并不难,但API不公开其使用的规则。

在我看来,您可以:

  1. 解析faces-config.xml中在初始化并存储在应用程序上下文的规则( 容易
  2. 实现自己的NavigationHandler忽略faces-config.xml中的规则或补充他们自己的规则文件,并以某种方式暴露了其规则集( 可行的,但需要一些工作
  3. 嘲笑自己的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。



Answer 2:

使用PrettyFaces试过吗? 这是一个开源JSF扩展,专门设计,使可收藏的JSF页面/ JSF有可能的GET请求。

PrettyFaces -搜索引擎优化,动态参数,书签和导航为JSF / JSF2



Answer 3:

你有没有考虑一个形式?

<h:form>
    <h:commandLink value="Click to see the message" action="#{handler.outcome}" />
    <h:inputHidden id="msgId" value="#{bean.msgId}"/>
</h:form>


Answer 4:

你可以使用嵌套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?