JFinal使用技巧-在JSP中使用Enjoy

相信用过魔板的伙伴很难再使用其他的渲染方式了, 比如JSP等...

但是身在江湖, 老客户提的新需求还得在老项目中做不是... 而且由于历史遗留问题... 还不能简单的全部切换到新技术中去...

那么就简单的写个插件用下吧... 分享一下

  1. 利用jsp的自定义标签Tag

package com.momathink.common.tag;

import java.io.IOException;
import java.io.StringWriter;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;

import com.jfinal.kit.PathKit;
import com.jfinal.template.Engine;
import com.jfinal.template.Template;

/***
 * 让JSP也用上jfinal的模版引擎
 * 
 * @author dufuzhong
 */
public class TemplateTag extends SimpleTagSupport  {
    private static Engine engine = null;
    private String render = null;

    public String getRender() {
        return render;
    }

    public void setRender(String render) {
        this.render = render;
    }

    public static Engine getEngine() {
        if (engine != null) {
            return engine;
        }
        engine = Engine.create(TemplateTag.class.getName())
                .setDevMode(true)
                .setBaseTemplatePath(PathKit.getWebRootPath());
        return engine;
    }

    /***
     * 自己定义 Engine
     * @param engine
     */
    public static void setEngine(Engine engine) {
        if (engine == null) {
            throw new IllegalArgumentException("engine can not be null");
        }
        TemplateTag.engine = engine;
    }

    @Override
    public void doTag() throws JspException, IOException {
        Template template = null;
        if(getRender() != null) {
            // 使用文件模版
            template = getEngine().getTemplate(getRender());
        }else {
            // 使用JSP标签体内的字符串模版
            StringWriter sw = new StringWriter();
            getJspBody().invoke(sw);
            template = getEngine().getTemplateByString(sw.toString());
        }
        template.render(getData(), getJspContext().getOut());
    }

    private Map<Object, Object> getData() {
        HttpServletRequest request = getRequest();
        
        Map<Object, Object> data = new HashMap<Object, Object>(16);
        for (Enumeration<String> attrs = request.getAttributeNames();
                attrs.hasMoreElements();) {
            String attrName = attrs.nextElement();
            data.put(attrName, request.getAttribute(attrName));
        }
        return data;
    }

    protected HttpServletRequest getRequest() {
        return (HttpServletRequest) ((PageContext)this.getJspContext()).getRequest();
    }

}


2.注册 Tag ,  根目录/common/建一个文件: jfinal.tld (可以建其他地方和下面地址对上就可以了)

<?xml version="1.0" encoding="UTF-8"?>
<taglib>
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>  
    <short-name>challen</short-name>  
    
     <tag>
        <name>template</name>
        <tag-class>com.momathink.common.tag.TemplateTag</tag-class>
        <body-content>scriptless</body-content>
        <attribute>
            <name>render</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
      
</taglib>

3 . web.xml 中加入taglib

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
   <jsp-config>
    <taglib>
       <taglib-uri>/common/jfinal.tld</taglib-uri>
       <taglib-location>/common/jfinal.tld</taglib-location>
    </taglib>
  </jsp-config> 
  <filter>
    <filter-name>jfinal</filter-name>
    <filter-class>com.jfinal.core.JFinalFilter</filter-class>
    <init-param>
      <param-name>configClass</param-name>
      <param-value>写你自己的Config路径</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>jfinal</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>


4 . 例子使用 : JSP页面顶部加入

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="jfinal" uri="/common/jfinal.tld" %>
<html>
<head>
... 省略一万字的html标签
    <div>
      <!-- 模版文件渲染  -->
      <jfinal:template render="/workbench/你自已的Template.html"/>
      
      <!-- 字符串模版渲染  -->
      <jfinal:template>
         #("你好 jfinal template")
         ${xxx}//混用也可以的
     </jfinal:template>
    </div>
... 省略一万字的html标签
</body>
</html>


过渡期的项目也可以用下
23333 就算老项目我也要嗨起来~~~ JFinal使用技巧~点个赞呗~

评论区

不要香菜

2017-11-18 21:57

不扶墙就服你

david wang

2017-11-18 22:01

不扶墙就服你

JFinal

2017-11-19 22:53

这种用法太有创意了,逼你用 JSP 的客户是拿你一点办法都没有 ^_^

嘉佑丶

2017-11-21 09:49

嗨起来~~~

北流家园网

2017-11-21 14:42

这种创意意义不大吧,JSP本来就有很多好用的标签了。enjoy最大的优点就是直接在HTML中书写,JSP编辑器加载速度太慢。如果JSP用得顺手,还是JSP标签强大。

穿越123

2017-11-21 15:57

赶紧换jfinal模板引擎吧,比jsp用的不知道爽多少倍,jsp太难用了

杜福忠

2017-11-21 17:02

@北流家园网 @穿越123
(┬_┬) 必须感觉不一样啊.. JSP与enjoy差了一个时代.. 老人机与智能机的区别啊...
分享上面有提到是老项目的代码历史遗留问题. 不能简单的替换到enjoy , 时间人力成本不够折腾的, 用过enjoy 根本就回不到jsp了... 所以就加个插件 ,,,在老项目中 继续用enjoy啊

穿越123

2017-11-22 08:56

欲风217

2017-11-22 14:23

不扶墙就服你

tosur

2017-11-23 14:56

能使用表达式吗?比如#if()#end

杜福忠

2017-11-23 15:12

@tosur enjoy必然是可以的啊, 分享的这个方法只是让jsp去调取enjoy , 并没有做其他的事情哈

tosur

2017-11-23 16:30

咋用表达式,直接写不行

tosur

2017-11-23 16:53

只能在HTML使用enjoy 命令?比如#if()#end ,在JSP里怎么用

杜福忠

2017-11-23 17:17

@tosur
最好是分开写, 不然把接手的人看懵逼了... 没法维护了..
比如我这边是用 类似引用的感觉:
< div>
< !-- 模版渲染 -->
< jfinal:template render="/workbench/你自已的Template.html" / >
< /div>
这样分开, 语法 , 就不会乱入了

tosur

2017-11-23 17:18

有不分开的办法不? 分开有写很多html页面,现在就是想用enjoy的命令代替jstl

zhongshg

2017-11-28 08:48

先赞再问:老项目只要加入enjoy.jar包就可以这样用吗?

杜福忠

2017-11-28 08:53

@zhongshg 是的哈, 必须可以

不知所以

2017-12-02 21:53

@撒的大声地

杜福忠

2017-12-03 00:51

@tosur 今天晚上睡不着... 看俱乐部直播的时候看见有人@ 我这篇文章了...
翻来看看... 你说的这种方式也是没有问题的, 然后我就扩展了一下

< jfinal:template>
#("你好 jfinal template")
< /jfinal:template>

@zhongshg

热门分享

扫码入社