`
chenlei65368
  • 浏览: 6013 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用Beetl实现静态页生成

阅读更多
使用Beetl 1.1实现静态页的生成。
使用struts1.2
首先在Lisener中设置ServletGroupTemplate相关配置。
模版文件位于WEB-INF/template下
public class InitLisener implements ServletContextListener{
	static Log log = LogFactory.getLog(InitLisener.class);
	
	public void contextDestroyed(ServletContextEvent arg0) {
		ActionServletContext.destroyed();
	}

	public void contextInitialized(ServletContextEvent event) {
		log.info("加载资源文件");
		ServletContext context = event.getServletContext();
		String configPath = context.getRealPath("//");
		ServletGroupTemplate.intance().init(context);
	    ServletGroupTemplate.intance().getGroup().config("<!--:", "-->", "${", "}");
	    ServletGroupTemplate.intance().getGroup().setCharset("UTF-8");
	    ServletGroupTemplate.intance().getGroup().registerFunction("fn.substring",new SubStringFunction());
	    ServletGroupTemplate.intance().getGroup().registerFunction("fn.length",new LengthFunction());
	    
		//context.setAttribute("templatepath", context.getRealPath("WEB-INF/template"));
		System.out.println(context.getRealPath("WEB-INF/template"));
		
		ActionServletContext.setServletContext(context);
		//PropertiesUtil.loadConfig();
	}

}


Action类,其中模拟了一些数据,输出路径为跟路径,文件名为index.html
public class StaticPageAction extends Action {
	/*
	 * Generated Methods
	 */

	/**
	 * Method execute
	 * 
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return ActionForward
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		PrintWriter pWriter = null;
		ActionForward forward = new ActionForward();
		response.setCharacterEncoding("UTF-8");
		
		String templatePath = (String) ActionServletContext.getServletContext()
				.getAttribute("templatepath");
		String rootpath = ActionServletContext.getServletContext().getRealPath(
				"/");
		rootpath = rootpath + "/index.html";
		
		List<Channel> channelList = getNewsData();
		try {
			pWriter = response.getWriter();
			Template template = ServletGroupTemplate.intance().getTemplate(
					"/index.html", request, response);
			template.set("channelList", channelList);
			template.set("user", "chenlei");
			template.set("Chal", new Channel(1, "栏目test", "栏目说明", 0, 10, 30));

			StringWriter writer = new StringWriter();
			template.getText(writer);
			// false为从文件开始处写入
			OutputStreamWriter outWriter = new OutputStreamWriter(
					new FileOutputStream(rootpath, false), "UTF-8");
			System.out.println(writer.toString());

			Writer out = new BufferedWriter(outWriter);
			out.write(writer.toString());
			out.flush();
			out.close();

			pWriter.print("输出首页成功!<a href='index.jsp'>返回</>");
		} catch (IOException e) {
			pWriter.print("输出首页失败!");
		} catch (BeeException e) {
			// e.printStackTrace();
		}

		return null;
	}

	private List<Channel> getNewsData() {

		List<Channel> newList = new ArrayList<Channel>(20);
		for (int i = 1; i <= 10; i++) {
			Channel chnnel = new Channel(i, "栏目" + i, "栏目说明" + i, 0, 10, 30);
			for (int j = 1; j <= 11; j++) {
				News news = new News(
						j + i,
						"新闻消息" + j + i,
						"新华社消息: 控制语句占位符号是/<!--: ,这样,尽可能然模板少破坏原有文件,你可以通过浏览器直接浏览模板文件",
						new Date(), "chnnal/news/" + j + i + "html");
				news.setChannelId(i);
				news.setChannelTitle(chnnel.getChnnelTitle());
				chnnel.addNewsList(news);
			}
			newList.add(chnnel);
		}
		return newList;
	}
}


模版文件:index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Index.html</title>
	
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

  </head>
  
  <body>
  <!--:if(user!=null){  -->
  	你好!${user}<br>
  	${Chal.chnnelTitle}
  	${channelList.~size}
  <!--:}  -->
    栏目列表
    
   <div>
   
   <!--: if(channelList.~size!=0){
      for(Channel in channelList){  -->
   <span style="color:red;">${Channel.chnnelTitle}</span>
   	<ul>
		<!--:
		 for(News in Channel.newsList){-->
   		<li>[<!--:if(fn.length(News.channelTitle)>2){ -->${fn.substring(News.channelTitle,0,2)}…<!--: }else{ -->${News.channelTitle} <!--:} -->]-${News.title}---[${News.newdate,dateFormat='yyyy-MM-dd'}]</li>
   		<!--: } -->
   	</ul>
   	<!--: }
   	}else {  -->
   	<span style="color:red;">没有数据</span>
   	<!--:}  -->
   </div>
  </body>
</html>

web.xml中的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <listener>
    <listener-class>com.otos.cl.common.listerner.InitLisener</listener-class>
  </listener>
  <context-param>
<param-name>GroupTemplate.Root</param-name>
<param-value>/WEB-INF/template</param-value>
</context-param>
<context-param>
<param-name>GroupTemplate.Optimize</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>GroupTemplate.NativeCall</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>GroupTemplate.Check</param-name>
<param-value>2</param-value>
</context-param>
  <filter>
    <filter-name>encode</filter-name>
    <filter-class>com.otos.cl.common.filter.FilterEncoding</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encode</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <servlet>
    <servlet-name>act</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>act</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    
  </welcome-file-list>
</web-app>

由于要对显示的字符串进行截取,定义了两个函数:
/**
 * 用于在模版中截取字符串长度的函数
 * 
 * @author chenl
 * 
 */
public class SubStringFunction implements Function {

	public Object call(Object[] objects, Context ctx) {
		String parentStr = "";
		Integer start = 0;
		Integer end = 0;
		Object str = objects[0];
		if (str == null) {
			return "";
		} else {
			parentStr = String.valueOf(str);
		}

		Object startindex = objects[1];
		if (startindex == null) {
			return "";
		} else {
			start = Integer.valueOf(startindex.toString());
		}
		if (objects.length >= 3) {
			Object endindex = objects[2];
			if (endindex != null) {
				end = Integer.valueOf(endindex.toString());
			}
		}
		if (start < 0 || end < 0) {
			throw new IllegalStateException("SubString函数中参数startindex和endindex不能小于0");
		}

		int length = parentStr.length();

		if (length == 1) {
			return parentStr;
		} else {
			if (end == 0)
				parentStr = parentStr.substring(start);
			else
				parentStr = parentStr.substring(start, end);
		}

		return parentStr;
	}
}


/**
 * Beetl自定义函数
 * @author chenl
 *
 */
public class LengthFunction implements Function {

	public Object call(Object[] arg0, Context arg1) {
		int length = 0;
		if(arg0.length==1){
			Object obj = arg0[0];
			if(obj instanceof String) {
				length = ((String) obj).length();
			}else if(obj instanceof Integer){
				length = ((String) obj).length();
			}else if(obj instanceof Double){
				length = ((String) obj).length();
			}else if(obj instanceof Float){
				length = ((String) obj).length();
			}else{
				throw new IllegalStateException("参数不正确");
			}
		}else{
			throw new IllegalStateException("参数不正确");
		}
		return length;
	}

}


生成结果:index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Index.html</title>
	
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  
  <body>
  	你好!chenlei<br>
  	栏目test
  	10
    栏目
    
   <div>
   
   <span style="color:red;">栏目1</span>
   	<ul>
   		<li>[栏目…]-新闻消息11---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息21---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息31---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息41---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息51---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息61---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息71---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息81---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息91---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息101---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息111---[2012-05-07]</li>
   	</ul>
   <span style="color:red;">栏目2</span>
   	<ul>
   		<li>[栏目…]-新闻消息12---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息22---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息32---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息42---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息52---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息62---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息72---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息82---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息92---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息102---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息112---[2012-05-07]</li>
   	</ul>
   <span style="color:red;">栏目3</span>
   	<ul>
   		<li>[栏目…]-新闻消息13---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息23---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息33---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息43---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息53---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息63---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息73---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息83---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息93---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息103---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息113---[2012-05-07]</li>
   	</ul>
   <span style="color:red;">栏目4</span>
   	<ul>
   		<li>[栏目…]-新闻消息14---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息24---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息34---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息44---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息54---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息64---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息74---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息84---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息94---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息104---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息114---[2012-05-07]</li>
   	</ul>
   <span style="color:red;">栏目5</span>
   	<ul>
   		<li>[栏目…]-新闻消息15---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息25---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息35---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息45---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息55---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息65---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息75---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息85---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息95---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息105---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息115---[2012-05-07]</li>
   	</ul>
   <span style="color:red;">栏目6</span>
   	<ul>
   		<li>[栏目…]-新闻消息16---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息26---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息36---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息46---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息56---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息66---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息76---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息86---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息96---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息106---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息116---[2012-05-07]</li>
   	</ul>
   <span style="color:red;">栏目7</span>
   	<ul>
   		<li>[栏目…]-新闻消息17---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息27---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息37---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息47---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息57---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息67---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息77---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息87---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息97---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息107---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息117---[2012-05-07]</li>
   	</ul>
   <span style="color:red;">栏目8</span>
   	<ul>
   		<li>[栏目…]-新闻消息18---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息28---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息38---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息48---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息58---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息68---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息78---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息88---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息98---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息108---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息118---[2012-05-07]</li>
   	</ul>
   <span style="color:red;">栏目9</span>
   	<ul>
   		<li>[栏目…]-新闻消息19---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息29---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息39---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息49---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息59---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息69---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息79---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息89---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息99---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息109---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息119---[2012-05-07]</li>
   	</ul>
   <span style="color:red;">栏目10</span>
   	<ul>
   		<li>[栏目…]-新闻消息110---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息210---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息310---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息410---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息510---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息610---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息710---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息810---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息910---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息1010---[2012-05-07]</li>
   		<li>[栏目…]-新闻消息1110---[2012-05-07]</li>
   	</ul>
   </div>
  </body>
</html>


感觉自定义函数功能不错,但是也麻烦了些,两个函数就要写两个类。
如果能归类就好了,比如对字符串的操作,一个自定义函数中不同的方法就可以搞定。
分享到:
评论
2 楼 chenlei65368 2012-05-18  
mycom
javamonkey 写道
非常好的建议啊,可以让GroupTempl注册一个特殊的类,此类实现FunctionPackage接口

class myStringsFunction implments FunctionPackage
{

   @Override
   public String getPackageName(){
     return "mycom.string"
    }

    public string substring(String str,int,int,Context ctx){........}

    public int lenght(String str,Context ctx){...........}
}

然后,GroupTemplate.registerFunctionPackage(new myStringsFunction() )

这样,就可以在模板里使用
${mycom.string.substring("abcddd",1,4)}

你觉得怎么样?

这样不错
1 楼 javamonkey 2012-05-18  
非常好的建议啊,可以让GroupTempl注册一个特殊的类,此类实现FunctionPackage接口

class myStringsFunction implments FunctionPackage
{

   @Override
   public String getPackageName(){
     return "mycom.string"
    }

    public string substring(String str,int,int,Context ctx){........}

    public int lenght(String str,Context ctx){...........}
}

然后,GroupTemplate.registerFunctionPackage(new myStringsFunction() )

这样,就可以在模板里使用
${mycom.string.substring("abcddd",1,4)}

你觉得怎么样?

相关推荐

    beetl-master.zip

    Beetl是一款强大的Java模板引擎,它主要用于动态页面和静态页面的生成,以及代码、XML、PDF、WORD等格式的生成。在Web开发中,模板引擎是连接后端逻辑和前端展示的重要工具,它允许开发者将业务逻辑和视图分离,提高...

    Beetl2.7.14中文文档.pdf

    - 微观层面,通过一维数组保存上下文、静态文本合并处理、重复使用字节数组来避免Java频繁创建和销毁数组、模板缓存和运行时优化等。 ### 独特功能 1. **自定义占位符和控制语句起始符号:** 这些功能可以减小...

    Springboot 集成Beetl模板

    而Beetl则是一款强大的、高性能的模板引擎,能够帮助开发者将动态数据与静态HTML模板结合,生成最终的网页。 首先,让我们了解Beetl的基本概念。Beetl设计的目标是简洁、高效和易用,它的语法接近自然语言,使得...

    Beetl模板引擎 v3.1

    为您提供Beetl模板引擎下载,Beetl相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,开发和维护模板有很好的体验。是新一代的模板引擎。总得来说,它的特性如下:1、功能完备:同主流的java模板引擎相比...

    用springboot+mybatis+beetl开发的一款CMS,支持自定义内容模型、模板标签、全站静态化等功能

    在CicadasCMS中,Beetl负责页面渲染,允许开发者使用强大的模板语言来创建动态网页,同时支持自定义标签库,使得模板更加灵活和模块化。 关于自定义内容模型,CicadasCMS允许用户根据需求定义不同的数据结构,例如...

    基于Java的实例源码-模板语言 Beetl.zip

    Java模板语言Beetl是一个强大的、高效的、易用的模板引擎,主要应用于Web开发中,用于将静态HTML模板与动态数据结合,生成最终的HTML页面。这个压缩包包含的是一系列基于Java实现的Beetl模板语言实例源码,帮助...

    基于java的模板语言 Beetl.zip

    同时,由于其良好的扩展性和灵活性,Beetl也常被用于生成静态文件、邮件内容、报表等多种场景。 总的来说,Beetl作为Java的一种高效模板语言,以其简洁的语法、强大的功能和优秀的性能,为Java开发者提供了便捷的...

    Java模板语言 Beetl

    - **模板语言**: 模板语言是用于生成动态HTML或其他格式文档的一种编程语言,它允许开发者将静态内容与动态数据相结合。 - **Beetl语法**: Beetl语法简洁且接近Java,支持表达式、控制结构(如if/else、for循环)...

    Beetl2.9 中文文档.pdf

    Beetl还具有局部渲染技术,结合现代JavaScript的ajax技术,可以在Web应用中实现动态内容的异步加载和更新。Beetl适合用于各种模板应用,包括代码生成工具、CMS系统、普通网站、超高访问量的门户系统,以及与富客户端...

    基于Java的模板语言 Beetl.zip

    - **文档生成**:在生成报表、PDF、Excel等静态文档时,Beetl也能发挥重要作用。 5. **优化与性能** - **预编译**:预编译模板可以显著提升运行效率,减少解析时间。 - **模板缓存**:对经常使用的模板进行缓存...

    Beetl模板引擎 v3.15.14.zip

    模板引擎的主要任务是将静态模板与动态数据结合,生成最终的HTML或其他格式的输出。Beetl的设计理念是尽可能接近自然语言,让开发者编写模板时感觉更自然,减少学习成本。它的语法简洁,支持多种控制结构,如条件...

    Beetl java模板引擎 v3.3.1.zip

    Beetl是一款强大的Java模板引擎,它为Java开发者提供了一种高效、简洁的方式来将静态模板与动态数据结合,生成HTML、XML、JSON等格式的输出。在Beetl v3.3.1版本中,我们可以期待一系列的改进和优化,以提升开发效率...

    IDEA配置btl文件类型为html.docx

    Beetl模板引擎是一款基于Java的模板引擎,用于生成静态网页的模板文件。.btl文件类型是Beetl模板引擎的默认文件类型,它包含了模板的定义和逻辑。 在Java项目中,使用Beetl模板引擎可以提高开发效率和质量。Beetl...

    矢量切片绘图Demo

    这个"矢量切片绘图Demo"项目是针对这一技术的一个实践应用,它利用SpringBoot框架和BeetlSQL数据库工具来实现动态生成和保存矢量切片。 首先,让我们深入了解一下矢量切片。矢量数据通常包含点、线和多边形等几何...

    Guns 技术文档 旗舰版v2.3.pdf

    核心思想 5.1 分包 5.2 统一异常拦截 5.2.1 介绍 5.2.2 优点 5.2.3 关于性能 5.3 结果包装器 5.3.1 如何使用 5.3.2 ConstantFactory 5.4 前端思想 5.4.1 布局 5.4.2 标签 5.4.3 手动新增标签页 6. 常见问题答疑 6.1...

    基于 JFinal 2.0 开发的 Java 版商城,主要实现基本的商城功能.zip

    3. **模板引擎**:JFinal 集成了 Beetl 或 Freemarker 等模板引擎,用于渲染前端页面,实现动态数据展示。 4. **拦截器**:利用拦截器实现权限控制,比如只有登录用户才能访问某些页面或执行某些操作。 5. **插件...

    Jeesite框架自定义上下文对象:ctx和${ctxStatic}.docx

    - 在Beetl模板中,可以直接使用`ctxf`来构建URL,如`${ctxf}/myPage"&gt;我的页面&lt;/a&gt;`,这将生成`我的页面&lt;/a&gt;`的HTML代码。 - 如果需要添加更多的自定义变量,只需在`afterPropertiesSet()`方法中按照`sharedVars....

    某开源项目Guns技术文档+个人总结

    开发手册部分涵盖了Guns的核心技术点,包括对项目结构的理解、模块划分、包结构设计、数据库建表、代码生成、菜单添加与权限分配、业务代码编写、权限控制与校验、多数据源配置、分页技术、数据范围使用、guns-rest...

    jfinal_common_maven_jfinal_

    Freemarker 是一种基于模板的静态文本生成器,而 Beetl 则提供了一套更为丰富的语法和强大的功能,包括变量、控制结构、函数等。在实际应用中,我们可以通过配置 JFinal 的启动参数,来指定使用哪种模板引擎。例如,...

    Guns技术文档.docx

    - **为何使用Beetl**:解释Guns选用Beetl作为模板引擎的原因。 - **为何有的业务没有Service层**:解答为何部分业务逻辑不使用Service层的原因。 - **为何既有DAO,又有Mapper**:解释Guns项目中DAO和Mapper层的区别...

Global site tag (gtag.js) - Google Analytics