首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

struts声明式错误二

2012-10-07 
struts声明式异常二上文如果资源文件改为:error.login.usernull? user must not null{0}则输出user must

struts声明式异常二

上文如果资源文件改为:

error.login.usernull?= user must not null{0}

则输出user must not null null

即参数由null来代替。

我们可以看到ExceptionHandler的excute方法里面是这样处理的。

 error = new ActionMessage(ae.getKey(), ex.getMessage());              property = error.getKey();   

?

可以看到new ActionMessage(ae.getKey(), ex.getMessage());??
这里的ae.getKey()就是我们在配置文件的exception的key属性。

<action path="/logon" type="com.lwf.struts.action.LogonAction"name="logonForm" input="/logon.jsp" scope="session" validate="true" ><exception key="error.login.usernull" type="com.lwf.struts.util.UserNotFoundException" path="/index.jsp" ></exception></action>

?而第二个参数ex.getMessage()则是获取异常信息。

也就是说如果我们的异常处理类抛出一个带参数的异常如;

package com.lwf.struts.action.entity;import com.lwf.struts.exception.PasswordNotFoundException;import com.lwf.struts.exception.UserNotFoundException;public class UserManager {private static UserManager userManager = new UserManager();private UserManager(){}public static UserManager instance(){return userManager;}public boolean isValidaUser(String name, String pwd) throws Exception{boolean flagPwd = false;boolean flagUser = false;if(name!=null && name.equals("admin")){flagUser = true;}else{throw new UserNotFoundException(“user incorrect”);}if(pwd!=null && pwd.equals("super")){flagPwd = true;}else{throw new PasswordNotFoundException("pwd incorrect");}return flagPwd && flagUser;}}

new UserNotFoundException(“user incorrect”);
?

注意黑体部分。那么异常会输出:

user must not null user incorrect null

即资源文件的key内容+异常抛出的文本+参数化

当然上面参数化也没有显示出来。需要我们写一个自己的ExceptionHandler来处理。

我们使用一个统一的异常类。如下:

package com.lwf.struts.exception;public class ErrorCodeException extends RuntimeException {private static final long serialVersionUID = 1L;private String errorCode;//错误码,对应资源文件的keyprivate Object[] args;//占位符,即参数public ErrorCodeException(){}public ErrorCodeException(String errorCode){this.errorCode = errorCode;}public ErrorCodeException(String errorCode, Object[] args){this.errorCode = errorCode;this.args = args;}public ErrorCodeException(String errorCode, Object args){this(errorCode,new Object[]{args});}public String getErrorCode() {return errorCode;}public void setErrorCode(String errorCode) {this.errorCode = errorCode;}public Object[] getArgs() {return args;}public void setArgs(Object[] args) {this.args = args;}}

?

实际上我们是为构造ActionMessage做准备。

我们自己的handler类:

package com.lwf.struts.handler;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.Globals;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import org.apache.struts.action.ActionMessage;import org.apache.struts.action.ExceptionHandler;import org.apache.struts.config.ExceptionConfig;import com.lwf.struts.exception.ErrorCodeException;public class LogonHandler extends ExceptionHandler {public ActionForward execute(Exception ex, ExceptionConfig ae,ActionMapping mapping, ActionForm formInstance,HttpServletRequest request, HttpServletResponse response)throws ServletException {if(!(ex instanceof ErrorCodeException)){          return  super.execute(ex, ae, mapping, formInstance, request, response);}        ActionForward forward;        ActionMessage error;        String property;        if (ae.getPath() != null) {            forward = new ActionForward(ae.getPath());        } else {            forward = mapping.getInputForward();        }        ErrorCodeException ece = (ErrorCodeException)ex;        String errocode = ece.getErrorCode();        Object[] args = ece.getArgs();        error = new ActionMessage(errocode, args);        property = error.getKey();        this.logException(ex);        // Store the exception        request.setAttribute(Globals.EXCEPTION_KEY, ex);        this.storeException(request, property, error, forward, ae.getScope());        return forward;}}

?

?error = new ActionMessage(errocode, args);

我们可以看到现在我们构造ActionMessage传入的第一个参数不再是ae.getKey()所以现在来说

配置文件exception的key属性在这里可以不需要与资源文件相对应,可随便取值。如下配置:

<action path="/login" type="com.lwf.struts.action.LoginAction"name="loginForm" input="/index.jsp" scope="session" validate="true" ><exception key="keyCode" type="com.lwf.struts.exception.ErrorCodeException" handler="com.lwf.struts.handler.LogonHandler"></exception></action>

?看上面key="keyCode"

下面action

package com.lwf.struts.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import org.apache.struts.action.ActionMessages;import com.lwf.struts.action.entity.UserManager;import com.lwf.struts.form.LoginForm;public class LoginAction extends Action {public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {LoginForm loginForm = (LoginForm)form;String name = loginForm.getUsername();String pwd = loginForm.getPassword();ActionMessages errors = new ActionMessages();UserManager.instance().isValidaUser(name, pwd);return mapping.findForward("success");}}

?下面是UserManager类。

package com.lwf.struts.action.entity;import com.lwf.struts.exception.ErrorCodeException;import com.lwf.struts.exception.PasswordNotFoundException;public class UserManager {private static UserManager userManager = new UserManager();private UserManager(){}public static UserManager instance(){return userManager;}public boolean isValidaUser(String name, String pwd) throws Exception{boolean flagPwd = false;boolean flagUser = false;if(name!=null && name.equals("admin")){flagUser = true;}else{throw new ErrorCodeException("user.name.incorrect",name);}if(pwd!=null && pwd.equals("super")){flagPwd = true;}else{throw new ErrorCodeException("user.pwd.incorrect",pwd);}return flagPwd && flagUser;}}

?注意我们这里统一抛出的是ErrorCodeException异常,只是参数不同。第一个参数必须与资源文件的key对应,第二个参数则可以是对象或对象数组。对应于资源文件的点位符。如ApplicationResources.properties文件内容

user.name.incorrect= user incorrect {0}user.pwd.incorrect= pwd incorrect{0}

?这里我们传入的是输入的用户名。

好测试一下。我们输入用户名为we

那么在页面上会看到:

user incorrect we

?

即实现了参数化

热点排行