Java Web 極速開發(fā)框架jfinal 的搭建

前言:

這個Java web服務(wù)端的jfinal 框架最早出來上班的時候那個公司的所使用圈澈,之前有基本的了解 。 現(xiàn)在只是重新學(xué)習(xí)了就從零開始的搭建一個基礎(chǔ)的項目分享給大家 如果有不足和錯誤的地方望各位及時指正,廢話話不多說我們正式開始

1開發(fā)環(huán)境:

建議使用myeclispe 或者基礎(chǔ)版本的eclipse 裝插件都可以 myeclipse 下載地址:https://www.myeclipsecn.com/ eclispe 下載地址: https://www.eclipse.org/downloads/

2具體實現(xiàn):

一 需要用到的jar包

c3p0-0.9.5.2.jar (數(shù)據(jù)庫連接池的jar包)

jfinal-3.3.jar (jfinal框架庫的jar包)

mysql-connector-java-5.1.20.jar (mysql的jar包)


TIM截圖20200202202355.png
二 數(shù)據(jù)庫賬號密碼jdbcUrl配置
TIM截圖20200202204558.png
jdbcUrl = jdbc:mysql://localhost/test?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
username = root  //換成自己的數(shù)據(jù)庫的賬號和 密碼
password = 123456 
showSql=true
三 jfinal 的web.xm的配置
TIM截圖20200202215213.png
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>jfinal_work</display-name>
  <!-- Jfinal配置文件 -->
  <filter>
<!--   
  <filter-name>encodingFilter</filter-name>  
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
        <init-param>  
            <param-name>encoding</param-name>  
            <param-value>UTF-8</param-value>  
        </init-param>  
        <init-param>  
            <param-name>forceEncoding</param-name>  
            <param-value>true</param-value>  
        </init-param>  
    </filter>  
    <filter-mapping>  
        <filter-name>encodingFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping> -->
  
    <filter-name>jfinal</filter-name>
    <filter-class>com.jfinal.core.JFinalFilter</filter-class>
    <init-param>
        <param-name>configClass</param-name>
        <param-value>config.App_config</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>jfinal</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!-- Jfinal配置文件 -->
</web-app>
四 我們寫一個config類繼承JFinalConfig 核心配置類讀取數(shù)據(jù)庫的配置信息和路由的配置
package config;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.c3p0.C3p0Plugin;
import com.jfinal.plugin.ehcache.EhCachePlugin;
import com.jfinal.template.Engine;
import controller.LoginController;
import model.Engineer;
import model.Order;
import model.Phonemodle;
import model.User;


/**
 * @author xuqing
 *
 */

public class App_config  extends  JFinalConfig{

    @Override
    public void configConstant(Constants arg0) {
        loadPropertyFile("Databaseconfig.txt");
        arg0.setDevMode(true);
    }

    @Override
    public void configEngine(Engine arg0) {
    
    }

    @Override
    public void configHandler(Handlers arg0) {
    
        
    }

    @Override
    public void configInterceptor(Interceptors arg0) {

        
    }

    @Override
    public void configPlugin(Plugins arg0) {
        C3p0Plugin c3p0Plugin = new C3p0Plugin(getProperty("jdbcUrl"),
                getProperty("username"),
                getProperty("password")
                );
        ActiveRecordPlugin activeRecordPlugin = new ActiveRecordPlugin(c3p0Plugin);
        //配置model
        activeRecordPlugin.addMapping("user", User.class);
        activeRecordPlugin.addMapping("orderfrom", Order.class);
        activeRecordPlugin.addMapping("phonemodle", Phonemodle.class);
        activeRecordPlugin.addMapping("engineer", Engineer.class);
        arg0.add(c3p0Plugin);
        arg0.add(activeRecordPlugin);
        activeRecordPlugin.setShowSql(true);

    }
     /**
            * 添加接口方法
             *   配置路由器
      *   
      *   
      */
    @Override
    public void configRoute(Routes arg0) {
        arg0.add("/user", controller.LoginController.class);
        arg0.add("/order", controller.OrderController.class);
    }
    
    /**
     * 建議使用 JFinal 手冊推薦的方式啟動項目
     * 運(yùn)行此 main 方法可以啟動項目赁还,此main方法可以放置在任意的Class類定義中潮梯,不一定要放于此
     */
    public static void main(String[] args) {
        JFinal.start("WebRoot", 80, "/", 5);
    }

讀取的是 Databaseconfig.txt 里面的數(shù)據(jù)庫賬號密碼還有編碼等信息


TIM截圖20200202204558.png

讀取代碼具體實現(xiàn)

