【问题标题】:Changing Browser URL from backing bean从支持 bean 更改浏览器 URL
【发布时间】:2011-02-21 16:27:47
【问题描述】:

我希望能够更改 url 栏中的文本以反映我的应用程序的当前状态(就像 GMail 一样)。

我主要指的是更改 url 参数以反映我的表单中的值。 (一旦用户输入一个参数,我想更改对应的url参数)

你知道怎么做吗?

谢谢!

【问题讨论】:

  • 换句话说,您想使用 HTTP GET 而不是 HTTP POST?您使用的是 JSF 1.x 还是 2.x?如果是 1.x,那就太笨拙了。如果是 2.x,那很好。
  • GRrrrr!! 1.2...笨拙的解决方案是什么?我应该期待从 1.2 更新到 2.0 的麻烦吗?我们在一定程度上很灵活。
  • 您是否依赖某些组件库来实现 HTML 表单 UI 的外观?根据您的问题历史,您似乎正在使用 RichFaces。
  • 是的。确实,我有富人做所有 ajaxy 的事情。
  • 提示:使用@nickname 自动通知其他人有关不属于他们自己的帖子的 cmets。另见meta.stackexchange.com/questions/43019/…。否则,您将依赖于他们渴望回顾他们留下评论的帖子;)

标签: jsf


【解决方案1】:

说到点子上,您希望触发 HTTP GET 请求而不是 HTTP POST 请求。改变视图侧是微不足道的,使用

<form action="targetpage.jsf">

而不是

<h:form>

在与targetpage.jsf 关联的托管bean 中,您需要做更多的更改。 JSF 1.2 不提供通过视图声明为您设置 GET 请求参数的工具,也不转换/验证参数(JSF 2.0 对此有 &lt;f:viewParam&gt;)。

您需要自己在构造函数和/或支持 bean 的@PostConstruct 中收集/转换/验证所有请求参数,并在那里调用操作。收集参数基本上有两种方法:

  • 将参数定义为faces.config.xml&lt;managed-bean&gt;&lt;managed-property&gt;,以便JSF 为您设置。

    例如

    <h:inputText id="input" />
    

    (将在 HTML 中生成&lt;input type="text" id="input" name="input" /&gt;,它是name 属性,用作请求参数名称;如果不确定,请在浏览器中右键单击页面并查看源代码)

    <managed-property>
        <property-name>input</property-name>
        <value>#{param.input}</value>
    </managed-property>
    

    private String input; // +setter
    

    EL 也支持自动转换为原始类型及其包装器,因此您也可以对数字使用 private Long input; 代替。但是需要注意的是,当值不可解析为数字时,这将引发丑陋且无法处理的异常。

  • 或者,通过ExternalContext#getRequestParameterMap()自行收集。

    public class Bean {
        private String input;
    
        public Bean() {
            Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
            input = params.get("input");
            // ...
        }
    }
    

    这允许更细粒度的转换/验证/错误处理。

【讨论】:

  • 感谢您的详细解答!
  • 您的意思是&lt;h:form action="targetpage.jsf"&gt;? (第 3 行)
  • 不,只是简单的&lt;form&gt;&lt;h:form&gt; 生成 method="post",你不希望这样。
  • 我在使用这种方法时得到了很长的一行参数,然后是一个空白屏幕。 http://localhost/d/faces/pinCodePage.jsp?j_id_jsp_1215600124_2:PinCodeInputField=dsfsd&amp;j_id_jsp_1215600124_2:j_id_jsp_1215600124_11=Submit&amp;j_id_jsp_1215600124_2_SUBMIT=1&amp;javax.faces.ViewState=MC2Qwf%2BZS%2ByJjGo..... 知道为什么吗?
  • 我不知道 RichFaces 在做什么,但看起来很像您在某个地方仍然有一个父组件 &lt;h:form&gt;UINamingContainer 组件。您是否使用最小模板文件对其进行了测试? ViewState 不应该在那里,命令按钮/链接也应该有一个 id 分配,否则只使用纯 HTML &lt;input type="submit"&gt; 没有名称。
猜你喜欢
  • 2011-10-21
  • 2011-12-19
  • 2012-04-10
  • 2019-07-30
  • 2012-02-14
  • 2010-11-24
  • 2015-03-09
  • 1970-01-01
相关资源
最近更新 更多