1、什么是Velocity
Velocity 是一个简单而强大的基于 Java 的模板引擎,可将数据从纯 Java 对象呈现为文本、xml、电子邮件、SQL、Post Script、HTML 等。模板语法和呈现引擎既易于理解,又易于学习和实施.
功能远远超出了 Web 领域(例如 xdoclet、middlegen、Intellij 等),使程序员能够专注于编写功能代码,同时,模板设计人员可以直接修改模板以创建有吸引力的输出。
在 webapps 中,模型-视图-控制 (MVC) 分离可以被严格执行,因为模板不包含“代码”。或者,由程序员决定,可以在模板中提供“工具”,以便更直接地访问数据。
2、学习Velocity的参考网站
公司的项目使用的是velocity模板引擎,所以在日常的编码中做个记录,方便下次查找使用:
附上我学习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,需要注意的是不能在后面的括号中
加上'/'不然就会访问不到你指定的链接、