使用velocity模板使javaWeb的html+js实现模块化

页面上一些基础数据或者其他页面经常用到部分,可以独立出来做成小组件,组件预留调用入口,需要的页面直接调用即可。

如图,页面中的展示分类和搜索标签在多个页面重复使用,可以将这部分内容独立出来,做成组件,供后续开发调用:

classify_search_tag.html文件如下,其中包含HTML节点和Jquery代码;

<!--
展示分类与搜索标签组件使用说明:
    1.新增时父页面调用方法:页面加载时调用 goodsClassifyAndSearchTag.getFirstLevelClassify();/** 初始化一级展示分类 **/
    2.编辑时父页面调用方法:页面加载时调用 goodsClassifyAndSearchTag.getClassifyAndSearchTag(String classifys);
        ShowClassifyList类型json串,可参考 \js\standard_v2\group\group_edit.js  该方法 groupGoodsObj.getEditClassify();
    3.返回页面选中的展示分类和搜索标签,调用 goodsClassifyAndSearchTag.returnSelectedClassifyAndTag();
    注意事项:可能会出现js冲突问题,父页面的js最好在文件顶部加载
-->
<!--展示分类-->
<div class="row form-horizontal">
    <div class="col-md-12">
        <div class="form-group">
            <label class="col-md-1 control-label pr0">展示分类</label>
            <div class="col-md-1">
                <select class="form-control" id="first_classify" onchange="goodsClassifyAndSearchTag.getSecondClassify(this)">
                    <option value="0">请选择</option>
                </select>
            </div>
            <div class="col-md-1">
                <select class="form-control" id="second_classify" onchange="goodsClassifyAndSearchTag.getThirdClassify(this)">
                    <option value="0">请选择</option>
                </select>
            </div>
            <div class="col-md-1">
                <select class="form-control" id="third_classify" onchange="goodsClassifyAndSearchTag.getSearchTag(this)">
                    <option value="0">请选择</option>
                </select>
            </div>
        </div>
    </div>
</div>
<!--搜索标签-->
<div class="row mb15">
    <div class="col-md-12">
        <h2><small>搜索标签:</small></h2>
    </div>
</div>
<div class="row form-horizontal" id="classify_template">
    <div class="col-md-12" name="tag_original">
        <div name="selectTagDom" id="selectTagDom"></div>
        <div name="commonTagDom" id="commonTagDom"></div>
    </div>
</div>
<!-- 展示分类模板 -->
<script id="classifyTemplate" type="text/x-jsrender">
    <option value="{{:id}}">{{:classilyName}}</option>
