import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import junit.framework.TestCase;
public class FreemarkerTest extends TestCase {
private String dir = "E:/.../OA/TestTotal/src/com/bjsxt/oa/freemarker";
public void testFreemarker() {
Configuration cfg = new Configuration();
try {
// 从哪里加载模板文件
cfg.setDirectoryForTemplateLoading(new File(dir));
// 定义模版的位置,从类路径中,相对于FreemarkerManager所在的路径加载模版
// cfg.setTemplateLoader(new ClassTemplateLoader(FreemarkerManager.class, "templates"))
// 设置对象包装器
cfg.setObjectWrapper(new DefaultObjectWrapper());
// 设置异常处理器
cfg
.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
// 定义数据模型
Map root = new HashMap();
root.put("abc", "世界,你好");
// 通过freemarker解释模板,首先需要获得Template对象
Template template = cfg.getTemplate("test.ftl");
// 定义模板解释完成之后的输出
PrintWriter out = new PrintWriter(new BufferedWriter(
new FileWriter(dir+"/out.txt")));
try {
// 解释模板
template.process(root, out);
} catch (TemplateException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
##表单模板
##@author fsjohnhuang
##@version 1.0
## 引入外部模板文件
#parse('macro.vm')
## 主逻辑
## 生成input表单元素区域的宏
#macro(input $title $id)
#end
## 生成select表单元素区域的宏
#macro(select $title $id $items)
#end
public static void main(String[] args) {
// 初始化模板引擎
Properties props = new Properties();
props.put("file.resource.loader.path", ".\\vm");
VelocityEngine ve = new VelocityEngine(props);
// 配置引擎上下文对象
VelocityContext ctx = new VelocityContext();
ctx.put("action", "./submit");
ArrayList> inputs = new ArrayList>();
HashMap input1 = new HashMap();
input1.put("id", "title");
input1.put("title", "标题:");
inputs.add(input1);
HashMap input2 = new HashMap();
input2.put("id", "brief");
input2.put("title", "摘要:");
inputs.add(input2);
ctx.put("inputs", inputs);
ArrayList> selects = new ArrayList>();
HashMap select1 = new HashMap();
selects.add(select1);
select1.put("id", "sex");
select1.put("title", "性别:");
HashMap kv1 = new HashMap();
kv1.put(0, "男");
kv1.put(1, "女");
select1.put("items", kv1);
HashMap select2 = new HashMap();
selects.add(select2);
select2.put("id", "job");
select2.put("title", "职业:");
HashMap kv2 = new HashMap();
kv2.put(0, "Java工程师");
kv2.put(1, "Net工程师");
select2.put("items", kv2);
ctx.put("selects", selects);
// 加载模板文件
Template t = ve.getTemplate("test.vm");
StringWriter sw = new StringWriter();
// 渲染模板
t.merge(ctx, sw);
System.out.print(sw.toString());
}
User: Zhang Kaitao
*
Date: 13-6-20 下午4:31
*
Version: 1.0
*/
@Service
public class HelloService extends BaseService
@Autowired
@BaseComponent
private HelloRepository helloRepository;
}
非常方便。
除此之外,我们还可以定义如 jsp模板、html模板、配置文件模板等等,消除开发中的重复工作。
但是此种方式的主要缺点就是:一次只能一个文件。比如,我们生成Service时,其实DAO、Contoller等最好也自动生成。 接下来就需要自动代码生成了。
4、自动代码生成
估计很多朋友都使用/开发过代码生成器;其实开发一个简单的代码生成器花不了多长时间,核心指导思想是:变与不变分离:
不变的是结构;
变的是包名、类名及实体数据。
所以根据这个思想可以很容易写一个代码生成器,可以按照如下步骤完成:
1、自动生成一个模块的DAO、Service、Controller;
2、根据数据库自动生成一个模块的Entity、DAO、Service、Controller;
3、自动生成一对一、一对多关系的模块代码;
4、自动生成公司中常用的代码的模块代码,如树;
目前见到的主要有这些类型的自动代码生成。
代码生成的模板文件可以使用纯文本(即纯粹的字符串替换),更高级点的可以使用如velocity这种模板语言,更加强大。
如果有朋友不会写代码生成器,可以先建一个Example的示例代码,接着做复制、粘帖、修改实体名等等完成,估计30秒钟也能出一个基本的模块代码。但是如果交给代码生成器,速度更快。
比如笔者刚开发的新项目,还没时间开发代码生成器,就写一个一些示例,这样如果写新模块就直接复制一份改改即可,尤其树这块节省不少时间,点击showcase前往查看。
代码生成器也不是万能的,如果你做过互联网项目,不像企业应用那样有许多的增删改查,所以这个时候,纯粹生成CRUD的代码生成器没有任何意义。
到此我们介绍完了模板,使用模板能提升不少开发速度,但是模板不是万能的,只有发现有些代码是由:变与不变组成,那我们就可以把不变的做成模板,变的部分通过占位符(即变量)填入。
参考资料:
30 Days with IntelliJ IDEA. Quick Popups
IntelliJ IDEA 12.1.0 Web Help
不变的做成模板,变的部分用变量表示。
是的,这个要自己识别,我们天天在用模板这玩意 ,但是如何识别出现这才是关键。如spring jdbc template就是一个绝好的例子。
说实话,我们今年的项目中我大胆的用了spring jdbctemplate,可惜,被Manager否定了,说着东西有诸多弊端,没怎么花时间去研究这东西,真心不知道怎么样...楼主能说说看吗,关于原生的JDBC和spring jdbctemplate到底有什么差别么...
原始的就是写代码多,什么都要自己去写;
1、代码冗余
2、映射部分
给PreparedStatement赋值、取值
ResultSet取值映射到model
3、事务传播麻烦
jdbc template就是来干:
1、消除冗余代码
2、简化映射
3、得到spring事务管理的好处
spring jdbc template 封装的很薄, 其实可以看出个工具, 上手简单、为嘛不用。
所以直接写jdbc 开发效率慢 而且诸如事务传播等都是很麻烦的。
你可以参考
http://jinnianshilongnian.iteye.com/blog/1685963
你们现在架构是什么样的
架构,呵呵,谈什么架构哦,以前印度人写的框架给拿过来,算是在此版本上重新开放,基本就是Struts2, Spring(用的很少,基本是我来之后我用的多些), ORM没用框架,基本是自己手写的原生jdbc,经常能看到静态代码监测不通过的,看到数据库连接,resultSet,PreparedStatement未释放的,我当时就像用spring的模板方法肯定剩下很多时间,而且很方便就搞定了,
可以不用spring/hibernate等框架 但是得借用相关的思想; 所以你说的那些根本没 “不重复自己”。楼主可以写一套重构 给经理看: 节省了代码就节省了开发时间;代码少了 bug自然就会少
jdbc template就是来干:
1、消除冗余代码
2、简化映射
3、得到spring事务管理的好处
所以直接写jdbc 开发效率慢 而且诸如事务传播等都是很麻烦的。
是少了个On frame deactivation 这个设置
我现在都是maven+jetty运行,还真没有这么用过,刚查了下
http://stackoverflow.com/questions/9117844/publish-changes-to-server-from-intellij-idea-11
意思就是当idea窗口失去焦点焦点时 更新
哦 我刚才在Build Artifacts 添加上项目artifacts的就出现窗口和hot swap classes选项了
和现在我还不知道这个Artifacts 是干什么的?? 现在每次更新都需要按下反人类的快捷键CTRL+SHIFT+F9更新 如果有跟ECLIPSE的保存自动更新就方便了 目前没找到
Artifacts 就是制品,可以理解为打包好的产品;比如打成war包 / 直接的web项目目录 / jar包
不过按你说的On frame deactivation,配置这个应该是可以的; 如果maven内嵌 我现在也是CTRL+SHIFT+F9更新
哦 我刚才在Build Artifacts 添加上项目artifacts的就出现窗口和hot swap classes选项了
和现在我还不知道这个Artifacts 是干什么的?? 现在每次更新都需要按下反人类的快捷键CTRL+SHIFT+F9更新 如果有跟ECLIPSE的保存自动更新就方便了 目前没找到
如果是非debug模式下
http://jinnianshilongnian.iteye.com/blog/1887788
如在执行tomcat/jetty时的VM参数中指定如上配置即可。无需在debug模式下执行。如果使用的是如idea可以按Ctrl+Shift+F9编译当前类/Ctrl+F9编译所有更改的类。
我之前调试成功过一次 就是在TOMCAT 设置那有2个On 'Update' action xx 的选项
都选择hotswap class 然后在每次修改代码后在Deployment选项卡点Deploy All就完成你说的热替换效果 但是现在不知道为什么现在On 'Update' action只有1个地方设置 选项里面也只有Restart server选项 咋也变不回去了
如在执行tomcat/jetty时的VM参数中指定如上配置即可。无需在debug模式下执行。如果使用的是如idea可以按Ctrl+Shift+F9编译当前类/Ctrl+F9编译所有更改的类。
所以你可以参考这篇 直接上字节码热替换
我09年接触过,那时候也是抵触,直到最近一年 尤其maven集成这块 eclipse比较弱,使用idea真心方便不少。
========
eclipse开发velocity实例
开发环境
Eclipse Java EE IDE for Web Developers.(Version: Helios Service Release 1)
jdk1.6.0_07
apache-tomcat-6.0.10
首先需要为eclipse安装velocity编辑插件:
在Eclipse的Help->Install New Software...
点击“Add加 Veloeclipse,值:http://veloeclipse.googlecode.com/svn/trunk/update/
备注:如果无法安装,在安装插件的界面中把 Group Items by Catagory 前打钩去掉
创建项目
打开eclipse,File -> New -> Other... -> Web -> Dynamic Web Projec 之后按照提示一路next;
注意1:修改代码文件输出路径,默认是build\classes;这个不符合tomcat的要求,需要改成WebContent\WEB-INF\classes 如下:
注意2:勾选 Generate web.xml deployment descriptor
添加velocity依赖包
velocity相关的包有十多个,下载解压后复制全部,粘贴到项目WebContent -> WEB-INF ->lib文件夹中
项目名右键菜单选择build path -> configure build path ->java build path ->libraries -> add jars 选择项目lib文件夹,选择全部jar最后点确认按钮
备注:velocity所需的jar包下载地址 http://download.csdn.net/detail/smilevt/4802244
添加velocity模板文件
在WebContent下添加一个文件夹,我起名叫templates。在该文件下添加一个hello.vm文件,里面内容如下:
Hello My First Velocity
name list
#foreach ($name in $theList)
$name
#end
添加java类文件
在Java Resource -> src下新建一个包,包名com.velocitydemo.velocityhandler,名称随意,后面配置文件里要用到,前后需要一致
在该包下添加一个类,类名HelloHandler,名称随意,道理同上
类的代码如下:
package com.velocitydemo.velocityhandler;
import java.util.Properties;
import java.util.Vector;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.context.Context;
import org.apache.velocity.tools.view.VelocityViewServlet;
public class HelloHandler extends VelocityViewServlet {
private static final long serialVersionUID = 1L;
private VelocityEngine velo;
public void init() throws ServletException {
velo = new VelocityEngine();// velocity引擎对象
Properties prop = new Properties();// 设置vm模板的装载路径
String path = this.getServletContext().getRealPath("/");
prop.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path + "templates/");
try {
velo.init(prop);// 初始化设置,下面用到getTemplate("*.vm")输出时;一定要调用velo对象去做,即velo.getTemplate("*.vm")
} catch (Exception e1) {
e1.printStackTrace();
}
}
protected Template handleRequest(HttpServletRequest request, HttpServletResponse response, Context ctx) {
String p1 = "Charles";
String p2 = "Michael";
Vector personList = new Vector();
personList.addElement(p1);
personList.addElement(p2);
ctx.put("theList", personList); // 将模板数据 list放置到上下文环境context中
Template template = velo.getTemplate("hello.vm");
return template;
}
}
配置web.xml
打开WEB-INF下的web.xml文件,内容如下:
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
至此一个最简单的velocity项目创建完毕
注意:WEB-INF下的classes文件夹并不显示在项目结构图中
发布项目
到这里可以把项目文件夹中的WebContent发布到Tomcat中进行测试了
发布的方式参考地址(http://blog.csdn.net/smilevt/article/details/8212075)
启动tomcat访问一个最简单的velocity项目
========