初试FreeMarker模板的一些问题



一: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,显示页面如下

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值