前言:终于来了一篇有质量的文章,我个人感觉非常不错,《jfinal与bootstrap之间的登录跳转实战》。具体内容包含有点击登录弹出模态框、点击登录确认按钮后的validate、jfinal的validate、jfinal的session管理、ajax请求与返回信息处理、页面间智能跳转。
弹出模态框以及jquery validate可以参照jquery weebox总结、弹出窗口不居中显示?、jquery validate初上手系列文章。
从jfinal的validate说起
当然你可以参考jfinal提供的帮助文档,我当然也必须是参照了官方文档,当然对于这种开源技术每个人在使用的过程中肯定有千奇百态的问题,那么依据我的实战结果,我想再赘述一遍也是非常有必要的。
1.指定config中的路由
me.add("/login", MembersController.class, "/pages/login");
2.编写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("用户不存在!"); } // 跳转到前台发起请求的路径 renderJson(); } }
注意:
使用before绑定validate
使用actionkey绑定前端请求action名
使用getSession().setAttribute来操作session,同时前端稍后介绍如何使用
封装ajaxDone系列方法进行数据格式绑定,前端稍后介绍
使用renderJson方法对ajax请求返回结果数据进行json格式输出
接下来你需要看看我封装的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); // 跳转路径 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); } }
注意:
分别封装成功、错误、info级别的信息
增加了statusCode、message、forwardUrl、callbackType四个属性。
以上两个属性和前端也有对应,稍后介绍。
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", "请输入用户名!"); validateRequiredString("password", "passwordMsg", "请输入密码!"); } @Override protected void handleError(Controller controller) { controller.keepModel(Members.class); controller.render("login.jsp"); } }
注意:
这个validate确实没什么屌用,因为前端已经使用jquery validate进行了check,然而请注意,如果你没有使用jquery的或者为了网络安全等等,有这个也不错。
好吧,我其实不想加入这个validate,但是我觉得可以我还没有想到用处,但是心有戚戚焉,觉得它还是有用的。
jfinal的session管理
其实说到这,已经不是jfinal的session了,其实要说的是前端。
<c:choose> <c:when test="${sessionScope.username!=null}"> <span> <a href="javascript:void(0);"> ${sessionScope.username}<s></s> </a> <i></i> <a href="https://www.jb51.net/logout" title="退出">退出</a> </span> </c:when> <c:otherwise> <span> <a title="登录" href="javascript:show_pop_login();">登录</a> </span> </c:otherwise> </c:choose>
注意:
这里使用了${sessionScope.username}获取session数据,这只是很简单的一个应用。
1中好像没什么可说的,但重要的是,你弹出登录框后,需要重新回到对应的跳转页面,然后显示登录的信息,好吧,我觉得没有解释清楚,那么上一张图吧!