未设置JSF SelectOne菜单值

未设置JSF SelectOne菜单值,jsf,selectonemenu,Jsf,Selectonemenu,我有一个页面,无论是否有关于DB的信息,都会显示SelectOneMenu。 我的表单如下所示: ... <h:form id="wrapperUpload" enctype="multipart/form-data" > <h:outputLabel for="option" value="Tipo de carga: " rendered="#{uploadFile.check(userVerifier.depende

我有一个页面,无论是否有关于DB的信息,都会显示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
...
...
私有上传文件upFile;
私有布尔showOptions=false;
私有最终字符串[]选项={
“选择一项行动”,
“Cargar toda la información.”,
“Cargar solo información errónea。”
};
选择专用字符串选项;
私有数据库db=新数据库();
公共上载文件getUpFile(){
返回upFile;
}
公共无效设置文件(上载文件upFile){
this.upFile=upFile;
}
公共字符串[]getOptions(){
返回选项;
}
public void setOptionSelected(字符串选项selected){
this.optionSelected=optionSelected;
}
公共字符串getOptionSelected(){
选择返回选项;
}
公共布尔检查(字符串相关){
字符串hasInfo;
hasInfo=db.checkForInfo(dependencia);
if(hasInfo.equals(“T”)){
showOptions=true;
}否则{
showOptions=false;
}
返回显示选项;
}
公共字符串上载(){
字节[]缓冲区=空;
整数计数=0;
fileserverfile=null;
InputStream输入=null;
OutputStream输出=null;
Map params=FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
字符串dependencia=params.get(“dependencia”);
字符串扩展名=FilenameUtils.getExtension(upFile.getName());
System.out.println(“\u依赖:+dependencia”);
System.out.println(“\uu选项:“+optionSelected);//null
...
...
最后,当我点击按钮时,SelectOneMenu(或我bean中的selectedOption)的值总是空的。。。 怎么解决?我是不是遗漏了什么

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

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

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

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

由于您没有发布真正的代码,所以无法发布如何正确修复它的代码

另见:

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

@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;
    }

    // ...
}


并摆脱

这不是真正的代码。您没有
isCheck()
方法,也没有使用
rendered=“#{uploadFile.check('somestring')}”
。它在显示表单时已经抛出EL异常。请显示真实的代码。很抱歉,这是真实的代码,我省略了其余的代码,但基本上这就是我所拥有的…但我会发布所有代码,所以也许你能帮上忙。
呈现的=“#{uploadFile.check}”
需要一个
公共布尔值isCheck()
方法,而不是
公共布尔检查(字符串依赖项)
方法。它应该抛出一个EL异常。您使用的是什么容器?就是这样,希望能更好。如果我发布了不完整的代码,很抱歉。哦,我明白您的意思…我会尝试更正…但它不会发送任何EL异常,但为了更好地实践,我会更改它。既然您将其更改为
呈现=”#{uploadFile.check(userVerifier.dependencia)}“
,它看起来更好。最初您渲染了
”=“#{uploadFile.check}”
与给定方法组合无效。如何保留该变量?我将其放在视图范围内,但这产生了一个新问题,
标记不再保留该值。我将其放在
上,以查看它们是否有值,它们是否有值。初始化bean的属性(post)构造,只是不使用f:param。只要您与同一个视图交互,视图范围的bean就会存在。该属性在后续的回发中只有相同的值。您不需要通过HTTP请求来回传递它。我不明白……我是JSF的新手,如果您能详细解释我,我应该初始化它吗UserVerifierBean?其思想是:登录后(检查用户密码是否正确后)在此页面中,我将检查数据库,查看用户是否已经有数据,如果已经有,则呈现selectOneMenu。然后在选择文件并点击按钮后,应检查用户是否从selectOneMenu中选择了有效选项并执行上载。有人在吗?您能详细解释我吗?谢谢!我将立即检查并执行pos结果如何!顺便问一下,我从哪里可以学到这些?这是某种高级JSF的东西吗?
rendered="#{uploadFile.showOptions}"