1.声明式异常
struts2支持声明式异常处理,可以再Action中直接抛出异常而交给struts2来处理,当然需要我们在xml文件中配置,由于抛出同样的异常的处理方法通常都一样,所以如果能在xml中配置全局异常,将会使得开发便捷性大大提高。
例如:
Action.java
import com.opensymphony.xwork2.ActionSupport;
public class TestAction1 extends ActionSupport {
@Override
public String execute() throws Exception {
System.out.println("TestAction1 execute....");
int i=1/0;
return SUCCESS;
}
}
struts.xml
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="test1" class="com.zucc.action.TestAction1">
<result>/index.jsp</result>
<result name="error">/error.jsp</result>
<exception-mapping result="error" exception="java.lang.ArithmeticException"/>
</action>
</package>
</struts>
分析:TestAction1中抛出ArithmeticException异常,在struts.xml中通过<exception-mapping result="error" exception="java.lang.ArithmeticException"/>获取这个异常,并处理
一般声明式异常都是配置全局异常,这样就不需要在每个action中配置
struts.xml改成
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.ArithmeticException"/>
</global-exception-mappings>
<action name="test1" class="com.zucc.action.TestAction1">
<result>/index.jsp</result>
</action>
</package>
</struts>
注意:全局result要写在全局异常前面,不然会报错
2.用Filter模拟声明式异常
Servlet.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("TestServlet .....");
int i=1/0;
}
}
Filter.java
Filter.java
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class ExceptionFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("ExceptionFilter......come ");
try {
chain.doFilter(request, response);
}
catch (Exception e) {
request.setAttribute("exception", e);
request.getRequestDispatcher("/error.jsp").forward(request, response);
}
System.out.println("ExceptionFilter......back ");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
web.xml
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.zucc.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
<filter>
<filter-name>ExceptionFilter</filter-name>
<filter-class>com.zucc.filter.ExceptionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ExceptionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
分析:在servlet中抛出异常,在web.xml中截获异常,跳转到Filter处理