JFinal與Qui學習筆記(二)
之前說的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系列問題,這裡先不整理了。
嗯,就這樣。