`
sillycat
  • 浏览: 2552373 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

定时任务管理(二)velocity和groovy构成灵活的展现层

    博客分类:
  • JAVA
阅读更多
定时任务管理(二)velocity和groovy构成灵活的展现层

最近项目采用了groovy来做为我们的控制层,通过配置,能将groovy文件从项目的war包中分离出来,放置在一个特定的目录,这样,我们根据groovy解释语言的特性,可以在不修改任何war包服务的情况下,对groovy的controller进行修改。如果还是使用jsp文件,那么灵活性就大大折扣了,所以这里我们修改JSP,用velocity来替换之。
velocity在2004年的时候,我就开始在淘宝项目中使用,一直使用了2年左右的时间,一直觉得很好用。哈哈。这次终于有机会重新应用一下了,先给eclipse安装好插件
velocity首页
http://velocity.apache.org/
velocity的eclipse插件地址
http://propsorter.sourceforge.net/veloeclipse/
我在eclipse3.5下安装,最先报出提示信息如下:
There are no categorized items   安装不上
网上搜索了下,去掉了下面的勾 Group items by category就好了:)

groovy的应用
这个以前就专门写过BLOG,这里基本上也没有怎么改动
http://hi.baidu.com/luohuazju/blog/item/37db387719ceae11b151b959.html
http://hi.baidu.com/luohuazju/blog/item/0d02982367884b4493580759.html
核心配置文件core-context.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:lang="http://www.springframework.org/schema/lang"
xmlns:groovy="http://www.sillycat.com/schema/groovy"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.sillycat.com/schema/groovy http://www.sillycat.com/schema/groovy/groovy.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="cn.sccl" />
<!-- 属性文件读入 -->
<bean id="propertyConfigurer"
   class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
   <property name="locations">
    <list>
     <value>classpath:config.properties</value>
    </list>
   </property>
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean id="handlerAdapter" class="com.sillycat.easygroovyplugin.servlet.proxy.ProxyAwareAnnotationMethodHandlerAdapter" />
<lang:defaults refresh-check-delay="5" />
<!-- file://D:/work/easygroovy/groovy/*.groovy -->
<groovy:scan source-pattern="/groovy/*.groovy" />
</beans>
比较关键的是这个com.sillycat.easygroovyplugin.servlet.proxy.ProxyAwareAnnotationMethodHandlerAdapter,我做的扩展,这个是用到的easygroovyplugin项目中的东东,同时会默认装载easygroovy.properties文件如下:
###############################################
# groovy configuration
###############################################
groovy.file.path=file://D:/project/CPMIS-Core/Code/Trunk/tasksupervisor
这样就做到了groovy文件可以指向任意的路径,而不需要打在war包中
其中一个JobController.groovy文件如下:
package cn.sccl.tasksupervisor.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.bind.annotation.RequestMethod;
import cn.sccl.tasksupervisor.commons.utils.StringUtil;
import java.net.URLDecoder;
import cn.sccl.tasksupervisor.service.SchedulerService;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller
@RequestMapping("/job.do")
class JobController {
@Autowired
SchedulerService schedulerService;
@RequestMapping(params = "method=list")
public ModelAndView list() throws IOException {
   ModelAndView view = new ModelAndView("jobList");
   List<Map<String, Object>> jobs = schedulerService.getQrtzJobs();
   view.addObject("items",jobs);
   return view;
}
@RequestMapping(params = "method=edit")
public ModelAndView edit() throws IOException {
   ModelAndView view = new ModelAndView("jobEdit");
   return view;
}
@RequestMapping(params = "method=save")
public ModelAndView save(HttpServletRequest request,
    HttpServletResponse response) throws IOException {
   ModelAndView view = new ModelAndView("redirect:job.do?method=list");
   String jobName = request.getParameter("jobName");
   String jobTaskName = request.getParameter("jobTaskName");
   String jobType = request.getParameter("jobType");
   String relateBeanNames = request.getParameter("relateBeanNames");
 
   if(StringUtil.isNotBlank(jobType)){
    if("spring".equals(jobType)){
     Map paras = null;
     if(StringUtil.isNotBlank(relateBeanNames)){
      paras = new HashMap<String,Object>();
      paras.put("RELATE_BEANS",relateBeanNames);
     }
     schedulerService.addSpringJob(jobName, null, jobTaskName, paras);
    }else if("java".equals(jobType)){
     schedulerService.addJob(jobName, null, jobTaskName, null);
    }
   }
   return view;
}
@RequestMapping(params = "method=cmd")
public void cmd(HttpServletRequest request,
HttpServletResponse response) throws IOException {
   String action = request.getParameter("action");
   String jobName = request.getParameter("jobName");
   if(StringUtil.isNotBlank(action) && StringUtil.isNotBlank(jobName)){
    jobName = URLDecoder.decode(jobName,"UTF-8");
    if("pause".equals(action)){
     //暂停任务
     schedulerService.pauseJob(jobName, null);
     response.getWriter().println(0);
    }else if("resume".equals(action)){
     //重启任务
     schedulerService.resumeJob(jobName, null);
     response.getWriter().println(0);
    }else if("remove".equals(action)){
     //删除任务
     schedulerService.removeJob(jobName, null);
     response.getWriter().println(0);
    }
   }
}
}
velocity的灵活布局
布局上参考了以前一个北京同事的BLOG,呵呵http://qieqie.iteye.com/blog/65028
核心配置文件也在这个core-context.xml里面:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:lang="http://www.springframework.org/schema/lang"
xmlns:groovy="http://www.sillycat.com/schema/groovy"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.sillycat.com/schema/groovy http://www.sillycat.com/schema/groovy/groovy.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="cn.sccl" />
<!-- 属性文件读入 -->
<bean id="propertyConfigurer"
   class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
   <property name="locations">
    <list>
     <value>classpath:config.properties</value>
    </list>
   </property>
</bean>
<bean id="velocityConfig"
   class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
   <property name="resourceLoaderPath" value="${velocity.file.path}/template/" />
   <property name="velocityProperties">
    <props>
     <prop key="input.encoding">UTF-8</prop>
     <prop key="output.encoding">UTF-8</prop>
     <prop key="contentType">text/html;charset=UTF-8</prop>
    </props>
   </property>
</bean>
    <bean id="velocityViewResolver"
       class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver">
    <property name="layoutUrl" value="layout/layout.vm"/>
    <property name="cache" value="false" />
   <property name="suffix" value=".vm" />
   <property name="exposeSpringMacroHelpers" value="true" />
   <property name="contentType" value="text/html;charset=UTF-8" />
    </bean>
</beans>
默认的velocity的路径指向了config.properties里面配置的:
################################################
# velocity path
################################################
velocity.file.path=file://D:/project/CPMIS-Core/Code/Trunk/tasksupervisor

这样,就做到了velocity页面文件也和war分开了。也就是说,我平时改页面,改controller层代码,其实我都不需要重新发布war包,只要改了文件上传就行了。

另外我的velocity layout布局是怎么回事呢,看看以下几个文件就明白了:
/template/layout/layout.vm
<html>  
    <head>  
       <title>任务调度系统</title>
    </head>  
    <body>  
        <div id="header">#parse('common/header.vm')</div>  
        <div id="content">  
            <div id="sub">#parse($sub)</div>  
            <div id="main">$screen_content</div>  
        </div>
        <div id="footer">#parse('common/footer.vm')</div>  
    </body>  
</html>
/template/common/header.vm
header is here!
/template/common/footer.vm
footer is here!
/template/common/menu.vm
<a href="job.do?method=edit">新增任务</a>&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;
<a href="trigger.do?method=edit">新增调度</a>&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;
<a href="job.do?method=list">任务管理</a>&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;
<a href="trigger.do?method=list">调度管理</a>&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;<br />
当访问我的真实页面/template/jobEdit.vm的时候,会在jobEdit.vm里面设置,我要调用哪个layout,哪个sub元素,其实以前在淘宝用的webx框架就和这个很类似,访问一个页面就去找对应文件夹的layout,可能就是从这里得到灵感出来的。
#set($layout = "layout/layout_edit.vm")  
#set($sub= "common/menu.vm")
<h1>新增任务</h1>
....省略

完成以上功能后,发现,整个项目的velocity展现层+groovy控制层都比较灵活了,同时又有很灵活的layout布局,把很多页面单元可以抽取成各个小模块,放置到commons里面以供调用,修改velocity文件和groovy文件也不用重启服务,很方便。
分享到:
评论

相关推荐

    Velocity 和 FreeMarker区别

    总的来说,**FreeMarker**在功能性和灵活性方面优于**Velocity**,尤其是在处理复杂逻辑和大规模项目时表现更佳。然而,如果项目的复杂度不高,或者对性能有特别要求,那么**Velocity**也是一个不错的选择。最终选择...

    模板:velocity和freemarker的比较

    Velocity 和 Freemarker 都是开源的模板技术,它们都提供了强大的功能和灵活的语法。下面我们将从几个方面比较这两种模板技术。 首先,从功能上来讲,Freemarker 在 View 层提供了 format 日期和数字的功能,这个...

    velocity和freemarker的比较

    标题“velocity和freemarker的比较”涉及到的是两个在Java Web开发中常用的模板引擎——Velocity和FreeMarker。它们都是用于将静态模板与动态数据结合,生成HTML或其他类型的文本输出,常用于MVC(模型-视图-控制器...

    Velocity文档和NVelocity类库

    3. `VelocityEngine`: 是核心引擎类,负责配置和管理Velocity。你可以设置各种配置属性,如模板路径、缓存策略等。 4. `MergeTemplate`: 该方法用于合并模板和上下文,生成最终的输出字符串。 **NVelocity模板的...

    velocity-1.5.jar,velocity-1.6.2-dep.jar,velocity-tools-1.3.jar

    Velocity的主要优点在于其简单易用和高度可扩展性,使得开发者能够将业务逻辑与表现层分离,提高代码的可读性和维护性。以下是关于这三个JAR文件的详细知识点: 1. **velocity-1.5.jar**: 这是Velocity的1.5版本...

    三大框架整合 前端视图使用velocity渲染,数据访问层使用hibernate+mysql,

    通过这样的整合,项目具备了良好的分层架构,前后端分离,数据访问层通过ORM抽象,降低了数据库操作的复杂性,同时Spring的管理能力保证了整个系统的灵活性和扩展性。对于二次开发而言,这样的框架提供了坚实的基础...

    velocity-1.7.jar

    在实际项目中,将Velocity-1.7.jar与velocity-tools-2.0结合使用,可以构建出强大的动态内容生成系统,尤其是在Web应用开发中,它能够帮助开发者更高效地管理和呈现动态内容,同时保持良好的代码组织结构。...

    Velocity资料

    它是由Apache软件基金会管理的一个项目,被广泛应用于Java开发中,用于分离业务逻辑和展现层。 2. Velocity版本: 文档提到的版本是Velocity 1.4,这是一个已经稳定并广泛使用的版本。由于技术的持续发展,建议查看...

    velocity为空判断

    在使用Velocity作为视图层处理数据时,常常需要进行空值判断,确保模板能够正确地处理不存在或者值为空的情况。下面我们将详细探讨在Velocity中如何进行空值和空字符串的判断。 ### 1. 判断Velocity变量是否为null ...

    Maven 整合 Spring mvc + Mybatis + Velocity 的实例

    本实例将探讨如何使用Maven作为项目管理工具,结合Spring MVC作为控制层框架,Mybatis作为数据访问层框架,以及Velocity作为视图层模板引擎,来构建一个完整的Java Web应用。以下是关于这些技术的详细解释和整合步骤...

    velocity的所有jar包

    其中包含了许多关键组件,如`VelocityContext`(用于存储模板变量)、`Template`(表示模板文件)和`VelocityRuntime`(初始化并管理Velocity环境)。 3. **avalon-logkit-2.1.jar**:Avalon LogKit是Apache软件...

    jsp、freemarker、velocity简介和对比

    ### jsp、freemarker、velocity简介和对比 在Java Web开发领域,模板引擎是连接后端业务逻辑与前端展示层的重要桥梁。本文将重点介绍三种常用的Java Web模板引擎:JSP(Java Server Pages)、Freemarker以及...

    eclipse中velocity插件

    5. **宏库支持**:Velocity支持宏定义,插件可以帮助开发者管理和重用这些宏,提高代码复用率。 要安装Eclipse中的Velocity插件,你可以按照以下步骤操作: 1. 打开Eclipse,选择菜单栏的“Help” -&gt; “Eclipse ...

    velocity document

    2. **灵活性**:Velocity的宏功能相对强大,更易于复用和扩展,而Freemarker的模板继承和导入功能则更灵活。 3. **性能**:两者在性能上各有千秋,具体取决于应用场景和优化程度。 **三、Velocity的上下文和模型**...

    Velocity

    Velocity源自Apache软件基金会,是Apache Jakarta项目的一部分,被广泛应用于各类Web应用和内容管理系统中。 Velocity的核心概念是模板语言,它设计的目标是易于理解和使用,同时提供足够的灵活性以满足复杂的页面...

    velocity 电子书

    《Velocity》一书是关于Apache Velocity模板引擎的权威指南,主要面向Web开发人员和系统管理员。Velocity是一个开源的Java库,用于生成动态Web内容,它以其简洁、高效和可扩展性而闻名。这本书深入探讨了Velocity的...

    JAVAEE Velocity例子工程

    通过这个例子工程,你可以了解到如何在不依赖XML配置的情况下,直接在代码中创建和管理Velocity模板。这对于快速原型开发或小型项目来说非常方便。同时,这也是一种理解Velocity工作原理的好方式,为以后在更大规模...

    eclipse编辑velocity插件velocitysite-2.0.8

    1. **代码折叠**:允许用户将复杂的 Velocity 模板段落折叠起来,以便于查看和管理模板的总体结构,提高代码的可读性。这对于处理大量模板代码的项目来说尤其有用。 2. **代码高亮**:通过为 Velocity 语法提供颜色...

    spring+velocity+ibatis

    标题“spring+velocity+ibatis”揭示了一个基于Java的Web应用程序开发组合,它结合了Spring框架、Velocity模板引擎和iBatis数据访问层。这个项目可能是为了演示或教学如何有效地集成这三个组件,以便构建一个完整的...

    Velocity标签详解文档

    例如,Velocity可以与Turbine框架结合,为Turbine提供模板服务,构建更强大的Web应用程序,支持真正的MVC模式开发,使得业务逻辑、视图呈现和控制器管理各自独立,提高了代码的可维护性和扩展性。 在实际应用中,...

Global site tag (gtag.js) - Google Analytics