1. 程式人生 > >JFinal與Qui學習筆記(二)

JFinal與Qui學習筆記(二)

Qui是一套網頁框架,效果不錯,不過剛剛接觸,難度還是非常大的!完全是新手,這不,到前10分鐘才完成一個簡單的使用者登入。

之前說的JFinal這裡要補充一下:玩了這麼久,底層的東西雖然都不知道,但是基本會用吧,自認為。。呵呵。

工作環境:myeclipse9,tomcat7,mysql,Navicat。嗯就是這些了吧。

在myeclipse中新建一個web project。新建若干包,這個若干好像比較欠打,不過的確挺多包的。。

包名類裡面的類名,可以從Java檔案中體現出來,就不多說了。

第一個檔案:

package com.my.config;

import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.wall.WallFilter;
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.ext.handler.ContextPathHandler;
import com.jfinal.ext.interceptor.SessionInViewInterceptor;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.druid.DruidStatViewHandler;
import com.jfinal.render.ViewType;
import com.my.controller.MainController;
import com.my.model.User;
import com.my.util.UrlHistoryHandler;



public class MyBaseConfig extends JFinalConfig {

	@Override
	public void configConstant(Constants me) {
		// TODO Auto-generated method stub
		//載入全域性配置檔案
		loadPropertyFile("config.properties");        //載入配置檔案
		me.setDevMode(getPropertyToBoolean("dev_model"));//從配置檔案中獲取dev_model引數,此處為true
		me.setEncoding(getProperty("encoding"));          //從配置檔案中獲取encoding編碼方式,並設定。此處為utf-8
		me.setViewType( ViewType.FREE_MARKER);            //設定檢視型別為FreeMaker
	}

	@Override
	public void configHandler(Handlers me) {       //handler方法
		 me.add(new ContextPathHandler("path"));//加入路徑
		  me.add(new DruidStatViewHandler(getProperty("consle")));//資料監控的路徑
		  me.add(new UrlHistoryHandler());
		
	}

	@Override
	public void configInterceptor(Interceptors me) {
		 me.add(new SessionInViewInterceptor());
	}

	@Override
	public void configPlugin(Plugins me) {
		 DruidPlugin druidPlugin = new DruidPlugin(getProperty("jdbcUrl"),
	                getProperty("user"), getProperty("password"));
	        
	        WallFilter wallFilter = new WallFilter();//這個的作用?過濾器?
	        wallFilter.setDbType(getProperty("db_type"));//資料庫型別此處為mysql
	        druidPlugin.addFilter(wallFilter);
	        druidPlugin.addFilter(new StatFilter());
	        
	        me.add(druidPlugin);
	        ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
			me.add(arp);
			arp.addMapping("user","User_Id",User.class);//引數表:表名,主鍵,類
			arp.setShowSql(true);
	}

	@Override
	public void configRoute(Routes me) {
		// TODO Auto-generated method stub
		me.add("/", MainController.class);//設定路由
		
	}
	
	
}

第一個檔案:

package com.my.controller;

import com.jfinal.aop.ClearInterceptor;
import com.jfinal.core.Controller;
import com.my.service.UserService;
import com.my.domain.ReturnJsonObject;
import com.my.model.User;
import com.my.util.GlobalUtils;

public class MainController extends Controller {
	UserService userService = new UserService();
	
	@ClearInterceptor      //清除清除上一級別(Controller級)的攔截器        
	public void index(){               
		/*
		 * 索引方法,跳轉到登入
		 */
//	    render("/_doc/system/login/login.html");//當viewType設定成jsp時還要訪問HTML,則用此。
	    render("/system/login/login.html");
}
	@ClearInterceptor
	public void login(){
		if(getSessionAttr("user")!=null){
		    /*
		     * 登入成功,進入系統
		     */
   			render("/system/layout_html/main.html");
   			
			
        }else{
            /*
             * 登入失敗,重新進入登入頁面
             */
            render("/system/login/login.html");
        }
        
	}
	@ClearInterceptor
	public void checklogin() throws Exception{
		ReturnJsonObject rjo = new ReturnJsonObject();
		//獲得帳號密碼清除多餘空格
		String userName = getRequest().getParameter("username").trim();//.trim()去掉前後多餘的空格
		String password = getRequest().getParameter("password").trim();
		
		User user = userService.queryForUser(userName, password);
		if(user!=null){                       //如果user不為空的話,則說明該使用者存在。
			setSessionAttr("user", user);
			rjo.setCode(GlobalUtils.OPERATOR_SUCCESS);		
		}else{
			rjo.setCode(GlobalUtils.OPERATOR_ERROR);
			rjo.setMessage("帳號或者密碼錯誤");
		}	
		renderJson(rjo);
		
		/*
		 * 將 user 物件轉換成 json 資料並渲染
		 * Json是什麼玩意?JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。
		 */
	}
	
	
}

第三個檔案:
package com.my.domain;

/**
 * 返回的JSON物件失敗成功
 *
 */
public class ReturnJsonObject {
    /**
     * 操作成功或失敗標識
     */
    private String code;
    /**
     * 操作描述資訊
     */
    private String message;
    
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    
    
}
第四個檔案:
package com.my.interceptor;

import com.jfinal.aop.Interceptor;
import com.jfinal.core.ActionInvocation;

public class LoginCheckInterceptor implements Interceptor{

