日期:2014-05-20  浏览次数:20743 次

struts2使用freemarker的问题!求各位大侠拔刀相助!!
想在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}
应该是你手误了吧