JSF表单值在提交时消失

JSF表单值在提交时消失,jsf,jakarta-ee,javabeans,Jsf,Jakarta Ee,Javabeans,当我尝试提交表单时,输入值出现在验证方法中,但在提交方法中消失了。为什么程序到达提交功能时输入属性为空 输入:asdf genres.xhtml <h:form> <h:inputText id="userGenre" value="#{genres.input}" validator="#{genres.validateLength}" required="true" size="3"

当我尝试提交表单时,输入值出现在验证方法中,但在提交方法中消失了。为什么程序到达提交功能时输入属性为空

输入:asdf


genres.xhtml

<h:form>
    <h:inputText 
        id="userGenre"
        value="#{genres.input}"
        validator="#{genres.validateLength}"
        required="true" size="3"
        />
    <h:commandButton 
        value="Add genre"
        action="#{genres.submit}" 
        />
    <h:message for="userGenre" />
</h:form>
<managed-bean>
    <managed-bean-name>genres</managed-bean-name>
    <managed-bean-class>no.krystah.Genres</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
        <property-name>input</property-name>
        <property-class>java.lang.String</property-class>
        <value/>
    </managed-property>
</managed-bean>


Genres.java

@Named
@SessionScoped
public class Genres {

    static final Logger LOG = LoggerFactory.getLogger(Genres.class);

    private String input = "";

    public void validateLength(FacesContext context, UIComponent toValidate, Object value) {
        LOG.info("Validating");

        input = (String) value;
        LOG.info("name:"+input); // result: "name:asdf"

        int min = 3;
        int max = 15;
        int len = input.length();
        if (len < min || len > max) {
            ((UIInput) toValidate).setValid(false);
            FacesMessage message = new FacesMessage("Must be at least 3 and at most 15 characters.");
            context.addMessage(toValidate.getClientId(context), message);
            return;
        }
    }

    public void submit() {
        LOG.info("Submitting");
        LOG.info("name:"+input); // result: "name:"

        // process input
    }

    public String getInput() {
        return input;
    }

    public void setInput(String input) {
        this.input = input;
    }

}
@Named
@会议范围
公共类体裁{
静态最终记录器日志=LoggerFactory.getLogger(Genres.class);
私有字符串输入=”;
public void validateLength(FacesContext上下文、UIComponent toValidate、对象值){
日志信息(“验证”);
输入=(字符串)值;
LOG.info(“name:+input);//结果:“name:asdf”
int min=3;
int max=15;
int len=input.length();
如果(lenmax){
((UIInput)toValidate).setValid(false);
FacesMessage message=新的FacesMessage(“必须至少3个字符,最多15个字符”);
addMessage(toValidate.getClientId(context),message);
返回;
}
}
公开作废提交(){
日志信息(“提交”);
LOG.info(“名称:”+输入);//结果:“名称:”
//过程输入
}
公共字符串getInput(){
返回输入;
}
公共void setInput(字符串输入){
这个输入=输入;
}
}

faces config.xml

<h:form>
    <h:inputText 
        id="userGenre"
        value="#{genres.input}"
        validator="#{genres.validateLength}"
        required="true" size="3"
        />
    <h:commandButton 
        value="Add genre"
        action="#{genres.submit}" 
        />
    <h:message for="userGenre" />
</h:form>
<managed-bean>
    <managed-bean-name>genres</managed-bean-name>
    <managed-bean-class>no.krystah.Genres</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
        <property-name>input</property-name>
        <property-class>java.lang.String</property-class>
        <value/>
    </managed-property>
</managed-bean>

体裁
不,克丽斯塔
一场
输入
java.lang.String

{genres.submit}
中,当您尝试提交时,JSF将生成您的genres类的新实例,因此输入为空,但是如果您在genres类顶部使用@ManagedBean注释,我认为代码应该可以正常工作

,这是有意义的,因为我初始化“input”字段时使用的任何内容(在本代码中,我使用“”)都是提交时发送的内容。然而,添加@ManagedBean注释并没有起到任何作用。不幸的是,我收回了这一点。单独添加ManagedBean不起作用,但如果我也删除了@Named,它就起作用了。谢谢。:)不客气,很高兴看到你的问题已经解决了