freemarker自定义标签

freemark:模板引擎


freemarker提供模板,Java提供数据,合在一起出现效果


1.Template file:模板文件
2.Java Object:Java对象,一般通过Map封装对象
3. (1,2)通过freemark引擎处理输出数据 






模板:index.ftl
.ftl:freemarker Temlate简称,可随意定义
取值:${user}


Java文件:
1.创建freemarker配置实例
Configuration cfg=new Configuration ();
cfg.setDirecoryForTemplateLoading(new File("template"))


2.创建数据模型
Map root=new HashMap();
root.put(“user”,"admin");


3.加载模板文件
Tumplate tl=cfg.getTumplate("index.ftl");


4.显示生成的数据
Writer out=new OutputStreamWriter(System.out);
tl.procues(root,out);

out.flush


package com.shop.front.tag;


import com.shop.front.bean.NewsListBean;
import com.shop.front.bean.PageBean;
import com.shop.front.service.ITagNewsListService;
import freemarker.core.Environment;
import freemarker.template.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 类描述:新闻列表标签
 * 创建人:liuhao
 */
@Component("TagNewsList")
public class TagNewsListDirective implements TemplateDirectiveModel {
    @Autowired
    private ITagNewsListService tagNewsListServiceImpl;

    @Override
    public void execute(Environment environment, Map map, TemplateModel[] templateModels, TemplateDirectiveBody templateDirectiveBody) throws TemplateException, IOException {
        //栏目id
        String cidsValue = map.get("cids") + "";
        String cids = null;
        if (cidsValue != null && !"null".equals(cidsValue)) {
            cids = cidsValue;
        } else {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            String cidValue = request.getParameter("cid") + "";

            String cid = null;
            if (cidValue != null && !"null".equals(cidValue)) {
                cids = cidValue;
                request.setAttribute("cid", cidValue);
            }
        }


        //是否分页
        String isPageValue = map.get("isPage") + "";
        Boolean isPage = false;
        if (isPageValue != null && "true".equals(isPageValue)) {
            isPage = true;
        }

        //显示条数
        String countValue = map.get("count") + "";//这里模版页面传进来的参数
        Integer count = null;
        if (countValue != null && !"null".equals(countValue)) {
            count = Integer.parseInt(countValue);
        }
        //栏目标识
        String markerValue = map.get("marker") + "";//这里模版页面传进来的参数
        String marker = null;
        if (markerValue != null && !"null".equals(markerValue)) {
            marker = markerValue;
        }
        //标题长度
        String titLenValue = map.get("titLen") + "";//这里模版页面传进来的参数
        Integer titLen = null;
        if (titLenValue != null && !"null".equals(titLenValue)) {
            titLen = Integer.parseInt(titLenValue);
        }
        //标题长度
        String subLenValue = map.get("subLen") + "";//这里模版页面传进来的参数
        Integer subLen = null;
        if (subLenValue != null && !"null".equals(subLenValue)) {
            subLen = Integer.parseInt(subLenValue);
        }
        //时间格式
        String dateFormatValue = map.get("dateFormat") + "";//这里模版页面传进来的参数
        String dateFormat = null;
        if (dateFormatValue != null && !"null".equals(dateFormatValue)) {
            dateFormat = dateFormatValue;
        }
        //截取标题长度后省略
        String appendValue = map.get("append") + "";//这里模版页面传进来的参数
        String append = null;
        if (appendValue != null && !"null".equals(appendValue)) {
            append = appendValue;
        }
        //排序,0表sort倒序,1表sort升序,2表时间倒序,3表时间升序,4表sort倒序和时间倒序
        String orderValue = map.get("order") + "";//这里模版页面传进来的参数
        Integer order = null;
        if (orderValue != null && !"null".equals(orderValue)) {
            order = Integer.parseInt(orderValue);
        }
        PageBean pageBean = new PageBean();

        if (isPage) {
            String urlPath = getRequestURL();
            //url前面部分
            String frontUrl = urlPath.substring(0, urlPath.lastIndexOf("/") + 1);
            //url后面部分
            String lastUrl = urlPath.substring(urlPath.lastIndexOf("/") + 1, urlPath.length());
            Integer currentPage = 1;
            if (lastUrl.indexOf("_") != -1) {
                currentPage = Integer.valueOf(lastUrl.substring(lastUrl.lastIndexOf("_") + 1, lastUrl.indexOf(".htm")));
            } else {
                currentPage = 1;
            }
//            //当前页面码
//            String currentPageValue = map.get("currentPage")+"";
//
//            if (currentPageValue!=null && !"null".equals(currentPageValue)) {
//                currentPage = Integer.parseInt(currentPageValue);
//            }

            pageBean = tagNewsListServiceImpl.getPageBean(cids, marker, count, currentPage);


            String homePage = null;
            String prevPage = null;
            String nextPage = null;
            String trailerPage = null;

            if (pageBean.getTotalPages() > 1) {
                //当前页面大于1,小于总页数
                if (currentPage > 1 && currentPage < pageBean.getTotalPages()) {
                    homePage = frontUrl + "index.htm";

                    prevPage = frontUrl + "index_" + (currentPage - 1) + ".htm";
                    nextPage = frontUrl + "index_" + (currentPage + 1) + ".htm";

                    trailerPage = frontUrl + "index_" + pageBean.getTotalPages() + ".htm";
                } else if (currentPage == 1) {
                    nextPage = frontUrl + "index_" + (currentPage + 1) + ".htm";
                    trailerPage = frontUrl + "index_" + pageBean.getTotalPages() + ".htm";
                } else if (currentPage == pageBean.getTotalPages()) {
                    homePage = frontUrl + "index.htm";
                    prevPage = frontUrl + "index_" + (currentPage - 1) + ".htm";
                }

            }
            pageBean.setHomePage(homePage);
            pageBean.setPrevPage(prevPage);
            pageBean.setNextPage(nextPage);
            pageBean.setTrailerPage(trailerPage);


        }
        TemplateModel templateModelPageBean = ObjectWrapper.DEFAULT_WRAPPER.wrap(pageBean);
        environment.setVariable("pageBean", templateModelPageBean);

        List<NewsListBean> list = tagNewsListServiceImpl.getNewsList(cids, count, pageBean.getStartRow(), marker, titLen, subLen, dateFormat, order, append);

        TemplateModel templateModel = ObjectWrapper.DEFAULT_WRAPPER.wrap(list);
        environment.setVariable("list", templateModel);
        if (templateDirectiveBody != null) {
            try {
                templateDirectiveBody.render(environment.getOut());
            } catch (Exception e) {
                e.printStackTrace();
            }

        } else {
            throw new RuntimeException("missing body");
        }


    }