    @Override
    public void configPlugin(Plugins arg0) {
        C3p0Plugin c3p0Plugin = new C3p0Plugin(getProperty("jdbcUrl"),
                getProperty("username"),
                getProperty("password")
                );
        ActiveRecordPlugin activeRecordPlugin = new ActiveRecordPlugin(c3p0Plugin);
        //配置model 
        activeRecordPlugin.addMapping("user", User.class);
        activeRecordPlugin.addMapping("orderfrom", Order.class);
        activeRecordPlugin.addMapping("phonemodle", Phonemodle.class);
        activeRecordPlugin.addMapping("engineer", Engineer.class);
        arg0.add(c3p0Plugin);
        arg0.add(activeRecordPlugin);
        activeRecordPlugin.setShowSql(true);

    }

配置訪問路由來映射我們對應(yīng)訪問的controller 層的代碼邏輯

  /**
            * 添加接口方法
             *   配置路由器
      *   
      *   
      */
    @Override
    public void configRoute(Routes arg0) {
        arg0.add("/user", controller.LoginController.class);
        arg0.add("/order", controller.OrderController.class);
    }
    

創(chuàng)建modle 層 需要繼承jfinal 里面的modle

package model;
import com.jfinal.plugin.activerecord.Model;
  /**
   * @author Administrator
   * xuqing
   * 用于登錄注冊的 modle 
   */

public class User extends Model<User>{
    public static final  User   dao =  new User();
    
}

controller 控制層的編寫 我們的controller 要繼承 import com.jfinal.core.Controller 這個包下面的Controller
如下代碼是返回一個簡單json的例子
通過調(diào)用setAttr()方法和 renderJson(); 方法來返回json數(shù)據(jù)

package controller;
import java.util.List;
import utils.util;
import com.jfinal.aop.Before;
import com.jfinal.core.Controller;
import com.jfinal.ext.interceptor.POST;
import model.Engineer;
import model.User;
public class LoginController extends Controller{
    //通過調(diào)用setAttr()方法和  renderJson(); 方法來返回json數(shù)據(jù) 
    public void index(){
        setAttr("message", "jfinal部署成功!");
        renderJson();
    } 
    
}

我們先跑一把 選中項目 run as run on Server 選擇你本地關(guān)聯(lián)的Tomcat

TIM截圖20200202212113.png

我們通過控制臺看到本地的tomcat 已經(jīng)啟動了
TIM截圖20200202212228.png

我們現(xiàn)在用postman來訪問測試下
localhost 是本機(jī)IP地址 端口默認(rèn)是8080 當(dāng)然你也可以修改
http://localhost:8080/jfinal_work/user/index

TIM截圖20200202212427.png

到此這個項目我們已經(jīng)啟動了 還有連接數(shù)據(jù)庫操作數(shù)據(jù)庫增刪改查的一些邏輯 我簡單講解下
通過調(diào)用 getPara 來獲取網(wǎng)絡(luò)請求傳過來的數(shù)據(jù)

String  username =getPara("username");
String  password =getPara("password");

sql 語句盡量寫在modle 或者是service 我這邊是偷懶就寫在了controller 里面了 各位同學(xué)在寫的時候要養(yǎng)成寫大型項目的好習(xí)慣把sql語句抽離出來寫

 String   sql="select * from  xq   where  username = "+"'"+username+"'";
 User  user=User.dao.findFirst(sql);

全部代碼的實現(xiàn)如下

package controller;
import java.util.List;
import utils.util;
import com.jfinal.aop.Before;
import com.jfinal.core.Controller;
import com.jfinal.ext.interceptor.POST;
import model.Engineer;
import model.User;


public class LoginController extends Controller{
    public void index(){
        setAttr("message", "jfinal部署成功游添!");
        renderJson();
    } 

    /**
     * 注冊
     * xuqing  
     * 2018-1-22
     * 
     * 
     */
    public  void   register(){
   //通過調(diào)用 getPara 來獲取網(wǎng)絡(luò)請求傳過來的數(shù)據(jù)   
 
        String  username =getPara("username");
        String  password =getPara("password");
        String   againpassword =getPara("againpassword");
          if(!util.isMobileNum2(username)){
              setAttr("msg", "請輸入正確格式的手機(jī)號碼"); 
              setAttr("code", "0");
              renderJson();
              return;
              
          }
          if(!password.equals(againpassword)){
              setAttr("msg", "兩次輸入的密碼不一致"); 
              setAttr("code", "0");
              renderJson();
              return;
          }
    //  sql  語句盡量寫在modle 或者是service 我這邊是偷懶就寫在了controller 里面了 各位同學(xué)在寫的時候要養(yǎng)成寫大型項目的好習(xí)慣把sql語句抽離出來寫 
         String   sql="select * from  xq   where  username = "+"'"+username+"'";
        User  user=User.dao.findFirst(sql);
        
        if(user==null){
            user=new  User();   
            user.set("username", username);
            user.set("password", password);
            user.save();
            setAttr("msg", "注冊成功");
            setAttr("code", "200");
        } else{
              setAttr("msg", "已經(jīng)存在此賬號");
              setAttr("code", "0");
        }
        renderJson();

    }
    
    public  void  selectuseralldata(){
        String  sql ="select * from  xq";
      List<User>listdata =User.dao.find(sql);
      setAttr("listdata", listdata);
      renderJson();
    }
    
