JFinal 是国产的、基于 Java 语言的极速 WEB MVC + ORM 框架,由 Handler、Interceptor、Controller、Render、Plugin 五大部分组成。其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。
JFinal架构以Action为参照,Handler处在扩展的外围,Interceptor处在更贴近Action的范围,Controller承载Action处在扩展的中心,Render处于Action后端,Plugin处于Action右侧。
简单总结为:零配置、代码量少、开发体验连续、无第三方依赖、概念最少化。
1、它是国产的MVC架构
2、惯例优于配置原则,零配置无xml
3、使用DB+Record实现ORM
4、支持多种视图
5、强大的validator后端校验功能
… …
对JFinal有了一个宏观了解后,接下来通过一个入门demo跟大家一起学习下JFinal在项目中的使用。
1、在开始建项之前,先打开eclipse的Perferences窗口,将项目编码和JSP编码格式统一设置为UTF-8。
2、下载JFinal依赖的jar包,官网地址: http://www.jfinal.com/
3、创建web应用。新建Dynamic Web工程
4、创建配置文件类MyAppConfig并继承JFinalConfig类
5、修改web.xml文件,通过初始化参数将MyAppConfig设置为filter过滤器的入口。
6、创建controller类。JFinal的controller需要继承controller类。
7、创建JSP页面。在WebContent中新建hello.jsp和index.jsp。
8、注册controller路由。在MyAppConfig.java中将准备好的jsp和controller关联起来。
到此,一个简单的JFinal项目框架已经建好了。接下来我们看一下各个部分的具体实现和调用关系。
首先MyAppConfig.java类
public class MyAppConfig extends JFinalConfig {
/* * 一些默认通用设置 */
@Override
public void configConstant(Constants me) {
me.setDevMode(true);
me.setEncoding("utf-8");
me.setViewType(ViewType.JSP);
}
/* * 注册路由,将jsp访问和controller关联在一起 */
@Override
public void configRoute(Routes me) {
//----"/"访问到IndexController这个类的index()方法,这是约定
me.add("/", IndexController.class);
//----"/user"访问到UserController这类
//----/user/login,默认访问UserController的login()方法
// me.add("/user",UserController.class);
}
@Override
public void configPlugin(Plugins me) {
// -------------这里启用JFinal插件------下篇介绍---------------
}
/* * 说明:这里用于配置全局的拦截器,对所有请求进行拦截 */
@Override
public void configInterceptor(Interceptors me) {
// -------------这里是拦截器的配置------下篇介绍---------------
}
@Override
public void configHandler(Handlers me) {
/* * ContextPathHandler,在每次请求时将ContextPath (这里指"/MyJFinalApp") * 设置到HttpServletRequest的属性"basePath"中 */
me.add(new ContextPathHandler("basePath"));
}
}
讲解:根据我们以前掌握的知识,bathPath必须设置到HttpServletRequest中才能在页面中使用。这里configHandler就只做了这么一件事,即在每次请求时将ContextPath设置到HttpServletRequest的属性”basePath”中。这样在jsp页面可以直接使用${basePath}了。
web.xml。既然MyAppConfig.java是入口,那么,在Tomcat这个容器中,就需要配置这个入口,使得Tomcat启动的同时加载这个入口类。
<?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" 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">
<display-name>JFinalApp</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- jfinal核心filter -->
<filter>
<filter-name>jfinal</filter-name>
<filter-class>com.jfinal.core.JFinalFilter</filter-class>
<init-param>
<param-name>configClass</param-name>
<param-value>cn.tgb.config.MyAppConfig</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jfinal</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
controller类。
public class IndexController extends Controller {
// Controller默认调用的方法
public void index() {
// 渲染视图并返回给浏览器
this.render("index.jsp");
}
public void sayHello() {
String userName = this.getPara("userName");
String sayHello = "Hello" + userName + ",welcome to JFinal world!";
this.setAttr("sayHello", sayHello);
this.render("/hello.jsp");
}
}
讲解:this.render(“index.jsp”),渲染并返回index页面。这里用的render而不是return。这里即为JFinal的特点之一:支持多种视图。渲染页面不仅仅JSP、VELOCITY等几种类型。将来如有新的类型出现,则只需要扩展Render就可轻松支持。
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${basePath}/sayHello" method="post">
请输入您的名字: <input type="text" name="userName" />
<input type="submit" value="确定" />
</form>
</body>
</html>
hello.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>${sayHello}</p><p><a href="${basePath}/"></a></p>
</body>
</html>
到这里,一个简单的工程就完了。主要实现的是一个问候功能。部署并启动运行。首先访问index页面。在地址栏输入 localhost:8080/JFinalApp/ ,返回index 页面。
在index页面输入“大美女”,确定。跳转到hello页面。
本篇文章介绍了JFinal的特性和访问关系,并介绍了config的两个核心方法configRoute()和configHandler()的作用。下篇文章将继续通过一个demo介绍另外两个核心方法configPlugin()和configInterceptor()的使用和作用。