页面 <f:view>
    <h:form id="addresform">
<div>
<h3>Upload Resource</h3>
Subject:  <h:outputText value="#{param.subjectname}" /> 
        Chapter:
         <h:selectOneMenu id="chapterId" converter="javax.faces.Integer" value="#{res.chapterId}">
         <f:selectItems value="#{res.chapterList}"/> 
        </h:selectOneMenu>
        <h:message for="chapterId" styleClass="error"/>        



 <h:commandButton  id="btn_submit" type="submit" value="Upload" action="#{res.uploadAction}" />
<input type="reset" name="reset" value="Reset" />
</div>
   </h:form>
    </f:view>后台Resbean部分代码public List<SelectItem> getChapterList() {
chapterList.clear();
FacesContext facesContext = FacesContext.getCurrentInstance();
String id = (String)facesContext.getExternalContext().getRequestParameterMap().get("subjectid");
if(id!=null){

List chapters = subjectService.findChaptersBySubjectId(Integer.parseInt(id));

for(Object obj:chapters){
TbSubjectcontentChapter tc = (TbSubjectcontentChapter)obj;
chapterList.add(new SelectItem(tc.getChapterId(),tc.getChapterNo()));
}
}
if(chapterList.size()==0){
chapterList.add(new SelectItem(new Integer(0)," "));
}


return chapterList;
}。public String uploadAction(){
FacesContext facesContext = FacesContext.getCurrentInstance();
try {
File file = new File(dir+"test.html");
if(!file.exists())
file.createNewFile();
FileWriter wr= new FileWriter(file);
content=(String)facesContext.getExternalContext().getRequestParameterMap().get("EditorDefault");
log.debug("content: "+content);
System.out.println("Content:"+content);
wr.write(content);
wr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


return "success";
}
现在逻辑是页面接受subjectid这个参数,然后查找出chapterList,显示出来,这块正常了但是一点击提交后就报
"addresform:chapterId": 非法选项.  。。根本没有进入uploadaction方法debug时候发现点击提交按钮后也进入 getChapterList()方法,因为是提交过程,所以直接进入if(chapterList.size()==0)之后的逻辑,chapterList里增加了new SelectItem(new Integer(0)," "),和原来页面已有的chapterList冲突,估计是这个原因引起的验证错误现在问题是,如果去掉if(chapterList.size()==0)这个判断,点击提交后直接报错 java.util.NoSuchElementException ,如果保留就报验证错误。。现在怎么解决这个冲突,难道resbean在初始化时候会自动调用属性的get方法么。。
从后台找出chapterList的方法最好写在哪里?。。是否直接写在属性的get方法里不妥?

解决方案 »

  1.   

    感觉有点乱,你为什么不在界面判断下subjectid 是否为空呢?
    如为空 不让提交,不为空的话,就提交了。
    这样到后台的话,就没有subjectid 为空这个说法了。function check_kong(){
       if(document.addresform.subjectid.value==""){
               alert("空,不能提交");
               return;
       }
       docuemnt.addresform.method="post";
       docuemnt.addresform.submit();
    }
      

  2.   

    和subjectid没有关系是<h:selectOneMenu id="chapterId" converter="javax.faces.Integer" value="#{res.chapterId}">
            <f:selectItems value="#{res.chapterList}"/>
            </h:selectOneMenu> chapterList初始化的问题....现在把bean设置成session后可以了...但关键是我不想用很多session的bean
      

  3.   

    没人知道 jsf 生命周期相关的么...
      

  4.   

    chapterId不要用int型的,改成String类型就可以了
    <h:selectOneMenu>不支持String到int的自动转换,想当初这个问题也困扰了我好久,没办法,是组件的问题,怎么jsf都好几年了都没有修正这个问题,真是奇怪!
      

  5.   

    楼上的。改了string仍然不可以[#|2010-02-24T00:35:09.592+0800|SEVERE|sun-appserver2.1|javax.enterprise.resource.webcontainer.jsf.lifecycle|_ThreadID=16;_ThreadName=httpSSLWorkerThread-8080-0;APPLY_REQUEST_VALUES 2;/addRes.jsp;javax.faces.event.PhaseEvent[source=com.sun.faces.lifecycle.LifecycleImpl@1fc107];_RequestID=a7ab81b3-e0c1-4046-b5af-51c9a49b5f17;|JSF1054: (Phase ID: APPLY_REQUEST_VALUES 2, View ID: /addRes.jsp) Exception thrown during phase execution: javax.faces.event.PhaseEvent[source=com.sun.faces.lifecycle.LifecycleImpl@1fc107]|#][#|2010-02-24T00:35:09.595+0800|SEVERE|sun-appserver2.1|javax.enterprise.system.container.web|_ThreadID=16;_ThreadName=httpSSLWorkerThread-8080-0;_RequestID=a7ab81b3-e0c1-4046-b5af-51c9a49b5f17;|StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
    java.lang.IllegalArgumentException
    at javax.faces.component.SelectItemsIterator.next(SelectItemsIterator.java:179)
    at javax.faces.component.SelectItemsIterator.next(SelectItemsIterator.java:61)
    at javax.faces.component.SelectUtils.matchValue(SelectUtils.java:82)
    at javax.faces.component.UISelectOne.validateValue(UISelectOne.java:144)
    at javax.faces.component.UIInput.validate(UIInput.java:875)
    at javax.faces.component.UIInput.executeValidate(UIInput.java:1072)
    at javax.faces.component.UIInput.processDecodes(UIInput.java:642)
    at javax.faces.component.UIForm.processDecodes(UIForm.java:208)
    at org.ajax4jsf.component.AjaxViewRoot$1.invokeContextCallback(AjaxViewRoot.java:395)
    at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:235)
    at org.ajax4jsf.component.AjaxViewRoot.processDecodes(AjaxViewRoot.java:412)
    at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
    at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:333)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
    at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
    at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
    at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
    at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:313)
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1093)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1093)
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:291)
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:666)
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:597)
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:872)
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)
    at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:264)
    at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)
    |#]
      

  6.   

    converter="javax.faces.Integer"这句删掉了吗?
      

  7.   

    自然,查了下似乎是selectOneMaun组件会检查新的赋值和原来赋值的是否一样,不一样就报"非法选项",这是很多与的验证....而在我这里新的赋值是这段了
    if(chapterList.size()==0){
    chapterList.add(new SelectItem(new Integer(0)," "));
    } 另外backbean在提交时候初始化是先进get后进set方法,所以导致页面的数据没有近来直接进入上面这段代码了..这问题比较麻烦了....
      

  8.   

    我靠,我也遇到这样的问题,妈比,jsf2.0验证还不能取消真是相当的郁闷呀,他提交的时候硬是要看看这个值在list有没有,如果你这个list是空的话他妈的就报错,哪位兄弟知道告知一下,[email protected]