• Java Velocity模板引擎的使用


    1、什么是Velocity

      Velocity 是一个简单而强大的基于 Java 的模板引擎,可将数据从纯 Java 对象呈现为文本、xml、电子邮件、SQL、Post Script、HTML 等。模板语法和呈现引擎既易于理解,又易于学习和实施.

    功能远远超出了 Web 领域(例如 xdoclet、middlegen、Intellij 等),使程序员能够专注于编写功能代码,同时,模板设计人员可以直接修改模板以创建有吸引力的输出

    在 webapps 中,模型-视图-控制 (MVC) 分离可以被严格执行,因为模板不包含“代码”。或者,由程序员决定,可以在模板中提供“工具”,以便更直接地访问数据。

    2、学习Velocity的参考网站

    公司的项目使用的是velocity模板引擎,所以在日常的编码中做个记录,方便下次查找使用:

    附上我学习velocity这个技术的参考网站:

    Java Velocity模板引擎详解

    3、基本用法

    3.1:遍历数据

      遍历数据库中的用户数据,并在前台页面进行一个展示:

    DAO:

    /**
     * 对于用户的一些查询方法(dao层)
     *
     * @author zhangzhixi
     * @date 2021-6-25 10:43
     */
    public class InquireMemberDataManager {
        /**
         * 单例创建对象
         */
        private static InquireMemberDataManager singleton;
        private static final Logger LOG = LoggerFactory.getLogger(InquireMemberDataManager.class);
    
        public static InquireMemberDataManager instance() {
            if (singleton == null) {
                singleton = new InquireMemberDataManager();
            }
            return singleton;
        }
    
        private static CommonDatabaseAccess db() {
            return CommonDatabaseAccess.instance();
        }
    
        /**
         * 通过name获取这个用户
         * <p>
         * //     * @param loginname 用户名称
         *
         * @return 用户实体
         * @throws DbAccessException
         */
        public List<Member> getMember(String name) throws DbAccessException {
    
            String sql = "SELECT * FROM T_MEM_MEMBER WHERE F_LOGINNAME= ?";
    
            List<Member> member = new ArrayList<>();
            //
            IDbacTransaction tx = db().beginTransaction();
            try {
                member = db().listObjects(sql, new Object[]{name}, Member.class, 0, 0);
                System.out.println("=======================>>" + member);
            } catch (DbAccessException e) {
                tx.rollback();
                throw e;
            } finally {
                db().endTransaction();
            }
            return member;
        }
    }

    Service:

    /**
     * service层
     *
     * @author zhangzhixi
     * @date 2021-6-25 10:57
     */
    public class InquireMemberDataService {
        private static InquireMemberDataService singleton;
        private static final Logger LOG = LoggerFactory.getLogger(InquireMemberDataService.class);
    
        public static InquireMemberDataService instance() {
            if (singleton == null) {
                singleton = new InquireMemberDataService();
            }
            return singleton;
        }
    
    
        public List<Member> getMember(String name) throws DbAccessException {
            // 调用dao层,执行sql
            InquireMemberDataManager instance = InquireMemberDataManager.instance();
            List<Member> member = instance.getMember(name);
    
            // 一些不重要的数据输出
            for (Member member1 : member) {
                System.out.println("Service===》" + member);
            }
            return member;
        }
    }

    Controller:

    /**
         * 个人中心-张志喜测试
         *
         * @param name     用户名
         * @param model    视图层处理数据以及视图页面的跳转
         * @param request  请求
         * @param response 响应
         * @return 用户数据到前台页面进行一个展示
         */
        @RequestMapping(value = "/myTest.htm", method = RequestMethod.POST)
        public ModelAndView weeklyRecordByDate(String name, Model model, HttpServletRequest request, HttpServletResponse response) throws CmsException, JsonProcessingException, DbAccessException {
            // 调用service层,得到用户数据
            List<Member> member = InquireMemberDataService.instance().getMember(name);
    
            for (Member mem : member) {
                System.out.println(mem);
            }
    
            // 将查询到的用户数据返回到前端页面
            if (member.size() > 0) {
                // 返回视图数据
                model.addAttribute("msg", member);
            } else {
                model.addAttribute("msg", "查询的用户不存在或者数据为空,请重新输入!");
                return new ModelAndView("pc/cms/article/article/zzxView");
            }
            return new ModelAndView("pc/cms/article/article/zzxData");
        }
    
        /**
         * 用户姓名数据填写查询页面
         *
         * @return 跳转到查询用户数据查询表单页面
         */
        @RequestMapping(value = "/myView.htm", method = RequestMethod.GET)
        public ModelAndView getModelAndView() {
            return new ModelAndView("pc/cms/article/article/zzxView");
        }

    前端代码:

      用户输入数据:

    ##注册界面内容
    
    #if($!msg == "查询的用户不存在或者数据为空,请重新输入!")
    <script>
        alert('$!msg');
    </script>
    #end
    <div class="container main-content2" style="text-align: center">
        <div class="row clearfix">
            ## from表单进行跳转到具体的查询页面
            <form class="login-form" id="loginForm" method="post" action="#rootPath("myTest.htm")"
                  enctype="multipart/form-data">
                <div class="form-group">
                    <label class="form-label" for="name"><span class="star"></span>姓名</label>
                    <input type="text" class="form-control input" id="name" name="name" placeholder="请输入您的姓名"/>
                </div>
    
                <div class="form-group">
                    <button type="submit" class="btn btn-login">立即查询</button>
                </div>
            </form>
            <div class="marked-words">
                <strong id="message-marked-words"></strong>
            </div>
        </div>
    </div>

      数据展示:

    <div id="myTabContent" class="tab-content" style="text-align: center">
            <table border="1" cellpadding="3" cellspacing="0" style=" 60%;margin:auto">
                <thead style="text-align:center">
                <tr>
                    <th>ID</th>
                    <th>登录名</th>
                    <th>用户名</th>
                    <th>身份证号</th>
                    <th>手机号</th>
                    <th>学历</th>
                    <th>职业</th>
                    <th>邮箱</th>
                </tr>
                </thead>
                <tbody style="text-align: center">
                    #*#if($!msg == "查询的用户不存在或者数据为空")
                    <script>
                        alert('$!msg');
                    </script>
                    #else*#
                    ## 能够直接进来的说明用户数据存在
                    #foreach($!mem in $!msg)
                    <tr>
                        <td>$!mem.Id</td>
                        <td>$!mem.F_loginname</td>
                        <td>$!mem.f_username</td>
                        <td>$!mem.f_id_num</td>
                        <td>$!mem.f_mobile</td>
                        <td>$!mem.f_education</td>
                        <td>$!mem.f_major</td>
                        <td>$!mem.f_email</td>
                    </tr>
                    #end
                    ###end
                </tbody>
            </table>
    </div>

    测试:

    查询到用户(用户展示)

    未查询到用户:

    3.2:判断数据是否为null

    <span class="item_speaker">
        #if($!db.f_author != 'null')
       主讲人:$!db.f_author
        #else
            主讲人:
        #end
    </span>

     3.3:判断循环

    在Velocity中,有一个变量$velocityCount用作循环计数,初始值是1。在我们进行foreach循环的时候,可用于做循环次数的判断,而不需要你再重新定义变量

     3.4:取部署项目的地址

      在WEB学习的时候我们学过通过EL表达式:${pageContext.request.contextPath}取出项目的地址

      在JSP中的写法是:<%=request.getContextPath()%>

      它们的意思就是取得当前项目名称(或者是--取出部署的应用程序名)

    在Velocity模板引擎中是这样写的:

      <a href="#rootPath("indexOfPXB.html")">

    举个例子:

      就拿上面的a标签来说,如果你的tomcat是在本机启动,那么#rootPath就会找到你的本机的项目地址:localhost:8080,需要注意的是不能在后面的括号中

      加上'/'不然就会访问不到你指定的链接、

  • 相关阅读:
    Codeforces 294B Shaass and Bookshelf:dp
    Codeforces 372B Counting Rectangles is Fun:dp套dp
    Codeforces 402D Upgrading Array:贪心 + 数学
    Codeforces 571B Minimization:dp + 贪心【前后相消】
    Codeforces 509F Progress Monitoring:区间dp【根据遍历顺序求树的方案数】
    codeforces 447E or 446C 线段树 + fib性质或二次剩余性质
    类斐波那契数列的一些性质
    CF 1097D
    最近点对问题
    2018ACM-ICPC EC-Final 现场赛I题 Misunderstanding...Missing 倒着DP
  • 原文地址:https://www.cnblogs.com/zhangzhixi/p/14972065.html
Copyright © 2020-2023  润新知