**
选用JFinal的原因非常简单,我喜欢java代码,而不是弱智标签语言(不喜欢繁琐的xml配置,搞来搞去完全不知道框架是怎么运作的!)

再次奉劝大家赶快转战IDEA,因为真的非常好用,不过对于不怎么接触IDEA的同学来说,上手有些困难。
我用IDEA编辑器已经有2年多了,从一开始非常容易出错到现在的上天入地,爱不释手

**

JFinal框架需要一个入口函数:

/**
 * shift + F9 启动(我的说的IDEA中)
 */
public class App {
    public static void main(String[] args){
        /**
         * 第一个参数填写web.xml所在路径的名字
         * 第二个参数是端口号
         * 第三个参数是url_basePath
         */
        JFinal.start("src/main/webapp", 80, "/");

    }
}

JFinal框架是围绕JFinalConfig这个类展开的,JFinalConfig作用就是做一些app的配置
贴出代码和注释说明:

public class AppConfig extends JFinalConfig {

    /**
     * 配置一些常量,常数,基础之类的
     * @param constants
     */
    public void configConstant(Constants constants) {
        constants.setDevMode(true);
//        constants.setError404View();
//        constants.setErrorView();
//        constants.setEncoding();
    }

    /**
     * 写好的controller从这里开始添加
     * @param routes
     */
    public void configRoute(Routes routes) {
        /**
         * routes.add("/路径(默认访问class.index()方法);/路径/函数名(访问class.函数名)",class);
         * 如果在Controller的函数中注明 @ActionKey("/login"),则会打破这里的配置规则(level_up)
         */
        routes.add("/", HelloController.class);

        /**
         * 设置view的默认路径
         * Controller.render(basePath + view)
         */
//        routes.setBaseViewPath("/view");

        /**
         * 如果实际开发中,规则不能满足业务,可以考虑自定义Routes
         */
//        routes.add(new Routes());


    }

    /**
     * 配置引擎模板
     * @param engine
     */
    public void configEngine(Engine engine) {
//        engine.addSharedFunction()
    }

    /**
     * 数据库的配置
     * @param plugins
     */
    public void configPlugin(Plugins plugins) {
        /**
         * 默认是连接mysql的
         * file info:
         * -------------start------------------------
         * jdbcUrl = jdbc:mysql://localhost/jfinal_demo?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
         * user = root
         * password =
         * devMode = true
         */
//        loadPropertyFile(file or file_name)
        DruidPlugin druidPlugin = new DruidPlugin(
                getProperty("jdbcUrl"),
                getProperty("user"),
                getProperty("password"));//从文件中获取参数值
        /**
         * 或者完全不用这么麻烦
         * DruidPlugin plugin = new DruidPlugin("jdbc_url","root","123456");
         */
        plugins.add(druidPlugin);
        /**
         * ActiveRecordPlugin读取配置并连接数据库
         */
        ActiveRecordPlugin activeRecordPlugin = new ActiveRecordPlugin(druidPlugin);
        plugins.add(activeRecordPlugin);
//        activeRecordPlugin.addMapping(“user”,UserBean.class);这个函数的作用是,建立数据库与Model的映射关系,所以变量名一定要与数据库一致
//        activeRecordPlugin.addMapping("user","user_id", UserBean.class);
//          中间这个参数是手动指定主键,默认是:id,Bean类一定要继承Model<classNameOfBean>
    }

    /**
     * 配置全局拦截器
     * @param interceptors
     */
    public void configInterceptor(Interceptors interceptors) {
        interceptors.add(new Interceptor() {
            public void intercept(Invocation invocation) {
//                invocation可以对方法进行拦截,并提供机会在方法的前后添加切面代码
//                invocation.getMethod()
//                invocation.getController()
//                invocation.invoke();必须调用这个函数,传递本次调用,调用剩下的拦截器与目标方法
            }
        });
//        interceptors.addGlobalActionInterceptor()//添加全局拦截器
//        interceptors.addGlobalServiceInterceptor()//添加service层拦截器
//        interceptors.add()兼容老版本而保留的方法,与addGlobalActionInterceptor功能一致
    }

    /**
     * 可以添加自定义的handler,handler对所有的web请求有着完全的控制权
     * @param handlers
     */
    public void configHandler(Handlers handlers) {
        handlers.add(new Handler() {
            @Override
            public void handle(String s,
                               HttpServletRequest httpServletRequest,
                               HttpServletResponse httpServletResponse,
                               boolean[] booleans) {

            }
        });
    }

    /**
     * init
     */
    @Override
    public void afterJFinalStart() {

    }

    /**
     * destroy
     */
    @Override
    public void beforeJFinalStop() {

    }
}

示例Controller:

public abstract class AbsController extends Controller{

    public abstract void index();

}


//@Before(className.class)//before注解可声明对类、函数的拦截器,多个拦截器{className.class1,className.class2}
public class HelloController extends AbsController {


    /**
     * 在config中不配置指定访问函数时,默认访问index()函数
     */
    @ActionKey("/hello")
//    @Clear 清除当前声明的拦截器,也可添加参数声明清除指定的拦截器
    public void index(){
        renderText("hellohellohello");
//        renderJson("jsontxt");返回json字符串
//        render("viewpath");返回view路径
//        redirect301("url");跳转
//        renderError(code,"viewpath");自定义的状态码和view 如果不想程序继续执行,使用return
//        renderFile(file);发送文件
//        renderJsp("jsp_path");
//        getRequest()
//        getResponse()
//        getPara("name") 事实上是对 HttpServletRequest.getParameter(String name)的封装
//        getPara(index)

//        xxxService service = enhance(xxxService.class)
        /**
         * AOP
         * 使用Duang.duang方法在任何地方对目标进行增强
         * OrderService service = Duang.duang(OrderService.class);
         * 调用payment方法时将会触发拦截器
         * service.payment(…);
         * 使用Enhancer.enhance方法在任何地方对目标进行增强
         * OrderService service = Enhancer.enhance(OrderService.class);
         *
         * 为enhance方法传入的拦截器称为Inject拦截器,下面代码中的Tx称为Inject拦截器
         * OrderService service = Enhancer.enhance(OrderService.class, Tx.class);
         * service.payment(…);
         */

    }
}

JDBC的使用:

public class UserBean extends Model<UserBean>{

    /**
     * Model提供了很多封装的API,自行研究
     * 
     */
    public static final UserBean dao = new UserBean().dao();

    public String name;

    public int age;

    public String sex;

    public UserBean(){
    }
}

pom清单:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>jfinal_demo</groupId>
  <artifactId>jfinal_demo</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>jfinal_demo Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>com.jfinal</groupId>
      <artifactId>jfinal</artifactId>
      <version>3.2</version>
    </dependency>
    <dependency>
      <groupId>com.jfinal</groupId>
      <artifactId>jetty-server</artifactId>
      <version>8.1.8</version>
    </dependency>

  </dependencies>
  <build>
    <finalName>jfinal_demo</finalName>
  </build>
</project>

web.xml清单:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <filter>
    <filter-name>jfinal</filter-name>
    <filter-class>com.jfinal.core.JFinalFilter</filter-class>
    <init-param>
      <param-name>configClass</param-name>
      <param-value>com.zzyd.jfinal.config.AppConfig</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>jfinal</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

看完在对比一下SpringMVC,你发现你还会爱他吗?

话说回来,每一个框架的适用场景都不一样, SpringMVC 也好 SpringBoot也好,都是开发web项目的一个工具,选择适合自己的工具才是最重要的!

转战IDEA吧,Eclipse真的太老旧了

源码奉上!