精华内容
下载资源
问答
  • 我要在前台页面展示的数据是后台java对象中一个引用类型属性中的普通属性:如要展示order对象下的orderConsumer下的orderID,该怎么写呢?
  • java-velocity的用法

    千次阅读 2017-10-16 20:37:26
    转自:http://www.busfly.net/csdn/post/java-velocity.html  这是一篇JAVA的基础文章,大家耐心点看完的话肯定会有收获的,中国自学编程网 [www.zxbc.cn] 整体提供 变量 (1)变量的定义: #set($name = \"hello...
    转自:http://www.busfly.net/csdn/post/java-velocity.html

     

    这是一篇JAVA的基础文章,大家耐心点看完的话肯定会有收获的,中国自学编程网 [www.zxbc.cn] 整体提供

    变量
    (1)变量的定义:
    #set($name = \"hello\")      说明:velocity中变量是弱类型的。
    当使用#set 指令时,括在双引号中的字面字符串将解析和重新解释,如下所示:
    #set($directoryRoot = \"www\" )
    #set($templateName = \"index.vm\" )
    #set($template = \"$directoryRoot/$templateName\" )
    $template
    输出将会是:www/index.vm
    注:在velocity中使用$2.5这样的货币标识是没有问题得的,因为velocity中的变量总是以一个大写或者小写的字母开始的。
    (2)变量规范的写法
    ${name} ,也可以写成:$name。提倡用前面的写法。
    例如:你希望通过一个变量$vice来动态的组织一个字符串。
     Jack is a $vicemaniac.
    本来变量是$vice现在却变成了$vicemaniac,这样Veloctiy就不知道您到底要什么了。所以,应该使用规范的格式书写 : Jack is a ${vice}maniac
    现在Velocity知道变量是$vice而不是$vicemaniac。
    注意:当引用属性的时候不能加{}
    (3)变量的赋值:  
    $name=\"hello\"
    赋值的左边必须是一个变量或者是属性引用。右边可以是下面六种类型之一: 
    变量引用,字面字符串,属性引用,方法引用,字面数字,数组列表。
    下面的例子演示了上述的每种类型:
    #set( $monkey = $bill ) ## variable reference
    #set( $monkey.Friend = \"monica\" ) ## string 
    #set( $monkey.Blame = $whitehouse.Leak ) ## property reference
    #set( $monkey.Plan = $spindoctor.weave($web) ) ## method reference
    #set( $monkey.Number = 123 ) ##number 
    #set( $monkey.Say = [\"Not\", $my, \"fault\"] ) ## ArrayList
    注意:①如果上述例子中的右值是null, 则左值不会被赋值,也就是说会保留以前的值。
    ②velocity模板中未被定义的变量将被认为是一个字符串。例如:
    #set($foo = \"gibbous\") 
    $moon = $foo
    输出结果为:
    $moon = gibbous
    ③velocity模板中不会将reference解释为对象的实例变量。例如:$foo.Name将被解释为Foo对象的getName()方法,而不是Foo对象的Name实例变量。例如:
    $foo.getBar()  等同于$foo.Bar ;
    $data.getUser(\"jon\") 等同于$data.User(\"jon\") ;
    data.getRequest().getServerName() 等同于
    $data.Request.ServerName等同于${data.Request.ServerName}
     
    2.     循环
    #foreach ($element in $list)
         This is $element.
         $velocityCount  [Page]
    #end
    例子:
    #set( $list = [\"pine\", \"oak\", \"maple\"])
    #foreach ($element in $list)
    $velocityCount
    This is $element.<br>
    #end
    输出的结果为:
    1 This is pine. 
    2 This is oak. 
    3 This is maple.
    每次循环$list中的一个值都会赋给$element变量。
    $list可以是一个Vector、Hashtable或者Array。分配给$element的值是一个java对象,并且可以通过变量被引用。例如:如果$element t是一个java的Product类,并且这个产品的名字可以通过调用他的getName()方法得到。
    #foreach ( $key in $list.keySet())
    Key: $key -> Value: $list.get($key) <br>
    #end
    提示:velocity中大小写敏感。
    Velocity还特别提供了得到循环次数的方法,$velocityCount变量的名字是Velocity默认的名字。
     
    例子:
    First example:
      #foreach ( $foo in [1..5] )
        $foo
      #end
      Second example:
      #foreach ( $bar in [2..-2] )
        $bar
      #end
      Third example:
      #set ( $arr = [0..1] )
      #foreach ( $i in $arr )
        $i
      #end
    上面三个例子的输出结果为:
      First example:
      1 2 3 4 5
      Second example:
      2 1 0 -1 -2
      Third example:
      0 1
    3.     条件语句
    #if (condition) 
    #elseif (condition) 
    #else 
    #end
    4.     语句的嵌套
        #foreach ($element in $list) 
           ## inner foreach 内循环 
           #foreach ($element in $list) 
           This is $element. $velocityCount <br>inner<br>
           #end 
           ## inner foreach 内循环结束 

        ## outer foreach 
        This is $element. 
        $velocityCount <br>outer<br>
        #end
    语句中也可以嵌套其他的语句,如#if…#else…#end等。
    5.      注释 [Page]
    (1)单行注释:
      ## This is a single line comment.
    (2)多行注释:
      #*
       Thus begins a multi-line comment. Online visitors won’t
       see this text because the Velocity Templating Engine will
      ignore it.
      *#
    (3)文档格式:
      #**
       This is a VTL comment block and
       may be used to store such information
      as the document author and versioning
       information:
       @version 1.1
       @author  xiao
         *#
    6.     关系和逻辑操作符
    Velocity 也具有逻辑AND, OR 和 NOT 操作符。 

    ## example for AND
    #if($foo && $bar)
       <strong> This AND that</strong>
    #end
    例子中#if() 指令仅在$foo 和$bar 斗为真的时候才为真。如果$foo 为假,则表达式也为假;并且 $bar 将不被求值。如果 $foo 为真,Velocity 模板引擎将继续检查$bar的值,如果 $bar 为真,则整个表达式为真。并且输出This AND that 。如果 $bar 为假,将没有输出因为整个表达式为假。
    7.Velocity 中的宏
    Velocity中的宏我们可以理解为函数。
    ①宏的定义
    #macro(宏的名称 $参数1 $参数2 …)
       语句体(即函数体)
    #end
    ②宏的调用
    #宏的名称($参数1 $参数2 …)
        说明:参数之间用空格隔开。
    8.#stop
       停止执行模板引擎并返回,把它应用于debug是很有帮助的。
    9.#include与#parse
    #include和#parse的作用都是引入本地文件, 为了安全的原因,被引入的本地文件只能在TEMPLATE_ROOT目录下。
    区别:
    (1) 与#include不同的是,#parse只能指定单个对象。而#include可以有多个
    如果您需要引入多个文件,可以用逗号分隔就行:
    #include (\"one.gif\", \"two.txt\", \"three.htm\" )
    在括号内可以是文件名,但是更多的时候是使用变量的:
    #include ( “greetings.txt”, $seasonalstock )
    (2) #include被引入文件的内容将不会通过模板引擎解析; 
    而#parse引入的文件内容Velocity将解析其中的velocity语法并移交给模板,意思就是说相当与把引入的文件copy到文件中。
    #parse是可以递归调用的,例如:如果dofoo.vm包含如下行:
    Count down.<br>
    #set ($count = 8)
    #parse (\"parsefoo.vm\") [Page]
    <br>All done with dofoo.vm!
    那么在parsefoo.vm模板中,你可以包含如下VTL:
    $count
    #set($count = $count - 1)
    #if ( $count > 0 )<br>
    #parse( \"parsefoo.vm\" )
    #else
    <br>All done with parsefoo.vm!
    #end的显示结果为:
    Count down.
    8
    7
    6
    5
    4
    3
    2
    1
    0
    All done with parsefoo.vm!
    All done with dofoo.vm!
    注意:在vm中使用#parse来嵌套另外一个vm时的变量共享问题。如:
    ->a.vm 里嵌套 b.vm;
    ->a.vm 里定义了变量 $param;
    ->b.vm 里可以直接使用$param,无任何限制。
    但需要特别注意的是,如果b.vm里同时定义有变量$param,则b.vm里将使用b.vm里定义的值。
    10.转义字符’\\’的使用
    如果reference被定义,两个’\\’意味着输出一个’\\’,如果未被定义,刚按原样输出。如:
    #set($email = \"foo\" )
    $email
    \\$email
    \\\\$email
    \\\\\\$email
    输出:
    foo
    $email
    \\foo
    \\$email
    如果$email 未定义
    $email
    \\$email
    \\\\$email
    \\\\\\$email
    输出:
    $email
    \\$email
    \\\\$email
    \\\\$email
     
    11.内置对象
    Velocity内置了一些对象,在vm模版里可以直接调用,列举如下:
    $request、$response、$session,另外,模板内还可以使用 $msg内的消息工具访问 Struts 的国际化资源,达到简便实现国际化的方法。
    12. 数组访问
    对数组的访问在Velocity中存在问题,因为Velocity只能访问对象的方法,而数组又是一个特殊的Array,所以虽然数组可以进行循环列举,但却不能定位访问特定位置的元素,如 strs[2],数组对固定位置元素的访问调用了Array的反射方法get(Object array, int index),而Velocity没能提供这样的访问,所以数组要么改成List等其他类容器的方式来包装,要么就通过公用Util类的方式来提供,传入数组对象和要访问的位置参数,从而达到返回所需值的目的。
     
     
    示例部分
    1.Hello world的示例代码:
    (1)Velocity模板(hello.html)
    <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">

    <HTML>
    <HEAD>
    <TITLE> New Document </TITLE>
    </HEAD>
    <BODY>
        hello,$name!                 (注意:这里的name与VelocityTest.java中的名称要一致)
    </BODY>
    </HTML>
    (2)将velocity模板的内容转换的类(VelocityTest.java)
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.PrintWriter;
    import java.io.Writer;
    import org.apache.velocity.Template;
    import org.apache.velocity.VelocityContext;
    import org.apache.velocity.app.Velocity;
    import org.apache.velocity.app.VelocityEngine; [Page]
     
    /**
     * Velocity转换
     * @author
     */
    public class VelocityTest
    {
        /**
         * 主函数
         * @param args
         */
        public static void main(String[] args)
     {
          //获取模板引擎
            VelocityEngine ve = new VelocityEngine();
            //模板文件所在的路径
            String path = \"D:/java/jproject/regedit/webroot\";       
            //设置参数
            ve.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path);
    //处理中文问题
            ve.setProperty(Velocity.INPUT_ENCODING,\"GBK\");
            ve.setProperty(Velocity.OUTPUT_ENCODING,\"GBK\");
            try 
            {
                //初始化模板
                ve.init();
                //获取模板(hello.html)
    Velocity模板的名称
                Template template = ve.getTemplate(\"hello.html\");    
                //获取上下文
                VelocityContext root = new VelocityContext();
                //把数据填入上下文
                root.put(\"name\",\"world\");                     (注意:与上面的对应)
    //输出路径
                Strint outpath = \"e:/helloworld.html\";
                //输出
                Writer mywriter = new PrintWriter(new FileOutputStream( [Page]
                    new File(outpath)));            
                template.merge(root, mywriter);
                mywriter.flush();           
            } 
            catch (Exception e) 
            {
                e.printStackTrace();
            }
        }
    }
    (3)环境的搭建
    在lib目录内分别copy进:velocity-1.4.jar,velocity-dept.jar;
    下载地址:http://jakarta.apache.org/velocity/
    (4)运行后的结果如下:
    <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">
    <HTML>
    <HEAD>
    <TITLE> New Document </TITLE>
    </HEAD>
    <BODY>
    hello,world! 
    </BODY>
    </HTML>
     
    2.Servlet和Velocity结合示例
    (1)example.html
     <html>
      <head><title>Velocity</title></head>
      <body bgcolor=\"#ffffff\">
        <center>
        <h2>Welcom to Velocity!</h2>

        <i>Here’s the list of people</i>
        <table cellspacing=\"0\" cellpadding=\"5\" width=\"20%\" >
        <tr>
        <td bgcolor=\"#eeeeee\" align=\"center\">
        Names:
        </td>
        </tr>
        #foreach ($name in $theList)
        <tr>
        <td bgcolor=\"#eeeeee\" align=\"center\">$name</td>
        </tr>
        #end
        </table>
        </center>
      </body>
    </html>
    (2)servlet
    package com.koal.velocity;
     
    import java.io.IOException;
    import java.io.FileNotFoundException;
    import java.util.ArrayList;
    import java.util.Properties; [Page]
    import java.util.Vector;
    import javax.servlet.ServletConfig;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.velocity.Template;
    import org.apache.velocity.context.Context;
    import org.apache.velocity.servlet.VelocityServlet;
    import org.apache.velocity.app.Velocity;
    import org.apache.velocity.exception.ResourceNotFoundException;
    import org.apache.velocity.exception.ParseErrorException;
     
    public class SampleServlet extends VelocityServlet  
    {
        /**
         *   由VelocityServlet.init()调用,
         *   在此找出模版的路径
         */
        protected Properties loadConfiguration(ServletConfig config )
            throws IOException, FileNotFoundException {
            Properties p = new Properties();
            //取得路径
            String path = config.getServletContext().getRealPath(\"/\");
            if (path == null) 
            {
                System.out.println(\" SampleServlet.loadConfiguration() : unable to \" 
                        + \"get the current webapp root.  Using ’/’. Please fix.\");
                path = \"/\";
            }
            //设置路径
            p.setProperty( Velocity.FILE_RESOURCE_LOADER_PATH, path);
            
            return p;
        }
     
        /**
         *  Velocity主要的商业逻辑处理方法,由VelocityServlet自动调用
         *  @param ctx 模板上下文              [Page]
         *  @return Template 模板信息
         */   
        public Template handleRequest( HttpServletRequest request,
           HttpServletResponse response, Context ctx )
       {        
            //主要在此设置演示用的数据,开发中在此调用相应的业务处理流程,
     
            //并设置返回到页面的数据 
            //待展示的列表数据
            String p1 = \"第一位:LiuDong\";
            String p2 = \"第二位:Liang.xf\";
            Vector personList = new Vector();
            //中文需要转换
            try {
                personList.addElement(new String(p1.getBytes(), \"ISO-8859-1\") );

                personList.addElement(new String(p2.getBytes(), \"ISO-8859-1\") );
            } catch (Exception e) {
                System.out.println(\"数据转换异常:\"+e);    
            }
            //设置数据,供页面模版替换成显示的数据
            ctx.put(\"theList\", personList );   
            //定义模板        
            Template outty = null;        
            try 
            {
                //取模板
                outty =  getTemplate(\"example.html\");            
            }  [Page]
            catch( ParseErrorException pee ) 
            {
                System.out.println(\"SampleServlet: parse error for template \" + pee);
            }
            catch( ResourceNotFoundException rnfe ) 
            {
                System.out.println(\"SampleServlet: template not found \" + rnfe);
            } 
            catch( Exception e )
            {
                System.out.println(\"Error \" + e);
            }
            
            return outty;
    }
     
    (3)在web.xml中的配置:
    <web-app>
    <servlet>  
           <servlet-name>SampleServlet</servlet-name>
           <servlet-class>com.koal.velocity.SampleServlet</servlet-class>
    </servlet>
        <servlet-mapping>
           <servlet-name>SampleServlet</servlet-name>
           <url-pattern>/SampleServlet</url-pattern>
    </servlet-mapping>
    </web-app>
     
    (4)环境的搭建
    在lib目录内分别copy进:commons-collections.jar,velocity-1.4.jar,velocity-dept.jar;
        Tomcat运行环境正常。
        启动Tomcat,在IE上输入:http://localhost:8080/example,页面显示数据列表:
    Here’s the list of people
    Names: 
    第一位:LiuDong
    第二位:Liang.xf


     

    #if语法:

    #if ($foo < 10)
    Go North
    #elseif ($foo == 10)
    Go East
    #else
    Go West
    #end

     

    展开全文
  • 基于javaVelocity模板匹配引擎

    千次阅读 2013-10-08 11:21:26
    它允许任何人仅仅简单的使用模板语言来引用由java代码定义的对象。 主要应用在:  1.Web应用的开发。  2.作为模板产生SQL,XML或代码等。  3.作为其他系统的集成组件使用。 当Velocity应用于...

    Velocity是一个基于java的模板引擎(模板引擎的作用就是取得数据并加以处理,最后显示出数据)。
    它允许任何人仅仅简单的使用模板语言来引用由java代码定义的对象。

    主要应用在:
     1.Web应用的开发。
     2.作为模板产生SQL,XML或代码等。
     3.作为其他系统的集成组件使用。

    当Velocity应用于application program或 a servlet,主要工作流程如下:
     1.初始化Velocity.
     2.创建Context对象
     3.添加数据到Context
     4.选择模板
     5.合并模板和数据产生输出页面

    准备工作:导入相关依赖包,在下面附件中。

    例1:应用程序事例

    1.模板文件hellovelocity.vm文件

    Java代码 复制代码 收藏代码
    1. ##这是一行注释,不会输出
    2. #*这是多行注释,不会输出
    3. 多行注释*#
    4. // ---------- 1.变量赋值输出------------
    5. Welcome $name to Javayou.com!
    6. today is $date.
    7. tdday is $mydae.//未被定义的变量将当成字符串
    8. // -----------2.设置变量值,所有变量都以$开头----------------
    9. #set( $iAmVariable = "good!" )
    10. Welcome $name to Javayou.com!
    11. today is $date.
    12. $iAmVariable
    13. //-------------3.if,else判断--------------------------
    14. #set ($admin = "admin")
    15. #set ($user = "user")
    16. #if ($admin == $user)
    17. Welcome admin!
    18. #else
    19. Welcome user!
    20. #end
    21. //--------------4.迭代数据List---------------------
    22. #foreach( $product in $list )
    23. $product
    24. #end
    25. // ------------5.迭代数据HashSet-----------------
    26. #foreach($key in $hashVariable.keySet() )
    27. $key ‘s value: $ hashVariable.get($key)
    28. #end
    29. //-----------6.迭代数据List Bean($velocityCount为列举序号,默认从1开始,可调整)
    30. #foreach ($s in $listBean)
    31. <$velocityCount> Address: $s.address
    32. #end
    33. //-------------7.模板嵌套---------------------
    34. #foreach ($element in $list)
    35. #foreach ($element in $list)
    36. inner:This is ($velocityCount)- $element.
    37. #end
    38. outer:This is ($velocityCount)- $element.
    39. #end
    40. //-----------8.导入其它文件,多个文件用逗号隔开--------------
    41. #include("com/test2/test.txt")
    ##这是一行注释,不会输出
    #*这是多行注释,不会输出
       多行注释*#
    // ---------- 1.变量赋值输出------------
    Welcome $name to Javayou.com!
    today is $date.
    tdday is $mydae.//未被定义的变量将当成字符串
    
    // -----------2.设置变量值,所有变量都以$开头----------------
    #set( $iAmVariable = "good!" )
    Welcome $name to Javayou.com!
    today is $date.
    $iAmVariable
    
    //-------------3.if,else判断--------------------------
    #set ($admin = "admin")
    #set ($user = "user")
    #if ($admin == $user)
    Welcome admin!
    #else
    Welcome user!
    #end
    
    //--------------4.迭代数据List---------------------
    #foreach( $product in $list )
    $product
    #end
    
    // ------------5.迭代数据HashSet-----------------
    #foreach($key in $hashVariable.keySet() )  
    $key ‘s value: $ hashVariable.get($key)
    #end
    
    //-----------6.迭代数据List Bean($velocityCount为列举序号,默认从1开始,可调整)
    #foreach ($s in $listBean)
    <$velocityCount> Address: $s.address
    #end
    
    //-------------7.模板嵌套---------------------
    #foreach ($element in $list)
    	#foreach ($element in $list)
    	inner:This is ($velocityCount)- $element.
    	#end
    outer:This is ($velocityCount)- $element.
    #end
    
    //-----------8.导入其它文件,多个文件用逗号隔开--------------
    #include("com/test2/test.txt")

    2.其它非模板文件text.txt

    Java代码 复制代码 收藏代码
    1. ======text.txt====================
    2. this is test's content.yeah.
       ======text.txt====================
       this is test's content.yeah.

    3.客户端应用测试代码:

    Java代码 复制代码 收藏代码
    1. package com.test2;
    2. import java.io.FileOutputStream;
    3. import java.io.StringWriter;
    4. import java.util.*;
    5. import org.apache.velocity.app.Velocity;
    6. import org.apache.velocity.app.VelocityEngine;
    7. import org.apache.velocity.Template;
    8. import org.apache.velocity.VelocityContext;
    9. public class HelloVelocity {
    10. public static void main(String[] args) throws Exception {
    11. // 初始化并取得Velocity引擎
    12. VelocityEngine ve = new VelocityEngine();
    13. // 取得velocity的模版
    14. Properties p =new Properties();
    15. p.put(Velocity.FILE_RESOURCE_LOADER_PATH, "D:/myspace/VelocityTest/src");
    16. ve.init(p);
    17. //取得velocity的模版
    18. Template t = ve.getTemplate("com/test2/hellovelocity.vm","utf-8");
    19. // 取得velocity的上下文context
    20. VelocityContext context = new VelocityContext();
    21. // 把数据填入上下文
    22. context.put("name", "Liang");
    23. context.put("date", (new Date()).toString());
    24. // 为后面的展示,提前输入List数值
    25. List temp = new ArrayList();
    26. temp.add("item1");
    27. temp.add("item2");
    28. context.put("list", temp);
    29. List tempBean = new ArrayList();
    30. tempBean.add(new UserInfo("1","张三","福建"));
    31. tempBean.add(new UserInfo("2","李四","湖南"));
    32. context.put("listBean", tempBean);
    33. // 输出流
    34. StringWriter writer = new StringWriter();
    35. // 转换输出
    36. t.merge(context, writer);
    37. // 输出信息
    38. System.out.println(writer.toString());
    39. // 输出到文件
    40. FileOutputStream of = new FileOutputStream("d:/velocity.txt");
    41. of.write(writer.toString().getBytes("GBK"));
    42. of.flush();
    43. of.close();
    44. }
    45. }
    package com.test2;
    import java.io.FileOutputStream;
    import java.io.StringWriter;
    import java.util.*;
    import org.apache.velocity.app.Velocity;
    import org.apache.velocity.app.VelocityEngine;
    import org.apache.velocity.Template;
    import org.apache.velocity.VelocityContext;
    
    public class HelloVelocity {
    
    	public static void main(String[] args) throws Exception {
    
    		// 初始化并取得Velocity引擎
    		VelocityEngine ve = new VelocityEngine();
    
    		// 取得velocity的模版		
    		Properties p =new Properties();
    		p.put(Velocity.FILE_RESOURCE_LOADER_PATH, "D:/myspace/VelocityTest/src");
    		ve.init(p);
    		
    		//取得velocity的模版 
    		Template t = ve.getTemplate("com/test2/hellovelocity.vm","utf-8"); 	
    
    		// 取得velocity的上下文context
    		VelocityContext context = new VelocityContext();
    
    		// 把数据填入上下文
    		context.put("name", "Liang");
    		context.put("date", (new Date()).toString());
    
    		// 为后面的展示,提前输入List数值
    		List temp = new ArrayList();
    		temp.add("item1");
    		temp.add("item2");
    		context.put("list", temp);		
    		List tempBean = new ArrayList();
    		tempBean.add(new UserInfo("1","张三","福建"));
    		tempBean.add(new UserInfo("2","李四","湖南"));
    		context.put("listBean", tempBean);
    
    		// 输出流
    		StringWriter writer = new StringWriter();
    		// 转换输出
    		t.merge(context, writer);
    		// 输出信息
    		System.out.println(writer.toString());
    		
    		// 输出到文件
    		FileOutputStream of = new FileOutputStream("d:/velocity.txt");
                               of.write(writer.toString().getBytes("GBK")); 
                               of.flush();
                               of.close();		
    	}
    }
    

    4.UserInfo实体类

    Java代码 复制代码 收藏代码
    1. package com.test2;
    2. public class UserInfo {
    3. private String userId;
    4. private String userName;
    5. private String address;
    6. public UserInfo(String userId, String userName, String address) {
    7. super();
    8. this.userId = userId;
    9. this.userName = userName;
    10. this.address = address;
    11. }
    12. public String getUserId() {
    13. return userId;
    14. }
    15. public void setUserId(String userId) {
    16. this.userId = userId;
    17. }
    18. public String getUserName() {
    19. return userName;
    20. }
    21. public void setUserName(String userName) {
    22. this.userName = userName;
    23. }
    24. public String getAddress() {
    25. return address;
    26. }
    27. public void setAddress(String address) {
    28. this.address = address;
    29. }
    30. }
    package com.test2;
    
    public class UserInfo {
    	
    	private String userId;
    	private String userName;
    	private String address;	
    	
    	public UserInfo(String userId, String userName, String address) {
    		super();
    		this.userId = userId;
    		this.userName = userName;
    		this.address = address;
    	}
    	public String getUserId() {
    		return userId;
    	}
    	public void setUserId(String userId) {
    		this.userId = userId;
    	}
    	public String getUserName() {
    		return userName;
    	}
    	public void setUserName(String userName) {
    		this.userName = userName;
    	}
    	public String getAddress() {
    		return address;
    	}
    	public void setAddress(String address) {
    		this.address = address;
    	}
    }
    

    例2:Web应用事例

    1.在web-inf目录下建立velocity目录,建立一模板文件velocity.vm。

    Java代码 复制代码 收藏代码
    1. <html>
    2. <title>hello!Lizhiwo_wo!</title>
    3. <body>
    4. #set($foo = "Velocity")
    5. Hello $foo World! 欢迎您~~~~~~~~~~~~
    6. <table>
    7. <tr>
    8. <td>ID</td><td>姓名</td><td>地址</td>
    9. </tr>
    10. #foreach ($s in $listBean)
    11. <tr>
    12. <td>$s.userId</td><td>$s.userName</td><td>$s.address</td>
    13. </tr>
    14. #end
    15. </table>
    16. </body>
    17. </html>
    <html>
    <title>hello!Lizhiwo_wo!</title>
    <body>
    #set($foo = "Velocity")
    Hello $foo World!  欢迎您~~~~~~~~~~~~
    <table>
    	<tr>
    		<td>ID</td><td>姓名</td><td>地址</td>
    	</tr>
    	#foreach ($s in $listBean)	
    		<tr>
    		<td>$s.userId</td><td>$s.userName</td><td>$s.address</td>
    		</tr>
    	#end
    </table>
    </body>
    </html>

    2.在web-inf目录下建立velocity.properties属性文件

    Java代码 复制代码 收藏代码
    1. resource.loader = file
    2. file.resource.loader.path = /WEB-INF/velocity
    3. file.resource.loader.cache = true
    4. file.resource.loader.modificationCheckInterval = 300
    resource.loader = file
    file.resource.loader.path = /WEB-INF/velocity
    file.resource.loader.cache = true
    file.resource.loader.modificationCheckInterval = 300
    

    3.建立Servlet文件VelocityServletTest.java

    Java代码 复制代码 收藏代码
    1. package servlet;
    2. import java.io.IOException;
    3. import java.io.StringWriter;
    4. import java.util.ArrayList;
    5. import java.util.List;
    6. import javax.servlet.ServletConfig;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. import org.apache.commons.collections.ExtendedProperties;
    10. import org.apache.velocity.Template;
    11. import org.apache.velocity.app.Velocity;
    12. import org.apache.velocity.context.Context;
    13. import org.apache.velocity.tools.view.servlet.VelocityViewServlet;
    14. import com.test2.UserInfo;
    15. public class VelocityServletTest extends VelocityViewServlet{
    16. private static final long serialVersionUID = 1L;
    17. //第一步 加载配置文件这个方法会在VelocityServlet的初始化方法init()中被调用
    18. protected ExtendedProperties loadConfiguration(ServletConfig config) throws IOException
    19. {
    20. ExtendedProperties p = super.loadConfiguration(config);
    21. // 获取velocity.properties中配置的velocity模板路径
    22. String velocityLoadPath = p.getString(Velocity.FILE_RESOURCE_LOADER_PATH);
    23. if (velocityLoadPath != null) {
    24. // 获取模板路径的绝对路径
    25. velocityLoadPath = getServletContext().getRealPath(velocityLoadPath);
    26. if (velocityLoadPath != null) {
    27. //重新设置模板路径
    28. System.out.println("vMPath2:"+velocityLoadPath);
    29. p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, velocityLoadPath);
    30. }
    31. }
    32. return p;
    33. }
    34. protected Template handleRequest(HttpServletRequest req,
    35. HttpServletResponse res,
    36. Context context)
    37. throws Exception{
    38. //字符编码
    39. req.setCharacterEncoding("gb2312");
    40. res.setCharacterEncoding("gb2312");
    41. //页面输出
    42. res.setContentType("text/html;charset=" + "gb2312");
    43. List tempBean = new ArrayList();
    44. tempBean.add(new UserInfo("1","张三","福建"));
    45. tempBean.add(new UserInfo("2","李四","湖南"));
    46. context.put("listBean", tempBean);
    47. String templateName = "velocity.vm";
    48. // 测试信息输出
    49. Template t= getTemplate(templateName, "utf-8");
    50. StringWriter writer = new StringWriter();
    51. // 转换输出
    52. t.merge(context, writer);
    53. // 输出信息
    54. System.out.println(writer.toString());
    55. // 获取模板页面展示
    56. return templateName != null ? getTemplate(templateName, "utf-8") : null;
    57. }
    58. }
    package servlet;
    
    import java.io.IOException;
    import java.io.StringWriter;
    import java.util.ArrayList;
    import java.util.List;
    import javax.servlet.ServletConfig;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.commons.collections.ExtendedProperties;
    import org.apache.velocity.Template;
    import org.apache.velocity.app.Velocity;
    import org.apache.velocity.context.Context;
    import org.apache.velocity.tools.view.servlet.VelocityViewServlet;
    
    import com.test2.UserInfo;
    
    	public class VelocityServletTest extends VelocityViewServlet{
    	
    	private static final long serialVersionUID = 1L;	
    	
    	//第一步 加载配置文件这个方法会在VelocityServlet的初始化方法init()中被调用
        protected ExtendedProperties loadConfiguration(ServletConfig config) throws IOException
        {
            ExtendedProperties p = super.loadConfiguration(config);
    
            // 获取velocity.properties中配置的velocity模板路径
            String velocityLoadPath = p.getString(Velocity.FILE_RESOURCE_LOADER_PATH);        
       
            if (velocityLoadPath != null) {
            
            	// 获取模板路径的绝对路径
            	velocityLoadPath = getServletContext().getRealPath(velocityLoadPath);
                if (velocityLoadPath != null) {
                	//重新设置模板路径
                	 System.out.println("vMPath2:"+velocityLoadPath);
                    p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, velocityLoadPath);               
                }
            }
            return p;
        }
    
    	protected Template handleRequest(HttpServletRequest req, 
    									 HttpServletResponse res, 
    									 Context context)
    									 throws Exception{
    		
    		//字符编码
        	req.setCharacterEncoding("gb2312");
            res.setCharacterEncoding("gb2312");
            //页面输出
            res.setContentType("text/html;charset=" + "gb2312");
    		
    		List tempBean = new ArrayList();
    		tempBean.add(new UserInfo("1","张三","福建"));
    		tempBean.add(new UserInfo("2","李四","湖南"));
    		context.put("listBean", tempBean);
    		
    	    String templateName = "velocity.vm";	    
    	    // 测试信息输出
    	    Template t= getTemplate(templateName, "utf-8");	    
    		StringWriter writer = new StringWriter();
    		// 转换输出
    		t.merge(context, writer);
    		// 输出信息
    		System.out.println(writer.toString());	    
    	    // 获取模板页面展示
                return templateName != null ? getTemplate(templateName, "utf-8") : null;		
    	}
    }
    

    4.在web.xml文件中进行配置

    Xml代码 复制代码 收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <web-app version="2.4"
    3. xmlns="http://java.sun.com/xml/ns/j2ee"
    4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    5. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    6. http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    7. <servlet>
    8. <servlet-name>velocityServletTest</servlet-name>
    9. <servlet-class>servlet.VelocityServletTest</servlet-class>
    10. <init-param>
    11. <param-name>org.apache.velocity.properties</param-name>
    12. <param-value>/WEB-INF/velocity.properties</param-value>
    13. </init-param>
    14. <load-on-startup>1</load-on-startup>
    15. </servlet>
    16. <servlet-mapping>
    17. <servlet-name>velocityServletTest</servlet-name>
    18. <url-pattern>/velocityServletTest</url-pattern>
    19. </servlet-mapping>
    20. </web-app>
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" 
    	xmlns="http://java.sun.com/xml/ns/j2ee" 
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    	
    	<servlet>
            <servlet-name>velocityServletTest</servlet-name>
            <servlet-class>servlet.VelocityServletTest</servlet-class>
            <init-param>
                <param-name>org.apache.velocity.properties</param-name>
                <param-value>/WEB-INF/velocity.properties</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>velocityServletTest</servlet-name>
            <url-pattern>/velocityServletTest</url-pattern>
        </servlet-mapping>
    </web-app>
    

    5.将其部署到tomcat下,页面访问
    http://localhost:8080/VelocityTest/velocityServletTest
    输出页面如下:

    Java代码 复制代码 收藏代码
    1. Hello Velocity World! 欢迎您~~~~~~~~~~~~
    2. ID 姓名 地址
    3. 1 张三 福建
    4. 2 李四 湖南
     Hello Velocity World! 欢迎您~~~~~~~~~~~~ 
     ID	姓名	地址
     1	张三	福建
     2	李四	湖南

    展开全文
  • 近日的业务逻辑代码繁重,许多都是一些重复性的工作,索性花了几天时间做了一个可扩展的代码生成器 分分钟完成domain—>ServiceImpl的所有代码,欢迎大家支持鸭 项目地址:Orange ...SysLogLoginDO.java BasicD

    近日的业务逻辑代码繁重,许多都是一些重复性的工作,索性花了几天时间做了一个可扩展的代码生成器
    分分钟完成domain—>ServiceImpl的所有代码,欢迎大家支持鸭
    项目地址:Orange

    Orange

    为CMS系统设计的专属代码生成器,独创关联表跳跃设计,遵循阿里巴巴规范,使您的开发事半功倍!

    项目亮点

    基于Java的代码生成器有很多,本项目有一些我个人的见解

    1. 对不同作用的表有着不同的设计,可以自行选择表的基类,优化表结构,并且为关联表设置独特的跳跃访问方法
    2. 基于配置文件直接启动,虽然不同那些图形界面操作简单,但更易于扩展与设计,对有有Java基础的用户也是很简单的
    3. 对mybatis的设计上也遵循Java的 封装,继承,多态思想
    4. 模块化的设计,使二次开发更易于扩展,毕竟每个人的的代码规范都是略有差异

    使用教程

    配置与启动

    配置环境

    • jdk 1.8
    • maven3

    这里我们拿一张MySQL的数据表来讲解使用方法:

    我们要来设计这张表的 domain,dao,mapper.xml,service层的代码,首先观察表格不难发现,它是由五张数据表和三张关联表组成的。并且有四张表格都有七个公共字段,分别为 id ,is_use,order_num,create_by,create_time,update_by,update_time,remark,而sys_log_login这张没有公共字段, 显然在生成代码的时候需要考虑这些情况。

    下载代码,打开 src\main\resources\orange.properties

    # 作者
    author=swing
    #生成文件的输出路径
    exportUrl=D:\\code\\java\\Orange
    # 默认生成包路径
    basicPackage=com.swing.sky.web.generator.result
    #阿里巴巴规范下的公共字段(这里使用的是字段对应的Java属性)
    basicColumns=id,use,orderNum,createBy,createTime,updateBy,updateTime,remark
    
    #数据库名
    schemaName=sky_new
    #数据表使用 table_数字 的格式命名(此名要与数据库中的名字完全一致)
    table_2=sys_user
    table_3=sys_role
    table_4=sys_dept
    table_5=sys_menu
    table_1=sys_log_login
    # on开启公共字段提取,off反之,默认为on(这里表示sys_log_login这个表没有公共字段)
    table_1.basic.enable=off
    #关联表
    link_table_1=sys_user,sys_user_role,sys_role
    link_table_2=sys_role,sys_role_dept,sys_dept
    link_table_3=sys_role,sys_role_menu,sys_menu
    

    我将每一个配置所表示的含义已标注

    确认配置完成后,只需要运行src\main\java\com\swing\sky\web\generator\Gen.java的主方法即可生成,关于生成文件的预览,请参考 生成代码说明(参考)

    关联表的跳跃查询设计

    先来看一个问题,假设所有的关联都是一对多的关系,那么依据上表,我想获取某个用户的所有菜单集合,那该怎么做呢?

    通过关联表很容易做到这一点,如图:

    我们只需要通过 user_id 获取所有的 role_id 然后使用每一个 role_id 去获取其 menu 集合,然后将所有的 menu 累加,然后去重即可

    思路很清晰,代码实现也很简单,但如果像这样的业务需求十分庞大,那么代码量就很不可观了,于是我设计了这种跳跃查询的方法,使用一行代码即可完成任意复杂关系链的调用,其核心设计是为关联增加一些强大且通用的功能,一个关联表有如下方:(说明:假设一个关联表的命名为 user_role 那么前者(表user)被称为 one,后者(role表)被称为 two)

    而要完成上面的提到的功能,只需要如下代码即可:(这些方法都会默认生成)

    Long userId = 1L;
    List<SysMenuDO> menus = roleMenuLinkDAO.listTwoByOneIds(userRoleLinkDAO.listTwoIdsByOneId(userId));
    

    So easy !

    生成代码说明(参考)

    本项目目前支持生成十六种类型的文件,由于它的可扩展性,后期会更多,也欢迎您的贡献

    依据上面和表结构的配置,生成的文件如下(相同的类型的表只做一个说明)

    BasicDO.java

    package com.swing.sky.web.generator.result.domain;
    import java.util.Date;
    import java.util.Objects;
    
    /**
     * xxxDO 数据对象的共有字段
     *
     * @author swing
     */
    public class BasicDO {
        protected static final long serialVersionUID = 1L;
        /**
         * 主键id,自增字段
         */
        protected Long id;
        /**
         * 是否使用(1 使用,0 停用)
         */
        protected Boolean use;
    
        /**
         * 显示顺序
         */
        protected Integer orderNum;
    
        /**
         * 创建者
         */
        protected String createBy;
    
        /**
         * 创建时间
         */
        protected Date createTime;
    
        /**
         * 更新者
         */
        protected String updateBy;
    
        /**
         * 更新时间
         */
        protected Date updateTime;
    
        /**
         * 备注
         */
        protected String remark;
    
        public BasicDO(Boolean use, Integer orderNum, String createBy, Date createTime, String updateBy, Date updateTime, String remark) {
            this.use = use;
            this.orderNum = orderNum;
            this.createBy = createBy;
            this.createTime = createTime;
            this.updateBy = updateBy;
            this.updateTime = updateTime;
            this.remark = remark;
        }
        public BasicDO() {
        }
        public Boolean getUse() {
            return use;
        }
        @Override
        public boolean equals(Object o) {
           //方法体略
        }
        @Override
        public int hashCode() {
            return Objects.hash(id, use, orderNum, createBy, createTime, updateBy, updateTime, remark);
        }
        @Override
        public String toString() {
            //方法体略
        }
    }
    
    

    SysUserDO.java

    package com.swing.sky.web.generator.result.domain;
    import com.swing.sky.web.generator.result.domain.BasicDO;
    import java.io.Serializable;
    import java.util.Date;
    /**
     * 用户信息表:对象 sys_user
     *
     * @author swing
     */
    public class SysUserDO extends BasicDO implements Serializable{
        private static final long serialVersionUID=1L;
        /**
         * 部门id
         */
        private Long deptId;
        /**
         * 用户账号
         */
        private String username;
        /**
         * 密码
         */
        private String password;
        /**
         * 用户昵称
         */
        private String nickName;
        /**
         * 用户邮箱
         */
        private String email;
        /**
         * 手机号码
         */
        private String phone;
        /**
         * 用户性别(M男 W女 N未知)
         */
        private String gender;
        /**
         * 头像地址
         */
        private String avatar;
        /**
         * 是否删除 (1 删除,0 未删除)
         */
        private Boolean deleted;
        /**
         * 无参构造函数
         */
        public SysUserDO() {
        }
        /**
         * 全参构造函数
         */
        public SysUserDO(Long deptId, String username, String password, String nickName, String email, String phone, String gender, String avatar, Boolean deleted) {
            this.deptId = deptId;
            this.username = username;
            this.password = password;
            this.nickName = nickName;
            this.email = email;
            this.phone = phone;
            this.gender = gender;
            this.avatar = avatar;
            this.deleted = deleted;
        }
        public Long getDeptId() {return deptId;}
        public void setDeptId(Long deptId) {this.deptId = deptId;}
       //剩余的的get/set方法略
        @Override
        public String toString() {
            //方法体略
        }
    }
    

    SysLogLoginDO.java

    package com.swing.sky.web.generator.result.domain;
    import java.io.Serializable;
    import java.util.Date;
    
    /**
     * 系统访问记录:对象 sys_log_login
     *
     * @author swing
     */
    public class SysLogLoginDO implements Serializable {
        private static final long serialVersionUID = 1L;
        /**
         * 访问ID
         */
        private Long id;
        /**
         * 用户账号
         */
        private String username;
        /**
         * 客户端类型
         */
        private String clientType;
        /**
         * 是否成功(1成功 失败)
         */
        private Boolean success;
        /**
         * 提示消息
         */
        private String message;
        /**
         * 登录IP地址
         */
        private String ip;
        /**
         * 登录地点
         */
        private String location;
        /**
         * 操作系统
         */
        private String os;
        /**
         * 浏览器类型
         */
        private String browser;
        /**
         * 访问时间
         */
        private Date createTime;
    
        /**
         * 无参构造函数
         */
        public SysLogLoginDO() {
        }
    
        /**
         * 全参构造函数
         */
        public SysLogLoginDO(Long id, String username, String clientType, Boolean success, String message, String ip, String location, String os, String browser, Date createTime) {
            this.id = id;
            this.username = username;
            this.clientType = clientType;
            this.success = success;
            this.message = message;
            this.ip = ip;
            this.location = location;
            this.os = os;
            this.browser = browser;
            this.createTime = createTime;
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    //剩余的get/set方法略
        @Override
        public String toString() {
          //方法体略
        }
    }
    

    BasicDAO.java

    /**
     * 基本 dao 方法
     *
     * @author swing
     */
    public interface BasicDAO<T> {
        /**
         * 插入
         *
         * @param t 内容
         * @return 影响行数
         */
        int insert(T t);
    
        /**
         * 删除
         *
         * @param id 主键
         * @return 影响行数
         */
        int deleteById(Long id);
    
        /**
         * 批量删除
         *
         * @param ids 需要删除的信息Id集合
         * @return 结果
         */
        int batchDeleteByIds(Long[] ids);
    
        /**
         * 更新
         *
         * @param t 内容
         * @return 影响行数
         */
        int update(T t);
    
        /**
         * 根据主键获取实体类
         *
         * @param id 主键
         * @return 实体类
         */
        T getById(Long id);
    
        /**
         * 查询符合条件的集合
         *
         * @param beginTime 开始时间
         * @param endTime   终止时间
         * @param t         条件
         * @return 符合条件的集合
         */
        List<T> listByCondition(@Param("condition") T t, @Param("beginTime") String beginTime, @Param("endTime") String endTime);
    }
    

    SysUserDAO.java

    /**
     * 用户信息表
     *
     * @author swing
     */
    public interface SysUserDAO extends BasicDAO<SysUserDO> {
    }
    

    BasicLinkDAO.java

    /**
     * 关联表的基本方法
     *
     * @author swing
     */
    public interface BasicLinkDAO<One, Two, Item> {
        /**
         * 批量插入信息
         *
         * @param items 信息集合
         * @return 影响行数
         */
        int batchInsert(List<Item> items);
    
        /**
         * 根据One的id 删除T
         *
         * @param id One的id
         * @return 影响行数
         */
        int deleteItemByOneId(Long id);
    
        /**
         * 根据One的id 批量删除T
         *
         * @param ids id数组
         * @return 影响行数
         */
        int batchDeleteItemByOneIds(Long[] ids);
    
        /**
         * 根据Two的id 删除T
         *
         * @param id Two的id
         * @return 影响行数
         */
        int deleteItemByTwoId(Long id);
    
    
        /**
         * 根据Two的id 批量删除T
         *
         * @param ids id数组
         * @return 影响行数
         */
        int batchDeleteItemByTwoIds(Long[] ids);
    
        /**
         * 根据One的id统计数据量
         *
         * @param id One的id
         * @return 数量
         */
        int countItemByOneId(Long id);
    
        /**
         * 根据Two的id统计数据量
         *
         * @param id Two的id
         * @return 数量
         */
        int countItemByTwoId(Long id);
    
        /**
         * 根据Two的id列出One的信息列表
         *
         * @param id Two的Id
         * @return 信息列表
         */
        List<One> listOneByTwoId(Long id);
    
        /**
         * 根据Two的ids列出One的信息列表(去重复)
         *
         * @param ids Two的Ids
         * @return 信息列表
         */
        List<One> listOneByTwoIds(Long[] ids);
    
        /**
         * 根据Two的id列出One的id数组
         *
         * @param id Two的Id
         * @return 信息列表
         */
        Long[] listOneIdsByTwoId(Long id);
    
        /**
         * 根据Two的ids列出One的id数组(去重复)
         *
         * @param ids Two的Ids
         * @return 信息列表
         */
        Long[] listOneIdsByTwoIds(Long[] ids);
    
    
        /**
         * 根据Two的id列出One的信息列表
         *
         * @param id Two的Id
         * @return 信息列表
         */
        List<Two> listTwoByOneId(Long id);
    
        /**
         * 根据Two的id列出One的信息列表(去重复)
         *
         * @param ids Two的Ids
         * @return 信息列表
         */
        List<Two> listTwoByOneIds(Long[] ids);
    
        /**
         * 根据Two的id列出One的idid数组
         *
         * @param id Two的Id
         * @return 信息列表
         */
        Long[] listTwoIdsByOneId(Long id);
    
        /**
         * 根据Two的id列出One的id数组(去重复)
         *
         * @param ids Two的Ids
         * @return 信息列表
         */
        Long[] listTwoIdsByOneIds(Long[] ids);
    }
    

    SysUserRoleLinkDAO.java

    /**
     * @author swing
     */
    public interface SysUserRoleLinkDAO extends BasicLinkDAO<SysUserDO, SysRoleDO, SysUserRoleDO> {
    }
    

    SysLogLoginDAO.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.swing.sky.web.generator.result.dao.SysLogLoginDAO">
        <resultMap id="BaseResultMap" type="com.swing.sky.web.generator.result.domain.SysLogLoginDO">
            <result column="id" jdbcType="BIGINT" property="id"/>
            <result column="username" jdbcType="VARCHAR" property="username"/>
            <result column="client_type" jdbcType="CHAR" property="clientType"/>
            <result column="is_success" jdbcType="BOOLEAN" property="success"/>
            <result column="message" jdbcType="VARCHAR" property="message"/>
            <result column="ip" jdbcType="VARCHAR" property="ip"/>
            <result column="location" jdbcType="VARCHAR" property="location"/>
            <result column="os" jdbcType="VARCHAR" property="os"/>
            <result column="browser" jdbcType="VARCHAR" property="browser"/>
            <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
        </resultMap>
    
        <sql id="table_name">sys_log_login</sql>
    
        <sql id="Base_Column_List">
        sys_log_login.id, sys_log_login.username, sys_log_login.client_type, sys_log_login.is_success, sys_log_login.message, sys_log_login.ip, sys_log_login.location, sys_log_login.os, sys_log_login.browser, sys_log_login.create_time    </sql>
    
        <select id="getById" parameterType="java.lang.Long" resultMap="BaseResultMap">
            select
            <include refid="Base_Column_List"/>
            from
            <include refid="table_name"/>
            where id = #{id,jdbcType=BIGINT}
        </select>
        <delete id="deleteById" parameterType="java.lang.Long">
            delete from
            <include refid="table_name"/>
            where id = #{id,jdbcType=BIGINT}
        </delete>
        <delete id="batchDeleteByIds" parameterType="long">
            delete from
            <include refid="table_name"/>
            where id in
            <foreach collection="array" item="item" index="index" open="(" separator="," close=")">
                #{item}
            </foreach>
        </delete>
    
        <insert id="insert" keyColumn="id" keyProperty="id"
                parameterType="com.swing.sky.web.generator.result.domain.SysLogLoginDO" useGeneratedKeys="true">
            insert into
            <include refid="table_name"/>
            <trim prefix="(" suffix=")" suffixOverrides=",">
                <if test="id != null">
                    id,
                </if>
                <if test="username != null">
                    username,
                </if>
                <if test="clientType != null">
                    client_type,
                </if>
                <if test="success != null">
                    is_success,
                </if>
                <if test="message != null">
                    message,
                </if>
                <if test="ip != null">
                    ip,
                </if>
                <if test="location != null">
                    location,
                </if>
                <if test="os != null">
                    os,
                </if>
                <if test="browser != null">
                    browser,
                </if>
                <if test="createTime != null">
                    create_time,
                </if>
            </trim>
            <trim prefix="values (" suffix=")" suffixOverrides=",">
                <if test="id != null">
                    #{id,jdbcType=BIGINT},
                </if>
                <if test="username != null">
                    #{username,jdbcType=VARCHAR},
                </if>
                <if test="clientType != null">
                    #{clientType,jdbcType=CHAR},
                </if>
                <if test="success != null">
                    #{success,jdbcType=BOOLEAN},
                </if>
                <if test="message != null">
                    #{message,jdbcType=VARCHAR},
                </if>
                <if test="ip != null">
                    #{ip,jdbcType=VARCHAR},
                </if>
                <if test="location != null">
                    #{location,jdbcType=VARCHAR},
                </if>
                <if test="os != null">
                    #{os,jdbcType=VARCHAR},
                </if>
                <if test="browser != null">
                    #{browser,jdbcType=VARCHAR},
                </if>
                <if test="createTime != null">
                    #{createTime,jdbcType=TIMESTAMP},
                </if>
            </trim>
        </insert>
        <update id="update" parameterType="com.swing.sky.web.generator.result.domain.SysLogLoginDO">
            update
            <include refid="table_name"/>
            <set>
                <if test="id != null">
                    id = #{id,jdbcType=BIGINT},
                </if>
                <if test="username != null">
                    username = #{username,jdbcType=VARCHAR},
                </if>
                <if test="clientType != null">
                    client_type = #{clientType,jdbcType=CHAR},
                </if>
                <if test="success != null">
                    is_success = #{success,jdbcType=BOOLEAN},
                </if>
                <if test="message != null">
                    message = #{message,jdbcType=VARCHAR},
                </if>
                <if test="ip != null">
                    ip = #{ip,jdbcType=VARCHAR},
                </if>
                <if test="location != null">
                    location = #{location,jdbcType=VARCHAR},
                </if>
                <if test="os != null">
                    os = #{os,jdbcType=VARCHAR},
                </if>
                <if test="browser != null">
                    browser = #{browser,jdbcType=VARCHAR},
                </if>
                <if test="createTime != null">
                    create_time = #{createTime,jdbcType=TIMESTAMP},
                </if>
            </set>
            where id = #{id,jdbcType=BIGINT}
        </update>
    
        <select id="listByCondition" parameterType="com.swing.sky.web.generator.result.domain.SysLogLoginDO"
                resultMap="BaseResultMap">
            select
            <include refid="Base_Column_List"/>
            from
            <include refid="table_name"/>
            <where>
                <if test="condition != null">
                </if>
                <if test="beginTime != null">
                    and date_format(create_time,'%y%m%d') &gt;= date_format(#{beginTime},'%y%m%d')
                </if>
                <if test="endTime != null">
                    and date_format(create_time,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d')
                </if>
            </where>
        </select>
    
    </mapper>
    

    BasicDAO.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.swing.sky.web.generator.result.dao.BasicDAO">
        <resultMap id="BaseResultMap" type="com.swing.sky.web.generator.result.domain.BasicDO">
            <id column="id" jdbcType="BIGINT" property="id"/>
            <result column="is_use" jdbcType="BOOLEAN" property="use"/>
            <result column="order_num" jdbcType="INTEGER" property="orderNum"/>
            <result column="create_by" jdbcType="VARCHAR" property="createBy"/>
            <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
            <result column="update_by" jdbcType="VARCHAR" property="updateBy"/>
            <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
            <result column="remark" jdbcType="VARCHAR" property="remark"/>
        </resultMap>
    
        <sql id="common_insert_up">
            <if test="use != null">
                is_use,
            </if>
            <if test="orderNum != null">
                order_num,
            </if>
            <if test="createBy != null">
                create_by,
            </if>
            <if test="createTime != null">
                create_time,
            </if>
            <if test="updateBy != null">
                update_by,
            </if>
            <if test="updateTime != null">
                update_time,
            </if>
            <if test="remark != null">
                remark,
            </if>
        </sql>
    
        <sql id="common_insert_down">
            <if test="use != null">
                #{use,jdbcType=BOOLEAN},
            </if>
            <if test="orderNum != null">
                #{orderNum,jdbcType=INTEGER},
            </if>
            <if test="createBy != null">
                #{createBy,jdbcType=VARCHAR},
            </if>
            <if test="createTime != null">
                #{createTime,jdbcType=TIMESTAMP},
            </if>
            <if test="updateBy != null">
                #{updateBy,jdbcType=VARCHAR},
            </if>
            <if test="updateTime != null">
                #{updateTime,jdbcType=TIMESTAMP},
            </if>
            <if test="remark != null">
                #{remark,jdbcType=VARCHAR},
            </if>
        </sql>
    
        <sql id="common_update">
            <if test="use != null">
                is_use = #{use,jdbcType=BOOLEAN},
            </if>
            <if test="orderNum != null">
                order_num = #{orderNum,jdbcType=INTEGER},
            </if>
            <if test="createBy != null">
                create_by = #{createBy,jdbcType=VARCHAR},
            </if>
            <if test="createTime != null">
                create_time = #{createTime,jdbcType=TIMESTAMP},
            </if>
            <if test="updateBy != null">
                update_by = #{updateBy,jdbcType=VARCHAR},
            </if>
            <if test="updateTime != null">
                update_time = #{updateTime,jdbcType=TIMESTAMP},
            </if>
            <if test="remark != null">
                remark = #{remark,jdbcType=VARCHAR},
            </if>
        </sql>
    
        <insert id="insert"></insert>
        <update id="update"></update>
        <delete id="deleteById"></delete>
        <delete id="batchDeleteByIds"></delete>
        <select id="getById" resultMap="BaseResultMap"></select>
        <select id="listByCondition" resultMap="BaseResultMap"></select>
    </mapper>
    

    SysUserDAO.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.swing.sky.web.generator.result.dao.SysUserDAO">
        <resultMap id="BaseResultMap" extends="com.swing.sky.web.generator.result.dao.BasicDAO.BaseResultMap"
                   type="com.swing.sky.web.generator.result.domain.SysUserDO">
            <result column="dept_id" jdbcType="BIGINT" property="deptId"/>
            <result column="username" jdbcType="VARCHAR" property="username"/>
            <result column="password" jdbcType="VARCHAR" property="password"/>
            <result column="nick_name" jdbcType="VARCHAR" property="nickName"/>
            <result column="email" jdbcType="VARCHAR" property="email"/>
            <result column="phone" jdbcType="VARCHAR" property="phone"/>
            <result column="gender" jdbcType="CHAR" property="gender"/>
            <result column="avatar" jdbcType="VARCHAR" property="avatar"/>
            <result column="is_deleted" jdbcType="BOOLEAN" property="deleted"/>
        </resultMap>
    
        <sql id="table_name">sys_user</sql>
    
        <sql id="Base_Column_List">
        sys_user.id, sys_user.dept_id, sys_user.username, sys_user.password, sys_user.nick_name, sys_user.email, sys_user.phone, sys_user.gender, sys_user.avatar, sys_user.is_deleted, sys_user.is_use, sys_user.order_num, sys_user.create_by, sys_user.create_time, sys_user.update_by, sys_user.update_time, sys_user.remark    </sql>
    
        <select id="getById" parameterType="java.lang.Long" resultMap="BaseResultMap">
            select
            <include refid="Base_Column_List"/>
            from
            <include refid="table_name"/>
            where id = #{id,jdbcType=BIGINT}
        </select>
        <delete id="deleteById" parameterType="java.lang.Long">
            delete from
            <include refid="table_name"/>
            where id = #{id,jdbcType=BIGINT}
        </delete>
        <delete id="batchDeleteByIds" parameterType="long">
            delete from
            <include refid="table_name"/>
            where id in
            <foreach collection="array" item="item" index="index" open="(" separator="," close=")">
                #{item}
            </foreach>
        </delete>
    
        <insert id="insert" keyColumn="id" keyProperty="id"
                parameterType="com.swing.sky.web.generator.result.domain.SysUserDO" useGeneratedKeys="true">
            insert into
            <include refid="table_name"/>
            <trim prefix="(" suffix=")" suffixOverrides=",">
                <if test="deptId != null">
                    dept_id,
                </if>
                <if test="username != null">
                    username,
                </if>
                <if test="password != null">
                    password,
                </if>
                <if test="nickName != null">
                    nick_name,
                </if>
                <if test="email != null">
                    email,
                </if>
                <if test="phone != null">
                    phone,
                </if>
                <if test="gender != null">
                    gender,
                </if>
                <if test="avatar != null">
                    avatar,
                </if>
                <if test="deleted != null">
                    is_deleted,
                </if>
                <include refid="com.swing.sky.web.generator.result.dao.BasicDAO.common_insert_up"/>
            </trim>
            <trim prefix="values (" suffix=")" suffixOverrides=",">
                <if test="deptId != null">
                    #{deptId,jdbcType=BIGINT},
                </if>
                <if test="username != null">
                    #{username,jdbcType=VARCHAR},
                </if>
                <if test="password != null">
                    #{password,jdbcType=VARCHAR},
                </if>
                <if test="nickName != null">
                    #{nickName,jdbcType=VARCHAR},
                </if>
                <if test="email != null">
                    #{email,jdbcType=VARCHAR},
                </if>
                <if test="phone != null">
                    #{phone,jdbcType=VARCHAR},
                </if>
                <if test="gender != null">
                    #{gender,jdbcType=CHAR},
                </if>
                <if test="avatar != null">
                    #{avatar,jdbcType=VARCHAR},
                </if>
                <if test="deleted != null">
                    #{deleted,jdbcType=BOOLEAN},
                </if>
                <include refid="com.swing.sky.web.generator.result.dao.BasicDAO.common_insert_down"/>
            </trim>
        </insert>
        <update id="update" parameterType="com.swing.sky.web.generator.result.domain.SysUserDO">
            update
            <include refid="table_name"/>
            <set>
                <if test="deptId != null">
                    dept_id = #{deptId,jdbcType=BIGINT},
                </if>
                <if test="username != null">
                    username = #{username,jdbcType=VARCHAR},
                </if>
                <if test="password != null">
                    password = #{password,jdbcType=VARCHAR},
                </if>
                <if test="nickName != null">
                    nick_name = #{nickName,jdbcType=VARCHAR},
                </if>
                <if test="email != null">
                    email = #{email,jdbcType=VARCHAR},
                </if>
                <if test="phone != null">
                    phone = #{phone,jdbcType=VARCHAR},
                </if>
                <if test="gender != null">
                    gender = #{gender,jdbcType=CHAR},
                </if>
                <if test="avatar != null">
                    avatar = #{avatar,jdbcType=VARCHAR},
                </if>
                <if test="deleted != null">
                    is_deleted = #{deleted,jdbcType=BOOLEAN},
                </if>
                <include refid="com.swing.sky.web.generator.result.dao.BasicDAO.common_update"/>
            </set>
            where id = #{id,jdbcType=BIGINT}
        </update>
    
        <select id="listByCondition" parameterType="com.swing.sky.web.generator.result.domain.SysUserDO"
                resultMap="BaseResultMap">
            select
            <include refid="Base_Column_List"/>
            from
            <include refid="table_name"/>
            <where>
                <if test="condition != null">
                    <if test="condition.use != null">
                        and is_use = #{condition.use,jdbcType=BOOLEAN}
                    </if>
                </if>
                <if test="beginTime != null">
                    and date_format(create_time,'%y%m%d') &gt;= date_format(#{beginTime},'%y%m%d')
                </if>
                <if test="endTime != null">
                    and date_format(create_time,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d')
                </if>
            </where>
        </select>
    
    </mapper>
    

    SysUserRoleLinkDAO.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!--链接mapper测试模板 1.0.3-->
    <mapper namespace="com.swing.sky.web.generator.result.dao.SysUserRoleLinkDAO">
        <resultMap id="BaseResultMap" type="com.swing.sky.web.generator.result.domain.SysUserRoleDO">
            <result column="user_id" jdbcType="BIGINT" property="userId"/>
            <result column="role_id" jdbcType="BIGINT" property="roleId"/>
        </resultMap>
        <resultMap id="one_BaseResultMap" extends="com.swing.sky.web.generator.result.dao.SysUserDAO.BaseResultMap"
                   type="com.swing.sky.web.generator.result.domain.SysUserDO">
        </resultMap>
    
        <resultMap id="two_BaseResultMap" extends="com.swing.sky.web.generator.result.dao.SysRoleDAO.BaseResultMap"
                   type="com.swing.sky.web.generator.result.domain.SysRoleDO">
        </resultMap>
    
        <sql id="table_name">sys_user_role</sql>
        <sql id="one_id">user_id</sql>
        <sql id="two_id">role_id</sql>
        <sql id="column_list">(#{item.userId},#{item.roleId})</sql>
    
    
        <sql id="Base_Column_List"><include refid="table_name"/>.<include refid="one_id"/>,<include refid="table_name"/>.
            <include refid="two_id"/>
        </sql>
    
        <sql id="one_table_name">
            <include refid="com.swing.sky.web.generator.result.dao.SysUserDAO.table_name"/>
        </sql>
        <sql id="one_Base_Column_List">
            <include refid="com.swing.sky.web.generator.result.dao.SysUserDAO.Base_Column_List"/>
        </sql>
    
        <sql id="two_table_name">
            <include refid="com.swing.sky.web.generator.result.dao.SysRoleDAO.table_name"/>
        </sql>
        <sql id="two_Base_Column_List">
            <include refid="com.swing.sky.web.generator.result.dao.SysRoleDAO.Base_Column_List"/>
        </sql>
    
    
        <sql id="one_join"><include refid="table_name"/>.<include refid="one_id"/>=<include refid="one_table_name"/>.id
        </sql>
    
        <sql id="two_join"><include refid="table_name"/>.<include refid="two_id"/>=<include refid="two_table_name"/>.id
        </sql>
    
    
        <insert id="batchInsert" parameterType="arraylist">
            insert into
            <include refid="table_name"/>
            (
            <include refid="Base_Column_List"/>
            )
            values
            <foreach collection="list" item="item" index="index" separator=",">
                <include refid="column_list"/>
            </foreach>
        </insert>
    
        <delete id="deleteItemByOneId" parameterType="long">
            delete from
            <include refid="table_name"/>
            where
            <include refid="one_id"/>
            = #{id}
        </delete>
    
        <delete id="batchDeleteItemByOneIds" parameterType="long">
            delete from
            <include refid="table_name"/>
            where
            <include refid="one_id"/>
            in
            <foreach collection="array" item="item" index="index" open="(" separator="," close=")">
                #{item}
            </foreach>
        </delete>
    
        <delete id="deleteItemByTwoId" parameterType="long">
            delete from
            <include refid="table_name"/>
            where
            <include refid="two_id"/>
            = #{id}
        </delete>
    
        <delete id="batchDeleteItemByTwoIds" parameterType="long">
            delete from
            <include refid="table_name"/>
            where
            <include refid="two_id"/>
            in
            <foreach collection="array" item="item" index="index" open="(" separator="," close=")">
                #{item}
            </foreach>
        </delete>
    
        <select id="countItemByOneId" parameterType="long" resultType="int">
            select count(*) from
            <include refid="table_name"/>
            where
            <include refid="one_id"/>
            = #{id}
        </select>
    
        <select id="countItemByTwoId" parameterType="long" resultType="int">
            select count(*) from
            <include refid="table_name"/>
            where
            <include refid="two_id"/>
            = #{id}
        </select>
    
        <select id="listOneByTwoId" parameterType="long" resultMap="one_BaseResultMap">
            select
            <include refid="one_Base_Column_List"/>
            from
            <include refid="table_name"/>
            left join
            <include refid="one_table_name"/>
            on
            <include refid="one_join"/>
            where
            <include refid="two_id"/>
            = #{id}
        </select>
    
        <select id="listOneByTwoIds" parameterType="long" resultMap="one_BaseResultMap">
            select distinct
            <include refid="one_Base_Column_List"/>
            from
            <include refid="table_name"/>
            left join
            <include refid="one_table_name"/>
            on
            <include refid="one_join"/>
            where
            <include refid="two_id"/>
            in
            <foreach collection="array" item="item" index="index" open="(" separator="," close=")">
                #{item}
            </foreach>
        </select>
    
        <select id="listOneIdsByTwoId" parameterType="long" resultType="long">
            select
            <include refid="one_id"/>
            from
            <include refid="table_name"/>
            left join
            <include refid="one_table_name"/>
            on
            <include refid="one_join"/>
            where
            <include refid="two_id"/>
            = #{id}
        </select>
    
        <select id="listOneIdsByTwoIds" parameterType="long" resultType="long">
            select distinct
            <include refid="one_id"/>
            from
            <include refid="table_name"/>
            left join
            <include refid="one_table_name"/>
            on
            <include refid="one_join"/>
            where
            <include refid="two_id"/>
            in
            <foreach collection="array" item="item" index="index" open="(" separator="," close=")">
                #{item}
            </foreach>
        </select>
    
        <select id="listTwoByOneId" parameterType="long" resultMap="two_BaseResultMap">
            select
            <include refid="two_Base_Column_List"/>
            from
            <include refid="table_name"/>
            left join
            <include refid="two_table_name"/>
            on
            <include refid="two_join"/>
            where
            <include refid="one_id"/>
            = #{id}
        </select>
    
        <select id="listTwoByOneIds" parameterType="long" resultMap="two_BaseResultMap">
            select distinct
            <include refid="two_Base_Column_List"/>
            from
            <include refid="table_name"/>
            left join
            <include refid="two_table_name"/>
            on
            <include refid="two_join"/>
            where
            <include refid="one_id"/>
            in
            <foreach collection="array" item="item" index="index" open="(" separator="," close=")">
                #{item}
            </foreach>
        </select>
    
        <select id="listTwoIdsByOneId" parameterType="long" resultType="long">
            select
            <include refid="two_id"/>
            from
            <include refid="table_name"/>
            left join
            <include refid="two_table_name"/>
            on
            <include refid="two_join"/>
            where
            <include refid="one_id"/>
            = #{id}
        </select>
    
        <select id="listTwoIdsByOneIds" parameterType="long" resultType="long">
            select distinct
            <include refid="two_id"/>
            from
            <include refid="table_name"/>
            left join
            <include refid="two_table_name"/>
            on
            <include refid="two_join"/>
            where
            <include refid="one_id"/>
            in
            <foreach collection="array" item="item" index="index" open="(" separator="," close=")">
                #{item}
            </foreach>
        </select>
    </mapper>
    

    BasicService.java

    /**
     * 服务层基本接口
     *
     * @author swing
     */
    public interface BasicService<T> {
        /**
         * 插入
         *
         * @param t 内容
         * @return 影响行数
         */
        int insert(T t);
    
        /**
         * 删除
         *
         * @param id 主键
         * @return 影响行数
         */
        int deleteById(Long id);
    
        /**
         * 批量删除
         *
         * @param ids 需要删除的信息Id集合
         * @return 结果
         */
        int batchDeleteByIds(Long[] ids);
    
        /**
         * 更新
         *
         * @param t 内容
         * @return 影响行数
         */
        int update(T t);
    
        /**
         * 根据主键获取实体类
         *
         * @param id 主键
         * @return 实体类
         */
        T getById(Long id);
    
        /**
         * 查询符合条件的集合(此方法只有管理员用户可以使用,可以没有限制地获取该资源的所有记录)
         * 入对资源的访问需要进行权限限制,请使用扩展的方法:
         * List<T> listByConditionAndUserId(Long userId, T t, String beginTime, String endTime);
         *
         * @param beginTime 开始时间
         * @param endTime   终止时间
         * @param t         条件
         * @return 符合条件的集合
         */
        List<T> listByCondition(T t, String beginTime, String endTime);
    }
    

    SysUserService.java

    /**
     * 用户信息表
     *
     * @author swing
     */
    public interface SysUserService extends BasicService<SysUserDO> {
    }
    

    SysUserServiceImpl.java

    /**
     * 用户信息表
     *
     * @author swing
     */
    public class SysUserServiceImpl implements SysUserService {
    
        @Resource
        private SysUserDAO sysUserDAO;
    
        @Override
        public int insert(SysUserDO sysUserDO) {
            return sysUserDAO.insert(sysUserDO);
        }
    
        @Override
        public int deleteById(Long id) {
            return sysUserDAO.deleteById(id);
        }
    
        @Override
        public int batchDeleteByIds(Long[] ids) {
            return sysUserDAO.batchDeleteByIds(ids);
        }
    
        @Override
        public int update(SysUserDO sysUserDO) {
            return sysUserDAO.update(sysUserDO);
        }
    
        @Override
        public SysUserDO getById(Long id) {
            return sysUserDAO.getById(id);
        }
    
        @Override
        public List<SysUserDO> listByCondition(SysUserDO sysUserDO, String beginTime, String endTime) {
            return sysUserDAO.listByCondition(sysUserDO, beginTime, endTime);
        }
    }
    

    二次开发

    如果这些生成规则无法满足你的私人定制,那么欢迎对其进行二次开发,可联系我,然后我给你提供代码分支

    本项目是基于 velocity 上开发的

    项目架构

    其中 该项目的核心类是 moduleHouse ,其中包括所有的配置文件信息,和数据库信息

    模块的配置与扩展

    src\main\resources\gen.properties

    #打包工具(使用逗号隔开,然后在下文使用 (模块名.配置)的形式配置文件信息)
    packageTool=maven
    #打包工具定制化
    maven.java.path=src\\main\\java
    maven.test.java.path=src\\test\\java
    maven.resources.path=src\\main\\resources
    maven.test.resources.path=src\\test\\resources
    #生成文件的模块名,在此处填写模块名,使用逗号隔开,然后在下文使用 (模块名.配置)的形式配置文件信息
    modules=linkMapper,daoLink,basicDomain,domain,domainBasic,basicDao,dao,daoBasic,basicLinkDao,basicMapper,mapper,mapperBasic,basicService,service,serviceBasic,serviceImpl
    
    #basicDomain
    #文件类型(main:主文件,test:测试,src:源码,resource:资源文件)
    basicDomain.type=main/src
    #包名
    basicDomain.packageName=domain
    #后缀
    basicDomain.suffix=DO
    #文件扩展名
    basicDomain.extension=.java
    #模板文件路径
    basicDomain.templateUrl=vm/java/domain/BasicDO.java.vm
    ##默认文件名(没有此属性默认根据表明来转换)
    basicDomain.defaultFileName=BasicDO
    
    #domain
    domain.type=main/src
    domain.packageName=domain
    domain.suffix=DO
    domain.extension=.java
    domain.templateUrl=vm/java/domain/DO.java.vm
    
    #domainBasic
    domainBasic.type=main/src
    domainBasic.packageName=domain
    domainBasic.suffix=DO
    domainBasic.extension=.java
    domainBasic.templateUrl=vm/java/domain/DO_BASIC.java.vm
    
    #basicDao
    basicDao.type=main/src
    basicDao.suffix=DAO
    basicDao.packageName=dao
    basicDao.extension=.java
    basicDao.templateUrl=vm/java/dao/BasicDAO.java.vm
    basicDao.defaultFileName=BasicDAO
    
    #dao
    dao.type=main/src
    dao.suffix=DAO
    dao.packageName=dao
    dao.extension=.java
    dao.templateUrl=vm/java/dao/DAO.java.vm
    
    #daoBasic
    daoBasic.type=main/src
    daoBasic.suffix=DAO
    daoBasic.packageName=dao
    daoBasic.extension=.java
    daoBasic.templateUrl=vm/java/dao/DAO_BASIC.java.vm
    
    #basicLinkDao
    basicLinkDao.type=main/src
    basicLinkDao.suffix=LinkDAO
    basicLinkDao.packageName=dao
    basicLinkDao.extension=.java
    basicLinkDao.templateUrl=vm/java/dao/BasicLinkDAO.java.vm
    basicLinkDao.defaultFileName=BasicLinkDAO
    
    #daoLink
    daoLink.type=main/src
    daoLink.suffix=LinkDAO
    daoLink.packageName=dao
    daoLink.extension=.java
    daoLink.templateUrl=vm/java/dao/DAO_LINK.java.vm
    
    #basicMapper
    basicMapper.type=main/resources
    basicMapper.suffix=DAO
    basicMapper.packageName=mybatis
    basicMapper.extension=.xml
    basicMapper.templateUrl=vm/java/mybatis/BasicMapper.xml.vm
    basicMapper.defaultFileName=BasicDAO
    
    #mapper
    mapper.type=main/resources
    mapper.suffix=DAO
    mapper.packageName=mybatis
    mapper.extension=.xml
    mapper.templateUrl=vm/java/mybatis/Mapper.xml.vm
    
    #mapperBasic
    mapperBasic.type=main/resources
    mapperBasic.suffix=DAO
    mapperBasic.packageName=mybatis
    mapperBasic.extension=.xml
    mapperBasic.templateUrl=vm/java/mybatis/Mapper_BASIC.xml.vm
    
    #linkMapper
    linkMapper.type=main/resources
    linkMapper.suffix=LinkDAO
    linkMapper.packageName=mybatis
    linkMapper.extension=.xml
    linkMapper.templateUrl=vm/java/mybatis/Link_Mapper.xml.vm
    
    #basicService
    basicService.type=main/src
    basicService.suffix=Service
    basicService.packageName=service
    basicService.extension=.java
    basicService.templateUrl=vm/java/service/BasicService.java.vm
    basicService.defaultFileName=BasicService
    
    #service
    service.type=main/src
    service.suffix=Service
    service.packageName=service
    service.extension=.java
    service.templateUrl=vm/java/service/Service.java.vm
    
    #serviceBasic
    serviceBasic.type=main/src
    serviceBasic.suffix=Service
    serviceBasic.packageName=service
    serviceBasic.extension=.java
    serviceBasic.templateUrl=vm/java/service/Service_BASIC.java.vm
    
    #serviceImpl
    serviceImpl.type=main/src
    serviceImpl.suffix=ServiceImpl
    serviceImpl.packageName=service.impl
    serviceImpl.extension=.java
    serviceImpl.templateUrl=vm/java/service/ServiceImpl.java.vm
    
    

    一个module即对应一个类型的生成文件,如果需要生成属于自己的模板文件,请在modules中配置模块名称,然后再下文配置模块的详细信息

    包括模板位置,并再 src\main\java\com\swing\sky\web\generator\constant\ModuleConstants.java 中新增该模块的常量表示

    然后在 VelocityContextBuilder 中配置该模板文件生成时需要的上下文 VelocityContext 即可

    扩展 so easy!

    结尾

    可fork本仓库参与贡献
    有啥问题可在评论区留言,我努力回复,努力帮忙!
    多多fork多多start!!!😁多多点赞!

    捐赠

    可以请作者喝一瓶哇哈哈:

    展开全文
  • velocity作为Java模版引擎的主要目的是为了允许任何人使用简单而强大的模板语言来引用定义在Java代码中的对象。在velocity文件中可以给该页面指定模版布局,从而节省了大量的时间去写通用的模版布局。可以定义变量,...

    前言

    关于velocity与SpringMVC的配置请参考前一篇文章,此处不再介绍。velocity作为Java模版引擎的主要目的是为了允许任何人使用简单而强大的模板语言来引用定义在Java代码中的对象。在velocity文件中可以给该页面指定模版布局,从而节省了大量的时间去写通用的模版布局。可以定义变量,与Java方法进行交互。

    定义一个layout模版

    在上一篇文章中提到了配置默认模版,当然也可以不使用默认模版即在要用到的页面的最上端写上
    ?
    1
    #set($layout='layout/yourlayout.vm')

    那么如何定义一个layout,看下面的例子:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <! DOCTYPE  html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    < html  xmlns = "http://www.w3.org/1999/xhtml" >
    < HEAD >
         < TITLE >$!page_title 测试layout页面</ TITLE >
         < meta  http-equiv = "Content-Type"  content = "text/html; charset=UTF-8" />
         < meta  http-equiv = "Content-Language"  content = "zh-CN" />
         < meta  http-equiv = "Content-Type"  content = "text/html; charset=UTF-8" />
         < meta  http-equiv = "Content-Language"  content = "zh-CN" />
         < link  href = "/resources/lib/font-awesome/css/font-awesome.min.css"  tppabs = "/resources/lib/font-awesome/css/font-awesome.min.css"  rel = "stylesheet"  type = "text/css" />
         < link  href = "/resources/lib/bootstrap/css/bootstrap.min.css"  tppabs = "/resources/lib/bootstrap/css/bootstrap.min.css"  rel = "stylesheet"  type = "text/css" />
    </ HEAD >
    < BODY >
         $screen_content
    < script  src = "/resources/lib/jquery-1.10.2.min.js"  tppabs = "/resources/lib/jquery-1.10.2.min.js"  type = "text/javascript" ></ script >
    < script  src = "/resources/lib/jquery-migrate-1.2.1.min.js"  tppabs = "/resources/lib/jquery-migrate-1.2.1.min.js"  type = "text/javascript" ></ script >
    </ BODY >
    </ HTML >

    那么$screen_content所在的位置即是你所打开页面将要占用的位置。

    定义一个变量

    ?
    1
    2
    3
    #set($var='xxxx')
     
    ##输出上面的变量直接使用$var

    魂环数组或者list

    ?
    1
    2
    3
    #foreach($ele in $list)
    < span >output element:$ele</ span >
    #end

    条件判断

    ?
    1
    2
    3
    4
    5
    6
    7
    #if($var=='xxxx')
    < span >it is right</ span >
    #elseif($var=='')
    < span >sorry</ span >
    #else
    < span >it is wrong</ span >
    #end

    内置对象

    类似于JSP,velocity也有自己的内置对象,如$request,$response,$session这样以来我们就可以将Java对象request和response以及session里的东西轻而易举的展现在web页面里。

    自定义标签(指令)

    velocity同时也支持自定义标签,或者称为指令。如果查看velocity的源码就会发现有个directive.properties

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    directive. 1 =org.apache.velocity.runtime.directive.Foreach
    directive. 2 =org.apache.velocity.runtime.directive.Include
    directive. 3 =org.apache.velocity.runtime.directive.Parse
    directive. 4 =org.apache.velocity.runtime.directive.Macro
    directive. 5 =org.apache.velocity.runtime.directive.Literal
    directive. 6 =org.apache.velocity.runtime.directive.Evaluate
    directive. 7 =org.apache.velocity.runtime.directive.Break
    directive. 8 =org.apache.velocity.runtime.directive.Define
    directive. 9 =org.apache.velocity.runtime.directive.Stop

    这里正是velocity当前所提供的9个标签(指令),下面我们新添加一个指令say

    ?
    1
    2
    3
    <body>
       #say( "hello" )
    </body>

    java代码实现

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    import  java.io.IOException;
    import  java.io.Serializable;
    import  java.io.StringWriter;
    import  java.io.Writer;
    import  java.util.HashMap;
    import  java.util.Map;
     
    import  org.apache.velocity.VelocityContext;
    import  org.apache.velocity.app.VelocityEngine;
    import  org.apache.velocity.context.InternalContextAdapter;
    import  org.apache.velocity.exception.MethodInvocationException;
    import  org.apache.velocity.exception.ParseErrorException;
    import  org.apache.velocity.exception.ResourceNotFoundException;
    import  org.apache.velocity.runtime.directive.Directive;
    import  org.apache.velocity.runtime.parser.node.Node;
    import  org.apache.velocity.runtime.parser.node.SimpleNode;
    import  org.springframework.beans.factory.annotation.Autowired;
     
    import  com.alibaba.citrus.service.template.TemplateService;
    import  com.alibaba.click.util.HostUtil;
     
    public  class  Say  extends  Directive{
         
         @Autowired
         TemplateService templateService;
         
         private  static  final  VelocityEngine velocityEngine =  new  VelocityEngine();
     
         @Override
         public  String getName() {
             return  "say" ;
         }
     
         @Override
         public  int  getType() {
             return  LINE;
         }
     
         @Override
         public  boolean  render(InternalContextAdapter context, Writer writer,
                 Node node)  throws  IOException, ResourceNotFoundException,
                 ParseErrorException, MethodInvocationException {
             SimpleNode sn = (SimpleNode) node.jjtGetChild( 0 );   
             writer.write((String)sn.value(context));
             return  true ;
         }
         
    }

    接下来就可以在velocity.properties文件里添加上

    ?
    1
    say=cn.buglife.demo.msv.directive.Say
    展开全文
  • java使用模板Velocity语法2009-10-23 10:06java使用模板Velocity语法2009-05-27 11:421. 变量 (1) 变量的定义: #set($name = "hello") 说明:velocity中变量是弱类型的。 当使用#set 指令时,括在双...
  • Velocity 是一个基于 Java 的模板引擎,它允许用户使用简单的模板语言来引用由 Java 代码定义的对象。当 Velocity 应用于 Web 开发时,界面设计人员可以和 Java 程序开发人员同步开发一个遵循 MVC 架构的 Web 站点。...
  • 项目地址: GitHub https://github.com/wusas/java-excel-velocity 项目结构: ├─.idea │ ├─inspectionProfiles │ ├─libraries │ └─sonarlint │ └─issuestore ├─.mvn │ └─wrapper ├─src │ ├...
  • language)来引用由java代码定义的对象。从而实现界面和Java代码的分离,使得界面设计人员可以和java程序开发人员同步开发一个遵循 MVC架构的web站点。 另外,Velocity的能力远不止web站点开发这个领域...
  • Java的模板引擎Velocity

    2008-12-14 22:45:28
    不少人看过或了解过Velocity,名称字面翻译为:速度、速率、迅速,用在Web开发里,用过的人可能不多,大都基本知道和在使用Struts,到底Velocity和Struts是如何联系,怎么看待Velocity呢?让我们来尝试一下,了解...
  • Velocity java开发指南

    2012-01-10 01:54:53
    java.util.collection :velocity会使用他们的标准iterator() 得到一个可以迭代中使用的 iterator对象,如果你使用自己的实现了collection interface的对象,要确保它的iterator() 命令返回一个可用的iterator. ...
  • 不少人看过或了解过Velocity,名称字面翻译为:速度、速率、迅速,用在Web开发 里,用过的人可能不多,大都基本知道和在使用Struts,到底Velocity和Struts是如何联系,怎么看待Velocity呢?让我们来尝试一 下,...
  • velocity

    2017-09-11 22:50:49
    velocity,是一个基于Java的模板引擎,它允许任何人仅仅简单的使用模板语言来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点。这是很...
  • velocity java开发指南

    千次阅读 2007-08-16 17:33:00
    Velocity是一基于java语言的模板引擎,使用这个简单、功能强大的开发工具,可以很容易的将数据对象灵活的与格式化文档组装到一起;希望本文能指引使用velocity在开发基于servlet或一般java应用程序的应用上快速起步...
  • 使用Velocityjava代码转换成JS代码

    万次阅读 2011-11-16 13:01:05
    为什么要用Velocity:项目中需要将JAVA代码生成JS代码,但是又不想在JS中import JAVA类,而且类中有很多枚举元素,如果手动的将枚举元素转换成JS对象会很耗时,所以采用Velocity模板技术让JAVA枚举对象自动转换成JS...
  • 不少人看过或了解过Velocity,名称字面翻译为:速度、速率、迅速,用在Web开发里,用过的人可能不多,大都基本知道和在使用Struts,到底Velocity和Struts是如何联系,怎么看待Velocity呢?让我们来尝试一下,了解...
  • Velocity是一基于java语言的模板引擎,使用这个简单、功能强大的开发工具,可以很容易的将数据对象灵活的与格式化文档组装到一起;希望本文能指引使用velocity在开发基于servlet或一般java应用程序的应用上快速起步...
  • Velocity,java的模板引擎

    2016-03-24 16:59:23
    它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。从而实现界面和Java代码的分离,使得界面设计人员可以和java程序开发人员同步开发一个遵循 MVC架构的web站点。 另外,...
  • Velocity是一基于java语言的模板引擎,使用这个简单、功能强大的开发工具,可以很容易的将数据对象灵活的与格式化文档组装到一起;希望本文能指引使用velocity在开发基于servlet或一般java应用程序的应用上快速起步...
  • 不少人看过或了解过Velocity,名称字面翻译为:速度、速率、迅速,用在Web开发 里,用过的人可能不多,大都基本知道和在使用Struts,到底Velocity和Struts是如何联系,怎么看待Velocity呢?让我们来尝试一 下,...
  • Velocity可以获取java语言中定义的对象,从而实现界面和java代码的真正分离,这意味着可以使用velocity替代jsp的开发模式了提示:velocity中大小写敏感。基本的Velocity语法1、"#"用来标识Velocity的脚本语句,...
  • 3、在http://jakarta.apache.org/site/binindex.cgi上下载Velocity 1.4 zip,解压后获取velocity-1.4.jar,用它来编译上面的类HelloVelocity.java。 4、把1上的hellovelocity.vm copy到运行的当前目录下,运行...
  • Velocity

    2019-09-20 07:47:08
    介绍 Velocity是一个基于java的模板...它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,036
精华内容 5,614
关键字:

java对象velocity获取

java 订阅