想在sturts2里面使用freemarker做表现层,运行页面后总是报错:
java.lang.NoClassDefFoundError: javax.servlet.jsp.tagext.Tag
freemarker.ext.jsp.TaglibFactory.class$(TaglibFactory.java:466)
freemarker.ext.jsp.TaglibFactory$TldParser.endElement(TaglibFactory.java:594)
。。。。
上网查是说缺少包在tomcat的lib下发现servlet-api.jar里面确实没有Tag,而jsp-api.jar里面有Tag,我把jsp-api.jar也导入,还是报这个错,即使把tomcat lib下所有包导入也没用。。。郁闷啊!!!T_T
已经把struts-tags.tld复制到WEB-INF目录下;
web.xml的配置:
- XML code
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>JspSupportServlet</servlet-name> <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet></web-app>
struts.xml的配置:
- XML code
<struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <package name="test" namespace="/test" extends="struts-default" > <default-action-ref name="Category_list" /> <action name="df" > <result>/admin/default.jsp</result> </action> <action name="Category_list" class="com.mybbs.action.CategoryAction" method="list"> <result type="freemarker">/WEB-INF/template/categorylist.ftl</result> </action> </package></struts>
ftl模板内容:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title></title>
</head>
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />
<body>
<ul style="list-style: none;">
<#list categories as n>
<li>${c.name}||${c.description}</li>
</#list>
</ul>
<a href="admin/Category_addInput">添加</a>
</body>
</html>
------解决方案--------------------
其它的先不说 先把
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />
这个声明放到head里面
你放在那个位置想做什么
还有就是
<#list categories as n>
<li>${c.name}||${c.description}</li>
</#list>
你的categories 都不判断exists?
FreeMarker对Null非常敏感
不判定exists页面非常容易报错
还是就是
list里面的迭代元素你命名为n
可以下面却是${c.name}
应该是你手误了吧