Model使用put("","")方法,在JSP中EL表达式无法取值 JFinal2.2

在Controller中使用Model自带的put方法携带非Model属性的值。
userInfo.put("score", totalScore);
userInfo.put("studyScore", studySocre);
setAttr("user", userInfo);

在JSP中使用JSTL获取user 中的score和studyScore值,出现下面异常,在网页上无法获取以上设置的属性:

javax.el.PropertyNotFoundException: Property 'score' not found on type com.yqdz.biz.model.User
	at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:193)
	at javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:170)
	at javax.el.BeanELResolver.property(BeanELResolver.java:279)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:60)
	at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:123)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:935)
	at org.apache.jsp.user.userProfile_jsp._jspService(userProfile_jsp.java:233)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
	at com.jfinal.render.JspRender.render(JspRender.java:67)
	at com.jfinal.core.ActionHandler.handle(ActionHandler.java:97)
	at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:745)


但是在Java代码Debug和JSP debug响应数据中又包含有score和studyScore的值。无解了.....

如下截图:

Java 代码Debug信息:

1.png

JSP 代码Debug信息:

2.png

JFinal其他版本的我以前也遇到这个问题,都是通过手动在BaseModel中手动添加属性解决。

不知道其他小伙伴有遇到这个问题没?

评论区

JFinal

2017-06-30 11:50

如果你的 Model 生成过 BaseModel,就会 implements IBean 这个接口,在ModelRecordElResolver 的方法中可知对于 IBean 的处理是调用其 getter 方法,但你的 model 并不存在 getScore() 这个方法,所以就会有异常

解决的办法是配置一下:
ModelRecordElResolver.setResolveBeanAsModel(true)
这样 jstl 处理 model 时会调用其 get(String attrName) 方法,而不会理会 getter 方法

如果希望这个处理更加智能,建议使用 jfinal template engine

蜡笔小新

2017-06-30 12:03

@JFinal 多谢了,老系统维护使用JSP,新的系统考虑使用模版引擎。

JFinal

2017-06-30 12:10

@蜡笔小新 注意一下,如果配置了ModelRecordElResolver.setResolveBeanAsModel(true),那么 model 中的 getter 方法在 jstl 中将不会被调用,只会调用 model.get(String name)

要考虑这个配置是不是对以前的代码有影响,如果是老项目,建议在最终的 model 中添加个 getScore() 方法

tianci121404

2017-09-14 17:56

new个model,然后put一些数据库没有的字段,保存时报错。

热门反馈

扫码入社