使用Tomcat 5.0动态创建jsf组件时出错

时间:2010-11-14 11:48:11

标签: java jsf tomcat tomcat5

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

这是代码:

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的数据

创建一行单元格的CODE
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的原因。

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

2 个答案:

答案 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的类型。

无论如何,谢谢

相关问题