前言:終于來(lái)了一篇有質(zhì)量的文章,我個(gè)人感覺(jué)非常不錯(cuò),《jfinal與bootstrap之間的登錄跳轉(zhuǎn)實(shí)戰(zhàn)》。具體內(nèi)容包含有點(diǎn)擊登錄彈出模態(tài)框、點(diǎn)擊登錄確認(rèn)按鈕后的validate、jfinal的validate、jfinal的session管理、ajax請(qǐng)求與返回信息處理、頁(yè)面間智能跳轉(zhuǎn)。
彈出模態(tài)框以及jquery validate可以參照jquery weebox總結(jié)、彈出窗口不居中顯示?、jquery validate初上手系列文章。
從jfinal的validate說(shuō)起
當(dāng)然你可以參考jfinal提供的幫助文檔,我當(dāng)然也必須是參照了官方文檔,當(dāng)然對(duì)于這種開(kāi)源技術(shù)每個(gè)人在使用的過(guò)程中肯定有千奇百態(tài)的問(wèn)題,那么依據(jù)我的實(shí)戰(zhàn)結(jié)果,我想再贅述一遍也是非常有必要的。
1.指定config中的路由
me.add("/login", MembersController.class, "/pages/login");2.編寫(xiě)conroller類
public class MembersController extends BaseController {  @Before(MembersValidator.class)  @ActionKey("/login")  public void login() {    // 獲取用戶名    String name = getPara("username");    // 獲取密碼    String password = getPara("password");    Members mem = Members.me.getMemByNamePasswd(name, CipherUtils.generatePassword(password));    if (mem != null) {      // 保存session      getSession().setAttribute("username", name);      // 最后登錄ip      mem.set("lastip", getRequest().getRemoteHost());      mem.set("lastvisit", DateUtils.getCurrentTime());      mem.update();      ajaxDoneSuccess("登錄成功!");    } else {      ajaxDoneError("用戶不存在!");    }    // 跳轉(zhuǎn)到前臺(tái)發(fā)起請(qǐng)求的路徑    renderJson();  }}注意:
使用before綁定validate
使用actionkey綁定前端請(qǐng)求action名
使用getSession().setAttribute來(lái)操作session,同時(shí)前端稍后介紹如何使用
封裝ajaxDone系列方法進(jìn)行數(shù)據(jù)格式綁定,前端稍后介紹
使用renderJson方法對(duì)ajax請(qǐng)求返回結(jié)果數(shù)據(jù)進(jìn)行json格式輸出
接下來(lái)你需要看看我封裝的baseController
3.BaseController
package com.hc.jf.controller;import com.jfinal.core.Controller;public class BaseController extends Controller {  protected void ajaxDone(int statusCode, String message) {    setAttr("statusCode", statusCode);    setAttr("message", message);    // 跳轉(zhuǎn)路徑    String forwardUrl = getPara("forwardUrl");    if (forwardUrl == null || forwardUrl.equals("")) {      forwardUrl = getRequest().getRequestURL().toString();    }    setAttr("forwardUrl", forwardUrl);    setAttr("callbackType", getPara("callbackType"));  }  protected void ajaxDoneSuccess(String message) {    ajaxDone(200, message);  }  protected void ajaxDoneInfo(String message) {    ajaxDone(201, message);  }  protected void ajaxDoneSuccess(String message, String forwarUrl) {    ajaxDone(200, message);  }  protected void ajaxDoneError(String message) {    ajaxDone(300, message);  }  protected void ajaxDoneError(String message, String forwarUrl) {    ajaxDone(300, message);  }}注意:
分別封裝成功、錯(cuò)誤、info級(jí)別的信息
增加了statusCode、message、forwardUrl、callbackType四個(gè)屬性。
以上兩個(gè)屬性和前端也有對(duì)應(yīng),稍后介紹。
4.MembersValidator
package com.hc.jf.validator;import com.hc.jf.entity.Members;import com.jfinal.core.Controller;import com.jfinal.validate.Validator;public class MembersValidator extends Validator {  @Override  protected void validate(Controller controller) {    validateRequiredString("username", "usernameMsg", "請(qǐng)輸入用戶名!");    validateRequiredString("password", "passwordMsg", "請(qǐng)輸入密碼!");  }  @Override  protected void handleError(Controller controller) {    controller.keepModel(Members.class);    controller.render("login.jsp");  }}注意:
這個(gè)validate確實(shí)沒(méi)什么 主站蜘蛛池模板: 枣庄市| 扬中市| 淳化县| 古交市| 沅陵县| 平和县| 嘉善县| 赤峰市| 伊宁县| 抚远县| 桐城市| 太和县| 磴口县| 盐山县| 东乌珠穆沁旗| 普安县| 连南| 泸水县| 金门县| 黔江区| 苗栗县| 绥宁县| 商都县| 延吉市| 措美县| 新乐市| 崇明县| 泗水县| 久治县| 教育| 专栏| 哈巴河县| 威海市| 永清县| 阜康市| 五大连池市| 红桥区| 通榆县| 桦南县| 扬中市| 隆化县|