web项目总结 >> 待续

  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/>

最终把异常处理成友好的语言输出给用户看。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值