為了驗證賬號密碼不為空,需要在控制器下的login()方法前添加驗證器:
1 @Before(LoginValidator.class) 2 public void login() {
而validator是實現了Interceptor(攔截器)接口。validator的用法如下:
1 public class LoginValidator extends Validator { 2 @Override 3 protected void validate(Controller controller) { 4 5 //驗證輸入的賬號和密碼是否是空的 6 validateRequiredString("account", "account", "請輸入賬號"); 7 validateRequiredString("password", "password", "請輸入密碼"); 8 } 9 @Override 10 protected void handleError(Controller controller) { 11 String actionKey = getActionKey(); 12 if (actionKey.equals("/user/login")) { 13 controller.renderJsp("/view/user/login.jsp"); 14 } 15 } 16 }
在上面的代碼中,可以查看下面的源碼可以看到,是先執行validate(validator.controller),然后執行handleError(validator.controller)
final public void intercept(Invocation invocation) { Validator validator = null; try { validator = getClass().newInstance(); } catch (Exception e) { throw new RuntimeException(e); } validator.controller = invocation.getController(); validator.invocation = invocation; try { validator.validate(validator.controller); } catch (ValidateException e) { // should not be throw, short circuit validate need this LogKit.logNothing(e); } if (validator.invalid) { validator.handleError(validator.controller); } else { invocation.invoke(); } }
知道先后順序后,看方法中的代碼分別作了什么:
validateRequiredString("account", "account", "請輸入賬號"):
1 protected void validateRequiredString(String field, String errorKey, String errorMessage) { 2 if (StrKit.isBlank(controller.getPara(field))) 3 addError(errorKey, errorMessage); 4 }
其中的isBlank(controller.getPara(field))只是判斷得到的參數是否為空,而addError(errorKey, errorMessage):
1 protected void addError(String errorKey, String errorMessage) { 2 invalid = true; 3 controller.setAttr(errorKey, errorMessage); 4 if (shortCircuit) { 5 throw new ValidateException(); 6 } 7 }
可以看到,他把validateRequiredString(String field, String errorKey, String errorMessage)中的錯誤key,和錯誤信息通過controller.setAttr()存儲了起來,實際就是
存儲到了request域中。
以上驗證器中的第一個方法看完。
第二個方法中的代碼:
protected void handleError(Controller controller) { String actionKey = getActionKey(); if (actionKey.equals("/user/login")) { controller.renderJsp("/view/user/login.jsp"); } }
第一行和if判斷actionkey是否來自登錄頁面,如果是,就將前面存儲的信息發送到指定頁面
總結:先判斷填入的用戶名和密碼是否為空,如果為空,將信息存儲到request域中,發送回登錄頁面。