`
liyin_rookie
  • 浏览: 29342 次
  • 性别: 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就能建站,提供最便利、合理的使用方式 • 强大、灵活的标签,用户自定义显示内容和显示方式 • 在设计上自身预先做了搜索引擎优化,增强对...

    spring+hibernate+struts2+freemarker SSH2 新闻发布系统

    总结起来,"spring+hibernate+struts2+freemarker SSH2 新闻发布系统"是一个基础的Java Web项目,展示了SSH2框架组合在实际开发中的应用。开发者可以通过学习这个小例子,理解如何整合这些技术来构建更复杂的Web应用...

    struts1+spring+hibernate+freemarker一个小例子

    在这个“struts1+spring+hibernate+freemarker一个小例子”中,我们将探讨这四个组件如何协同工作,以及它们各自的核心功能。 首先,Struts1是MVC(模型-视图-控制器)设计模式的一个实现,主要用于处理HTTP请求和...

    struts2+spring+Ibatis框架包

    Struts2还支持多种视图技术,如JSP、FreeMarker、Velocity等,让开发者有更多选择。 Spring框架则是一个全面的企业级应用开发框架,它的核心特性包括依赖注入(DI)和面向切面编程(AOP)。依赖注入帮助解耦组件,...

    SSHF备忘之依赖包(struts2+spring2.5+hibernate+freemarker)

    在Java Web开发中,SSHF(Struts2、Spring、Hibernate和FreeMarker)是一个常见的技术栈,用于构建高效、可维护的MVC应用程序。这些框架的整合能够提供强大的功能,如模型-视图-控制器架构、依赖注入、持久化管理和...

    struts2和freemarker整合

    Struts2和FreeMarker是两种在Java Web开发中广泛应用的技术。Struts2是一个基于MVC(Model-View-Controller)架构模式的开源框架,用于构建动态、数据驱动的Web应用程序,而FreeMarker则是一个模板引擎,它允许...

    Struts2+Tiles

    Struts2+Tiles是一个常用的Java Web开发框架组合,主要用于构建结构清晰、可维护性强的Web应用。Struts2是基于MVC(Model-View-Controller)设计模式的开源框架,而Tiles则是Struts2的一个视图层扩展,它提供了一种...

    web框架PPT——Struts 2+Hibernate+MyBatis+Spring 网站开发案例课堂 书籍附带PPT课件

    同时,Struts 2支持多种视图技术,如JSP、FreeMarker等,使得开发者可以灵活地展示数据。 Hibernate则是一个对象关系映射(ORM)框架,它消除了Java应用程序与数据库之间的直接交互,使得开发者能够用面向对象的...

    Struts2+Hibernate+Spring课件 张志峰版

    1. **Struts2基础**:了解Struts2的MVC架构,学习Action、Result、Interceptor等概念,以及如何配置Struts2的XML文件。 2. **Struts2与Spring整合**:学习如何将Struts2的Action类与Spring的Bean管理结合,实现...

    MyEclipse开发SSH2(Struts2+Spring+Hibernate)教程

    ### MyEclipse开发SSH2(Struts2+Spring+...综上所述,通过上述步骤,你不仅能够成功在MyEclipse环境中搭建SSH2框架,还能深刻理解每个组件的作用及相互间的协作机制,为进一步开发复杂的企业级应用奠定坚实基础。

    freemarker+struts2+ibatis入门学习摘要

    【FreeMarker】 FreeMarker 是一个模板引擎,用于动态生成 ...这些步骤都是 FreeMarker+Struts2+iBatis 整合应用的基础,它们帮助开发者高效地构建动态网站,将视图、控制和数据访问分离,提高代码的可读性和可维护性。

    struts2+myeclipse 入门例子

    在视图层,Struts2支持多种技术,如JSP、FreeMarker或Velocity。在这个例子中,test2.jsp可能是用来显示结果的页面,可以包含动态数据从Action传递过来。 标签库是Struts2的一个强大特性,它提供了丰富的标签来简化...

    maven+struts2+spring+mybatis+springMVC

    本项目"maven+struts2+spring+mybatis+springMVC"就是一个典型的Java Web应用开发组合,利用了这些框架的优势进行集成,实现了数据持久化、业务逻辑处理、视图展示以及依赖管理等多个层面的功能。 首先,我们来详细...

    Struts2+Spring+Hiberate介绍

    **Struts2** 是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,它在Struts1的基础上进行了很多改进,提供了更丰富的功能和更好的性能。Struts2的核心是Action类,它处理用户请求,并与业务逻辑层进行...

    EXTJS4+STRUTS2+JAVA增删改查

    STRUTS2是一个基于MVC设计模式的Java Web框架,它简化了模型与视图、控制器的交互,支持多种视图技术,如JSP、FreeMarker等。STRUTS2的核心是Action和Interceptor,Action处理用户的请求,Interceptor处理业务逻辑和...

    Java高级框架应用开发案例教程 Struts2+Spring+Hibernate

    此外,Struts2支持多种模板技术,如FreeMarker和JSP,用于生成动态视图。 Spring框架则是一个全面的后端解决方案,包括依赖注入(DI)、面向切面编程(AOP)、事务管理、数据访问集成等。它允许开发者通过XML配置...

    Struts2+Spring+Hibernate+Ajax框架整合

    Struts2还支持多种视图技术,如JSP、FreeMarker等,以及丰富的插件系统,如国际化、表单验证等。 Spring框架则是一个全面的企业级应用开发框架,它不仅提供了依赖注入(DI)和面向切面编程(AOP)的能力,还涵盖了...

    Struts2+jQuery(不用JSON)实现局部刷新

    2. **jQuery基础**: jQuery简化了JavaScript的API,使开发者能够快速地选取DOM元素、操作样式、处理事件和进行AJAX通信。其核心功能包括选择器(如$("#id"))、DOM操作(如$(element).html())和动画效果(如...

    struts2+hibernate常用jar包.rar

    6. **xwork-core-2.3.24.1.jar**:XWork是Struts2的基础,它提供了一种Action管理和拦截器机制,Struts2在其基础上实现了更高级的MVC功能。 7. **javassist-3.15.0-GA.jar** 和 **javassist-3.11.0.GA.jar**:这两...

Global site tag (gtag.js) - Google Analytics