【问题标题】:JSF selectOneMenu value not setJSF selectOneMenu 值未设置
【发布时间】:2011-11-03 16:09:12
【问题描述】:

我有一个页面,无论数据库上是否有一些信息,都会呈现 SelectOneMenu。 我的表单如下所示:

...
<h:form id="wrapperUpload" enctype="multipart/form-data" >
<h:outputLabel for="option" value="Tipo de carga: "
                            rendered="#{uploadFile.check(userVerifier.dependencia)}" />
<h:selectOneMenu id="option"
                 value="#{uploadFile.optionSelected}"
                 rendered="#{uploadFile.check(userVerifier.dependencia)}"  >
    <f:selectItems value="#{uploadFile.options}" />
</h:selectOneMenu>
<h:outputLabel for="upfile" value="Archivo: " />
<t:inputFileUpload id="upfile" required="true" 
                   value="#{uploadFile.upFile}" />
<h:commandButton value="Validar #{userVerifier.dependencia}"
                 action="#{uploadFile.upload}"
                 onclick="return confirmation()" >
    <f:param name="dependencia" value="#{userVerifier.dependencia}" />
</h:commandButton>
</h:form>
...

我的豆子是

private UploadedFile upFile;
private boolean showOptions = false;
private final String[] options = {
    "Seleccione una opción.",
    "Cargar toda la información.",
    "Cargar solo información errónea."
};
private String optionSelected;
private Database db = new Database();

public UploadedFile getUpFile() {
    return upFile;
}

public void setUpFile(UploadedFile upFile) {
    this.upFile = upFile;
}

public String[] getOptions() {
    return options;
}

public void setOptionSelected(String optionSelected) {
    this.optionSelected = optionSelected;
}

public String getOptionSelected() {
    return optionSelected;
}

public boolean check(String dependencia) {
    String hasInfo;
    hasInfo = db.checkForInfo(dependencia);
    if (hasInfo.equals("T")) {
        showOptions = true;
    } else {
        showOptions = false;
    }
    return showOptions;
}

public String upload() {
    byte[] buffer = null;
    int count = 0;
    File serverFile = null;
    InputStream input = null;
    OutputStream output = null;

    Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
    String dependencia = params.get("dependencia");
    String extension = FilenameUtils.getExtension(upFile.getName());

    System.out.println("__depend:   " + dependencia);
    System.out.println("__option:   " + optionSelected);  //null
...
...

最后,当我点击按钮时,SelectOneMenu(或我的 bean 中的 selectedOption)的值始终为空... 如何解决这个问题?我错过了什么吗?

忘了提一下,如果我删除渲染部分一切正常...

【问题讨论】:

  • 这不是真正的代码。您没有isCheck() 方法,也没有使用rendered="#{uploadFile.check('somestring')}"。它在显示表单时已经抛出 EL 异常。请出示真实代码。
  • 很抱歉告诉你,但它是真正的代码,我省略了其余的代码,但基本上这就是我所拥有的......但我会发布所有代码,所以也许你可以帮忙。
  • rendered="#{uploadFile.check}" 需要 public boolean isCheck() 方法,而不是 public boolean check(String dependencies) 方法。它应该抛出一个 EL 异常。你用的是什么容器?
  • 就是这样,希望对您有所帮助。抱歉,如果我发布不完整的代码。哦,我明白你的意思了...我会尝试纠正它...但它不会发送任何 EL 异常,但为了保持良好的实践,我会更改它。
  • 现在,由于您将其更改为rendered="#{uploadFile.check(userVerifier.dependencia)}",它看起来更好。最初你有rendered="#{uploadFile.check}",它与给定的方法结合使用是无效的。

标签: jsf selectonemenu


【解决方案1】:

忘了提一下,如果我删除渲染部分一切正常

这只能意味着 bean 是请求范围的,并且 rendered 属性取决于基于请求的变量,该变量在显示表单时存在于初始请求中,但在处理表单提交时在后续请求中不存在。

将 bean 放在视图范围内或确保在后续请求中保留基于请求的变量应该可以解决您的问题。

由于您尚未发布真实代码,因此无法发布如何正确修复它的代码。

另见:


更新:根据您的更新和 cmets,您应该将 UserVerifier 设为 UploadFile bean 的托管属性,并在(后)构造函数中进行预初始化。比如:

@ManagedBean
@ViewScoped
public class UploadFile {

    @ManagedProperty("#{userVerifier}")
    private UserVerifier userVerifier; // +setter

    private boolean showOptions;

    @PostConstruct
    public void init() {
        showOptions = "T".equals(db.checkForInfo(userVerifier.getDependencia()));
    }

    public boolean isShowOptions() {
        return showOptions;
    }

    // ...
}

rendered="#{uploadFile.showOptions}"

并摆脱&lt;f:param&gt;

【讨论】:

  • 如何保留该变量?我将它放在 View Scope 上,但这产生了一个新问题,&lt;f:param&gt;&lt;t:inputFileUpload value&gt; 标记不再保留该值。我把它放在&lt;h:inputText&gt; 上,看看它们是否有价值,并且确实如此。
  • 初始化 bean (post) 构造的属性,只是不要使用 f:param。只要您与同一个视图交互,视图作用域 bean 就会存在。该属性在随后的回发中将具有相同的值。您无需通过 HTTP 请求来回传递它。
  • 我不明白...我是 JSF 的新手,所以如果你能详细解释一下。我应该初始化 userVerifier bean吗?想法是:在此页面中登录后(在检查用户密码是否正确之后),我将检查数据库以查看用户是否已经拥有数据,如果有,则呈现 selectOneMenu。然后在选择文件并点击按钮后,它应该检查用户是否从 selectOneMenu 中选择了一个有效的选项并执行上传。
  • 有人在吗?能详细解释一下吗?
  • 谢谢!我会立即检查并发布结果!顺便说一句,我在哪里可以学到所有这些?这是某种先进的 JSF 东西吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 2011-10-10
  • 1970-01-01
相关资源
最近更新 更多