	public void intercept(ActionInvocation ai) {
		if(ai.getController().getSession().getAttribute("user")!=null){
			ai.invoke();
			}
			else{
				ai.getController().setAttr("errorMsg","");
				ai.getController().setAttr("errorMsg","請先登入!!");
				ai.getController().render("/system/login/login.html");
			}
		
	}

}

第五個檔案:
package com.my.model;

import com.jfinal.ext.plugin.tablebind.TableBind;
import com.jfinal.plugin.activerecord.Model;
import com.my.model.User;

@TableBind(tableName="user",pkName="User_Id")
public class User extends Model <User> {
	public static final User dao = new User();
}

第六個檔案:
package com.my.service;

import com.my.model.User;

public class UserService {

	/**
	 * 根據使用者名稱和密碼查詢使用者
	 * @param userName
	 * @param password
	 * @return
	 */
	public User queryForUser(String userName, String password){
		String sqlStr = "select * " +
				"	from user " +
				"	where User_Name=? " +
				"	and User_Password=? ";
		User user = User.dao.findFirst(sqlStr, new Object[]{userName,password});
		return user;
	}

}

還有一個配置檔案:放在WEB-INF下
config.properties
dev_model = true
encoding = UTF-8
db_type = mysql
jdbcUrl= jdbc:mysql://localhost:3306/nimei
consle = /_admin/consle
user = nimei
password = nimei


這裡有些敏感資訊,我都改成nimei了,這是個人習慣勿噴。

還要把資料庫部分做好,說一下如何使用Navicat MySQL匯入.sql檔案。
開啟連線,右鍵相應資料庫,在左側導航欄裡選擇你要匯入的資料庫,右擊它,選“執行批次任務檔案”,然後選擇檔案。

接下來就是Qui中部分了

可以找到login.html頁面。程式碼需要改動一些部分,如下:


		<link href="${path}/system/login/skin/style.css" rel="stylesheet"
			type="text/css" id="skin" />
		<script type="text/javascript" src="${path}/libs/js/jquery.js"></script>
		<script type="text/javascript" src="${path}/libs/js/login.js"></script>
		
		<script type="text/javascript"
			src="${path}/libs/js/method/center-plugin.js"></script>
		
		
	function login() {
		var errorMsg = "";
		var userName = document.getElementById("username");
		var password = document.getElementById("password");
		if (!userName.value) {
			errorMsg += "  使用者名稱不能為空!";
		}
		if (!password.value) {
			errorMsg += "  密碼不能為空!";
		}

		if (errorMsg != "") {
			$(".login_info").html(errorMsg);
			$(".login_info").show();
		} else {
			$(".login_info").show();
			$(".login_info").html("  正在登入中...");
			//登入處理

			$.post("${path}/checklogin", {
				"username" : userName.value,
				"password" : password.value
			}, function(result) {//result沒有宣告?為何也能用?已經包含了!
				if (result.code == "error") {
					$(".login_info").html(result.message);
					return false;
				} else if (result.code == "success") {
					$(".login_info").html("登陸成功,正在跳轉到主介面");
					window.location="${path}/login";//進入主頁面。通過controller中的login方法
					
				}
			}, "json");
		}
		
	}


這裡看重點就好,不要複製貼上了,顯然直接是用不了的。另外登入成功後的頁面也要將js的路徑設對,按照這種方法改就行,但是隻是能用,顯然程式碼還有待提高。

這裡有一條語句活活折騰了我10個小時,window.location="${path}/login";沒錯就是這句。不過真的看起來挺簡單的,但是裡面的問題很多。前面說的所有東西路由都是在“/qui”下進行的,在這一句上我還是想這麼幹,但是在JFinal下不管怎麼幹,經過一次render後,後面的render總是不行。如果把這句直接改成登入成功的頁面,個人總是感覺不安全,因為在瀏覽器中檢視原始碼找到成功頁面的地址後直接輸入,就可以成功(除非在HTML中做檢查)。所以我還是提交給controller類去處理。

這裡有個小技巧:當你發現,出現網頁中一些js程式碼不正確時,可以在瀏覽器中檢視原始碼,檢查路徑是不是對的。

如果上面的程式碼報錯的話,可能你包含的jar不夠,我數了一下,我包含的jar,共18個。。自己真是有點嚇到了,新手嘛。。。

遇到的問題還是挺多的,稍微整理了一下:

遇到問題:在myeclipse9的情況下使用tomcat7,昨晚還可以執行的web project現在出現404,但是http://localhost:8080可以訪問,而且訪問的頁面是tomcat7的頁面,而且以前通過
myeclipse8.5和tomcat6新增得web project依然可以可以訪問。
嘗試解決方法:1,關閉myeclipse9中的tomcat7,到tomcat7的安裝目錄中啟動tomcat7。
訪問8080,tomcat7執行正常。
訪問以前新增的web project,執行正常。
訪問新新增的web project還是不能執行。
2,重啟計算機。
問題情況一致。
3,在該環境下重新匯入一份新的工程test_5555,並將config.properties中的URL更改為:jdbc:mysql://localhost:3306/nimei;注意:mysql資料庫中有這個資料庫。
執行正常。
4,在myeclipse9中將出現問題的web project重新載入進tomcat7。
執行正常,問題解決。
5,不服!將tomcat7重啟,觀察是否問題再次出現。
執行正常,問題解決。
問題總結:可能是某些誤操作,導致問題出現,也有可能是開發環境某一個部分的bug。

遇到的問題還有render系列問題,這裡先不整理了。

嗯,就這樣。