码迷,mamicode.com
首页 > 其他好文 > 详细

JFinal+maven+freemarker 入门教程

时间:2014-12-29 12:18:08      阅读:1331      评论:0      收藏:0      [点我收藏+]

标签:jfinal   freemarker   maven   demo   

写在前面的话

前两天听说了JFinal,简介甚是牛擦,号称java框架终结者,也是醉了,言归正传,我们就不研究他的宣传语了。不过他这个框架确实有他所说的一些特性,一起看看。


官网

http://www.jfinal.com/


JFinal 极速开发

JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。 在拥有Java语言所有优势的同时再拥有ruby、python、php等动态语言的开发效率!为您节约更多时间,去陪恋人、家人和朋友 :)

JFinal有如下主要特点:

  • MVC架构,设计精巧,使用简单
  • 遵循COC原则,零配置,无xml
  • 独创Db + Record模式,灵活便利
  • ActiveRecord支持,使数据库开发极致快速
  • 自动加载修改后的java文件,开发过程中无需重启web server
  • AOP支持,拦截器配置灵活,功能强大
  • Plugin体系结构,扩展性强
  • 多视图支持,支持FreeMarker、JSP、Velocity
  • 强大的Validator后端校验功能
  • 功能齐全,拥有struts2的绝大部分功能
  • 体积小仅248K,且无第三方依赖

:以上全部摘自官网,勿喷,该了解的还是要了解。


JFinal+maven部署

  1. 首先创建一个maven本地web工程,至于怎么创建在此就不再赘述,利用eclipse或者直接mvn命令创建
  2. pom.xml添加相关依赖
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.jfinal</groupId>
        <artifactId>jetty-server</artifactId>
        <version>8.1.8</version>
        <scope>provided</scope>
        <exclusions>
            <exclusion>
            <artifactId>jetty-server</artifactId>
            <groupId>org.eclipse.jetty</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.jfinal</groupId>
        <artifactId>jfinal</artifactId>
        <version>1.9</version>
    </dependency>
    <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1.2</version>
    </dependency>
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.20</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.20</version>
    </dependency>
    <dependency>
        <groupId>com.jfinal</groupId>
        <artifactId>cos</artifactId>
        <version>26Dec2008</version>
    </dependency>
</dependencies>

3.  web.xml添加如下代码

<filter>
      <filter-name>jfinal</filter-name>
      <filter-class>com.jfinal.core.JFinalFilter</filter-class>
      <init-param>
           <param-name>configClass</param-name>
           <param-value>com.demo.jfinal.config.DemoConfig</param-value>
      </init-param>
     </filter>
     <filter-mapping>
          <filter-name>jfinal</filter-name>
          <url-pattern>/*</url-pattern>
     </filter-mapping>

4. 创建一个JFinal入口配置文件DemoConfig,需要继承JFinal的JFinalConfig类

package com.demo.jfinal.config;

import java.util.Properties;

import com.demo.jfinal.controller.BlogController;
import com.demo.jfinal.controller.HelloController;
import com.demo.jfinal.model.Blog;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
import com.jfinal.ext.handler.ContextPathHandler;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.c3p0.C3p0Plugin;
import com.jfinal.render.FreeMarkerRender;
import com.jfinal.render.ViewType;

/**
 * @author jack.song
 * @time 2014年12月26日
 */
public class DemoConfig extends JFinalConfig{

	@Override
	public void configConstant(Constants arg0) {
		arg0.setDevMode(true);//开发模式设置
		arg0.setBaseViewPath("template");//页面模板根路径
		arg0.setFreeMarkerViewExtension(".ftl");//freemarker 模板后缀名
	}

	@Override
	public void configHandler(Handlers arg0) {
		arg0.add(new ContextPathHandler("base"));//添加项目contextPath,以便在页面直接获取该值 ${base?if_exists}
	}

	@Override
	public void configInterceptor(Interceptors arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void configPlugin(Plugins me) {
		loadPropertyFile("common_config.txt");//添加相关插件,读取配置文件
		C3p0Plugin c3p0Plugin = new C3p0Plugin(getProperty("jdbcUrl"),
		getProperty("user"), getProperty("password"));
		me.add(c3p0Plugin);
		ActiveRecordPlugin arp = new ActiveRecordPlugin(c3p0Plugin);
		me.add(arp);
		arp.addMapping("blog", Blog.class);//添加相关model配置
	}

	@Override
	public void configRoute(Routes arg0) {
		arg0.add("/", HelloController.class);//添加项目路由,类似于struts的action 配置文件,此处配置controller名,action名称对应方法名
		arg0.add("/blog", BlogController.class);
	}
	
	public void afterJFinalStart() {
	  Properties p = loadPropertyFile("freemarker.properties");//由于我们用到freemarker,所以在此进行freemarker配置文件的装载
	  FreeMarkerRender.setProperties(p);
	}
	/**
	 * 建议使用 JFinal 手册推荐的方式启动项目
	 * 运行此 main 方法可以启动项目,此main方法可以放置在任意的Class类定义中,不一定要放于此
	 */
	public static void main(String[] args) {
		JFinal.start("src/main/webapp", 80, "/", 5);//启动配置项
	}
}

5.  上一步中为JFinal的主要入口类,我们必须创建它,并进行相应的配置改动,其中的common_config.txt,freemarker.properties附下

##common_config.txt
jdbcUrl = jdbc:mysql://127.0.0.1/jfinal_demo?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
user = root
password = password

#freemarker.properties
default_encoding=utf-8
#for production environment
template_exception_handler=ignore

#for testing
#template_exception_handler=DEBUG

template_update_delay=5
auto_import=/macros/demo.ftl as demo
			

locale=no_NO
datetime_format=yyyy-MM-dd HH:mm:ss
date_format=yyyy-MM-dd
number_format=#.##


6.  创建第一个controller,需要继承JFinal的controller 类

package com.demo.jfinal.controller;

import com.jfinal.core.Controller;

/**
 * @author jack.song
 * @time 2014年12月26日
 */
public class HelloController extends Controller {

