0

我创建了一个应用程序,它动态地构建一个网格或元素矩阵。当我尝试导航到另一个页面时,出现错误:

这是代码:

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 中的数据创建一行单元格的代码

public 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 的原因。

我看不到调试这个的方法。如果有人感兴趣,我有一个独立的项目来看看它是如何工作的。

4

2 回答 2

2

在 JSP 2.1 中引入了统一 EL(ValueExpression和 consorts)(请注意 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。

于 2010-11-14T12:18:19.433 回答
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 的文件夹中删除了这个库,它可以工作了。使用其他代码,我可以指定值的类型(字符串、整数等)。现在使用 ValueBinding 它默认取值,在我的例子中是 Integer。我不知道为什么。我想是因为 Integer 是 bean 的类型。

总之感谢

于 2010-11-20T20:16:08.873 回答