一:freemarker编辑器的安装
freeM a rker模板IDE作为MyEclipse的插件用来编辑ftl文件,具有语法高亮的作用,安装的方式一是采用MyEclipse的help选项下的softWare update,指定url地址,来自动完成插件的下载和安装,安装后会提示重启,在测试的过程中myEclips6.6中提示报错,大致意思是说连接问题,但在eclipse在线安装过程中未出现任何状况,所以采用手动安装的方式,
二:freemarker-jar包的使用
hudson.freemarker_ide_0.9.14下修改配置以及导入指定的freemarkerjar包
,因为freemarker-ide下的第三方jar版本过低,这时需要下载新的版本,覆盖原先的jar,在freemar-ide ----C:\Users\Administrator\Desktop\freemarker-ide-0.9.14\plugins\hudson.freemarker_ide_0.9.14\META-INF\MANIFEST.MF文件进行修改。
=========================================================
MANIFEST.MF
org.eclipse.jdt.ui
Eclipse-AutoStart: true
Bundle-ClassPath: freemarker-2.3.6.jar,
Bunle-ClassPath:指定覆盖后的jar
三:freeMarker的一些问题
1.strut2对freeMarker支持,在struts2.0版本中,查看包结构
views\freemarker下即是struts2对freemarker支持的源文件,但strut2.0版本的还有个FreemarkerServlet.java文件,见附件。
freemarkerServlet继承(extends HttpServlet),也就是一个servlet,所以它会对ftl模板文件进行拦截做些处理,所以在web.xml文件中,会配置一下freemarkerServlet,
<servlet>
<servlet-name>FreemarkerServlet</servlet-name>
<servletclass>org.apache.struts2.views.freemarker.FreemarkerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FreemarkerServlet</servlet-name>
<url-pattern>/servlet/FreemarkerServlet</url-pattern>
</servlet-mapping>
但运行时,会出现一下异常:
javax.servlet.ServletException: Servlet.init() for servlet freemarker threw exception org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) java.lang.Thread.run(Thread.java:619) root cause java.lang.NullPointerException org.apache.struts2.views.freemarker.FreemarkerServlet.createConfiguration(FreemarkerServlet.java:76) org.apache.struts2.views.freemarker.FreemarkerServlet.init(FreemarkerServlet.java:54) javax.servlet.GenericServlet.init(GenericServlet.java:212) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) java.lang.Thread.run(Thread.java:619)
2.关于freemarker调用struts标签的问题
在ftl文件中,如要使用strut2的标签库就要复制,struts包的标签到指定的目录下,建立对其的引用。
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"]> //struts-tag.tld复制到了WEB-INF下 <html> <head><title>Struts2 FreeMarker</title></head> <body> <@s.form action="login.action"> <@s.textfield name="uid" label="USRNAME"/> <@s.textfield name="password" label="PASSWORD"/> <@s.submit value="login"/> </@s.form> </body> </html>
但是在我使用的时候并没有达到页面显示的内容,也许前面的问题和这个问题是环环相扣的。
3, ide对<@s.textfield>标签的提示并没有表现出来,也只有${}这样的标识也予以提示.
四:加载模板文件(templates)的几种方式
1,通过setClassForTemplateLoading()方式,参数一,指定当前类,参数二:ftl文件所在文件。前提是当前类是ftl所在目录的父目录。
configuration.setClassForTemplateLoading(FreeMarkerManager.class,"templates");
2.通过configuration.setServletContextForTemplateLoading(getServletContext(),
"\\template"),其中第一参数是应用上下文,第二个参数是相对于classpath的ftl所在的目录。
3.通过configuration.setDirectoryForTemplateLoading(new File("templates")),newFile()文件与src是同级目录。
五:sturt2和freemaker
因为以上问题,所以在示例中并没有采用调用struts2标签的方式来进行页面类似输入框的显示,只执行简单的struts2和freemaker数据交互的过程,示例如下。
public class LoginAction extends ActionSupport implements ServletRequestAware, ServletResponseAware, ServletContextAware { private HttpServletRequest request; @SuppressWarnings("unused") private HttpServletResponse response; private ServletContext servletContext; public void setServletRequest(HttpServletRequest request) { this.request = request; } public void setServletResponse(HttpServletResponse response) { this.response = response; } @SuppressWarnings("unchecked") public String Login() throws IOException, TemplateException { Configuration configuration = new Configuration(); configuration.setServletContextForTemplateLoading(getServletContext(), "\\template"); configuration.setObjectWrapper(new DefaultObjectWrapper()); // 设置默认的对象包装器 configuration.setTemplateExceptionHandler(TemplateExceptionHandler .IGNORE_HANDLER);// 设置异常处理器 Map map = new HashMap(); map.put("name", "zhangsan"); map.put("password", "123"); try { Writer out = response.getWriter(); Template template = configuration.getTemplate("login.ftl"); response.setContentType("text/html;charset=" + template.getEncoding()); template.process(map, out); out.close(); } catch (TemplateException e) { } return SUCCESS; } public void setServletContext(ServletContext servletContext) { this.servletContext = servletContext; } public ServletContext getServletContext() { return servletContext; } }
struts.xml配置
<struts> <package namespace="/free" name="free" extends="struts-default"> <action name="LoginAction_*" class="cn.spring.action.LoginAction" method="{1}"> <result>/template/login.ftl</result> </action> </package> </struts>
login.ftl
<html> <body> <form action=""> username:<input type="text" name="username" value="${name}"/> password:<input type="text" name="password" value="${password}"/> </form> </body> </html>
地址栏输入:http://localhost:8080/freeMark/free/LoginAction_Login.action,显示页面如下