	public void index(){
		render("/index.ftl");
	}
}

7.  创建index.ftl

<@demo.layout>
<h1>JFinal Demo 项目首页</h1>
<div class="table_box">
	<p>欢迎来到 JFinal极速开发世界!</p>
	
	<br><br><br>
	
	本Demo采用FreeMarker 作为视图文件,您还可以使用Jsp、Velocity或自定义类型视图。
	点击<a href="${base?if_exists}/blog"><b>此处</b></a>开始试用Demo。
	
	<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
	<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
</div>
</@demo.layout>
8. 上一步中的layout是freemarker的宏定义,代码如下

<#assign staticCssPath="${base}/static/css/"/>
<#assign staticImgPath="${base}/static/img/"/>
<#macro layout>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="zh-CN" xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<link href="${staticCssPath}manage.css" media="screen" rel="stylesheet" type="text/css" />
</head>
<body>
	<div class="manage_container">
		<div class="manage_head">
			<div class="manage_logo"><a href="http://www.jfinal.com">JFinal web framework</a></div>
			<div id="nav">
				<ul>
					<li><a href="${base?if_exists}/"><b>首页</b></a></li>
					<li><a href="${base?if_exists}/blog"><b>Blog管理</b></a></li>
				</ul>
			</div>
		</div>
		<div class="main">
			<#nested>
		</div>
	</div>
</body>
</html>
</#macro>

<#macro paginate currentPage totalPage actionUrl urlParas="">
	<#if (totalPage <= 0) || (currentPage > totalPage)><#return></#if>
	<#local startPage = currentPage - 4>
	<#if (startPage < 1)><#local startPage = 1></#if>
	
	<#local endPage = currentPage + 4>
	<#if (endPage > totalPage)><#local endPage = totalPage></#if>
	
	<div class="pagination">
			<#if (currentPage <= 8)>
				<#local startPage = 1>
			</#if>
			<#if ((totalPage - currentPage) < 8)>
				<#local endPage = totalPage>
			</#if>
			
			<#if (currentPage == 1)>
				<span class="disabled prev_page">上页</span>
			<#else>
				<a href="${actionUrl}#{currentPage - 1}${urlParas!}" class="prev_page">上页</a>
			</#if>
			
			<#if (currentPage > 8)>
				<a href="${actionUrl}#{1}${urlParas!}">#{1}</a>
				<a href="${actionUrl}#{2}${urlParas!}">#{2}</a>
				<span class="gap">…</span>
			</#if>
			
			<#list startPage..endPage as i>
				<#if currentPage == i>
					<span class="current">#{i}</span>
				<#else>
					<a href="${actionUrl}#{i}${urlParas!}">#{i}</a>
				</#if>
			</#list>
			
			<#if ((totalPage - currentPage) >= 8)>
				<span class="gap">…</span>
				<a href="${actionUrl}#{totalPage - 1}${urlParas!}">#{totalPage - 1}</a>
				<a href="${actionUrl}#{totalPage}${urlParas!}">#{totalPage}</a>
			</#if>
			
			<#if (currentPage == totalPage)>
				<span class="disabled next_page">下页</span>
			<#else>
				<a href="${actionUrl}#{currentPage + 1}${urlParas!}" class="next_page" rel="next">下页</a>
			</#if>
	</div>
</#macro>

9.  启动

eclipse用run as 配置Main class为com.jfinal.core.JFinal

或者直接jetty配置启动如下图技术分享


上述就是一些简单的部署启动步骤,由于是入门级,所以比较简单,一些代码也为直接放出,但是在此给出整个demo的代码,大家可以下载直接浏览

demo实例下载地址:TestJFinal.rar

总结:初步感觉JFinal确实比较快速,易学,以及一站化(前端+ORM),但是有比较大的侵入性,比如必须继承之类的

转载请注明出处http://blog.csdn.net/abudexiatian/article/details/42234617

JFinal+maven+freemarker 入门教程

标签:jfinal   freemarker   maven   demo   

原文地址:http://blog.csdn.net/abudexiatian/article/details/42234617

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!