JFinal

发布时间 2023-04-12 17:35:28作者: lvye1221

JFinal 


下载地址:

http://www.jfinal.com/project/1

文档地址
http://www.jfinal.com/upload/2.2/jfinal-2.2-all.zip


开发流程

 

非常详细的开发文档:

http://www.jfinal.com/doc

 


## step1: 新建项目 ##

新建 项目/动态网站 (Dynamic Web Server)  , 新建项目是选择 J2EE1.4 模板

WebRoot\WEB-INF\classes
WebRoot

编辑文件是在于 web.xml (此文件路径是在 WEB-INF目录) 中

 

PS. 如果MyEclipse中看不见 web.xml 文件夹的话,那么,可以: 

右键web-inf文件夹,点Show In 里有个Navigator ,就出来了

 

在 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>demo.DemoConfig</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>jfinal</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
```

附上完整的 web.xml

```

<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    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>jfinal_demo</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>demo.DemoConfig</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>jfinal</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
    </welcome-file-list>
</web-app>

```


将 jfinal-xxx.jar 与 jetty-server-8.1.8.jar拷贝至项目 WEB-INF\lib 下即可 。 
注意: jetty-server-8.1.8.jar 是开发时使用的 运行环境

## step2: 创建类 ##

demo 包下 新建 DemoConfig 类

```
package demo;

import com.jfinal.config.*;

public class DemoConfig extends JFinalConfig {
    public void configConstant(Constants me) {
        me.setDevMode(true);
    }

    public void configRoute(Routes me) {
        me.add("/hello", HelloController.class);
    }

    public void configPlugin(Plugins me) {
    }

    public void configInterceptor(Interceptors me) {
    }

    public void configHandler(Handlers me) {
    }
}

```

控制器:
```
package demo;

import com.jfinal.core.Controller;

public class HelloController extends Controller {
    public void index() {
        renderText("Hello JFinal World.");
    }

}
```


## step3 配置程序启动路径 ##

参照文档来做


点击 “New Configuration” 按钮启动服务器


http://localhost/hello

## 错误信息 ##

---------
```
一月 05, 2017 7:53:01 下午 com.jfinal.kit.LogKit error
严重: port: 80 already in use!
java.lang.IllegalStateException: port: 80 already in use!
    at com.jfinal.server.JettyServer.doStart(JettyServer.java:79)
    at com.jfinal.server.JettyServer.start(JettyServer.java:65)
    at com.jfinal.core.JFinal.main(JFinal.java:168)

```

关闭占用的 80 端口

netstat -ano 80

netstat -aon|findstr "80"


netstat -abno后查看,经过查找为pid=4的system进程,因为是系统进程,也无法结束它,经查SQL Server ReportingServices (SQLEXPRESS) 服务占用80端口,停止SQL Server ReportingServices后APache正常启动.
---------

## 数据库 ##

ansisqldialect 数据库方言

```
public void configPlugin(Plugins me) {
    loadPropertyFile("classes/config.properties");
    C3p0Plugin cp = new C3p0Plugin(getProperty("jdbc.url"),
            getProperty("jdbc.username"), getProperty("jdbc.password"),
            getProperty("jdbc.driverClassName")); // 使用C3P0
    me.add(cp);
    ActiveRecordPlugin arp = new ActiveRecordPlugin(cp);
    me.add(arp);
    // arp.setDialect(new AnsiSqlDialect());//使用AnsiSqlDialect        
    arp.setDialect(new SqlServerDialect());
    arp.setContainerFactory(new CaseInsensitiveContainerFactory());
}
    
```    

### MSSQL ###

```    
##-------------------------------------------------
## SQL Server
##-------------------------------------------------
jdbc.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver

jdbc.url=jdbc:sqlserver://localhost:1433;DatabaseName=dbname
jdbc.username=sa
jdbc.password=123456
jdbc.dbType=sqlserver
```    
  1. 插件 ###


#### 信息 ####

```    
2017-01-10 15:49:42.999:WARN:oejuc.AbstractLifeCycle:FAILED jfinal: java.lang.IllegalArgumentException: Properties file not found in classpath: classes/config.properties
java.lang.IllegalArgumentException: Properties file not found in classpath: classes/config.properties
```    

改成 loadPropertyFile("config.properties");, 并将 config.properties 文件放到 src 文件夹中

```    
2017-01-10 16:08:52.945:WARN:oejuc.AbstractLifeCycle:FAILED jfinal: java.lang.NoClassDefFoundError: com/mchange/v2/c3p0/ComboPooledDataSource
java.lang.NoClassDefFoundError: com/mchange/v2/c3p0/ComboPooledDataSource
```    
缺少连接池包( c3p0-0.8.5.2.jar )

 

```    
java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
    at java.net.URLClassLoader.findClass(Unknown Source)
    
```    
缺少连接池包( sqljdbc4.jar )
```
com.microsoft.sqlserver.jdbc.SQLServerException: 不支持此服务器版本。目标服务器必须是 SQL Server 2000 或更高版本。
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
    at com.microsoft.sqlserver.jdbc.DBComms.Prelogin(Unknown Source)
    at com.microsoft.sqlserver.jdbc.DBComms.<init>(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.loginWithoutFailover(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(Unknown Source)

```

JAR包问题,在项目的WEB-INFO/lib下存在sqljdbc4.jar和sqljdbc.jar两个札包,就是因为"sqljdbc.jar"版本太老的原因使得无法访问SQLSERVER08数据库,将“sqljdbc.jar”删掉,只留sqljdbc4.jar,之后再右击项目-->Build Path-->configureBuildPath-->将sqljdbc.jar删除,这样编译之后的classpath下就只有sqljdbc4.jar,就不会产生冲突;


##### 资料 #####

jfinal框架下使用c3P0连接池连接sql server 2008
http://blog.csdn.net/u014522611/article/details/50095571

  1. 访问数据库 ###
```
List<Record> users = Db.find("select * from AccountsInfo");

System.out.println(users);

// 创建name属性为James,age属性为25的record对象并添加到数据库
Record user = new Record().set("name", "James").set("age", 25);
Db.save("user", user);
// 删除id值为25的user表中的记录
Db.deleteById("user", 25);
// 查询id值为25的Record将其name属性改为James并更新到数据库
user = Db.findById("user", 25).set("name", "James");
Db.update("user", user);
// 获取user的name属性
String userName = user.getStr("name");
// 获取user的age属性
Integer userAge = user.getInt("age");
// 查询所有年龄大于18岁的user
List<Record> users = Db.find("select * from user where age > 18");
// 分页查询年龄大于18的user,当前页号为1,每页10个user
Page<Record> userPage = Db.paginate(1, 10, "select *", "from user where age >&nbsp;?", 18);

```


## JSON ##

Action 

```
List<Record> users = Db.find("select top 10 * from AccountsInfo");

renderJson(users);
```


# 测试环境 #

记得加上这句话: “userInfoRedis.start();”

```
public static void main(String[] args) {

    RedisPlugin userInfoRedis = new RedisPlugin("userInfo","localhost");

    // 测试环境中执行
    userInfoRedis.start();
    
    Cache userInfoCache = Redis.use("userInfo");
    
    userInfoCache.set("1", "2");
    
    Object o = userInfoCache.get("1");

    System.out.println(o);
    
}
```
  1. 端口设置 #

jfinal初接触,一个简单的文件上传例子
http://www.cnblogs.com/acehalo/p/3915720.html


## 项目文件路径 ##