【问题标题】:JSF 2 sending parameters via URLJSF 2 通过 URL 发送参数
【发布时间】:2013-08-22 14:03:23
【问题描述】:

我正在尝试通过 URL 发送参数但它失败了,因为我有些无法为 bean 分配值,或者我无法将值与 URL 字符串连接。顺便说一句,当我手动编写颜色值时,一切正常,例如:

    <h:button outcome="viewParams?c=red"/>

这是我尝试发送参数的页面代码。

                <h:form>
                    <h:selectOneMenu value="#{viewMngr.selectedColor}">
                        <f:selectItems value="#{viewMngr.colors}" var="c"
                            itemLabel="#{c}" itemValue="#{c}" />
                        <f:ajax listener="#{viewMngr.valueChanged}" />
                    </h:selectOneMenu>
                    <h:button outcome="viewParams?c=#{viewMngr.selectedColor}"/>
                </h:form>

这是 viewManager bean 代码(据我所知,bean 值已设置,因为我可以将其打印出来)

@ManagedBean
public class ViewMngr {
private ArrayList<String> colors = new ArrayList<String>();

private String selectedColor;

public ViewMngr()
{
    getColors().add("red");
    getColors().add("green");
    getColors().add("blue");
    getColors().add("gray");
    getColors().add("yellow");
    getColors().add("orange");
}


public ArrayList<String> getColors() {
    return colors;
}

public void setColors(ArrayList<String> colors) {
    this.colors = colors;
}

public String getSelectedColor() {
    return selectedColor;
    }

public void setSelectedColor(String selectedColor) {
    System.out.println("Selected color: " + selectedColor);
    this.selectedColor = selectedColor;
}

public void valueChanged() {
    System.out.println("Value changed!");
}
}

现在这里是第二页中试图捕捉该参数的代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:p="http://primefaces.org/ui"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:f="http://java.sun.com/jsf/core">

            <f:metadata>
                <f:viewParam name="c" value="#{color.color}"/>
            </f:metadata>

            <h:body style="background-color:#{color.color}">
              <fieldset>
                <h:form>
                  <h:outputText value="Some text!"/>
                </h:form>
              </fieldset>
            </h:body>
    </html>

这里是彩豆:

@ManagedBean
public class Color {
private String color;

public String getColor() {

    return color;
}

public void setColor(String color) {
    if(color != null)
        System.out.println(color);
    this.color = color;
}
}

【问题讨论】:

    标签: jsf-2 parameter-passing


    【解决方案1】:

    成为您的目标页面viewParams.xtml

    <h:button outcome="viewParams">
        <f:param name="c" value="#{viewMngr.selectedColor}" />
    </h:button>
    

    获取视图 ID 并将参数附加到 url。

    【讨论】:

    • 感谢您的回答。它表明有不止一种方法可以解决相同的任务。您的代码有效,但您必须将 id="buttonId" 添加到该按钮并在颜色值更改后呈现它 。如果你编辑你的代码,我会给你 +1
    • 我认为您需要重新渲染您的按钮,因为您将参数直接包装到您的结果中(因此它与当前颜色连接一起提供给客户端)。但是,如果使用我的解决方案,请在单击按钮时检查#{viewMngr.selectedColor},以便它同时获得该属性中的颜色。更改值时不需要重新渲染按钮。啊,关于“+1”,你应该考虑点击复选标记(投票计数器下方的✓标记)接受答案,因为我看到你的大部分问题仍然没有它们;-)
    • 实际上您需要将 id 添加到按钮并重新渲染它,因为没有它 c 不会被设置并且通过 url 发送参数失败。这与 bean 值无关,而与 c 值有关。
    • ViewMngr 中使用@ManagedBean 注释下方的@ViewScoped 检查。这样,您将保持由h:selectOneMenu 完成的选择。顺便说一句,Color 不能是 @ManagedBean
    • ViewMngr 范围是正确的(尽管我尝试过 ViewScope),但是我不需要使用 ViewScope,因为我想传递值并忘记 ViewMngr bean 中的内容,所以这里的请求范围很好。而且我看不到 Color 不能是 @ManagedBean 的原因,因为我使用 Color 来获取参数值。
    【解决方案2】:

    事实证明,该按钮需要重新渲染,因为 c 值未设置。棘手的部分是 viewMngr.selectedColor 已设置,但要设置参数 c,需要重新渲染按钮。这是编辑后的代码:

        <h:body>
                <fieldset>
    
                    <h:form prependId="false">
                        <h:selectOneMenu value="#{viewMngr.selectedColor}">
                            <f:selectItems value="#{viewMngr.colors}" var="c"
                                itemLabel="#{c}" itemValue="#{c}" />
                        <f:ajax listener="#{viewMngr.valueChanged}" render="buttonId"/>
                        </h:selectOneMenu>
                        <h:button id="buttonId" outcome="viewParams?c=#{viewMngr.selectedColor}"/>
    
                    </h:form>
    
                </fieldset>
        </h:body>
    

    【讨论】:

      猜你喜欢
      • 2013-06-21
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多