    //JAVA 获取完整URL 方法
    public String getRequestURL() {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        if (request == null) {
            return "";
        }
        String url = "";
        url = request.getContextPath();
        url = url + request.getServletPath();
        java.util.Enumeration names = request.getParameterNames();
        int i = 0;

        if (names != null) {
            while (names.hasMoreElements()) {
                String name = (String) names.nextElement();
                if (i == 0) {
                    url = url + "?";
                } else {
                    url = url + "&";
                }
                i++;

                String value = request.getParameter(name);
                if (value == null) {
                    value = "";
                }

                url = url + name + "=" + value;
                try {
                    // java.net.URLEncoder.encode(url, "ISO-8859");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        try {
            // String enUrl = java.net.URLEncoder.encode(url, "utf-8");
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return url;
    }

    public ITagNewsListService getTagNewsListServiceImpl() {
        return tagNewsListServiceImpl;
    }

    public void setTagNewsListServiceImpl(ITagNewsListService tagNewsListServiceImpl) {
        this.tagNewsListServiceImpl = tagNewsListServiceImpl;
    }
}

.ftl:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>商城首页</title>
</head>
<body>

<@TagNewsList cids='1'>
 <#list list as l>
    ${l.title}<br>
  ${l.subTitle}<br>

 ${l.titleImage}<br>
 ${l.author}<br>
</#list>
</@TagNewsList>

</body>
</html>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Spring Boot 中使用 Freemarker 自定义标签,可以通过以下步骤实现: 1. 创建一个自定义标签类,继承 `freemarker.template.TemplateDirectiveModel` 接口,并实现其中的 `execute` 方法,该方法用于处理自定义标签的逻辑。 ```java @Component public class CustomTagDirective implements TemplateDirectiveModel { @Autowired private UserService userService; // 举例注入一个服务类 @Override public void execute(Environment environment, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { // 处理自定义标签逻辑,可以使用 environment、params、body 等参数 String userId = params.get("userId").toString(); User user = userService.getUserById(userId); environment.getOut().write(user.getName()); } } ``` 2. 在 Spring Boot 的配置文件中注册自定义标签类。 ```java @Configuration public class FreemarkerConfig { @Autowired private CustomTagDirective customTagDirective; @Bean public FreeMarkerConfigurer freeMarkerConfigurer() { FreeMarkerConfigurer configurer = new FreeMarkerConfigurer(); configurer.setTemplateLoaderPath("classpath:/templates"); Map<String, Object> variables = new HashMap<>(); variables.put("customTag", customTagDirective); configurer.setFreemarkerVariables(variables); return configurer; } } ``` 3. 在 Freemarker 模板中使用自定义标签。 ```html <#assign userId = "1" /> <@customTag userId=userId /> ``` 在以上代码中,我们首先通过 `<#assign>` 定义了一个变量 `userId`,然后通过 `<@customTag>` 调用自定义标签,并将 `userId` 作为参数传入。 这样就可以在 Spring Boot 中使用自定义Freemarker 标签了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值