0

我正在尝试添加一个简单的 selectManycheckbox 示例,但值没有绑定到 bean。我正进入(状态

INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.
sourceId=form1:subscriptions[severity=(ERROR 2), summary=(Conversion Error setting value 'asis base appl' for '#{HomePage.outputType}'.), detail=(Conversion Error setting value 'asis base appl' for '#{HomePage.outputType}'.)]

这是我的 jsf 页面

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f"  uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h"  uri="http://java.sun.com/jsf/html"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<link href="css/style.css" type="text/css" rel="stylesheet">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Downloader</title>
</head>
<body>
<f:view>

    <h:form id="form1">

        <h:panelGrid border="1" columns="2"
            style='color: black; font-size: 16px; font-family: "Times New Roman", Serif; font-weight: bold'>
            <h:outputLabel value="Select values"></h:outputLabel>
            <h:selectManyCheckbox id="subscriptions" value="#{HomePage.outputType}" layout="pageDirection">
                <f:selectItem id="item1" itemLabel="ASIS" itemValue="asis"/>
                <f:selectItem id="item3" itemLabel="BASE" itemValue="base"/>
                <f:selectItem id="item7" itemLabel="APPLIED" itemValue="appl"/>
            </h:selectManyCheckbox>

            </h:panelGrid>
            <h:commandButton type="submit" action="#{HomePage.genOutput}" value="Submit"></h:commandButton>
    </h:form>
</f:view>
</body>
</html>

这是我的 bean 类 HomePage.java:

package com.MH;
import com.MH.WebPageSaver;
public class HomePage{
    private String[] outputType;

    /*various getter setters*/


    public String genOutput() throws Exception{
     if (outputType != null)
      {
        System.out.println("if");
            WebPageSaver w = new WebPageSaver();
            try{
                System.out.println("inside try");
                            /*independent function below works fine*/
                String msg = w.generateOutput(outputType);
                return msg;
            }
            catch (Exception e){
                System.out.println(e);
                return "error";
            }
        }
        else 
        {
            System.out.println(outputType);
            System.out.println("else");
            return "error";
        }
    }


}

无论消息如何,导航规则都指向同一页面。

    <faces-config  xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
    version="1.2">
    <managed-bean>
        <managed-bean-name>HomePage</managed-bean-name>
        <managed-bean-class>com.MH.HomePage</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
    <navigation-rule>
        <from-view-id>/HomePage.jsp</from-view-id>
        <navigation-case>
        <from-outcome>success</from-outcome>
        <to-view-id>/HomePage.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>
    <navigation-rule>
        <from-view-id>/HomePage.jsp</from-view-id>
        <navigation-case>
        <from-outcome>error</from-outcome>
        <to-view-id>/HomePage.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>
</faces-config>

请让我知道我在这里缺少什么?

4

1 回答 1

0

据我所知,我的代码没有收到您的转换错误。我唯一能想到的是您可能setOutputType错误地定义了您的方法。它应该是

public void setOutputType(String[] outputType) {
        this.outputType = outputType;
}

因为在提交表单时h:selectManyCheckBox需要在您的情况下设置一个数组。String

我想在这里彻底,所以这是我的HomePage.java

package com.MH;
public class HomePage implements java.io.Serializable {
    private String[] outputType;

    /*various getter setters*/
    public String[] getOutputType() {
        return outputType;
    }

    public void setOutputType(String[] outputType) {
        this.outputType = outputType;
    }

    public String genOutput() throws Exception{
     if (outputType != null)
      {
        System.out.println("if");
            WebPageSaver w = new WebPageSaver();
            try{
                System.out.println("inside try");
                            /*independent function below works fine*/
                String msg = w.generateOutput(outputType);
                return msg;
            }
            catch (Exception e){
                System.out.println(e);
                return "error";
            }
        }
        else 
        {
            System.out.println(outputType);
            System.out.println("else");
            return "error";
        }
    }
}

和你的差别不大。我这边的generateOutput(String[])fromWebPageSaver只是简单地返回了String成功。我什至制作了一个简单的 test.jsp 来查看是否设置了值并且它们是。(注意:这很草率)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="h"  uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="f"  uri="http://java.sun.com/jsf/core"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<link href="css/style.css" type="text/css" rel="stylesheet">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Downloader</title>
</head>
<body>
<f:view>
    <h:outputText value="#{HomePage.outputType[0]}"/>
    <h:outputText value="#{HomePage.outputType[1]}"/>
    <h:outputText value="#{HomePage.outputType[2]}"/>
</f:view>
</body>
</html>

我编辑了你的一个导航案例

<from-outcome>success</from-outcome>
<to-view-id>/test.jsp</to-view-id>
</navigation-case>

注释

不知道为什么你有throws ExceptiongenOuput因为你已经在方法中抓住了它。它是不需要的(除非你的构造函数WebPageSaver抛出一些东西)

此外,会话范围应该实现java.io.Serializable. 不是必需的,但很好的做法

为什么将会话范围的对象序列化被认为是一种好习惯?

于 2013-06-25T04:00:06.650 回答