当前位置: 首页 > 面试题库 >

如何使用JSF和导航规则创建带有参数的GET请求?

柯瀚海
2023-03-14
问题内容

有没有一种方法可以使用h:outputLink,其他JSF标签或代码来创建html链接,以创建带有请求参数的非面孔请求(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不会公开其使用的规则。

如我所见,您可以:

  1. 在初始化时解析faces-config.xml并将规则存储在应用程序上下文中( easy
  2. 实现自己的NavigationHandler,它会忽略faces-config.xml中的规则或使用您自己的规则文件对其进行补充,并以某种方式公开其规则集( 可行,但需要一些工作
  3. 模拟您自己的FacesContext并将其传递给现有的导航处理程序( 很难使两个FacesContext对象在同一线程中共存并且效率极低

现在,您还有另一个问题。您将在哪里保留映射以查找视图?将它们硬编码在bean中?

使用导航规则

临时而言,我想到了两种从后端构造包含参数的URL的方法。两者都涉及定义某种bean。

<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操作期间将URL设置为视图,则可以使用操作中的重定向(由按钮或commandLink调用)来实现。

<h:commandLink id="myCommandLink" action="#{navBean.invokeRedirect}">
    <h:outputText value="post" />
</h:commandLink>

笔记

请注意,ExternalContext.encodeActionURL用于编码字符串。这是生成可跨上下文(portlet等)移植的代码的良好实践。如果您要编码指向图像或下载文件的链接,则应使用
encodeResourceURL



 类似资料:
  • 在后端,我有带有POST方法的REST控制器: 如何使用带有请求参数的WebClient创建请求?

  • 问题内容: 在swift 3中建议使用带参数的GET的哪种方法? 范例: 提前致谢 ! 问题答案: 示例如何使用请求。

  • 我必须使用导航规则编写一个JSF应用程序。我有几个ManagedBean,它们大多是RequestScoped的。当用户单击commandLink或commandButton时,我希望传递一个参数(例如当前Bean的id),以便Bean可以使用传递的id来填充其modell的数据,从而在使用的数据库中查找数据。为此,我使用了以下解决方案: 这样可以工作,并且在URL中可以看到view-param,

  • 问题内容: 我是新手,所以我的代码可能会出现很多错误,但是我要实现的目标是将GET请求发送到带有 参数的服务器。鉴于我的函数有两个参数,我试图做到更多。我不确定如何将两者结合到实际的URLRequest中?到目前为止,这是我尝试过的 问题答案: 建立请求时,请求的主体没有,但是所有内容都放在URL上。要构建网址(并正确地将其转义), 您还可以使用. 唯一的窍门是,大多数Web服务都需要+转义字符百

  • 当我尝试使用以下URL调用endpoint时: 将引发此异常: 只使用ZonedDateTime对象解析给定的日期是可行的(在Ideone.com上),但是其他的可能是错误的。我在SO上发现了这个问题:使用Spring@RestController处理带有ZonedDateTime参数的HTTP GET 明显的区别是在RequestParam中添加了。现在我在想;我如何让它与QueryDSLPre

  • 我有一个现有的Lambda函数。 我可以使用控制台创建一个以Lambda为目标的新规则。 当我通过控制台这样做时,它会自动创建一个“EventBridge(CloudWatch Events)”触发器,该触发器在Lambda配置屏幕上可见。 规则执行并成功调用Lambda。 尝试使用C#和SDK(nuget包:AWSSDK. EventBridge)自动执行上述步骤,我采取以下步骤: 我成功调用P