关于render(“*.html”)报错的请教

  1. 在访问MyAdmin/user/ 时,调用index,返回一个login.html, 返回代码是:render("login.html");

  2. 在访问MyAdmin/prd/ 时,调用index,返回一个prd-list.html, 返回代码是:render("prd-list.html"),这个时候就报错,报错如下:

JFinal-3.4 action report -------- 2018-08-26 22:39:42 --------------------------
Url         : GET /prd/
Controller  : com.dmm.admin.common.controller.PrdController.(PrdController.java:1)
Method      : index
Interceptor : com.jfinal.ext.interceptor.SessionInViewInterceptor.(SessionInViewInterceptor.java:1)
--------------------------------------------------------------------------------
2018-08-26 22:39:42
[ERROR]-[Thread: "http-bio-8080"-exec-6]-[com.jfinal.core.ActionHandler.handle()]: /prd/
com.jfinal.template.stat.ParseException: Syntax error: can not match end
Template: "/view/prd-list.html". Line: 113
	at com.jfinal.template.stat.Parser.parse(Parser.java:93)
	at com.jfinal.template.Engine.buildTemplateBySourceFactory(Engine.java:158)
	at com.jfinal.template.Engine.getTemplate(Engine.java:139)
	at com.jfinal.render.TemplateRender.render(TemplateRender.java:61)
	at com.jfinal.core.ActionHandler.handle(ActionHandler.java:103)
	at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:73)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:744)
2018-08-26 22:39:42
[ERROR]-[Thread: "http-bio-8080"-exec-6]-[com.jfinal.core.JFinalFilter.doFilter()]: /prd/
java.lang.IllegalStateException: getOutputStream() has already been called for this response
	at org.apache.catalina.connector.Response.getWriter(Response.java:636)
	at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:205)
	at com.jfinal.render.ErrorRender.render(ErrorRender.java:59)
	at com.jfinal.core.ActionHandler.handle(ActionHandler.java:141)
	at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:73)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:744)
  1. 如果在2中换成render("login.html");则是可以的

  这个是什么原因呢?各位大神请赐教


评论区

JFinal

2018-08-27 12:45

异常提示已经很明显了:
Syntax error: can not match end
Template: "/view/prd-list.html". Line: 113

在 prd-list.html 的 113 行附近,有一个 #end 没有被匹配上

要特别注意指令小括号要成对,少了小括号也会引发一些问题

猴子的花果山

2018-08-27 15:54

@JFinal 多谢多谢 我的理解思路错了 我以为与模板什么的相关 忘记检查html里面的语法了 麻烦了

JFinal

2018-08-27 16:07

@猴子的花果山 enjoy 引擎对于错误提示,首先会说明错误问题,然后会指出错误发生在哪个文件的哪一行代码,根据提示是很容易解决的,毕竟 enjoy 引擎只有 6 个核心指令,解决起来很容易

猴子的花果山

2018-08-27 21:28

@JFinal 看了下我的代码
laydate.render({
elem: '#end' //指定元素 //这是第113行
});
这个是标签冲突吗?

JFinal

2018-08-27 21:47

@猴子的花果山 是冲突了,有很多办法解决,例如使用“原样输出” 指令就可以,看一下文档:
http://www.jfinal.com/doc/6-6

或者将 elem 指向的元素改一下名,不要使用 #end

又或者使用 jfinal 的输出指令当成字符串参数输出一下,例如:
elem: #("'#end'")

JFinal

2018-08-27 21:49

@猴子的花果山 原样输出指令可以一次性跨多行来解决,例如:

#[[
laydate.render({
elem: '#end' //指定元素 //这是第113行
});
#]]

可以像上面这样将大块的 js 代码原样输出一下,对于某些 layiu 中的指令如果有冲突,还可以通过换行解决,例如:
{{ #
if(...)
}}

上面的 layui 代码,其中的字符 '#' 与 "if" 不在同一行,enjoy 模板引擎也会将其当成纯文本,不进行解析

JFinal

2018-08-27 21:49

最好的办法是改一下名,不要使用 #end,例如:
elem: '#otherName'

JFinal

2018-08-27 21:50

还想到一个办法,既然你这里是 javascript ,那么还可以用字符串相加来解决:
elem: '#' + 'end';

总之,解决的办法实在太多

猴子的花果山

2018-08-29 19:29

@JFinal 感谢赐教 根据你的方法 完美解决

热门反馈

扫码入社