前言:
這個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包)
二 數(shù)據(jù)庫賬號密碼jdbcUrl配置
jdbcUrl = jdbc:mysql://localhost/test?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
username = root //換成自己的數(shù)據(jù)庫的賬號和 密碼
password = 123456
showSql=true
三 jfinal 的web.xm的配置
<?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ù)庫賬號密碼還有編碼等信息
讀取代碼具體實現(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
我們通過控制臺看到本地的tomcat 已經(jīng)啟動了
我們現(xiàn)在用postman來訪問測試下
localhost 是本機(jī)IP地址 端口默認(rèn)是8080 當(dāng)然你也可以修改
http://localhost:8080/jfinal_work/user/index
到此這個項目我們已經(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