· 传智播客四月谈
2012-2-10 18:57:09 阅读0 评论0 102012/02 Feb10
2011年11月之前,我压根没有听过“捷易通”这个东西。一天,我和女朋友在上林体育馆(陕师大)跑圈,她说今天一个高中同学给她打电话,说8月份开了个淘宝店,到现在总共挣了5万多。 我当时就笑了,这话怎么可以信呢,无非是同学之间吹牛打屁而已。我女朋友似乎真的相信,说 自己也要开淘宝店。我当时没太搭理,因为我这两年觉得淘宝上已经没什么机会了。
后来,女朋友去她同学的店铺看一看,就开始不停的吵吵着让我帮她做。我推脱着,说我一个学历史的根本搞不好这玩意。为这事,闹的挺不愉快的。吃饭的时候,她说我是怕掏钱。我极力辩解。她很不高兴,本来每天晚上跑圈锻炼的,说是宿舍人约好去自习。我要陪她去,她让我滚。
我很不爽,想回宿舍找个人骂一顿,结果回来一看,一个人都没有。打开电脑,看了会校内。想去淘宝看看她同学的店。我给她打电话问店铺名,她赌气不接。发了几条短信,带了几个脏字。她才弱弱的回了一条,除了她同学淘宝店的名字易**(省去,避免给他免费打广告哈),附带“你去死”三个字。晕死!
搜索进去,好家伙,11年8月9日开的店,11月3日已经成为5钻卖家。或许今天看来这不算最厉害的,但当时确实颠覆了我对目前是否适合做淘宝的一些看法。再一看交易量,脏话都差一点骂出来,简直赚翻了。
她的同学卖的是一款软件,叫“捷易通”。我之前经常在淘宝上充手机话费的,总以为这是一个资金需求量非常大的业务,因为要向移动公司进货。今天才知道,只要买这款软件就能做充值业务。
我被人民币的油墨味深深吸引,再加上女朋友为这事和我闹了点小矛盾,确实动心了。在网上查了很多资料,有好有怀,这或许是历史系人的习惯性动作吧。后来在http://www.dinghaohuo.com(顶好货,专门做热销商品评测的网站)看到“捷易通”专题,从它那里推荐的卖家拍了一个500版的。后来,女友的那位同学还在她面前抱怨,说没有照顾生意。
支付宝本来就是实名认证的,淘宝店铺认证晚上提交的,第二天中午就批下来了。从做家教挣的那点钱里拿出1000元,交了消费者保障金。装修上货,开始了让我十分意外的淘宝生涯。
吃完晚饭,背上笔记本,把女友约到图书馆上网给她看淘宝店。她那表情,明显故作镇定状。说我花钱怎么可以不告诉她,店铺装修的跟我一样丑。我晕~
店铺起步很顺利,开业当天总计做了32笔交易。下午吃饭异常兴奋,因为看到淘宝的市场规模确实非常非常大。
后来我遇到一些前来请教的朋友,有些起步不太顺利的。都是因为低价销售1元QQ币造成的,这种方法肯定不行,跟刷信誉没有差别。淘宝态度其实很明确,在淘宝当卖家谁不想要信誉,但总不能让人一两分钱的成本搞一个信誉吧。我之所以顺利是因为我销售的主要是50元话费。
之后基本上每天都能达到30~50的交易量,20天后我达到三钻级别。三钻基本上是淘宝卖家的分水岭,三钻后购买转换率就开始不那么低了。开始卖软件,大家知道的,软件的利润相当丰厚,即便两三天卖一套也是相当赚的。2011年12月20号我们的支付宝账户累计收入已经达到一万三千元了,我女朋友差点疯了。作为学生,我们从来没有在这么短的时间里挣这么多钱,之前带家教已经很赚了,但还是有点小巫见大巫的感觉。
农历年大家都休假,我坚守岗位,基本上一天能够销出去一套软件,平均利润在300元左右。大年三十给爸爸妈妈一人给了500元,虽然不多,但他们高兴坏了。女朋友发话了,年末买辆小排量耍耍,我劝告她,不要太张扬。哈哈。
作为一个不算太早入行,但多少赚了点的从业者,在此祝愿各位能够发财,发大财~
2009-10-30 12:13:34 阅读447 评论0 302009/10 Oct30
6月28号,我从阴沉了半月的西安来到空姐所谓地面温度仅30°却差点热死我的北京。在机场大巴上晃了两个小时,来到这个人们若只听名字便觉得离幸福不远的地方——上地。王特往信息大厦接我,帮我拉着那只女性化的红色大旅行箱来到传智。后脚还没进门,小孙(当时称之为孙老师)就嚷嚷着让我给罗建国打电话。说真的,在整个六月份,我只有在飞机上的两小时才没有被罗建国关照到。从陕西到四川,再从陕西到北京,罗建国让我明白了人生的意义就是被重视,并最终不堪于被重视。
6月28至今,已有足足四个月的光景。每个人的变化不可谓不大,王特也当网管了。从第一次走进309教室见到我“偶像中的战斗像”张孝祥先生,到现在真实的感受老黎普通话的巨大进步。每一个人似乎匆匆而过,但又似乎是完全停滞在我的脑海。留给我不仅有技术,还有他们的为人。
老毕幽默的大嗓门(此句乃形容词乱用,请勿模仿)让新来的付域洲同学连连称赞,这位沈阳理工大的大二退学生号称“传智五天大学一年”。可见,有着满清血统的付域洲虽学理科,但在修辞上完全不输于文科老油条。而在我看来,听老毕的课是危险的,因为学员容易忘记疲惫。
不知老佟将java web和SSH框架研究的多精透。从我到张智慧再到付域洲,一直到……他估计会将框架拌着幽默一直播撒开来。他和老毕一样来自东北,我突然发自内心的觉得东北出个赵本山真乃情理之中。
老方温柔的抿嘴一笑,又让我想起了电工。好几次,王特拆不开的空调,他能拆。别人发不了的MAIL,他能发。他的强悍出自于多变的身份。嗯哼!
我专门查过汤姓,不信请看《传智播客”听讲笔记“之实战itcastBBS(概述与环境搭建)》。小哥汤阳光在出艺人(汤显祖、汤唯)的汤氏家族里偏偏做了一名软件工程师,他的魄力令人侧目。其实最重要的是,他还年轻。看到他,学员会反思自己的效率问题。
老徐,天天乐呵呵的。此老徐非徐静蕾,乃徐陪成先生也。他的调研系统中使用的几个报表框架,让我获益匪浅。8月中旬,我还专门问过老佟关于报表框架的问题。9月底,我一次学了两个。
或许是写博的原因,一些想来传智的人发消息询问我传智的情况,比如那位叫”J风“的朋友。其实各位只需跟传智咨询老师沟通就行了。如果真不放心,也可以问问老学员,比如罗建国先生,他善于总结并乐于关照别人。问传智课程体系的朋友请看这里。有更多细节问题的朋友,请进入传智官网点击咨询对话框。我博客中牵扯的技术问题欢迎讨论,关于让我形容讲师的技术有多高。我只能说,你能想多高就多高。
恍然间我也成传智老学员了。祝愿同班上课的同学找到满意的工作,祝愿像付域洲一样刚上了一个月的同学飞速进步,祝愿即将进入传智的同学因自己的明智决策而获得生活新转机。我在飞秋(局域网IM)上叫李宇春——信春哥拿高薪。
传智,俺会想你!!!
2009-10-30 12:12:50 阅读683 评论0 302009/10 Oct30
日期:10月28日
讲师:黎活明
在实际的应用中,如果页面只需显示极少的信息(服务器环境信息,WEB文档相关信息等等),我们为此专门写一个程序显然太耗精力。SSI就可以为我们轻松解决这个问题。
SSI(Server Side Include),通常称为“服务器端包含”技术。使用了SSI技术的文件默认的后缀名为.shtml,SSI技术通过在html文件中加入SSI指令让web服务器在输出标准HTML代码之前先解释SSI指令,并把解释完后的输出结果和HTML代码一起返回给客户端。多数项目中,我们主要使用了SSI的包含指令<!--#include virtual="/global/foot.jsp" -->,它的作用类似于JSP中的<jsp:include page="/global/foot.jsp"/>标签。
目前主流web服务器都提供了SSI实现,我们只需要打开SSI功能就可以使用。步骤如下(以Tomcat5.5为例):
1. 将$CATALINA_HOME/server/lib/servlets-ssi.renametojar的名称改为servlets-ssi.jar
2. 设置$CATALINA_HOME/conf/context.xml文件,在<Context>节点添加privileged="true"属性,该属性指定我们发布的web应用有权限使用容器的servlet。当你如果需要在$CATALINA_HOME/conf/server.xml添加其它web应用时,最好也为<Context>加上privileged="true"属性,如:
<Context debug="0" path="" docBase="E:\website" privileged="true"/>
3. 在$CATALINA_HOME/ conf/web.xml开启SSI的功能,Tomcat提供了两种开启SSI的方式:一种是servlet,另一种是filter。这里我们使用Servlet开启SSI功能。如:
<servlet>
<servlet-name>ssi</servlet-name>
<servlet-class>org.apache.catalina.ssi.SSIServlet</servlet-class>
部分代码省略
<init-param>
<param-name>inputEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>outputEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<load-on-startup>4</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ssi</servlet-name>
<url-pattern>*.shtml</url-pattern>
</servlet-mapping>
接下来,我们通过一个简单的例子看看SSI到底如何使用的。
main.shtml内容
<html xmlns="http://www.w3.org/1999/xhtml"><HEAD>
<TITLE>巴巴运动网</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
</HEAD>
<BODY>
<!--#include file="head.jsp" -->
<br>中部<br>
<!--#include file="foot.html" -->
</BODY></html>
head.jsp内容:
<%@ page language="java" pageEncoding="UTF-8"%>
这是头部
foot.html内容:
这是尾部
我们在使用SSI指令的时候,必须遵循它的格式。
1. 程序代码:
<!--#指令名称="指令参数“ -->
2. 示例:
<!--#include file="foot.html"-->
3. 说明:
<!-- -->是HTML语法中表示注释,当WEB服务器不支持SSI时,会忽略这些信息。
#include 为SSI指令之一。
file 为include的参数, foot.htm为参数值,在本指令中指将要包含的文档名。
4. 注意:
<!--与#号间无空格,只有SSI指令与参数间存在空格。
上面的标点="",一个也不能少。
SSI指令是大小写敏感的,因此参数必须是小写才会起作用。
------------------------------------------------
#flastmod 和 #fsize
作用:
#flastmod 文件最近更新日期
#fsize 文件的长度
语法:
<!--#flastmod file="文件名称"-->
<!--#fsize file="文件名称"-->
参数:
file 指定包含文件相对于本文档的位置
virtual 指定相对于服务器文档根目录的位置 如 /global/foot.html 表示
注意:文件名称必须带有扩展名。
示例:
<!--#flastmod file="foot.html"-->将当前目录下foot.html文件的最近更新日期插入到当前页面
<!--#fsize file="foot.html"-->将当前目录下news.html的文件大小入到当前页面
#echo
作用:将环境变量插入到页面中。
语法:
<!--#echo var="变量名称"-->
示例:
本文档名称:<!--#echo var="DOCUMENT_NAME"--> <br>
你的IP地址:<!--#echo var="REMOTE_ADDR"--> <br>
显示当前文档的虚拟路径:<!--#echo var="DOCUMENT_URI" -->
QUERY_STRING_UNESCAPED:显示未经转义处理的由客户端发送的查询字串,其中所有的特殊字符前面都有转义符"\"。例如:<!--#echo var="QUERY_STRING_UNESCAPED" -->
<!--#config timefmt="%Y-%m-%d %a %H:%M:%S"-->
现在时间:<!--#echo var="DATE_LOCAL"--> <br>
Echo 命令:
SERVER_SOFTWARE:显示服务器软件的名称和版本。例如:
<!--#echo var="SERVER_SOFTWARE" --><br>
SERVER_NAME: 显示服务器的主机名称,DNS别名或IP地址。例如:
<!--#echo var="SERVER_NAME" --><br>
SERVER_PROTOCOL:显示客户端请求所使用的协议名称和版本,如HTTP/1.0。例如:
<!--#echo var="SERVER_PROTOCOL" --><br>
SERVER_PORT:显示服务器的响应端口。例如:
<!--#echo var="SERVER_PORT" --><br>
REQUEST_METHOD:显示客户端的文档请求方法,包括GET, HEAD, 和POST。例如:
<!--#echo var="REQUEST_METHOD" --><br>
REMOTE_HOST:显示发出请求信息的客户端主机名称。
<!--#echo var="REMOTE_HOST" --><br>
REMOTE_ADDR:显示发出请求信息的客户端IP地址。
<!--#echo var="REMOTE_ADDR" --><br>
AUTH_TYPE:显示用户身份的验证方法。
<!--#echo var="AUTH_TYPE" --><br>
REMOTE_USER:显示访问受保护页面的用户所使用的帐号名称。
<!--#echo var="REMOTE_USER" -->
#set指令
作用:可给变量赋值,以用于后面的if语句。
语法:
<!--#set var="变量名" value="变量值"-->
示例:
<!--#set var=“varname" value=“liming"-->
#if指令
作用:创建可以改变数据的页面,这些数据根据使用if语句时计算的要求予以显示。
语法:
<!--#if expr="$变量名=\"变量值A\""-->
显示内容
<!--#elif expr="$变量名=\"变量值B\""-->
显示内容
<!--#else-->
显示内容
<!--#endif"-->
示例:
<!--#set var="varname" value="b"-->
<!--#if expr="$varname=\"a\""-->
A。
<!--#elif expr="$varname=\"b\"" -->
B。
<!--#else-->
other
<!--#endif"-->
注意:用于前面指令中的反斜杠,是用来代换内部的引号,以便它们不会被解释为结束表达式。不可省略。
2009-10-27 14:16:48 阅读932 评论0 272009/10 Oct27
日期:10月26日
讲师:黎活明
我们学习了页面静态化技术——Velocity,但对于网站的性能优化而言,这是不够的。大规模web应用优化一定是多方面的,除了我们已经做过的sql优化和页面优化以外,缓存对于web性能的提升非常显著。系统在面对那些需要动态输出但数据变更非常少的资源时使用缓存就会大大的减轻服务器的负荷。我在之前的日志中也多次提到缓存技术在web2.0时代的巨大功用。
在java世界中,最出名缓存解决方案的恐怕就是OsCache了。OSCache标记库由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能。 OSCache是个一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何Java应用程序的普通的缓存解决方案。
OSCache有以下特点:
1. 缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。
2. 拥有全面的API--OSCache API给你全面的程序来控制所有的OSCache特性。
3. 永久缓存--缓存能随意的写入硬盘,因此允许昂贵的创建(expensive-to-create)数据来保持缓存,甚至能让应用重启。
4. 支持集群--集群缓存数据能被单个的进行参数配置,不需要修改代码。缓存记录的过期--你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(如果默认性能不需要时)。
----------------------------------------------
下载地址:http://www.opensymphony.com/oscache/
使用OsCache所必须的jar包:
oscache.jar
\lib\commons-logging.jar
配置方法:
1. 把上述两个jar文件放置在WEB-INF/lib目录下。
2. 把oscache安装目录下的/etc/oscache.properties 文件放入 /WEB-INF/classes目录.开发阶段,我们可以把该文件放置在src目录。
OsCache作页面局部缓存:
我们使用Oscache的标签<oscache></oscache>来进行页面的局部缓存.使用方法如下:
<%@taglib uri="http://www.opensymphony.com/oscache" prefix=“oscache"%>
<oscache:cache>
<%=new Date() %>
</oscache:cache>
缓存的key将以请求的URI+查询字串组成,如果你访问/oscache/index.jsp?name=ttt和/oscache/index.jsp?name=ppp将得到两份缓存。缓存默认存放在application范围,缓存时间默认为3600秒,即1小时.
<oscache:cache key=“name”>
name=${param.name}
</oscache:cache>
这时候缓存将以name为key,不再是请求的URI+查询字串组成,所以如果你访问/oscache/index.jsp?name=ttt和/oscache/index.jsp?name=ppp将得到一份缓存。
<oscache:cache key="name" scope="session">
name=${param.name}
</oscache:cache>
缓存范围设置为session,这时候缓存保存在用户的session中,如果用户的把浏览器关闭,再重新打开一个新浏览器,原来缓存的内容将不存在。
<oscache:cache key="name" time="10">
name=${param.name}
</oscache:cache>
上面设置了缓存的时间为10秒,超过10秒后,缓存的内容将失掉。
<oscache:cache key="name" time="60" refresh="${param.refresh}">
name=${param.name}
</oscache:cache>
refresh为true将会导致缓存的内容过期而被清除,简单地说,该属性为true用于清除缓存。
人为管理缓存<flush />标签:
<oscache:flush scope="application" />
清除application范围内的所有缓存
<oscache:flush scope="session" key="foobar" />
清除session范围内的key为foobar的缓存。
<oscache:flush scope="application" group="currencyData" />
清除application范围内组名为currencyData内的所有缓存。
--------------------------------------------------
使用OsCache作页面全局缓存:
页面全局缓存将使用Filter实现(巴巴运动网产品列表显示采用的方案):
<filter>
<filter-name>CacheFilter</filter-name>
<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
<init-param>
<param-name>time</param-name>
<param-value>60</param-value>
</init-param>
<init-param>
<param-name>scope</param-name>
<param-value>application</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
缓存的key将以请求的URI+查询字串组成,如果你访问/oscache/index.jsp?name=ttt和/oscache/index.jsp?name=ppp将得到两份缓存。缓存是在初次访问页面时进行的,后续的请求将会返回缓存中的内容。缓存中存放的内容为页面返回给用户的html源代码。
OsCache配置属性:
cache.memory=true
指定是否使用内存缓存,默认值为true,即使用内存缓存。
cache.capacity
指定缓存的容量,默认的容量是无限的。我们可以为它设置缓存数量,如:
cache.capacity=100000
如果我们要使用硬盘缓存,可以这样设置:
cache.memory=false
cache.path=d:\\cache (指定,缓存保存的路径,注意:路径应采用双\符)
cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener
cache.persistence.class用于设置持久化类。
2009-10-27 14:13:33 阅读916 评论0 272009/10 Oct27
日期:10月24日
讲师:黎活明
请查阅巴巴运动网笔记第一篇,页面静态化是为了避免用户每做一次访问程序就必须向数据库向提交一次查询。巴巴运动网作为互联网产品,每天都要面对大量的访问客户,页面静态化就成了我们保证系统性能的一个重要举措。Velocity作为一款成熟的基于java的模板引擎,能够帮我们实现页面静态化。它允许使用模板语言(template language)来引用由java代码定义的对象。最重要的是,它简单易用,乃至于看一眼它的示例就可上手使用。
------------------------------------------
“Velocity将Java代码从Web 页面中分离出来,使用Web站点从长远看更容易维护,并且提供了一种可行的JavaServer Pages替代解决方案。”——Velocity用户手册
Velocity下载地址:http://velocity.apache.org/
在开发中,我们必须导入\lib\log4j-1.2.12.jar和velocity-1.6-dep.jar两个包。如果使用velocity-1.6.jar会稍微麻烦一点,需要把\lib下的commons-collections-3.2.1.jar\commons-lang-2.4.jar和oro-2.0.8.jar放入类路径下。 velocity-1.6-dep.jar文件内部已经包含前面三个jar文件的类。
导入开发包以后,我们需要在类路径中加入velocity.properties文档:
指定日志文件存放位置
runtime.log = E:\\spring\\velocity\\velocity_example.log
指定模版文件加载位置
file.resource.loader.path=E:\\spring\\velocity
指定输入编码格式
input.encoding=UTF-8
指定velocity的servlet向浏览器输出内容的编码
default.contentType=text/html; charset\=UTF-8
指定输出编码格式
output.encoding=UTF-8
接下来是老黎讲的10个例子:
一:
try{
Velocity.init("src/velocity.properties");
VelocityContext context = new VelocityContext();
context.put("hello", "HelloWorld");
context.put("who", "黎明");
Template template = Velocity.getTemplate("mytemplate.vm");
StringWriter sw = new StringWriter();
template.merge(context, sw);
sw.flush();
System.out.println(sw.toString());
}catch( Exception e ){
e.printStackTrace();
}
mytemplate.vm内容如下:
${who}说:${hello}
二:访问对象
try{
Velocity.init("src/velocity.properties");
VelocityContext context = new VelocityContext();
context.put("person", new Person(2,"小张"));
Template template = Velocity.getTemplate("mytemplate.vm");
StringWriter sw = new StringWriter();
template.merge(context, sw);
sw.flush();
System.out.println(sw.toString());
}catch( Exception e ){
e.printStackTrace();
}
mytemplate.vm内容如下:
${person.id}=${person.name}
三:历遍集合/数组
try{
Velocity.init("src/velocity.properties");
VelocityContext context = new VelocityContext();
context.put("list", Arrays.asList("第一个","第二个","第三个"));
Template template = Velocity.getTemplate("mytemplate.vm");
StringWriter sw = new StringWriter();
template.merge(context, sw);
sw.flush();
System.out.println(sw.toString());
}catch( Exception e ){
e.printStackTrace();
}
mytemplate.vm内容如下:
#foreach($element in $list)
$element
#end
四:历遍Map集合
try{
Velocity.init("src/velocity.properties");
VelocityContext context = new VelocityContext();
Map<String,String> map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");
context.put("map", map);
Template template = Velocity.getTemplate("mytemplate.vm");
StringWriter sw = new StringWriter();
template.merge(context, sw);
sw.flush();
System.out.println(sw.toString());
}catch( Exception e ){
e.printStackTrace();
}
mytemplate.vm内容如下:
#foreach( $key in $map.keySet() )
$key=$map.get($key)
#end
五:获得当前迭代的索引
try{
Velocity.init("src/velocity.properties");
VelocityContext context = new VelocityContext();
Map<String,String> map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");
context.put("map", map);
Template template = Velocity.getTemplate("mytemplate.vm");
StringWriter sw = new StringWriter();
template.merge(context, sw);
sw.flush();
System.out.println(sw.toString());
}catch( Exception e ){
e.printStackTrace();
}
mytemplate.vm内容如下:
#foreach( $key in $map.keySet() )
$velocityCount > $key=$map.get($key)
#end
velocityCount 变量名可以通过directive.foreach.counter.name属性修改,如: directive.foreach.counter.name =index,以后可以通过$index进行访问。迭代的索引默认从1开始,我们可以通过directive.foreach.counter.initial.value=0进行修改。
六:在模版中进行赋值
#set( $name = "老张" )
$name
#set( $condition = true )
数组赋值:
#set( $ints = [1..10])
#foreach( $entry in $ints)
$entry
#end
#set( $ints = ["第一个","第二个"])
#foreach( $entry in $ints)
$entry
#end
七:#if#else#end
try{
Velocity.init("src/velocity.properties");
VelocityContext context = new VelocityContext();
context.put("condition", true);
Template template = Velocity.getTemplate("mytemplate.vm");
StringWriter sw = new StringWriter();
template.merge(context, sw);
sw.flush();
System.out.println(sw.toString());
}catch( Exception e ){
e.printStackTrace();
}
mytemplate.vm内容如下:
#if($condition)
成立
#else
不成立
#end
八:格式化日期
格式化日期必须将velocity-tools-generic-1.4.jar包加入到类路径。
try{
Velocity.init("src/velocity.properties");
VelocityContext context = new VelocityContext();
context.put("now", new Date());
context.put("dateformat", new DateTool());
Template template = Velocity.getTemplate("mytemplate.vm");
StringWriter sw = new StringWriter();
template.merge(context, sw);
sw.flush();
System.out.println(sw.toString());
}catch( Exception e ){
e.printStackTrace();
}
mytemplate.vm内容如下:
$dateformat.format("yyyy-MM-dd", $now)
九:输出到文件
try{
Velocity.init("src/velocity.properties");
VelocityContext context = new VelocityContext();
context.put("title", "巴巴运行网");
context.put("body", "这是内容");
Template template = Velocity.getTemplate("mytemplate.vm");
File savefile = new File("E:\\spring\\velocity\\WebRoot\\page\\test.html");
if(!savefile.getParentFile().exists()) savefile.getParentFile().mkdirs();
FileOutputStream outstream = new FileOutputStream(savefile);
OutputStreamWriter writer = new OutputStreamWriter(outstream,"UTF-8");
BufferedWriter bufferWriter = new BufferedWriter(writer);
template.merge(context, bufferWriter);
bufferWriter.flush();
outstream.close();
bufferWriter.close();
}catch( Exception e ){
e.printStackTrace();
}
十:null处理
try{
Velocity.init("src/velocity.properties");
VelocityContext context = new VelocityContext();
context.put("title", null);
Template template = Velocity.getTemplate("mytemplate.vm");
StringWriter writer = new StringWriter();
BufferedWriter bufferWriter = new BufferedWriter(writer);
template.merge(context, bufferWriter);
bufferWriter.flush();
System.out.println(writer.toString());
}catch( Exception e ){
e.printStackTrace();
}
mytemplate.vm内容如下:
$title