ファーストハンドJ Final

11249 ワード

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は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;
        }
    }
    
    Interceptor
    JFinalの中のスクリーンショットは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 Validator
    ValidatorはJFinalが提供する検査コンポーネントです。その核心はInterceptorですので、使い方はInterceptorと似ています。Validator類を継承すればいいです。
  • validateは一連のvalidateXXX方法
  • を提供しています。
  • handleErrer処理エラー、一般的な使い方は
    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");
            }
        }
    }
    
  • getPara()は、要求からパラメータ
  • を取得する。
  • get File()サポートファイルアップロード
  • render Json()はJSONに戻り、JFinalは一連のレンダー方法を提供しています。現在サポートされているビューのタイプはFree Marker、JSP、Velocity、JSON、File、Text、Htmlなどです。
  • IndexController
    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にはまだ多くの部品が記載されていません。皆さんは公式サイトで詳細文書を確認してください。