我创建了一个应用程序,它可以构建一个网格或元素矩阵。当我尝试导航到另一个页面时,我收到一个错误:
这是代码:
private HtmlInputText createCelda(String vValue, String vStyle,
String vTitle, String vId, boolean vscript, boolean isreadonly) {
// private Application application;
// FacesContext fc = FacesContext.getCurrentInstance();
// application = fc.getApplication();
// private HtmlInputText ccelda;
ccelda = new HtmlInputText();
ccelda = (HtmlInputText) application
.createComponent(HtmlInputText.COMPONENT_TYPE);
ValueExpression ve = application.getExpressionFactory()
.createValueExpression(fc.getELContext(), vValue, String.class);
// ValueExpression ve = application.getExpressionFactory()
// .createValueExpression(fc.getELContext(), vValue, Integer.class);
ccelda.setValueExpression("value", ve);
ccelda.setStyleClass(vStyle);
ccelda.setTitle(vTitle);
ccelda.setId(vId);
ccelda.setReadonly(isreadonly);
if (vscript != false) {
ccelda.setOnkeydown(";return checkGrid(event, this.id);");
ccelda.setOnchange(";return changeValue(this.id);");
ccelda.setOnclick("this.select()");
}
return ccelda;
}
使用来自bean的数据
创建一行单元格的CODEpublic UIComponent createPanelPrincipal(int nx, int ny, UIComponent panel) {
panelCeldas = createPanel(nx, "nacionI");
for (int i = 1; i < nx + 1; i++) {
String snx = i > 9 ? String.valueOf(i) : "0" + String.valueOf(i);
ncelda = createCelda("#{myBean.totalI[" + (i - 1) + "]}",
celdaNacionIStyle, "I" + snx, "I" + snx, true, false);
panelCeldas.getChildren().add(ncelda);
}
panel.getChildren().add(panelCeldas);
return panel;
}
此代码在tomcat 6.0.18中完美运行
但是在Tomcat 5.0中我得到了下一个错误:
10-nov-2010 14:56:24 com.sun.faces.lifecycle.RenderResponsePhase execute
INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.
sourceId=form_composition:I15[severity=(ERROR 2), summary=(form_composition:I15: An error occurred when processing your submitted information.), detail=(form_composition:I15: An error occurred when processing your submitted information.)]
产生错误的行是:
ValueExpression ve = application.getExpressionFactory()
.createValueExpression(fc.getELContext(), vValue, String.class);
如果我只使用ccelda.setValue(myValue),效果很好,但我需要从bean中获取值,这就是我使用ValueExpression的原因。
我看不到调试方法。如果有人有兴趣,我有一个独立的项目,看它是如何工作的。
答案 0 :(得分:2)
统一EL(ValueExpression
和consorts)在JSP 2.1中引入(请注意javadoc中介绍性文本底部的“Since”注释)。
Tomcat 6.x是一个Servlet 2.5 / JSP 2.1容器,所以它支持它。
但是,Tomcat 5.0是一个Servlet 2.3 / JSP 1.2容器,所以它不支持它。你最好的选择是使用(不推荐使用JSF 1.2)ValueBinding
和朋友。实际上,对于Servlet 2.3 / JSP 1.2,您必须编写所有JSF代码,而不是最高JSF版本1.1,而不是1.2。
答案 1 :(得分:0)
感谢您的评论。
我使用过ValueBinding和朋友,结果是一样的。
我不知道错误发生在哪里。
我在blogspot中添加了一个jsf生命周期。
每个阶段如果被解雇,直到第6阶段。
就是这样:
START PHASE RESTORE_VIEW 1
END PHASE RESTORE_VIEW 1
START PHASE APPLY_REQUEST_VALUES 2
END PHASE APPLY_REQUEST_VALUES 2
START PHASE PROCESS_VALIDATIONS 3
END PHASE PROCESS_VALIDATIONS 3
START PHASE UPDATE_MODEL_VALUES 4
END PHASE UPDATE_MODEL_VALUES 4
START PHASE RENDER_RESPONSE 6
20-nov-2010 20:00:01 com.sun.faces.lifecycle.RenderResponsePhase execute
INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.
sourceId=main:I10[severity=(ERROR 2), summary=(java.lang.ClassCastException), detail=(java.lang.ClassCastException)]
END PHASE RENDER_RESPONSE 6
如果您或任何人想看看,这是下载链接: https://docs.google.com/leaf?id=0B5-kdDLa5NdMMDYxOGQ2MWMtMWMwNS00MDFlLTkxMWQtM2EzYmZkZDgyMTgy&hl=en
看一下Grid.java
由于
更新:
最后它有效,
我使用了valueBinding,好奇之前我曾经使用过,但是我把库留给了jsf1.2。现在我已经从lib的文件夹中删除了这些库并且它可以工作。使用其他代码,我可以指定值的类型(String,Integer等)。现在使用ValueBinding,它默认采用值,在我的情况下是整数。我不知道为什么。我想因为Integer是bean的类型。
无论如何,谢谢