ファーストハンドJ Final
JFinalは国産のMVCフレームで、Handler、Interceptor、Controller、Render、Pluginの5大部分から構成されています。本論文は一例を通して上手J Finalを通して、JFinalの各コンポーネントの使い方を熟知することを目指しています。
ターゲットユーザ登録/登録 ユーザが画像をアップロードする ログイン権限認証 アクセスパス
ユーザー登録:IP/user/loginユーザー登録:IP/user/registerユーザーアップロード画像:IP/user/image登録後にアクセスできます。IP/user/show
依存 druid-1.0.5.jar cos-26 Dec 2008.jar jfinal-2.0-bin.jar log 4 j-1.2.16.jar AppConfig
JFinalは
Jdbc.properties
ルートディレクトリの下に新しいJdbc.propertiesを作成して、データベース接続情報を保存します。私たちはAppConfigにそれをロードする必要があります。JFinalのツールクラスPropKitを使いました。
ログ4 jを使ってログ統計ができます。ログが必要なところでログオブジェクトを取得すればいいです。
そしてweb.xmlにJFinalのコアfilterと私達が書いたAppConfigを配置します。
ユーザーエンティティを定義するには、コードが非常に簡単です。
ここのデータベースの中でuserデザインも簡単です。三つのフィールド、userid、username、passwordについて、sqlを貼ります。
サービス層、パッケージ業務ロジック。ここではActive Recordプラグインを使用していますが、AppConfigに登録する必要があります。
JFinalの中のスクリーンショットは3つの機能領域、大域、種類と方法があります。JFinalのAOPを利用して、使いやすいです。インターセプターの定義も非常に簡単で、インターフェースを継承してintercept方法を書き換えるだけです。グローバルブロックはAppConfigに配置されています。
AuthInterceptor
簡単な権限ブロックです。ここでの役割は登録してこそ実行できます。sessionに変数flagsを設定し、trueである場合に実行します。
ValidatorはJFinalが提供する検査コンポーネントです。その核心はInterceptorですので、使い方はInterceptorと似ています。Validator類を継承すればいいです。 validateは一連のvalidateXXX方法 を提供しています。 handleErrer処理エラー、一般的な使い方は
JFinalのControllerはController類を引き継ぐ必要があり、類のマッピングはAppConfigに配置されています。
UserController
マッピング/userは、login()上で検証ブロックLoginValidatorを使用しています。ショー()は、権限ブロックAuthInterceptorを使用しています。 getPara()は、要求からパラメータ を取得する。 get File()サポートファイルアップロード render Json()はJSONに戻り、JFinalは一連のレンダー方法を提供しています。現在サポートされているビューのタイプはFree Marker、JSP、Velocity、JSON、File、Text、Htmlなどです。 IndexController
締め括りをつける
最後のプロジェクト全体のファイルは上の図のように、コードは非常に簡単です。私もアップロードしません。JFinalのInterceptor、Controller、Render、Pluginを紹介しました。HandlerはControllerとIntercepterの補足です。ORMはDb+Active Recordを使用しています。JFinalにはまだ多くの部品が記載されていません。皆さんは公式サイトで詳細文書を確認してください。
ターゲット
ユーザー登録:IP/user/loginユーザー登録:IP/user/registerユーザーアップロード画像:IP/user/image登録後にアクセスできます。IP/user/show
依存
JFinalは
JFinalConfig
のサブクラスを受け継ぐ必要があります。ここで名前をApConfigといいます。この種類の名前は自由に取っています。ここでAppConfigを取ります。import com.jfinal.config.*;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.render.ViewType;
import controller.IndexController;
import controller.UserController;
import model.User;
/**
* Created by reeco_000 on 2015/7/22.
*/
public class AppConfig extends JFinalConfig{
@Override
public void configConstant(Constants constants) {
constants.setEncoding("UTF-8");
constants.setDevMode(true);
constants.setViewType(ViewType.JSP);
}
@Override
public void configRoute(Routes routes) {
routes.add("/", IndexController.class);
routes.add("/user", UserController.class);
}
@Override
public void configPlugin(Plugins plugins) {
// Jfinal
PropKit.use("jdbc.properties");
final String URL =PropKit.get("jdbcUrl");
final String USERNAME = PropKit.get("user");
final String PASSWORD =PropKit.get("password");
final Integer INITIALSIZE = PropKit.getInt("initialSize");
final Integer MIDIDLE = PropKit.getInt("minIdle");
final Integer MAXACTIVEE = PropKit.getInt("maxActivee");
DruidPlugin druidPlugin = new DruidPlugin(URL,USERNAME,PASSWORD);
druidPlugin.set(INITIALSIZE,MIDIDLE,MAXACTIVEE);
druidPlugin.setFilters("stat,wall");
plugins.add(druidPlugin);
ActiveRecordPlugin activeRecordPlugin = new ActiveRecordPlugin(druidPlugin);
activeRecordPlugin.addMapping("user","userid", User.class);
plugins.add(activeRecordPlugin);
}
@Override
public void configInterceptor(Interceptors interceptors) {
// ,
}
@Override
public void configHandler(Handlers handlers) {
}
}
設定ファイルJdbc.properties
ルートディレクトリの下に新しいJdbc.propertiesを作成して、データベース接続情報を保存します。私たちはAppConfigにそれをロードする必要があります。JFinalのツールクラスPropKitを使いました。
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/school
user=root
password=root
initialSize=1
minIdle=1
maxActivee=20
log 4 j.propertiesログ4 jを使ってログ統計ができます。ログが必要なところでログオブジェクトを取得すればいいです。
log4j.rootLogger=INFO, stdout, file
log4j.appender.stdout.Target=System.out
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%n%-d{yyyy-MM-dd HH:mm:ss}%n[%p]-[Thread: %t]-[%C.%M()]: %m%n
# Output to the File
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=./web.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%n%-d{yyyy-MM-dd HH:mm:ss}%n[%p]-[Thread: %t]-[%C.%M()]: %m%n
# Druid
log4j.logger.druid.sql=warn,stdout
log4j.logger.druid.sql.DataSource=warn,stdout
log4j.logger.druid.sql.Connection=warn,stdout
log4j.logger.druid.sql.Statement=debug,stdout
log4j.logger.druid.sql.ResultSet=warn,stdout
web.xmlそしてweb.xmlにJFinalのコアfilterと私達が書いたAppConfigを配置します。
jfinal
com.jfinal.core.JFinalFilter
configClass
AppConfig
jfinal
/*
Modelユーザーエンティティを定義するには、コードが非常に簡単です。
package model;
import com.jfinal.plugin.activerecord.Model;
/**
* Created by reeco_000 on 2015/7/22.
*/
public class User extends Model{
}
Modelを継承すればいいです。getter、setter方法は必要ありません。Annotationは必要ありません。xmlは必要ありません。ここのデータベースの中でuserデザインも簡単です。三つのフィールド、userid、username、passwordについて、sqlを貼ります。
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`userid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
PRIMARY KEY (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
サービスサービス層、パッケージ業務ロジック。ここではActive Recordプラグインを使用していますが、AppConfigに登録する必要があります。
public void configPlugin(Plugins plugins) {
// JFinal
DruidPlugin druidPlugin = new DruidPlugin(URL,USERNAME,PASSWORD);
druidPlugin.set(INITIALSIZE,MIDIDLE,MAXACTIVEE);
druidPlugin.setFilters("stat,wall");
plugins.add(druidPlugin);
ActiveRecordPlugin activeRecordPlugin = new ActiveRecordPlugin(druidPlugin);
// Model 。user ,userid
activeRecordPlugin.addMapping("user","userid", User.class);
plugins.add(activeRecordPlugin);
}
データベース接続池はDruidを使っています。JFinalはC 3 P 0をサポートしています。JFinalはDb+Recordを使ってORMを完成します。Dbクラスは大量の照会の方法を提供しており、このモードはルビーオンライルスに類似している。package service;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
/**
* Created by reeco_000 on 2015/7/22.
*/
public class UserService {
public boolean add(String username,String password){
String SQL = "SELECT userid FROM user WHERE username =?";
Integer result = Db.queryFirst(SQL, username);
if(result==null){
Record user = new Record().set("username", username).set("password", password);
Db.save("user", user);
return true;
}
return false;
}
public boolean login(String username,String password){
String SQL = "SELECT userid FROM user WHERE username =? and password=?";
Integer result = Db.queryFirst(SQL, username, password);
if(result!=null)
return true;
else return false;
}
}
InterceptorJFinalの中のスクリーンショットは3つの機能領域、大域、種類と方法があります。JFinalのAOPを利用して、使いやすいです。インターセプターの定義も非常に簡単で、インターフェースを継承してintercept方法を書き換えるだけです。グローバルブロックはAppConfigに配置されています。
public void configInterceptor(Interceptors interceptors) {
// ,
//
interceptors.addGlobalActionInterceptor(new GlobalActionInterceptor());
//
interceptors.addGlobalServiceInterceptor(new GlobalServiceInterceptor());
}
クラスと方法は@Before(Class.class)を使って使えます。具体的には次のControllerの例を見てもいいです。JFinal 2ではInjectスクリーンも提供していますが、私達の例ではこの必要がないので、使っていません。具体的には公式文書を見てください。AuthInterceptor
簡単な権限ブロックです。ここでの役割は登録してこそ実行できます。sessionに変数flagsを設定し、trueである場合に実行します。
package interceptor;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;
/**
* Created by reeco_000 on 2015/7/22.
*/
public class AuthInterceptor implements Interceptor {
@Override
public void intercept(Invocation invocation) {
Controller controller = invocation.getController();
Boolean loginUser = controller.getSessionAttr("flag");
if (loginUser ==true )
invocation.invoke();
else
controller.redirect("/");
}
}
Login ValidatorValidatorはJFinalが提供する検査コンポーネントです。その核心はInterceptorですので、使い方はInterceptorと似ています。Validator類を継承すればいいです。
controller.keepPara();
controller.render("register.html");
という意味です。元のページに戻り、着信パラメータを維持するという意味です。package validator;
import com.jfinal.core.Controller;
import com.jfinal.validate.Validator;
/**
* Created by reeco_000 on 2015/7/22.
*/
public class LoginValidator extends Validator {
@Override
protected void validate(Controller c) {
validateRequiredString("username","nameError","username is null");
validateRequiredString("password","passError","username is null");
}
@Override
protected void handleError(Controller c) {
}
}
コントローラJFinalのControllerはController類を引き継ぐ必要があり、類のマッピングはAppConfigに配置されています。
public void configRoute(Routes routes) {
routes.add("/", IndexController.class);
routes.add("/user", UserController.class);
}
私たちはIndexControllerというクラスにアクセスし、/userがUserControllerにアクセスするという意味です。user/loginはデフォルトでUserController.loginにアクセスします。これはstructt 2と似ています。基礎があれば、非常に早いです。UserController
マッピング/userは、login()上で検証ブロックLoginValidatorを使用しています。ショー()は、権限ブロックAuthInterceptorを使用しています。
package controller;
import com.jfinal.aop.Before;
import com.jfinal.core.Controller;
import interceptor.AuthInterceptor;
import service.UserService;
import validator.LoginValidator;
/**
* Created by reeco_000 on 2015/7/22.
*/
public class UserController extends Controller{
private UserService userService = new UserService();
public void index(){}
@Before(LoginValidator.class)
public void login(){
String username = getPara("username");
String password = getPara("password");
boolean loginCheck = userService.login(username,password);
if(loginCheck){
renderJson("10000");
getSession().setAttribute("flag",true);
}
else
renderJson("10001");
}
public void register(){
String username = getPara("username");
String password = getPara("password");
boolean result = userService.add(username,password);
if(result)
renderJson("10010");
else
renderJson("10011");
}
@Before(AuthInterceptor.class)
public void show(){
renderJsp("user.jsp");
}
public void image(){
try{
getFile(getPara("img"),"UTF-8");
renderJson("20010");
} catch (Exception e){
renderJson("20012");
}
}
}
package controller;
import com.jfinal.core.Controller;
/**
* Created by reeco_000 on 2015/7/22.
*/
public class IndexController extends Controller{
public void index(){
renderJsp("index.jsp");
}
}
indexはControllerのデフォルト呼び出しの方法です。締め括りをつける
最後のプロジェクト全体のファイルは上の図のように、コードは非常に簡単です。私もアップロードしません。JFinalのInterceptor、Controller、Render、Pluginを紹介しました。HandlerはControllerとIntercepterの補足です。ORMはDb+Active Recordを使用しています。JFinalにはまだ多くの部品が記載されていません。皆さんは公式サイトで詳細文書を確認してください。