`
liyin_rookie
  • 浏览: 28782 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Struts2+Freemarker基础

 
阅读更多

本文主要分三步演示Freemarker这个模版视图的使用:普通Java程序--》Web应用--》与Struts2整合,代替JSP。

 

一、Freemarker简介

  Freemarker是一个非常优秀的模版引擎,这个模版引擎可用于任何场景,FreeMarker负责将数据模型中的数据合并到模版中,从而生成标准输出。

FreeMarker特别适应与MVC模式的Web应用,通常有Java程序准备要显示的数据,由FreeMarker模版引擎来生成页面,而FreeMarker模版则提供页面布局支持,从而能更好地规范MVC架构,保证视图逻辑和业务逻辑分离。

除此之外,FreeMarker也是与Web容器无关的,也就是FreeMarker并不一定要运行在Web容器中;FreeMarker同样应用与非Web应用程序环境。而且,FreeMarker并不是只能生成HTML页面,它也可以生成各种文本,如XML/RTF/Java源代码等。

Struts2可以非常简单地使用FreeMarker模版作为视图技术,对于传统的JSP页面而言,FreeMarker是一个绝佳的替代方案。

除此之外,Struts2默认采用FreeMarker作为其模版文件,而Struts2所有主题模版文件都是采用FreeMarker编写的。因此,如果我们需要扩展Struts2的主题,也需要熟悉FreeMarker技术。

 

二、Java程序中使用FreeMarker

 

HelloFreeMarker.java

 

package com.s2freemarker.exer.test;

import java.io.File;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;


public class HelloFreeMarker {

	private Configuration cfg ;
	
	
	public void init() throws Exception {
		
		cfg = new Configuration();
		cfg.setDirectoryForTemplateLoading(new File("src\\com\\s2freemarker\\exer\\templates"));
	}
	
	public void process() throws Exception{
		
		Map<Object,Object> root = new HashMap<Object,Object>();
		root.put("name", "FreeMarker");
		root.put("msg", "First example for freemarker .");
		
		Template t = cfg.getTemplate("test.ftl");
		t.process(root, new OutputStreamWriter(System.out));
		
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		HelloFreeMarker hfm = new HelloFreeMarker();
		hfm.init();
		hfm.process();
	}

}

 

模版文件test.ftl:

 

${name},hello!${msg}

 

三、Web应用中使用FreeMarker

 

HTML模版test.ftl:

 

<html>
	<head><title>FreeMarker</title></head>
	<body>
		${message}
	</body>
</html>
 

Servlet——FreemarkerServlet:

 

 

package com.s2freemarker.exer.web.servlet;

import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class FreemarkerServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 5495454566664178949L;
	
	private Configuration config;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		Map<Object , Object> root = new HashMap<Object,Object>();
		root.put("message", "Hello FreeMarker");
		
		Template t = config.getTemplate("test.ftl");
		
		response.setContentType("text/html;charset="+t.getEncoding());
		
		Writer out = response.getWriter();
		
		try {
			t.process(root, out);
		} catch (TemplateException e) {
			throw new ServletException("Handle template error !",e);
		}
	}

	/**
	 * Initialization of the servlet. <br>
	 *
	 * @throws ServletException if an error occurs
	 */
	public void init() throws ServletException {
		config = new Configuration();
		//the method of loading template in the servlet Configuration.setServletContextForTemplateLoading()
		config.setServletContextForTemplateLoading(getServletContext(), "WEB-INF\\templates");
	}

}
 

 

 

四、整合Struts2

index.jsp:

 

<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ page session="false" %>
<%
    response.sendRedirect(request.getContextPath()+"/freemarker_index.action");
%>

 

在FreeMarker模版中增加标签库定义后,就可以在FreeMarker模版中使用Struts2标签了。(<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"]>

将Struts2核心jar包下的struts-tags.tld文件复制到WEB-INF路径下。

在web.xml中启动JspSupportServlet。

 

HTML模版test2.ftl:

 

<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"]>

<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>

 

welcome.ftl:

 

<html>
	<head><title>welcome page</title></head>
	<body>
		Welcome , ${uid}, you have loged in .
	</body>
</html>
 

 

 

Action——FreemarkerAction:

 

package com.s2freemarker.exer.web.actions;

import com.opensymphony.xwork2.ActionSupport;

public class FreemarkerAction extends ActionSupport {

	/**
	 * 
	 */
	private static final long serialVersionUID = 4684751322790860946L;

	
	private String uid ;
	
	private String password ;

	public String getUid() {
		return uid;
	}

	public void setUid(String uid) {
		this.uid = uid;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	
	
	public String login() throws Exception{
		return SUCCESS;
	}
	
}

 

五、servlet和action所需配置文件web.xml/struts.xml

 

struts.xml:

 

将FreeMarkerz作为视图结果时要将resultType设置为freemarker。

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	
	<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
	
    <package name="freemarker" extends="struts-default" >
    	
    	<action name="FreemarkerServlet">
    		<result>/servlet/FreemarkerServlet</result>
    	</action>
    	
    	<action name="freemarker_index">
    		<result type="freemarker">/WEB-INF/templates/test2.ftl</result>
    	</action>
    	
    	<action name="login" class="com.s2freemarker.exer.web.actions.FreemarkerAction" method="login">
    		<result type="freemarker">/WEB-INF/templates/welcome.ftl</result>
    	</action>	
	        
    </package>

</struts>
 

web.xml:

 

<?xml version="1.0" encoding="UTF-8"?>
<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">

  <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>		
		
  <servlet>
    <servlet-name>FreemarkerServlet</servlet-name>
    <servlet-class>com.s2freemarker.exer.web.servlet.FreemarkerServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>FreemarkerServlet</servlet-name>
    <url-pattern>/servlet/FreemarkerServlet</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
</web-app>
分享到:
评论
6 楼 gouerli 2012-07-05  
liyin_rookie 写道
gouerli 写道
基本上struts2和freemarker的联合搭建是比较齐全了,但是博主有些地方还是介绍的不够清晰啊,比如在freemarker中加入了<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"]>之后,web.xml中一定要加上<servlet> 
    <servlet-name>JspSupportServlet</servlet-name> 
    <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
  </servlet> 否则的话ftl文件是无法识别这个标签库的,这个时候就会报异常。

最后的web.xml里已经加了

我看到了,建议楼主在前面标明,这样更清晰一些。
5 楼 liyin_rookie 2012-07-05  
gouerli 写道
基本上struts2和freemarker的联合搭建是比较齐全了,但是博主有些地方还是介绍的不够清晰啊,比如在freemarker中加入了<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"]>之后,web.xml中一定要加上<servlet> 
    <servlet-name>JspSupportServlet</servlet-name> 
    <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
  </servlet> 否则的话ftl文件是无法识别这个标签库的,这个时候就会报异常。

最后的web.xml里已经加了
4 楼 jateide 2012-07-05  
Loulley 写道
cfg.setDirectoryForTemplateLoading(new File("src\\com\\s2freemarker\\exer\\templates“)
这句是什么意思?

设置freemarker加载模版的路径
3 楼 gouerli 2012-07-05  
基本上struts2和freemarker的联合搭建是比较齐全了,但是博主有些地方还是介绍的不够清晰啊,比如在freemarker中加入了<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"]>之后,web.xml中一定要加上<servlet> 
    <servlet-name>JspSupportServlet</servlet-name> 
    <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
  </servlet> 否则的话ftl文件是无法识别这个标签库的,这个时候就会报异常。
2 楼 Loulley 2012-06-14  
cfg.setDirectoryForTemplateLoading(new File("src\\com\\s2freemarker\\exer\\templates“)
这句是什么意思?
1 楼 ie0ie0ie 2012-05-30  
不错,很全

相关推荐

    hibernate3+struts2+spring2+freemarker 主流技术架构 实例

    • 采用hibernate3+struts2+spring2+freemarker主流技术架构 • 懂html就能建站,提供最便利、合理的使用方式 • 强大、灵活的标签,用户自定义显示内容和显示方式 • 在设计上自身预先做了搜索引擎优化,增强对...

    Struts2+freemarker

    Struts2和FreeMarker结合,表现层使用FTL标签,并在FTL页面中使用Struts2标签,供入门的朋友用,属最最基础的东东. 方家批评!

    struts2_freemarker_mysql applicaton

    struts2_freemarker_mysql applicaton 这对于已有struts2和webwork基础的来说是一个很不错的学习实例。 带了具体说明及jar包

    [Struts 2权威指南--基于WebWork核心的MVC开发(高清完整版) 1/12

    第1章 Struts 2概述,第2章 Struts 2下的HelloWorld,第3章 Struts 2基础,第4章 深入Struts 2,第5章 Struts 2的类型转换,第6章 文件的上传和下载.,第7章 Struts 2的拦截器,第8章 Struts 2的输入校验,9.2 ...

    struts2必须包

    freemarker-2.3.19.jar Struts2的UI标签的模板,javassist-3.11.0.GA.jar 开源的分析、编辑和创建Java字节码的类库,ognl-3.0.6.jar 对象图导航语言包,struts2-core-2.3.16.3.jar Struts框架的核心类库,xwork-core...

    Struts2教程

    Struts2 实际上是在 Webwork 基础上构建起来的 MVC 框架。我们从 Struts2 的 源代码中可以看到,有很多都是直接使用的 xwork(Webwork 的核心技术 ) 的包。既然从技术 上来说 Struts2 是全新的框架,那么就让我们来...

    struts2框架搭建基础jar包

    struts2框架搭建基础jar包,具体包括: commons-fileupload-1.3.3.jar; commons-io-2.5.jar; commons-lang3-3.6.jar; commons-logging-1.1.3.jar; freemarker-2.3.26-incubating.jar; ognl-3.1.15.jar; struts...

    Struts2入门教程(全新完整版)

    org.apache.struts2.views.freemarker.FreemarkerResult 16 httpheader 16 控制特殊http行为的结果类型 16 org.apache.struts2.dispatcher.HttpHeaderResult 16 stream 16 向浏览器发送InputSream对象,通常用来处理...

    struts2的5个基础包

    struts2的最基础的五个驱动包, 1、commons-logging-1.0.4.jar 2、freemarker-2.3.8.jar 3、ognl-2.6.11.jar 4、struts2-core-2.0.11.jar 5、xwork-2.0.4.jar

    struts2整合spring2的配置

    1. 导入的包 &lt;br&gt;l struts2的五个基础包:commons-logging-1.1.jar; &lt;br&gt;freemarker-2.3.8.jar; &lt;br&gt;ognl-2.6.9.jar; &lt;br&gt;struts-core-2.0.6.jar; &lt;br&gt;xwork-2.0.0.jar. &lt;br&gt;l spring的核心包:...

    struts2所需基础包

    struts2基础包,commons-logging.jar、freemarker-2.3.15.jar、ognl-2.7.3.jar、struts2-core-2.1.8.jar、xwork-core-2.1.6.jar

    Struts2 in action中文版

    第1章 Struts 2:现代Web框架 2 1.1 Web应用程序:快速学习 2 1.1.1 构建Web应用程序 2 1.1.2 基础技术简介 3 1.1.3 深入研究 6 1.2 Web应用程序框架 7 1.2.1 什么是框架 7 1.2.2 为什么使用框架 8 1.3 Struts 2框架...

    struts2讲义_吴峻申

    9.1 Struts2国际化基础应用 178 9.1.1 国际化基础使用方式 178 9.1.2 占位符国际化使用方式 182 9.2 Struts2国际化使用范围说明 185 9.2.1 Struts2包范围属性文件国际化应用。 186 9.2.2 Struts2Action范围属性文件...

    深入浅出struts2

    │深入浅出STRUTS 2 Struts Ti却发现了二者在技术与开发人员这两个层面上的共同之处,不久之后,两个项目就在WebWork的技术基础上进行了合并2。 当我们说起WebWork的时候,我们实际上说的是两个项目——XWork和...

    freemarker-gae-pre2.jar包

    FreeMarker是专为实际的一代的 HTML 网页,特别是通过的servlet为基础的应用程序... 但是请注意,我们提供了型的解决方案中使用FreeMarker作为视图组成部分模型2框架(如Struts的) ,这也让你使用JSP的taglibs的模板。

    struts2基础jar包

    jar文件清单: commons-fileupload-1.2.2.jar commons-io-2.0.1.jar commons-lang3-3.1.jar freemarker-2.3.19.jar javassist-3.11.0.GA.jar ognl-3.0.5.jar struts2-core-2.3.4.1.jar xwork-core-2.3.4.1.jar

    jeecg-framework-v2.0 (最新源码)

    • 架构技术: Struts2+Spring3+Hibernate4+EasyUI1.3+Spring JDBC+Highcharts报表+Jquery+Ehcache+Freemarker • 代码生成器:自动生成美观大方的前台页面及后台代码 • 查询条件生成器: 动态拼SQL,追加查询条件 •...

    struts-2.3.4所有Jar包文件

    struts-2.3.4版本中所有的Jar包文件,配置最基础的structs2所需的6个必须的jar文件为: commons-fileupload-1.2.2.jar commons-logging-1.1.1.jar freemarker-2.3.19.jar ognl-3.0.5.jar struts2-core-2.3.4.jar ...

    Java Web程序设计教程

    7.3.1freemarker基础 155 7.3.2struts2整合freemarker 166 7.3.3使用struts2标签设计模板 170 7.4freemarker与velocity的比较 171 本章小结 171 课后练习 172 第8章hibernate框架基础 173 8.1orm简介 173 ...

    达内java培训目录

    Struts2 Struts2核心控制流程、Ognl、Action、Interceptor、Result、FreeMarker、Struts2标记库、Struts2扩展、Struts2应用技巧(输入验证、消息国际化、文件上传和下载、防止重复提交等)。 熟练掌握Struts2核心...

Global site tag (gtag.js) - Google Analytics