        /**
         * 
         *登錄的
         *xuqing
         *2018-1-22
         *
         */
    public  void     login(){
        String    username=getPara("username");
        String    password=getPara("password");
        String  sql ="select  * from  xq where username ="+"'"+username+"'";
        User  user=User.dao.findFirst(sql);
        
        try {
            if(user==null){
                setAttr("msg", "不存在此用戶");
                  setAttr("code", "0");
            }else{
                if(user.get("password").equals(password)){
                    String  sql2="select * from   engineer where phone = "+"'"+username+"'";
                    Engineer engineer=Engineer.dao.findFirst(sql2);
                    if(engineer!=null){
                        setAttr("allow","200");
                        setAttr("allowmsg","是工程師身份");
                    }else {
                        setAttr("allow","0");
                        setAttr("allowmsg","不是工程師身份");
                        
                    }
                                
                    setAttr("msg", "登錄成功");
                      setAttr("code", "200");
                      setAttr("userid", user.get("id"));
                     
                    
                }else{
                    setAttr("msg", "用戶名或者密碼錯誤");    
                      setAttr("code", "0");
                
                }
            }
            
        } catch (Exception e) {
          setAttr("msg", "網(wǎng)絡(luò)異常登錄失敗");
        }
        
        renderJson();
    }
       /***
        * 修改密碼
        * 通過舊密碼修改新密碼
        * 
        */
    public  void  updatepsw(){
         String  userid=getPara("userid");
         String oldpsw =getPara("oldpsw");
         String newpsw =getPara("newpsw");
         String againpsw =getPara("againpsw");
         String  sql="select * from   xq   where id="+userid;
         User user=User.dao.findFirst(sql);
         if(user!=null){
             if(user.get("password").equals(oldpsw)){
                 if(newpsw.equals(againpsw)){
                     user=User.dao.findById(userid);
                     user.set("password", newpsw);
                     user.update();
                     setAttr("msg", "修改密碼成功"); 
                 }else{
                     setAttr("msg", "兩次密碼不一致"); 
                 }
                
             }else{
                setAttr("msg", "原密碼不正確"); 
                 
             }
          
         }
         
        renderJson();
   
    }
    public  void  getuser(){
        String  id=getPara("id");
        String  sql ="select  * from  xq  where id = "+id;
        User  user=User.dao.findFirst(sql);
        setAttr("user", user);
        renderJson();
    }
}

整個項目從部署到獲取前端或者移動端傳過來的數(shù)據(jù)的獲取 還有數(shù)據(jù)庫的增刪改查 都有代碼示例和說明 , 整個框架搭建不算很復(fù)雜雖然沒有spring boot 那簡單快速 但是整個框架比較的輕量化 適合快速的開發(fā)小型項目, 拓展性也很強(qiáng)大 所以分享給大家 系草。
項目地址:https://gitee.com/qiuyu123/eclipse_adt.git

最后總結(jié):

我也是學(xué)習(xí)Java EE沒多久的新手(之前做安卓和混編的 ) 因為今年湖北疫情嚴(yán)重 春節(jié)假期延長在家沒啥事做就學(xué)習(xí)下 之前就了解過的Java Web極速開發(fā)框架jfinal 框架 ,整個工程創(chuàng)建到運(yùn)行成功 對于有Java web基礎(chǔ)的同學(xué)難度不算太大 比較順利 。教程有不足和錯誤的地方希望大家及時的指正,有興趣的朋友也可以加我QQ/微信 有空多多交流 個人微信/QQ1693891473

QQ 交流群:

92437359.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唆涝,一起剝皮案震驚了整個濱河市找都,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌廊酣,老刑警劉巖能耻,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異啰扛,居然都是意外死亡嚎京,警方通過查閱死者的電腦和手機(jī)嗡贺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門隐解,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诫睬,你說我怎么就攤上這事煞茫。” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵续徽,是天一觀的道長蚓曼。 經(jīng)常有香客問我,道長钦扭,這世上最難降的妖魔是什么纫版? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮客情,結(jié)果婚禮上其弊,老公的妹妹穿的比我還像新娘。我一直安慰自己膀斋,他們只是感情好梭伐,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仰担,像睡著了一般糊识。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上摔蓝,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天赂苗,我揣著相機(jī)與錄音,去河邊找鬼项鬼。 笑死哑梳,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绘盟。 我是一名探鬼主播鸠真,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼龄毡!你這毒婦竟也來了吠卷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤沦零,失蹤者是張志新(化名)和其女友劉穎祭隔,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體路操,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡疾渴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了屯仗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搞坝。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖魁袜,靈堂內(nèi)的尸體忽然破棺而出桩撮,到底是詐尸還是另有隱情敦第,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布店量,位于F島的核電站芜果,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏融师。R本人自食惡果不足惜右钾,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旱爆。 院中可真熱鬧霹粥,春花似錦、人聲如沸疼鸟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽空镜。三九已至浩淘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吴攒,已是汗流浹背张抄。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留洼怔,地道東北人署惯。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像镣隶,于是被迫代替她去往敵國和親极谊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容