- 浏览: 2552373 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
nation:
你好,在部署Mesos+Spark的运行环境时,出现一个现象, ...
Spark(4)Deal with Mesos -
sillycat:
AMAZON Relatedhttps://www.godad ...
AMAZON API Gateway(2)Client Side SSL with NGINX -
sillycat:
sudo usermod -aG docker ec2-use ...
Docker and VirtualBox(1)Set up Shared Disk for Virtual Box -
sillycat:
Every Half an Hour30 * * * * /u ...
Build Home NAS(3)Data Redundancy -
sillycat:
3 List the Cron Job I Have>c ...
Build Home NAS(3)Data Redundancy
定时任务管理(二)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> |
<a href="trigger.do?method=edit">新增调度</a> |
<a href="job.do?method=list">任务管理</a> |
<a href="trigger.do?method=list">调度管理</a> | <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文件也不用重启服务,很方便。
最近项目采用了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> |
<a href="trigger.do?method=edit">新增调度</a> |
<a href="job.do?method=list">任务管理</a> |
<a href="trigger.do?method=list">调度管理</a> | <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文件也不用重启服务,很方便。
发表评论
-
Update Site will come soon
2021-06-02 04:10 1679I am still keep notes my tech n ... -
Portainer 2020(4)Deploy Nginx and Others
2020-03-20 12:06 431Portainer 2020(4)Deploy Nginx a ... -
Private Registry 2020(1)No auth in registry Nginx AUTH for UI
2020-03-18 00:56 436Private Registry 2020(1)No auth ... -
Docker Compose 2020(1)Installation and Basic
2020-03-15 08:10 374Docker Compose 2020(1)Installat ... -
VPN Server 2020(2)Docker on CentOS in Ubuntu
2020-03-02 08:04 455VPN Server 2020(2)Docker on Cen ... -
Nginx Deal with OPTIONS in HTTP Protocol
2020-02-15 01:33 356Nginx Deal with OPTIONS in HTTP ... -
PDF to HTML 2020(1)pdftohtml Linux tool or PDFBox
2020-01-29 07:37 405PDF to HTML 2020(1)pdftohtml Li ... -
Elasticsearch Cluster 2019(2)Kibana Issue or Upgrade
2020-01-12 03:25 720Elasticsearch Cluster 2019(2)Ki ... -
Spark Streaming 2020(1)Investigation
2020-01-08 07:19 295Spark Streaming 2020(1)Investig ... -
Hadoop Docker 2019 Version 3.2.1
2019-12-10 07:39 295Hadoop Docker 2019 Version 3.2. ... -
MongoDB 2019(3)Security and Auth
2019-11-16 06:48 241MongoDB 2019(3)Security and Aut ... -
MongoDB 2019(1)Install 4.2.1 Single and Cluster
2019-11-11 05:07 294MongoDB 2019(1) Follow this ht ... -
Monitor Tool 2019(1)Monit Installation and Usage
2019-10-17 08:22 325Monitor Tool 2019(1)Monit Insta ... -
Ansible 2019(1)Introduction and Installation on Ubuntu and CentOS
2019-10-12 06:15 312Ansible 2019(1)Introduction and ... -
Timezone and Time on All Servers and Docker Containers
2019-10-10 11:18 332Timezone and Time on All Server ... -
Kafka Cluster 2019(6) 3 Nodes Cluster on CentOS7
2019-10-05 23:28 283Kafka Cluster 2019(6) 3 Nodes C ... -
K8S Helm(1)Understand YAML and Kubectl Pod and Deployment
2019-10-01 01:21 326K8S Helm(1)Understand YAML and ... -
Rancher and k8s 2019(5)Private Registry
2019-09-27 03:25 362Rancher and k8s 2019(5)Private ... -
Jenkins 2019 Cluster(1)Version 2.194
2019-09-12 02:53 444Jenkins 2019 Cluster(1)Version ... -
Redis Cluster 2019(3)Redis Cluster on CentOS
2019-08-17 04:07 373Redis Cluster 2019(3)Redis Clus ...
相关推荐
总的来说,**FreeMarker**在功能性和灵活性方面优于**Velocity**,尤其是在处理复杂逻辑和大规模项目时表现更佳。然而,如果项目的复杂度不高,或者对性能有特别要求,那么**Velocity**也是一个不错的选择。最终选择...
Velocity 和 Freemarker 都是开源的模板技术,它们都提供了强大的功能和灵活的语法。下面我们将从几个方面比较这两种模板技术。 首先,从功能上来讲,Freemarker 在 View 层提供了 format 日期和数字的功能,这个...
标题“velocity和freemarker的比较”涉及到的是两个在Java Web开发中常用的模板引擎——Velocity和FreeMarker。它们都是用于将静态模板与动态数据结合,生成HTML或其他类型的文本输出,常用于MVC(模型-视图-控制器...
3. `VelocityEngine`: 是核心引擎类,负责配置和管理Velocity。你可以设置各种配置属性,如模板路径、缓存策略等。 4. `MergeTemplate`: 该方法用于合并模板和上下文,生成最终的输出字符串。 **NVelocity模板的...
Velocity的主要优点在于其简单易用和高度可扩展性,使得开发者能够将业务逻辑与表现层分离,提高代码的可读性和维护性。以下是关于这三个JAR文件的详细知识点: 1. **velocity-1.5.jar**: 这是Velocity的1.5版本...
通过这样的整合,项目具备了良好的分层架构,前后端分离,数据访问层通过ORM抽象,降低了数据库操作的复杂性,同时Spring的管理能力保证了整个系统的灵活性和扩展性。对于二次开发而言,这样的框架提供了坚实的基础...
在实际项目中,将Velocity-1.7.jar与velocity-tools-2.0结合使用,可以构建出强大的动态内容生成系统,尤其是在Web应用开发中,它能够帮助开发者更高效地管理和呈现动态内容,同时保持良好的代码组织结构。...
它是由Apache软件基金会管理的一个项目,被广泛应用于Java开发中,用于分离业务逻辑和展现层。 2. Velocity版本: 文档提到的版本是Velocity 1.4,这是一个已经稳定并广泛使用的版本。由于技术的持续发展,建议查看...
在使用Velocity作为视图层处理数据时,常常需要进行空值判断,确保模板能够正确地处理不存在或者值为空的情况。下面我们将详细探讨在Velocity中如何进行空值和空字符串的判断。 ### 1. 判断Velocity变量是否为null ...
本实例将探讨如何使用Maven作为项目管理工具,结合Spring MVC作为控制层框架,Mybatis作为数据访问层框架,以及Velocity作为视图层模板引擎,来构建一个完整的Java Web应用。以下是关于这些技术的详细解释和整合步骤...
其中包含了许多关键组件,如`VelocityContext`(用于存储模板变量)、`Template`(表示模板文件)和`VelocityRuntime`(初始化并管理Velocity环境)。 3. **avalon-logkit-2.1.jar**:Avalon LogKit是Apache软件...
### jsp、freemarker、velocity简介和对比 在Java Web开发领域,模板引擎是连接后端业务逻辑与前端展示层的重要桥梁。本文将重点介绍三种常用的Java Web模板引擎:JSP(Java Server Pages)、Freemarker以及...
5. **宏库支持**:Velocity支持宏定义,插件可以帮助开发者管理和重用这些宏,提高代码复用率。 要安装Eclipse中的Velocity插件,你可以按照以下步骤操作: 1. 打开Eclipse,选择菜单栏的“Help” -> “Eclipse ...
2. **灵活性**:Velocity的宏功能相对强大,更易于复用和扩展,而Freemarker的模板继承和导入功能则更灵活。 3. **性能**:两者在性能上各有千秋,具体取决于应用场景和优化程度。 **三、Velocity的上下文和模型**...
Velocity源自Apache软件基金会,是Apache Jakarta项目的一部分,被广泛应用于各类Web应用和内容管理系统中。 Velocity的核心概念是模板语言,它设计的目标是易于理解和使用,同时提供足够的灵活性以满足复杂的页面...
《Velocity》一书是关于Apache Velocity模板引擎的权威指南,主要面向Web开发人员和系统管理员。Velocity是一个开源的Java库,用于生成动态Web内容,它以其简洁、高效和可扩展性而闻名。这本书深入探讨了Velocity的...
通过这个例子工程,你可以了解到如何在不依赖XML配置的情况下,直接在代码中创建和管理Velocity模板。这对于快速原型开发或小型项目来说非常方便。同时,这也是一种理解Velocity工作原理的好方式,为以后在更大规模...
1. **代码折叠**:允许用户将复杂的 Velocity 模板段落折叠起来,以便于查看和管理模板的总体结构,提高代码的可读性。这对于处理大量模板代码的项目来说尤其有用。 2. **代码高亮**:通过为 Velocity 语法提供颜色...
标题“spring+velocity+ibatis”揭示了一个基于Java的Web应用程序开发组合,它结合了Spring框架、Velocity模板引擎和iBatis数据访问层。这个项目可能是为了演示或教学如何有效地集成这三个组件,以便构建一个完整的...
例如,Velocity可以与Turbine框架结合,为Turbine提供模板服务,构建更强大的Web应用程序,支持真正的MVC模式开发,使得业务逻辑、视图呈现和控制器管理各自独立,提高了代码的可维护性和扩展性。 在实际应用中,...