页面 <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方法里不妥?
<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方法里不妥?
如为空 不让提交,不为空的话,就提交了。
这样到后台的话,就没有subjectid 为空这个说法了。function check_kong(){
if(document.addresform.subjectid.value==""){
alert("空,不能提交");
return;
}
docuemnt.addresform.method="post";
docuemnt.addresform.submit();
}
<f:selectItems value="#{res.chapterList}"/>
</h:selectOneMenu> chapterList初始化的问题....现在把bean设置成session后可以了...但关键是我不想用很多session的bean
<h:selectOneMenu>不支持String到int的自动转换,想当初这个问题也困扰了我好久,没办法,是组件的问题,怎么jsf都好几年了都没有修正这个问题,真是奇怪!
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)
|#]
if(chapterList.size()==0){
chapterList.add(new SelectItem(new Integer(0)," "));
} 另外backbean在提交时候初始化是先进get后进set方法,所以导致页面的数据没有近来直接进入上面这段代码了..这问题比较麻烦了....