- 浏览: 278973 次
- 来自: 北京
文章分类
最新评论
-
weishihchen:
安装可参考这篇唷redhat上php modelhttp:// ...
LInux下如何安装ffmpeg -
q821424508:
按照楼主到方法,安装了一下,基本上可以,不过有些东西有问题,安 ...
LInux下如何安装ffmpeg -
mugesoft:
lym6520 写道您好,请问下,为什么我下载的ffmpeg里 ...
LInux下如何安装ffmpeg -
mingxiao2010:
正在看这个东西,thanks!
关于linux下用lvs实现负载均衡的配置过程 -
huang_yong:
直接修改Velocity的jar包里的属性文件即可,方法如下: ...
velocity造成log增加的解决办法!(log4j:ERROR Attempted to append to cl)
接触模板技术的时间不是很长,原来一直通过io的方法去自己生成静态文件,后来发现了模板技术,大家都在学习,我也就跟风是的加入了行列,已开始接触的是velocity,后来看了je上的大牛的介绍,开始试用Freemarker。使用模板技术除了在web app中用来显示view之外,还有一个典型的应用就是将页面静态化,这也是提高网站性能的一个基本的办法。我的目标是这样的,通过一套模板在显示页面的同时,自动生成静态页面,并保存在用户自己的目录中。
已开始看了网上介绍的例子,基本上是通过freemarker的template来实现的,于是自己也做了这样的例子,做一个通用的接口,然后实现页面的静态化功能。
然后通过spring的注入功能,自动注入到webwork的action中,这样,在action中就可以调用生成静态页面的方法了。但是实际的实验结果是,如果freemarker的模板中使用了标签技术,在生成静态页面的时候,根本就不能render模板为正确的html文件,而是把ftl作为一个io流直接输出成html了,这样的结果是不行的。于是改变模板,不使用任何标签,而使用标准的html来写模板,然后在模板中使用freemarker的data+model方式来输出页面。这种方式解决了不解析tag的毛病,静态页面可以正确的输出了,但是发现一个问题,在ftl中使用i18n出现一些问题,比如:${action.getText('reg.title')}在生成静态页面的时候会出现错误。这里的原因主要是freemarker在处理静态文件生成的时候采用temp.process(Map root, Writer out);方法,如果webwork中的ognl中的stack value没有被放进root时,这样就会出现错误,一个最简单的办法是,定义一个super action,然后将stack初始化,并放入root中,然后每个action继承super action,这样root就能得到stack value了。这样的办法虽然能解决问题,但是总是感觉有些笨拙,于是考虑了下面一个更加简单的方法。
webwork在render freemaker模板的时候,有一个缺省的result type,就是freemarker,查看了他的源代码,通过下面的方式来实现的页面输出
我们完全可以将输出到页面上的流转换为输出到静态文件,于是自己做了一个result type,并且配置三个缺省的参数:userDirectory、staticFileName、pContentType,分别可以定义静态文件的路径、名称、类型。然后在xwork.xml中添加一种result type
实现的方法如下:
这里可以看到location是缺省参数,定义模板的位置,对于另外两个参数,用户可以定义变量${userDirectory},然后在action中给它赋值,同时也可以定义常量,在reslut中都可以正确的被解析出来,主要的方法是通过WebWorkResultSupport.conditionalParse来实现的。用户可以在xwork.xml中使用这个reslut type,在view的同时生成静态页面
已开始看了网上介绍的例子,基本上是通过freemarker的template来实现的,于是自己也做了这样的例子,做一个通用的接口,然后实现页面的静态化功能。
public class TemplateGenerateImpl implements TemplateGenerate { private Configuration cfg; public void init() { cfg = new Configuration(); cfg.setClassForTemplateLoading(TemplateGenerateImpl.class, "/templates"); cfg.setTemplateUpdateDelay(0); cfg.setTemplateExceptionHandler( TemplateExceptionHandler.HTML_DEBUG_HANDLER); cfg.setObjectWrapper(ObjectWrapper.BEANS_WRAPPER); cfg.setDefaultEncoding("ISO-8859-1"); cfg.setOutputEncoding("UTF-8"); cfg.setLocale(Locale.CHINA); } public void init(ServletContext sc) { cfg = new Configuration(); cfg.setServletContextForTemplateLoading( sc, SystemConstant.TEMPLATESPATH); cfg.setTemplateUpdateDelay(0); cfg.setTemplateExceptionHandler( TemplateExceptionHandler.HTML_DEBUG_HANDLER); cfg.setObjectWrapper(ObjectWrapper.BEANS_WRAPPER); cfg.setDefaultEncoding("ISO-8859-1"); cfg.setOutputEncoding("UTF-8"); cfg.setLocale(Locale.CHINA); } public void init(String templatePath) { cfg = new Configuration(); cfg.setClassForTemplateLoading(this.getClass(), templatePath); cfg.setTemplateUpdateDelay(0); cfg.setTemplateExceptionHandler( TemplateExceptionHandler.HTML_DEBUG_HANDLER); cfg.setObjectWrapper(ObjectWrapper.BEANS_WRAPPER); cfg.setDefaultEncoding("ISO-8859-1"); cfg.setOutputEncoding("UTF-8"); cfg.setLocale(Locale.CHINA); } public void show(String templateFileName, PageWrapper pw) throws IOException, TemplateException{ Template temp = cfg.getTemplate(templateFileName); pw.getResp().setContentType("text/html; charset=" + cfg.getOutputEncoding()); pw.getResp().setHeader("Cache-Control", "no-store, no-cache, must-revalidate, " + "post-check=0, pre-check=0"); pw.getResp().setHeader("Pragma", "no-cache"); Writer out = pw.getResp().getWriter(); temp.process(pw.getRoot(), out); } public void create(String templateFileName, PageWrapper pw, String targetFileName) throws IOException, TemplateException{ Template temp = cfg.getTemplate(templateFileName); targetFileName = "d:/temp/freemarker.html"; File file = new File(targetFileName); if(!file.exists()) file.mkdirs(); Writer out = new OutputStreamWriter(new FileOutputStream(targetFileName),"UTF-8"); temp.process(pw.getRoot(), out); out.flush(); } }
然后通过spring的注入功能,自动注入到webwork的action中,这样,在action中就可以调用生成静态页面的方法了。但是实际的实验结果是,如果freemarker的模板中使用了标签技术,在生成静态页面的时候,根本就不能render模板为正确的html文件,而是把ftl作为一个io流直接输出成html了,这样的结果是不行的。于是改变模板,不使用任何标签,而使用标准的html来写模板,然后在模板中使用freemarker的data+model方式来输出页面。这种方式解决了不解析tag的毛病,静态页面可以正确的输出了,但是发现一个问题,在ftl中使用i18n出现一些问题,比如:${action.getText('reg.title')}在生成静态页面的时候会出现错误。这里的原因主要是freemarker在处理静态文件生成的时候采用temp.process(Map root, Writer out);方法,如果webwork中的ognl中的stack value没有被放进root时,这样就会出现错误,一个最简单的办法是,定义一个super action,然后将stack初始化,并放入root中,然后每个action继承super action,这样root就能得到stack value了。这样的办法虽然能解决问题,但是总是感觉有些笨拙,于是考虑了下面一个更加简单的方法。
webwork在render freemaker模板的时候,有一个缺省的result type,就是freemarker,查看了他的源代码,通过下面的方式来实现的页面输出
public void doExecute(String location, ActionInvocation invocation) throws IOException, TemplateException { this.location = location; this.invocation = invocation; this.configuration = getConfiguration(); this.wrapper = getObjectWrapper(); ... ... if (preTemplateProcess(template, model)) { try { // Process the template // First, get the writer Writer writer = null; boolean useOutputStream = false; try { writer = getWriter(); } ... ... } } }
我们完全可以将输出到页面上的流转换为输出到静态文件,于是自己做了一个result type,并且配置三个缺省的参数:userDirectory、staticFileName、pContentType,分别可以定义静态文件的路径、名称、类型。然后在xwork.xml中添加一种result type
<result-types> <result-type name="viewstatic" class="com.example.ViewAndStaticResult"> </result-type> </result-types>
<action name="register" class="com.example.Register" method="init"> <result name="success" type="freemarker">/WEB-INF/classes/templates/register/reg.ftl</result> <interceptor-ref name="wsStack"></interceptor-ref> <!-- <result name="success" type="viewstatic"> <param name="location">${templateFile}</param> <param name="userDirectory">${userDirectory}</param> <param name="staticFileName">${staticFileName}</param> </result> --> </action>
实现的方法如下:
protected void doExecute(String location, ActionInvocation invocation) throws Exception { this.location = location; this.invocation = invocation; this.configuration = getConfiguration(); this.wrapper = getObjectWrapper(); this.userDirectory = (String)conditionalParse(userDirectory, invocation); this.staticFileName = (String)conditionalParse(staticFileName, invocation); if (!location.startsWith("/")) { ActionContext ctx = invocation.getInvocationContext(); HttpServletRequest req = (HttpServletRequest) ctx.get(ServletActionContext.HTTP_REQUEST); String base = ResourceUtil.getResourceBase(req); location = base + "/" + location; } Template template = configuration.getTemplate(location, deduceLocale()); TemplateModel model = createModel(); // Give subclasses a chance to hook into preprocessing if (preTemplateProcess(template, model)) { //make static file makeStatic(template,model); //make Browser view makeView(template,model); } } private void makeStatic(Template template,TemplateModel model) throws IOException, TemplateException{ try { // Process the template // First, get the writers Writer swriter = null; boolean useOutputStream = false; try { if(getFilePath()){ swriter = getStaticFileWriter(userDirectory+"/"+staticFileName); }else{ useOutputStream = true; } } catch (IllegalStateException ise) { useOutputStream = true; } ... ... template.process(model, swriter); } finally { // Give subclasses a chance to hook into postprocessing postTemplateProcess(template, model); } }
这里可以看到location是缺省参数,定义模板的位置,对于另外两个参数,用户可以定义变量${userDirectory},然后在action中给它赋值,同时也可以定义常量,在reslut中都可以正确的被解析出来,主要的方法是通过WebWorkResultSupport.conditionalParse来实现的。用户可以在xwork.xml中使用这个reslut type,在view的同时生成静态页面
评论
3 楼
zhongxy0000
2008-05-27
邮箱:
xyzhong123@126.com
xyzhong123@126.com
2 楼
zhongxy0000
2008-05-27
能不能发个例子过来!我搞了很久都搞不出来
1 楼
luogl
2007-06-20
收藏起来,慢慢消化
发表评论
-
关于在freemarker中使用radio tag遇到的问题
2007-06-27 17:10 3635freemarker是看到大家的推 ... -
freemarker模板中使用List Map Set的方法
2007-06-21 16:59 6502Beanpublic class GroupModel { ... -
关于Webwork中OpenSessionInView的使用
2007-06-19 11:29 14201、说说为什么使用lazy 当使用Hibernate中的one ... -
关于webwor中注册例子的备忘(freemarker的基本使用)
2007-06-14 16:41 2962以下是以一个注册的例子的实现来备忘关于webwork中view ... -
编辑ApplicationResource的好工具
2007-06-07 13:43 2329今天发出现一个不错的eclipse插件,用来写web程序中的资 ... -
关于Webwork下的文件上传进度条
2007-05-18 10:50 7211Webwork下的文件上传看了很多的文章收获不少,目前比较简单 ... -
关于WebWork使用拦截器进行用户身份校验的问题!
2007-04-12 13:50 2033看了很多人都说Webwork最大的特点是拦截器 Interce ... -
关于webwork中使用dwr的form验证
2007-03-13 13:52 3148webwork中通过dwr来实现页面中的form验证,这种aj ... -
关于FreeMarker中直接使用的对象
2007-03-07 19:01 10036${Request["a"]} ${Req ... -
关于webwork中使用FCKeditor
2007-03-06 16:47 2801两天的时间,终于把webwork+freemarker+FCK ... -
WebWork笔记(2)---webwork+spring+hibernate配置
2007-01-22 13:52 4172调试了半天,终于把系统配置了起来,具体环境如下,webwork ... -
关于webwork的一些配置
2007-01-18 12:13 1283对于url的后缀(.action),可以在webwo ... -
WebWork笔记(1)---webwork初步
2007-01-18 11:23 1712下载webwork的资源,其中包括两个部分:webw ... -
终于开始学习WebWork了
2007-01-18 11:19 1356很长时间了,大家都在说webwork,都在说s ...
相关推荐
Template是模板文件,通常以`.vm`为后缀,其中可以包含动态和静态内容。当Velocity解析Template时,会将Context中的数据替换到模板中的占位符,生成最终的HTML页面。 在这个登录示例中,可能会包含以下几个关键部分...
Velocity是Apache的一个模板引擎,用于生成静态HTML、XML或其他格式的文档。在WebWork中,Velocity可以作为视图技术,用于渲染动态内容。开发者可以编写Velocity模板文件,其中包含变量和控制结构,然后使用...
由于WebWork已经被Struts 2所取代,这里不再详细展开其配置方法。WebWork框架中的配置与Struts框架类似,主要是通过配置文件指定Action的处理逻辑。 #### 五、总结 通过上述示例可以看出,无论是在JSP、Struts、...
3. **`org.jfree.chart.servlet.ServletUtilities`**:这个类提供了一系列实用方法,如`saveChartAs*`用于以不同格式保存图表为图像文件,`sendTempFile`用于将文件流发送到客户端响应对象中。 #### 二、WebWork...
标题中的"jar包"指的是Java Archive,它是Java平台上的一个标准归档文件格式,用于封装Java类库、资源文件和元数据。它允许将多个文件组合到一个单一的可执行文件中,便于分发和运行。在Java应用程序中,jar包通常...
它的模板文件(.vm)中,开发者可以定义变量、控制结构(如条件语句和循环)、以及调用Java方法,将动态数据嵌入到静态HTML结构中。 【压缩包子文件的文件名称列表】"AUTOCODE"可能是一个自动生成的文件或者目录名...
手动修改配置文件与生成时可能遇到的问题及解决方法** - **实现方式**: 配置文件通常包含各种模板和生成规则,手动修改时需要注意保持格式正确,并且理解各个配置项的意义。 总之,J-HI平台提供了一套完整的解决...
1. 模板:Freemarker的核心是模板,它是纯文本文件,其中包含动态和静态内容。动态内容用特殊的语法表示,由Freemarker引擎解析并替换为实际值。 2. 数据模型:数据模型是Freemarker模板用来获取数据的对象集合,...
它可以生成静态图表,也可以用于动态图表的生成,例如在Swing或Web应用中。JFreeChart支持多种图表类型,如条形图、折线图、饼图、面积图、雷达图、散点图、甘特图等,而且可以自定义颜色、字体、标记等样式,以满足...
2. **JFreeChart库**:JFreeChart是Java平台上的一个独立图表库,可以生成高质量的静态和动态图表,支持多种图表类型,如条形图、折线图、饼图、散点图等。JFreeChart不仅提供了丰富的图表选项,还支持自定义颜色、...
首先,Struts2并非Struts1的简单升级,而是融合了WebWork的核心,因此在设计和工作流程上有显著差异。Struts2的稳定性和性能得益于WebWork的基础,提供了更高级别的功能和灵活性。 在源代码层面,Struts2的结构分为...
它可从多种数据源(如:SQL、Excel、XML和其它)读取数据并可生成多种输出如:PDF、XML、应用程序特殊文件用于将来报表的脱机查看。 这12种优秀开源报表工具各有其特点和优缺点,读者可以根据自己的需求选择合适的...
Freemarker是一个强大的Java模板引擎,它允许开发者将业务逻辑与视图层分离,使得HTML、XML等静态页面可以通过模板动态生成。以下是关于Freemarker语法和实例的详细讲解: 1. **概念** - **Sequence**:序列,类似...
Struts2是一个强大的Java web应用程序框架,源自Struts1.x和WebWork的融合,被认为是WebWork的升级版。它的核心设计理念和工作流程与Struts1.x有着显著的区别,旨在提供更稳定、高效和成熟的应用解决方案。 Struts2...
14. XML解析:Java解析XML文件主要使用DOM(文档对象模型)和SAX(简单API for XML)解析器。 15. 多态与继承:在Java中,当子类对象引用父类引用时,调用方法遵循多态原则,实际执行的是子类重写的方法。因此,`...
1. **SQL Maps**:iBatis的配置文件中包含了SQL语句,可以是静态的也可以是动态的,动态SQL可以根据条件自动生成不同的SQL。 2. **Mapped Statements**:这些映射语句关联了SQL和Java方法,当Java方法被调用时,对应...
Struts2是Apache Struts项目下的一个开源框架,它继承了Struts1的一些特性,同时又结合了WebWork框架的优点,使得它在Java Web开发领域具有很强的竞争优势。Struts2的核心优势在于它的灵活配置和强大的拦截器机制。 ...