XXX项目总结:
1. 非业务异常的处理
Web项目里面的异常分为两种,一种是业务异常,另一种是非业 务异常。业务异常和business有关,处理业务逻辑时抛出的异常,这种异常我们可以在程序里面捕获到的,而非业务异常需要我们在外面单独去处理的异 常,比如jsp的异常。jsp页面出异常通常会抛出一个jspexception出来,这个exception就需要在servlet层去捕获,下面就是 捕获的方法。
在web.xml中定义处理异常的servlet:
<!-- 定义BPIMSExceptionHandlerServlet类来处理非业务异常 -->
<servlet>
<servlet-name>exceptionHandler</servlet-name>
<servlet-class>com.ibm.partnerworld.incentives.management.action.BPIMSExceptionHandlerServlet</servlet-class>
<init-param>
<param-name>errorPageURL</param-name>
<param-value>error.wss</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<!-- 转发到/error的请求被exceptionHandler处理 -->
<servlet-mapping>
<servlet-name>exceptionHandler</servlet-name>
<url-pattern>/error</url-pattern>
</servlet-mapping>
<!-- 截获Throwable 异常,所有抛到容器里的并且继承自Throwable的异常都可以在这里被servlet截获,然后转发到这个uri(/error)来处理 -->
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error</location>
</error-page>
创建自己的BPIMSExceptionHandlerServlet.java:
/**
*
*/
package com.ibm.partnerworld.incentives.management.action;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.Globals;
/**
* @author jianghaifeng
*
*/
public class BPIMSExceptionHandlerServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
Throwable exception = null;
// Check if struts has placed an exception object in request
Object obj = request.getAttribute(Globals.EXCEPTION_KEY);
if (obj == null) {
// Since no struts exception is found,
// check if a JSP exception is available in request.
obj = request.getAttribute("javax.servlet.jsp.jspException");
}
if ((obj != null) && (obj instanceof Throwable)) {
exception = (Throwable) obj;
}
obj = new NullPointerException("aaaaaatest");
request.setAttribute("errorMessage", obj);
HttpSession session = request.getSession(true);
session.setAttribute("errorMessage", obj);
String requestURI = getServletConfig().getInitParameter("errorPageURL");
String path = request.getRequestURL().toString();
int index = path.lastIndexOf("/");
//assemble the url which direct to the error page
String url = path.substring(0, index) + "/" + requestURI;
//redirect url
response.sendRedirect(url);
} catch (Exception e) {
// Throwing exceptions from this method can result in request
// going in to an infinite loop forwarding to the error servlet
// recursively.
e.printStackTrace();
}
}
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
注意这里的doPost和doGet方法。必须要有doGet方法,因为请求是通过url发到servlet的,而只有doGet方法才能处理url发来的请求。这里只写doPost是不好用的!
下面还要做一个处理,因为response.sendRedirect后url被重定向到一个新的url了,那么这个时候就需要在struts里面定义一个action来处理这个url的请求。
struts-config.xml文件:
<action-mappings>
<action path="/error" type="com.ibm.partnerworld.incentives.management.action.Error">
<forward name="success" path="page.error">
</forward>
</action>
</action-mappings>
在这里用了title:
struts-tiles.tld:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration//EN" "http://jakarta.apache.org/struts/dtds/tiles-config.dtd">
<tiles-definitions>
<!--Define each of your definitions here-->
<definition name="base.definition" path="siteLayout.jsp">
<put name="description" value="description.home" />
<put name="documentTitle" value="IBM - BPIMS" />
<put name="mastHead" value="templates/masthead.jsp" />
<put name="content" value="" />
<put name="navigation" value="templates/navigation.jsp" />
</definition>
<!-- Common Pages -->
<definition name="page.error" extends="base.definition">
<put name="content" value="common/error1.jsp" />
</definition>
</tiles-definitions>
Action类Error.java:
package com.ibm.partnerworld.incentives.management.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
/**
* @version 1.0
* @author
*/
public class Error extends BPIMSAction
{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
ActionErrors errors = new ActionErrors();
ActionForward forward = new ActionForward(); // return value
try {
HttpSession session = request.getSession(true);
Object obj = session.getAttribute("errorMessage");
errors.add("errorMessage", new ActionError("aaaaaaaaaa"));
} catch (Exception e) {
// Report the error using the appropriate name and ID.
errors.add("name", new ActionError("id"));
}
// If a message is required, save the specified key(s)
// into the request for use by the <struts:errors> tag.
if (!errors.isEmpty()) {
saveErrors(request, errors);
// Forward control to the appropriate 'failure' URI (change name as desired)
forward = mapping.findForward("failure");
} else {
// Forward control to the appropriate 'success' URI (change name as desired)
forward = mapping.findForward("success");
}
// Finish with
return (forward);
}
}
error1.jsp:
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<h2>Oops an error had occured..</h2>
<html:errors/>
最终把异常处理成友好的语言输出给用户看。
web项目总结 >> 待续
最新推荐文章于 2023-12-26 18:24:31 发布