天天看點

使用springmvc+urlRewrite實作404,500以及異常的處理

最近在做一個小東西,其中想使用到urlRewrite,剛開始都是很不錯的,僞靜态做的很棒,但慢慢就出現問題了,比如404或者500的錯誤碼出現,雖然在web.xml中做了配合(如下),但好像不起作用啊

<error-page>
		<error-code>404</error-code>
		<location>/error/404.html</location>
	</error-page>
	<error-page>
		<error-code>500</error-code>
		<location>/error/404.html</location>
	</error-page>
	<error-page>
		<error-code>505</error-code>
		<location>/error/404.html</location>
	</error-page>
           

但當把這段配置搞掉的時候,回發現界面出現404錯誤,看來還是有作用的,但為什麼沒有正确調到相應的404界面呢?

網上找了很多,但都沒有找到原因,反而發現了這樣一個東西

public class MyHandlerExceptionResolver implements HandlerExceptionResolver {

	protected static Log logger = LogFactory.getLog(MyHandlerExceptionResolver.class);
	@Override
	
	public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
			Exception ex) {
		 String uri = request.getRequestURI();
		 logger.error("異常的url是:" + uri, new Exception());
		 
		return new ModelAndView("error/404");
	}

}
           

該程式處理的是所有異常,但需要在xml(我的是applicationContext.xml)裡進行配置

<bean id="exceptionResolver" class="包名.MyHandlerExceptionResolver"/>
           

到這裡,還是發現隻能處理異常,即出現異常時候回自動跳轉到404界面,但當真正的404出現時卻跳轉不了

郁悶了幾個小時

就在剛要吃飯的時候,忽然靈機一動,想到了web.xml裡的location是轉發url,這時候應該在urlrewrite.xml裡對其進行配置才對啊,so……試試

在xml裡添加

<!-- 404 -->
	

	<rule>  
        <from>/error/404.html$</from>  
		<to>/error/404.do</to>  
    </rule>
    <outbound-rule> 
		<from>/error/404.html$</from>  
		<to>/error/404.do</to>  
	</outbound-rule>
           

修改myHandle

@Controller
@RequestMapping("error")
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {

	protected static Log logger = LogFactory.getLog(MyHandlerExceptionResolver.class);
	@Override
	@RequestMapping("404")
	public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
			Exception ex) {
		 String uri = request.getRequestURI();
		 logger.error("異常的url是:" + uri, new Exception());
		 
		return new ModelAndView("error/404");
	}

}
           

運作代碼後發現……我真是個天才(大寫的得意,吼哈哈)…………

ok,搞定!!

需要的自取哦

--------------------------------------------------------------------------------------------------------

真以為事情那麼簡單就完成了?

運作代碼段的時候你就會發現,由于多次轉(web.xml裡的404.html-->urlrewrite中的from-->urlrewrite中的to-->action裡的方法),你會發現原本正确的,總會報exception,這是因為在urlrewrite之前,你的僞靜态url總是不存在的,故而會一直執行404

其實,仔細想想,就不難發現我們走了彎路(web.xml裡的404.html-->urlrewrite中的from-->urlrewrite中的to-->action裡的方法),為什麼不能一步到位呢(web.xml裡的404.html-->action裡的方法)?

去掉myHandle裡的@RequestMapping和controller,在另一個controller類裡進行并傳回modelandview(為什麼要更改呢?是因為我們的myHandle是一個監聽器,倘若不該,報exception的問題始終存在)

儲存,允許代碼,成功!

繼續閱讀