</script>
<!-- 普通标签模板 -->
<script id="commonTagTemplate" type="text/x-jsrender">
    <div class="form-group">
        <label class="col-md-1 control-label pr0">{{:optionName}}</label>
        <div class="col-md-9">
            {{for optionValues}}
                <label class="checkbox-inline">
                    {{if checked==true}}
                        <input type="checkbox" checked name=‘{{: #data.optionId}}‘ optionid=‘{{: #data.optionId}}‘ valueid=‘{{: #data.id}}‘>
                    {{else}}
                        <input type="checkbox" name=‘{{: #data.optionId}}‘ optionid=‘{{: #data.optionId}}‘ valueid=‘{{: #data.id}}‘/>
                    {{/if}}
                    <span>{{: #data.value}}</span>
                </label>
            {{/for}}
        </div>
    </div>
</script>
<!-- 级联标签模板 -->
<script id="selectTagTemplate" type="text/x-jsrender">
    <div class="form-group" id=‘label_{{:optionId}}‘ valueid=‘{{:valueId}}‘>
        <label class="col-md-1 control-label pr0">{{:optionName}}</label>
        <div class="col-md-9">
            {{for optionValues}}
                <label class="checkbox-inline">
                    {{if checked==true}}
                        <input type="checkbox" checked name=‘{{: #data.optionId}}‘ optionid=‘{{: #data.optionId}}‘ valueid=‘{{: #data.id}}‘ onclick=‘goodsClassifyAndSearchTag.getChildSelectOption({{: #data.optionId}}, {{: #data.id}}, this)‘>
                    {{else}}
                        <input type="checkbox" name=‘{{: #data.optionId}}‘ optionid=‘{{: #data.optionId}}‘ valueid=‘{{: #data.id}}‘ onclick=‘goodsClassifyAndSearchTag.getChildSelectOption({{: #data.optionId}}, {{: #data.id}}, this)‘/>
                    {{/if}}
                    <span>{{: #data.value}}</span>
                </label>
            {{/for}}
        </div>
    </div>
</script>
<!-- 级联子标签模板 -->
<script id="childOptionTemplate" type="text/x-jsrender">
    <div class="form-group" name=‘label_{{:optionId}}‘ valueId=‘{{:valueId}}‘>
        <lable class="col-md-1 control-label pr0">{{:optionName}}</lable>
        <div class="col-md-9">
            {{for optionValues}}
                <label class="checkbox-inline">
                    <input type="checkbox" name=‘{{:#parent.parent.data.optionId}}‘ optionid=‘{{: #data.optionId}}‘ valueid=‘{{: #data.id}}‘ onclick=‘goodsClassifyAndSearchTag.getChildSelectOption({{: #data.optionId}}, {{: #data.id}}, this)‘/>
                    <span>{{: #data.value}}</span>
                </label>
            {{/for}}
        </div>
    </div>
</script>
<!--展示分类和搜索标签相关处理js代码开始-->
<script>

    /**
     * 展示分类和搜索标签对象
     * @type {{index: {index: number}, getEditClassify: goodsClassifyAndSearchTag."getEditClassify"}}
     */
    var goodsClassifyAndSearchTag = {
        "index": 1,
        "getFirstLevelClassify": function () { /** 获取一级展示类目,新增时父页面调用入口 **/
        var url = ‘/showClassify/getClassifyByPid?pid=‘ + 0;
            var ajaxObj = {url: configJS.hostUrl() + url, async: true, method: "GET"};
            commonJS.loading("open");
            commonJS.sendAjaxRequest(ajaxObj, function (value) {
                $("#first_classify").append($("#classifyTemplate").render(value));
            });
            commonJS.loading("close");
        },
        "getSecondClassify": function (e) { /** 获取二级展示类型 **/
        $("#second_classify").html("<option value=‘0‘>请选择</option>");
            $("#third_classify").html("<option value=‘0‘>请选择</option>");
            $("#commonTagDom").html("");
            $("#selectTagDom").html("");
            if($(e).val() == 0){
                return;
            }
            var url = ‘/showClassify/getClassifyByPid?pid=‘ + $(e).val();
            var ajaxObj = {url: configJS.hostUrl() + url, async: true, method: "GET"};
            commonJS.loading("open");
            commonJS.sendAjaxRequest(ajaxObj, function (value) {
                $("#second_classify").append($("#classifyTemplate").render(value));
            });
            commonJS.loading("close");
            goodsClassifyAndSearchTag.getSearchTag(e);
        },
        "getThirdClassify": function (e) {
            $("#third_classify").html("<option value=‘0‘>请选择</option>");
            $("#commonTagDom").html("");
            $("#selectTagDom").html("");
            if($(e).val() == 0){
                return;
            }
            var url = ‘/showClassify/getClassifyByPid?pid=‘ + $(e).val();
            var ajaxObj = {url: configJS.hostUrl() + url, async: true, method: "GET"};
            commonJS.loading("open");
            commonJS.sendAjaxRequest(ajaxObj, function (value) {
                $("#third_classify").append($("#classifyTemplate").render(value));
            });
            commonJS.loading("close");
            goodsClassifyAndSearchTag.getSearchTag(e);
        },
        "getSearchTag": function (e) {
            $("#commonTagDom").html("");
            $("#selectTagDom").html("");
            var classifyId = $(e).val();
            if(0 == classifyId){
                return;
            }
            goodsClassifyAndSearchTag.getClassifyCommonSearchOption(e);
            goodsClassifyAndSearchTag.getClassifySelectedSearchOption(e);
        },
        "getClassifyCommonSearchOption": function (e) { /** 查询当前分类的所有普通标签 **/
        var classifyId = $(e).val();
            var url = ‘/searchTag/getCommonOptionByClassifyId?classifyId=‘ + classifyId;
            var ajaxObj = {url: configJS.hostUrl() + url, async: true, method: "GET"};
            commonJS.loading("open");
            commonJS.sendAjaxRequest(ajaxObj, function (value) {

                $("div[name=‘commonTagDom‘]").html($("#commonTagTemplate").render(value));
                var commonRadios = $("div[name=‘commonTagDom‘]").find("input[type=‘checkbox‘]");
                $.each(commonRadios, function (n, commonRadio) {
                    var newName = goodsClassifyAndSearchTag.index + "_" + $(commonRadio).attr("name");
                    $(commonRadio).attr("name", newName);
                });
            });
            commonJS.loading("close");
        },
        "getClassifySelectedSearchOption": function (e) { /** 查询当前分类的所有一级级联搜索标签 **/
        var classifyId = $(e).val();
            var url = ‘/searchTag/getSelectedOptionByClassifyId?classifyId=‘ + classifyId + "&pid=0";
            var ajaxObj = {url: configJS.hostUrl() + url, async: true, method: "GET"};
            commonJS.loading("open");
            commonJS.sendAjaxRequest(ajaxObj, function (value) {
                $("div[name=‘selectTagDom‘]").html($("#childOptionTemplate").render(value));
                var selectRadios = $("div[name=‘selectTagDom‘]").find("input[type=‘checkbox‘]");
                $.each(selectRadios, function (n, selectRadio) {
                    var newName = goodsClassifyAndSearchTag.index + "_" + $(selectRadio).attr("name");
                    $(selectRadio).attr("name", newName);
                });

            });
            commonJS.loading("close");
        },
        "getChildSelectOption": function (parentOptionId, valueId, e) { /** 根据标签值id获取下级标签 **/
        var url = ‘/searchTag/getChildSelectedOptionByValueId?valueId=‘ + valueId;
            var ajaxObj = {url: configJS.hostUrl() + url, async: true, method: "GET"};
            commonJS.loading("open");
            commonJS.sendAjaxRequest(ajaxObj, function (value) {
                if(value==null||value.length==0){
                    return;
                }
                var parent = $($(e).parents().parents()[1]);
                if(e.checked){
                    value[0][‘valueId‘]=valueId;
                    var childHtml = $("#childOptionTemplate").render(value);
                    parent.after(childHtml);
                }else{
                    // 先删除所有后面的兄弟节点
                    var divs=parent.nextAll(‘div‘);
                    goodsClassifyAndSearchTag.deleteOptionDiv(divs,valueId);
                }
            });
            commonJS.loading("close");
        },
        "deleteOptionDiv":function(divs,valueId){
            $.each(divs,function(key,obj){
                if($(obj).attr("valueid")==valueId){
                    var inputs=$(obj).find(‘input‘);
                    $.each(inputs,function(key1,obj1){
                        if(obj1.checked){
                            goodsClassifyAndSearchTag.deleteOptionDiv(divs,$(obj1).attr(‘valueid‘));
                        }
                    });
                    $(obj).remove();
                }
            });
        },
        "getClassifyAndSearchTag": function (showClassifys) {//编辑时回写搜索标签,父页面调用入口
            var url = "/standardGroupV2/getClassifyAndSearchTag";
            var param = {};
            param["showClassifyList"] = showClassifys.showClassifyList;
            var ajaxObj = {url: configJS.hostUrl() + url, async: true, param: {"showClassifys": JSON.stringify(param)}, method: "POST"};
            commonJS.loading("open");
            commonJS.sendAjaxRequest(ajaxObj, function (value) {
                $.each(value, function (n, obj) {
                    var html = $($("#classify_template").html());

                    var firstLevelHtml = ‘‘;
                    var secondLevelHtml = ‘‘;
                    var thirdLevelHtml = ‘‘;

                    $.each(obj.showClassifyJsons, function (n, val) {
                        if(val.level == 1){
                            if(val.checked == true){
                                firstLevelHtml += "<option selected value=‘"+val.id+"‘>"+val.classilyName+"</option>";
                            }else{
                                firstLevelHtml += "<option value=‘"+val.id+"‘>"+val.classilyName+"</option>";
                            }

                        }else if(val.level == 2){
                            if(val.checked == true){
                                secondLevelHtml += "<option selected value=‘"+val.id+"‘>"+val.classilyName+"</option>";
                            }else{
                                secondLevelHtml += "<option value=‘"+val.id+"‘>"+val.classilyName+"</option>";
                            }
                        }else if(val.level == 3){
                            if(val.checked == true){
                                thirdLevelHtml += "<option selected value=‘"+val.id+"‘>"+val.classilyName+"</option>";
                            }else{
                                thirdLevelHtml += "<option value=‘"+val.id+"‘>"+val.classilyName+"</option>";
                            }
                        }
                    });
                    $("#first_classify").append(firstLevelHtml);
                    $("#second_classify").append(secondLevelHtml);
                    $("#third_classify").append(thirdLevelHtml);

                    // 加载普通标签
                    $("div[name=‘commonTagDom‘]").html($("#commonTagTemplate").render(obj.commonTagOptionJsons));
                    // 加载级联标签
                    $("div[name=‘selectTagDom‘]").html($("#selectTagTemplate").render(obj.selectTagOptionJsons));
                });
            });
            commonJS.loading("close");
        },
        "returnSelectedClassifyAndTag":function () {
            // 获取展示分类ID和搜索标签
            var classifyName = ‘‘;
            var classifyId = $("#third_classify").val();
            $.each($("#third_classify").find("option"), function (n, val) {
                if (val.selected) {
                    classifyName = $(val).html();
                }
            });
            if (0 == classifyId) {
                classifyId = $("#second_classify").val();
                $.each($("#second_classify").find("option"), function (n, val) {
                    if (val.selected) {
                        classifyName = $(val).html();
                    }
                });
            }
            if (0 == classifyId) {
                classifyId = $("#first_classify").val();
                $.each($("#first_classify").find("option"), function (n, val) {
                    if (val.selected) {
                        classifyName = $(val).html();
                    }
                });
            }

            if (0 != classifyId) {
                var classify = {
                    "classifyId": 0,
                    ‘classifyName‘: ‘‘,
                    "searchTags": []
                }
                classify.classifyId = classifyId;
                classify.classifyName = classifyName;
                var selectTagDom = $("#selectTagDom");
                var commonTagDom = $("#commonTagDom");
                var selectTagsEle = selectTagDom.find("input[type=‘checkbox‘]");
                var commonTagsEle = commonTagDom.find("input[type=‘checkbox‘]");
                for (var i = 0; i < selectTagsEle.length; i++) {
                    if (selectTagsEle[i].checked) {
                        var searchTag = {};
                        var optionId = $(selectTagsEle[i]).attr("optionid");
                        var optionValueId = $(selectTagsEle[i]).attr("valueid");
                        searchTag.optionId = optionId;
                        searchTag.optionValueId = optionValueId;
                        classify.searchTags.push(searchTag);
                    }
                }
                for (var i = 0; i < commonTagsEle.length; i++) {
                    if (commonTagsEle[i].checked) {
                        var searchTag = {};
                        var optionId = $(commonTagsEle[i]).attr("optionid");
                        var optionValueId = $(commonTagsEle[i]).attr("valueid");
                        searchTag.optionId = optionId;
                        searchTag.optionValueId = optionValueId;
                        classify.searchTags.push(searchTag);
                    }
                }
                return classify;
            }
        }
    }
</script>

调用页面的HTML文件中该模块的位置用velocity引用该组件:

#parse("/classify_search_tag.html")

调用页面的js文件中,调用入口方法即可:

新增调用

$(function () {
   goodsClassifyAndSearchTag.getFirstLevelClassify();/** 初始化一级展示分类 **/
});

编辑调用:

$(function () {
    goodsClassifyAndSearchTag.getClassifyAndSearchTag("需要的参数");/** 回显展示类目以及搜索标签 **/
});

获取选中的返回值:

goodsClassifyAndSearchTag.returnSelectedClassifyAndTag()
时间: 2024-10-11 09:02:27

使用velocity模板使javaWeb的html+js实现模块化的相关文章

使用 Velocity 模板引擎快速生成代码

原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-velocity1/ Velocity 是一个基于 Java 的模板引擎,它允许任何人仅仅简单的使用模板语言来引用由 Java 代码定义的对象,从而实现界面和 Java 代码的分离,使得界面设计人员可以和 Java 程序开发人员同步开发一个遵循 MVC 架构的 web 站点.但是在实际应用过程中,Velocity 又不仅仅被用在了 MVC 的架构中. Velocity 模板引擎介绍 在现今的软

java 利用spring JavaMailSenderImpl发送邮件,支持普通文本、附件、html、velocity模板

java 利用spring JavaMailSenderImpl发送邮件,支持普通文本.附件.html.velocity模板 博客分类: Java Spring 本文主要介绍利用JavaMailSenderImpl发送邮件.首先介绍了发送一般邮件,然后介绍了发送富文本(html)邮件及以velocity为模板发送邮件. 邮件发送分为为三步:创建邮件发送器.编写邮件.发送邮件. Spring的JavaMailSenderImpl提供了强大的邮件发送功能,可发送普通文本邮件.带附件邮件.html格式

【转】Velocity模板(VM)语言介绍

http://www.blogjava.net/caizh2009/archive/2010/08/20/329495.html Velocity是什么? Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象. 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人 员可以只关注页面的显

改造Velocity模板引擎让$[!]{}输出默认进行html转义,并增加$#{}语法支持不转义输出

一直以来在项目中使用Apache Velocity模板引擎作为视图层输出,为了解决XSS漏洞,需要对输出到页面的内容进行HTML转义,我一般采用2种方式实现: 使用过滤器 Filter,在其中进行 HttpServletRequestWrapper 的 getParameter( )等方法重载,在底层进行HTML转义,然后页面直接输出: 这种方式很轻松很直接,业务代码不需要修改就完成了所有的转义工作:但是也带来了问题:修改了用户的原始输入数据,如果需要用到用户的原始输入数据,又得反转义回去,很麻

java vm(velocity)模板

Velocity是什么?  Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象.  当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人 员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码.Velocity将java代码从web页面中分离出来,这样为web站点的长

转 如何使用velocity模板引擎开发网站

基于 Java 的网站开发,很多人都采用 JSP 作为前端网页制作的技术,尤其在是国内.这种技术通常有一些问题,我试想一下我们是怎样开发网站的,通常有几种方法: 1:功能确定后,由美工设计网页的UI(界面)部分,然后由程序员在其上加入代码显示逻辑(比如循环,判断显示数据结果).也就是通常的 jsp 页面制作,当然这部分可以由美工完成模板,然后由 jsp 工程师再继续以它为原型创建相应的 jsp 页面. 2:功能确定后,由美工设计网页的UI(界面)部分,然后由网页制作人员在其上加入代码显示逻辑(比

Spring+Velocity模板发送邮件

Spring+Velocity模板发送邮件 1.在eclipse中新建一个Java Project, 命名为spring-velocity-mail 2.在项目下新建一个lib目录,导入需要的jar包 依赖包如下: commons-collections-3.2.1.jar commons-lang-2.6.jar commons-logging-1.2.jar mail.jar spring-beans-3.2.2.jar spring-context-3.2.2.jar spring-con

Struts2中使用Velocity模板时模板资源路径配置问题

在Struts2中使用Velocity模板时,如何以相对与Web工程的路径来配置模板资源文件路径这个问题网上千篇一律的来自Velocity官方文档.官方文档中指出如果是Web工程的话,模板的相对路径是工程根路径,今天在使用的时候有如下配置: Velocity.properties(默认在WEB-INF下): resource.loader =file, classclass.resource.loader.description = Velocity Classpath Resource Loa

velocity模板技术生成word文档

本文介绍采用velocity技术在Java中生成word文档的方法. 1.新建一个word文档,编辑内容如下: 2.将上述word文档另存为htm格式的文件 3.新建一个Java Project项目velocityTest,加入Velocity所依赖的Jar包velocity-dep-1.5-beta2.jar. 4.在src目录下新建一个velocity.vm文件,将第二步生成的velocity.htm用文本编辑器打开,复制内容到velocity.vm中.内容如下: <html xmlns:v