**
选用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真的太老旧了
源码奉上!