`
zhaoyanfangeye
  • 浏览: 122996 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用Freemarker和Struts2做动态表单

阅读更多
   由于项目中需要用到一个可定制的动态表单功能,管理员可以根据需要定制定出想要的表单,参考了一些视频和网上资料,自己做了一个动态电子表单模块。
     //FreemarkerManage 的初始配置
    public class FreemarkerManage {

	private static String ENCODING="UTF-8";
	private static Configuration cfg=new Configuration();
	static{
		//定义模板的位置
		cfg.setTemplateLoader(new ClassTemplateLoader(FreemarkerManage.class,"templates"));
		cfg.setObjectWrapper(new DefaultObjectWrapper());
		//设置异常
		cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
		cfg.setEncoding(Locale.CHINA, ENCODING);
	}
	public static Configuration getConfiguration(){
		return cfg;
	}

}


@Component
public class DynaFormFunction {
	private static String defaultTemplate = "document_form.ftl";
	private static String showTemplate = "showform.ftl";
	private static String initForm = "initForm.ftl";
	private static FlowFormManageService flowFormManageService;
	private static FormInstanceWebService formInstanceWebService;
	private static ReportJobWebService reportJobWebService;
	/***
	 * 初始化表单信息,将数据放到模板中
	 * @param workflowId
	 * @return
	 */
	public static String form(long workflowId) {
        FlowForm flowForm = flowFormManageService.findFlowFormById(workflowId);
		if (null == flowForm) {
			return null;
		}
		/**
		 * 加载freemarker的配置
		 */
	Configuration configuration = FreemarkerManage.getConfiguration();
		try {
			/**
			 * 加载表单模板文件
			 */
		Template template = configuration.getTemplate(document_form);
		Writer writer = new StringWriter();
		Map root = new HashMap();
		root.put("form", flowForm);
			/**
			 * 将模板与数据进行相结合
			 */
			template.process(root, writer);
			return writer.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 显示动态表单的值
	 * @param formInstanceId
	 * @return
	 */
	public static String showForm(long formInstanceId) {
           try {
	FormInstanceDTO formInstanceDTO = formInstanceWebService
					.findFormInstanceById(formInstanceId);
			if (null == formInstanceDTO) {
				return null;
			}
			/**
			 * 加载freemarker的配置
			 */
	Configuration configuration = FreemarkerManage.getConfiguration();
			/**
			 * 获取动态表单的实例数据
			 */
	Map<Long, Object> dataInstance = formInstanceDTO.getInstanceData();
	Map<String, Object> newDataInstance = reportJobWebService
					.findFlowFormData(dataInstance);
			/**
			 * 根据配置加载模板
			 */
	Template template = configuration.getTemplate(showTemplate);
			Writer writer = new StringWriter();
			Map root = new HashMap();
			root.put("showForm", newDataInstance);
			/**
			 * 将模板与数据进行结合
			 */
			template.process(root, writer);
			return writer.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
        }
}
模板文件的编写
(1).initForm.ftl的编写
<table>
	<#assign i=0>
	<#assign dataValue="">
	<#list form.formFields as field>
		<#assign i=i+1>
		<#if field_index % 2 = 0>
			<tr>
				</#if>
					<td colspan="2" valign="top">
						<span class="form-field"><span class="important-field-star">*</span>${field.fieldLable}:</span>
						<#include "${field.input.key}">
					</td>
				<#if i=2 || !field_has_next >
					<#assign i=0>
			</tr>
		</#if>
	</#list>
</table>

/****
*自定义一个tld文件放在WEB-INF下,文件名称叫my.tld
*/
<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
  version="2.0">
    
  <tlib-version>1.0</tlib-version>
  <short-name>my</short-name>
  <uri>http://www.gosophia.com/oa/functions</uri>
  <function>
    <name>form</name>
    <function-class>com.gosophia.reportData.action.DynaFormFunction</function-class>
    <function-signature>java.lang.String form(long)</function-signature>
  </function>
  <function>
     <name>showForm</name>
    <function-class>com.gosophia.reportData.action.DynaFormFunction</function-class>
    <function-signature>java.lang.String showForm(long)</function-signature>
  </function>
</taglib>
/**
**在web.xml文件进行配置
*/
	<jsp-config>
		<taglib>
		<taglib-uri>http://www.gosophia.com/myfunctions</taglib-uri>
		<taglib-location>/WEB-INF/my.tld</taglib-location>
		</taglib>
	</jsp-config>

在jsp页面显示,并且引进tld文件
 /**
  *
  *初始化电子表单页面
  */
//先在jsp页面引进自己的标签
<%@taglib prefix="my" uri="http://www.gosophia.com/oa/functions"%>
//在jsp直接引入就可以
   ${my:form(flowForm.formId)}

  /**
   *动态显示电子表单内容
   *
   */
//先在jsp页面引进自己的标签
<%@taglib prefix="my" uri="http://www.gosophia.com/oa/functions"%>
//显示动态表单中数据
${my:showForm(approvalReportJobDto.reportJobDto.formInstanceId)}

    由于这个模块是在整个项目当中的,没能提供出相应的源代码。由于时间原因自己没能做出一个例子。
    上面的模板文件没有定义全,如果想要真正使用的话,还的定义出其他模板文件。
    如图:
    如果上面有不对的或不清楚的地方,请大家留言,或加我msn通知我      zhaoyanfangmsn@hotmail.com
  • 大小: 5.9 KB
分享到:
评论

相关推荐

    Struts2 in action中文版

    8.1.1 页面上:如何使用自定义结果组件构建Struts 2 Ajax应用程序 171 8.1.2 实现JSON结果类型 173 8.2 常用的结果类型 180 8.2.1 RequestDispatcher,也叫做dispatcher 180 8.2.2 ServletRedirectResult,也叫做...

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

    10.为什么要使用struts2代替struts1.x 7 二、struts.xml配置及例程 7 1.配置文件的优先级 7 2.配置形式 8 3.package配置相关 8 4.分工合作include:指定多个配置文件 10 5.tomcat认证访问 10 6.初识拦截器 11 7....

    struts2讲义_吴峻申

    3.1 使用web.xml配置Struts2实现Web项目Struts2应用 37 3.2 使用配置文件struts.xml实现页面导航定义 38 3.3 使用Action类控制导航业务数据 40 3.4 使用ActionSupport进行校验 42 第4章 另一Struts2核心技术:拦截器...

    struts2 学习例子

    包括最常用的jsp页面,也可以说Velocity和FreeMarker等模板技术中的使用 2.Struts2分类 (1)UI标签:(User Interface, 用户界面)标签,主要用于生成HTML元素标签,UI标签又可分为表单标签非表单标签 (2)非UI...

    深入浅出struts2

    开发人员还可以通过拦截器(可以自定义拦截器或者使用Struts2提供的拦截器)来对请求进行预处理和后处理,这样一来,处理请求就变得更加模块化,从而进一步减小耦合度。模块化是一个通用的主题——可以通过插件机制...

    深入浅出Struts2(附源码)

    作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,如数据类型转换、文件上传和下载、提高Struts 2应用的安全性、调试与性能分析、FreeMarker、Velocity、Ajax,等等。跟随作者一道深入Struts 2,聆听...

    完整的struts2框架应用实例.docx

    Struts2 框架是一种基于 Java 语言的 Web 应用程序框架,它提供了一个灵活的和可扩展的架构,以帮助开发者快速构建基于 Web 的应用程序。下面是 Struts2 框架应用实例的详细介绍: 一、Struts2 框架配置 在开始...

    struts2.0.jar

    · 使用注释: 使用Struts 2开发的应用可以使用Java 5注释,作为XML和Java属性配置之外的一个替代办法。注释尽量减少了对XML的需要。Action、拦截器、验证及类型转换方面都有注释。 插入: 只要把插件JAR文件放到\WEB-...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    如数据类型转换、文件上传和下载、Struts2应用的安全性、调试与性能分析、FreeMarker、Velocily、Ajax,等等。跟随作者一道深入Struts2。聆听大量来之不易的经验之谈。你对Struts2开发框架的理解和应用水平都将更上...

    软件开发中动态表单的解决方案 (2010年)

    通过分析动态表单的实现原理和运行机制,采用MVC架构,运用Struts,Spring和iBATIS整合的轻量级J2EE的多层软件架构和模块化思想,结合Fckeditor在线编辑器和FreeMarker组件,设计并实现了一个B/S结构的、可视化的动态表单...

    达内java培训目录

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

    Java Web程序设计教程

    7.3.3使用struts2标签设计模板 170 7.4freemarker与velocity的比较 171 本章小结 171 课后练习 172 第8章hibernate框架基础 173 8.1orm简介 173 8.1.1应用orm的意义 173 8.1.2流行的orm框架 174 8.2准备...

    Spring in Action(第二版 中文高清版).part2

    16.2 协同使用Spring和WebWork 2/Struts 2 16.3 集成Spring和Tapestry 16.3.1 集成Spring和Tapestry 3 16.3.2 集成Spring和Tapestry 4 16.4 协同使用Spring和JSF 16.4.1 解析JSF管理的属性 16.4.2 解析Spring...

    java-web-tags.zip_4 3 2 1_JAVA 语法 大全_JSTL_jsp 表单_web-tags

    2、struts 2 标签;3、jstl 各类型标签;4、spring 标签;5、jsf标签;6、jsp标签、语法;7、freemarker语法;8、velocity语法;9、ajax常用函数;10、常用js表单检测函数;11、常用js函数;12、多功能jsp编辑器...

    Spring in Action(第2版)中文版

    16.2协同使用spring和webwork2/struts2 16.3集成spring和tapestry 16.3.1集成spring和tapestry3 16.3.2集成spring和tapestry4 16.4协同使用spring和jsf 16.4.1解析jsf管理的属性 16.4.2解析springbean 16.4.3...

    spring in action英文版

     3.3.4 使用动态切入点  3.3.5 切入点实施  3.4 创建引入  3.4.1 实现IntroductionInterceptor  3.4.2 创建一个引入Advisor  3.4.3 谨慎使用引入通知  3.5 使用ProxyFactoryBean  3.6 自动...

    Spring in Action(第二版 中文高清版).part1

    16.2 协同使用Spring和WebWork 2/Struts 2 16.3 集成Spring和Tapestry 16.3.1 集成Spring和Tapestry 3 16.3.2 集成Spring和Tapestry 4 16.4 协同使用Spring和JSF 16.4.1 解析JSF管理的属性 16.4.2 解析Spring...

Global site tag (gtag.js) - Google Analytics