Java Web 极速开发框架jfinal 的搭建

前言:

这个Java web服务端的jfinal 框架最早出来上班的时候那个公司的所使用,之前有基本的了解 。 现在只是重新学习了就从零开始的搭建一个基础的项目分享给大家 如果有不足和错误的地方望各位及时指正,废话话不多说我们正式开始

1开发环境:

建议使用myeclispe 或者基础版本的eclipse 装插件都可以 myeclipse 下载地址:https://www.myeclipsecn.com/ eclispe 下载地址: https://www.eclipse.org/downloads/

2具体实现:

一 需要用到的jar包

c3p0-0.9.5.2.jar (数据库连接池的jar包)

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

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


TIM截图20200202202355.png
二 数据库账号密码jdbcUrl配置
TIM截图20200202204558.png
jdbcUrl = jdbc:mysql://localhost/test?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
username = root  //换成自己的数据库的账号和 密码
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 核心配置类读取数据库的配置信息和路由的配置
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 手册推荐的方式启动项目
     * 运行此 main 方法可以启动项目,此main方法可以放置在任意的Class类定义中,不一定要放于此
     */
    public static void main(String[] args) {
        JFinal.start("WebRoot", 80, "/", 5);
    }

读取的是 Databaseconfig.txt 里面的数据库账号密码还有编码等信息


TIM截图20200202204558.png

读取代码具体实现

    @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);

    }

配置访问路由来映射我们对应访问的controller 层的代码逻辑

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

创建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的例子
通过调用setAttr()方法和 renderJson(); 方法来返回json数据

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{
    //通过调用setAttr()方法和  renderJson(); 方法来返回json数据 
    public void index(){
        setAttr("message", "jfinal部署成功!");
        renderJson();
    } 
    
}

我们先跑一把 选中项目 run as run on Server 选择你本地关联的Tomcat

TIM截图20200202212113.png

我们通过控制台看到本地的tomcat 已经启动了
TIM截图20200202212228.png

我们现在用postman来访问测试下
localhost 是本机IP地址 端口默认是8080 当然你也可以修改
http://localhost:8080/jfinal_work/user/index

TIM截图20200202212427.png

到此这个项目我们已经启动了 还有连接数据库操作数据库增删改查的一些逻辑 我简单讲解下
通过调用 getPara 来获取网络请求传过来的数据

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

sql 语句尽量写在modle 或者是service 我这边是偷懒就写在了controller 里面了 各位同学在写的时候要养成写大型项目的好习惯把sql语句抽离出来写

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

全部代码的实现如下

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(){
   //通过调用 getPara 来获取网络请求传过来的数据   
 
        String  username =getPara("username");
        String  password =getPara("password");
        String   againpassword =getPara("againpassword");
          if(!util.isMobileNum2(username)){
              setAttr("msg", "请输入正确格式的手机号码"); 
              setAttr("code", "0");
              renderJson();
              return;
              
          }
          if(!password.equals(againpassword)){
              setAttr("msg", "两次输入的密码不一致"); 
              setAttr("code", "0");
              renderJson();
              return;
          }
    //  sql  语句尽量写在modle 或者是service 我这边是偷懒就写在了controller 里面了 各位同学在写的时候要养成写大型项目的好习惯把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", "已经存在此账号");
              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", "网络异常登录失败");
        }
        
        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();
    }
}

整个项目从部署到获取前端或者移动端传过来的数据的获取 还有数据库的增删改查 都有代码示例和说明 , 整个框架搭建不算很复杂虽然没有spring boot 那简单快速 但是整个框架比较的轻量化 适合快速的开发小型项目, 拓展性也很强大 所以分享给大家 。
项目地址:https://gitee.com/qiuyu123/eclipse_adt.git

最后总结:

我也是学习Java EE没多久的新手(之前做安卓和混编的 ) 因为今年湖北疫情严重 春节假期延长在家没啥事做就学习下 之前就了解过的Java Web极速开发框架jfinal 框架 ,整个工程创建到运行成功 对于有Java web基础的同学难度不算太大 比较顺利 。教程有不足和错误的地方希望大家及时的指正,有兴趣的朋友也可以加我QQ/微信 有空多多交流 个人微信/QQ1693891473

QQ 交流群:

92437359.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容