springmvc页面跳转404 mvc 通过<error-page>处理404,怎么记录造成404的请求

如何定义404
404,说白了就是找不到页面,那么如何定义&找不到&呢?
我们可以通过源代码来看看Spring MVC如何定义&404&的:
// Determine handler for the current request.
mappedHandler = getHandler(processedRequest, false);
if (mappedHandler == null || mappedHandler.getHandler() == null) {
noHandlerFound(processedRequest, response);
getHandler是根据请求的url,通过handlerMapping来匹配到Controller的过程。
如果匹配不到,那么就执行noHandlerFound方法。这个方法很简单,返回一个404的错误代码。
我们的Web容器,比如tomcat,会根据这个错误代码来生成一个错误界面给用户。
那么,我们如何自定义这个界面呢?
重写noHandlerFound方法
最先想到的肯定是重写noHandlerFound方法,这个方法是protected,可以重写。
我们需要将页面重定向到我们自定义的404界面,那么只需要
protected void noHandlerFound(HttpServletRequest request,
HttpServletResponse response) throws Exception {
response.sendRedirect(request.getContextPath() + "/notFound");
这里我们的Controller里需要定义一个@requestMapping("/notFound")的这么一个方法,用来返回一个404页面
或者,这里应该可以采用直接访问静态文件的方法。
另外,也可以通过抛出一个异常NoSuchRequestHandlingMethodException
这样我们就实现了自定义的404页面。那么,还有别的方法吗?
利用Spring MVC的最精确匹配
Spring MVC对于url的匹配采用的是一种叫做&最精确匹配的方式&,举个例子
比如我们同时定义了&/test/a&, "/test/*",那么若请求的url结尾为/test/a,那么则会匹配精确的那个,也就是"/test/a"
我们是不是可以利用这个特点来找到那些找不到的页面?
1、首先我们定义一个拦截所有url的规则@requestMapping("*"),那么实际上不存在找不到的页面了,也就是永远不会进入noHandlerFound方法体内
2、后面的步骤和平时一样,为别的请求都配置上@requestMapping
那么请求过来,要么进入我们精确匹配的method(也就是找的到的),要么进入@requestMapping("*)拦截的方法体内(也就是找不到的)
那么我们只要让@requestMapping("*)拦截的这个方法返回一个自定义的404界面就OK了~
利用web容器提供的error-page
还记得之前提到的web容器会提供一个404的默认界面吗?
其实我们完全可以替换成我们自己的界面,那么看起来这种方法应该是最简单的了。
只需要在web.xml文件中写上如下代码就可以了:
不过值得注意的是,这里配置的的location其实会被当成一个请求来访问。
那么我们的DispatcherServlet会拦截这个请求而造成无法访问,此时的结果是用户界面一片空白。
所以这里的404.htm其实是一个静态资源,我们需要用访问静态资源的方式去访问。
而在我的Spring MVC里,resource目录下的文件都是不会被拦截的
比较三种方式的区别
1、最方便:那肯定是第三种了,我们只需要提供一个静态页面即可
2、最快捷:第一种肯定最慢,因为它会发起2个请求。第二种和第三种应该差不多
3、最灵活:从灵活性上来看,第三种肯定是最缺乏的,但是其实对于404来说并不是需要经常变化的,不过也保不准可能可以允许用户自定义404界面等,这里一、二两种方式则提供了灵活性。
4、通用性:第三种应该是最通用了,而一、二 两种则要依赖Spring MVC
阅读(...) 评论()SpringMVC(17)
&&&&&& SpringMVC 提供的异常处理主要有两种方式,一种是直接实现自己的HandlerExceptionResolver,另一种是使用注解的方式实现一个专门用于处理异常的Controller——ExceptionHandler。前者当发生异常时,页面会跳到指定的错误页面,后者同样,只是后者会在每个controller中都需要加入重复的代码。如何进行简单地统一配置异常,使得发生普通错误指定到固定的页面,ajax发生错直接通过js获取,展现给用户,变得非常重要。下面先介绍下2种异常处理方式,同时,结合现有的代码,让其支持ajax方式,实现spring
MVC web系统的异常统一处理。
&&&&&& 1、实现自己的HandlerExceptionResolver
&&&&&& HandlerExceptionResolver是一个接口,springMVC本身已经对其有了一个自身的实现——DefaultExceptionResolver,该解析器只是对其中的一些比较典型的异常进行了拦截处理&。
Java代码&&
import&javax.servlet.http.HttpServletR&&
import&javax.servlet.http.HttpServletR&&
import&org.springframework.web.servlet.HandlerExceptionR&&
import&org.springframework.web.servlet.ModelAndV&&
public&class&ExceptionHandler&implements&HandlerExceptionResolver&{&&
&&&&@Override&&
&&&&public&ModelAndView&resolveException(HttpServletRequest&request,&&
&&&&&&&&&&&&HttpServletResponse&response,&Object&handler,&Exception&ex)&{&&
&&&&&&&&&&
&&&&&&&&return&new&ModelAndView(&exception&);&&
&&&&&& 上述的resolveException的第4个参数表示对哪种类型的异常进行处理,如果想同时对多种异常进行处理,可以把它换成一个异常数组。
定义了这样一个异常处理器之后就要在applicationContext中定义这样一个bean对象,如:
&id=&exceptionResolver&&class=&com.tiantian.xxx.web.handler.ExceptionHandler&&&
&&&&&&& 2、使用@ExceptionHandler进行处理
&&&&&&& 使用@ExceptionHandler进行处理有一个不好的地方是进行异常处理的方法必须与出错的方法在同一个Controller里面,如:
Java代码&&
import&org.springframework.stereotype.C&&
import&org.springframework.web.bind.annotation.ExceptionH&&
import&org.springframework.web.bind.annotation.RequestM&&
import&com.tiantian.blog.web.servlet.MyE&&
@Controller&&
public&class&GlobalController&{&&
&&&&@ExceptionHandler({MyException.class})&&
&&&&public&String&exception(MyException&e)&{&&
&&&&&&&&System.out.println(e.getMessage());&&
&&&&&&&&e.printStackTrace();&&
&&&&&&&&return&&exception&;&&
&&&&@RequestMapping(&test&)&&
&&&&public&void&test()&{&&
&&&&&&&&throw&new&MyException(&出错了!&);&&
&&&&&& 这里在页面上访问test方法的时候就会报错,而拥有该test方法的Controller又拥有一个处理该异常的方法,这个时候处理异常的方法就会被调用。当发生异常的时候,上述两种方式都使用了的时候,第一种方式会将第二种方式覆盖。
&&&&&&& 3. 针对SpringMVC框架,修改代码实现普通异常及ajax异常的全部统一处理解决方案
&&&&&&&&关于spring异常框架体系讲的非常清楚,Dao层,以及sevcie层异常我们建立如下异常。
Java代码&&
package&com.jason.&&
public&class&BusinessException&extends&Exception&{&&
&&&&private&static&final&long&serialVersionUID&=&1L;&&
&&&&public&BusinessException()&{&&
&&&&&&&&&&
&&&&public&BusinessException(String&message)&{&&
&&&&&&&&super(message);&&
&&&&&&&&&&
&&&&public&BusinessException(Throwable&cause)&{&&
&&&&&&&&super(cause);&&
&&&&&&&&&&
&&&&public&BusinessException(String&message,&Throwable&cause)&{&&
&&&&&&&&super(message,&cause);&&
&&&&&&&&&&
Java代码&&
package&com.jason.&&
public&class&SystemException&extends&RuntimeException&{&&
&&&&private&static&final&long&serialVersionUID&=&1L;&&
&&&&public&SystemException()&{&&
&&&&&&&&&&
&&&&public&SystemException(String&message)&{&&
&&&&&&&&super(message);&&
&&&&&&&&&&
&&&&public&SystemException(Throwable&cause)&{&&
&&&&&&&&super(cause);&&
&&&&&&&&&&
&&&&public&SystemException(String&message,&Throwable&cause)&{&&
&&&&&&&&super(message,&cause);&&
&&&&&&&&&&
&&&&&& 在sevice层我们需要将建立的异常抛出,在controller层,我们需要捕捉异常,将其转换直接抛出,抛出的异常,希望能通过我们自己统一的配置,支持普通页面和ajax方式的页面处理,下面就详细讲一下步骤。
&&&&& (1) 配置web.xml 文件,将常用的异常进行配置,配置文件如下403,404,405,500页面都配置好了:
&version=&1.0&&encoding=&UTF-8&&&
&xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&&xmlns=&/xml/ns/javaee&&xmlns:web=&/xml/ns/javaee/web-app_2_5.xsd&&xsi:schemaLocation=&/xml/ns/javaee&/xml/ns/javaee/web-app_2_5.xsd&&id=&WebApp_ID&&version=&2.5&&&
&&SpringJSON&&
&&&&&&&&webAppRootKey&&&&
&&&&&&&&SpringJSON.webapp.root&&&&
&&&&&!--*******log4j日志信息的配置,设置在classpath根目录下&,spring中很多代码使用了不同的日志接口,&&
&&&&既有log4j也有commons-logging,这里只是强制转换为log4j!并且,log4j的配置文件只能放在classpath根路径。&&
&&&&同时,需要通过commons-logging配置将日志控制权转交给log4j。同时commons-logging.properties必须放置&&
&&&&在classpath根路径******&--&&
&&&&&&&&log4jConfigLocation&&
&&&&&&&&classpath:log4j.xml&&
&&&&&&&&log4jRefreshInterval&&
&&&&&&&&60000&&
&&&&&!--applicationContext.xml用于对应用层面做整体控制。按照分层思想,&&
&&&&统领service层,dao层,datasource层,及国际化层--&&
&&&&&&&&contextConfigLocation&&
&&&&&&&&classpath:applicationContext.xml&&
&&&&&&&&org.springframework.web.util.Log4jConfigListener&&
&&&&&&&&org.springframework.web.context.ContextLoaderListener&&
&&&&&&&&org.springframework.web.util.IntrospectorCleanupListener&&
&&&&&&&&CharacterEncodingFilter&&
&&&&&&&&org.springframework.web.filter.CharacterEncodingFilter&&
&&&&&&&&&&
&&&&&&&&&&&&encoding&&
&&&&&&&&&&&&UTF-8&&
&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&&&&&forceEncoding&&
&&&&&&&&&&&&true&&
&&&&&&&&&&
&&&&&&&&CharacterEncodingFilter&&
&&&&&&&&/*&&
&&&&&&&&SpringJSON&&
&&&&&&&&org.springframework.web.servlet.DispatcherServlet&&
&&&&&&&&&&
&&&&&&&&&&&&contextConfigLocation&&
&&&&&&&&&&&&classpath:spring/applicationContext-servlet.xml&&
&&&&&&&&&&
&&&&&&&&1&&
&&&&&!--***使用.html后缀,一方面用户不能通过URL知道我们采用何种服务端技术,&&
&&&&同时,可骗过搜索引擎,增加被收录的概率&。真正的静态网页可以用.htm,以避免被框架拦截--&&
&&&&&&&&SpringJSON&&
&&&&&&&&*.html&&
&&&&&&&&index.html&&
&&&&&&&&403&&
&&&&&&&&/WEB-INF/pages/error/403.jsp&&
&&&&&&&&404&&
&&&&&&&&/WEB-INF/pages/error/404.jsp&&
&&&&&&&&405&&
&&&&&&&&/WEB-INF/pages/error/405.jsp&&
&&&&&&&&500&&
&&&&&&&&/WEB-INF/pages/error/500.jsp&&
&&&&&&&& (2)建立相应的error页面,其中errorpage.jsp 是业务异常界面。
Html代码&&
%@&page&language=&java&&import=&java.util.*&&pageEncoding=&UTF-8&&isErrorPage=&true&%&&
%@&include&file=&/common/taglibs.jsp&%&&
&!DOCTYPE&html&PUBLIC&&-//W3C//DTD&XHTML&1.0&Transitional//EN&&&http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&&&
&xmlns=&http://www.w3.org/1999/xhtml&&&
&&&&error&page&&
&&&&&type=&text/javascript&&&
&&&&&&&&$(function(){&&
&&&&&&&&&&&&$(&#center-div&).center(true);&&
&&&&&&&&})&&
&style=&margin:&0;padding:&0;background-color:&#f5f5f5;&&&
&&&&&id=&center-div&&&
&&&&&&&&&style=&height:&100%;&width:&600&text-align:&&&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&width=&220&&height=&393&&src=&${basePath}/images/common/error.png&&style=&float:&&padding-right:&20&&alt=&&&&&
&&&&&&&&&&&&&&&&&&&&%=&exception.getMessage()%&&
&&&&&&&&&&&&&&&&&&&&&style=&line-height:&12&color:򢰪&font-family:&Tahoma,&'宋体';&font-size:&12&text-align:&&&&
&&&&&&&&&&&&&&&&&&&&&href=&javascript:history.go(-1);&返回!!!&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&&&&&&&
&errorpage.jsp代码内容如下:
Html代码&&
&&&&&&& (3)自定义SimpleMappingExceptionResolver覆盖spring的SimpleMappingExceptionResolver。关于SimpleMappingExceptionResolver的用法,大家都知道,只需在application-servlet.xml中做如下的配置
Java代码&&
&bean&id=&exceptionResolver&&class=&org.springframework.web.servlet.handler.SimpleMappingExceptionResolver&&&&
&&&&&&&property&name=&exceptionMappings&&&&&
&&&&&&&&&props&&&&
&&&&&&&&&&&prop&key=&com.jason.exception.SystemException&&error/500&/prop&&&&
&&&&&&&&&&&prop&key=&com.jason.exception.BusinessException&&error/errorpage&/prop&&&
&&&&&&&&&&&prop&key=&java.lang.exception&&error/500&/prop&&&
&&&&&&&&&&&&
&&&&&&&&/props&&&&
&&&&&&/property&&&&
&&&&&/bean&&&
&&&&&&&&&& 观察SimpleMappingExceptionResolver,我们可以复写其doResolveException(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)方法,通过修改该方法实现普通异常和ajax异常的处理,代码如下:
Java代码&&
package&com.jason.&&
import&java.io.IOE&&
import&java.io.PrintW&&
import&javax.servlet.http.HttpServletR&&
import&javax.servlet.http.HttpServletR&&
import&org.springframework.web.servlet.ModelAndV&&
import&org.springframework.web.servlet.handler.SimpleMappingExceptionR&&
public&class&CustomSimpleMappingExceptionResolver&extends&&
&&&&&&&&SimpleMappingExceptionResolver&{&&
&&&&@Override&&
&&&&protected&ModelAndView&doResolveException(HttpServletRequest&request,&&
&&&&&&&&&&&&HttpServletResponse&response,&Object&handler,&Exception&ex)&{&&
&&&&&&&&&&
&&&&&&&&String&viewName&=&determineViewName(ex,&request);&&
&&&&&&&&if&(viewName&!=&null)&{&&
&&&&&&&&&&&&if&(!(request.getHeader(&accept&).indexOf(&application/json&)&&&-1&||&(request&&
&&&&&&&&&&&&&&&&&&&&.getHeader(&X-Requested-With&)!=&null&&&&request&&
&&&&&&&&&&&&&&&&&&&&.getHeader(&X-Requested-With&).indexOf(&XMLHttpRequest&)&&&-1)))&{&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&Integer&statusCode&=&determineStatusCode(request,&viewName);&&
&&&&&&&&&&&&&&&&if&(statusCode&!=&null)&{&&
&&&&&&&&&&&&&&&&&&&&applyStatusCodeIfPossible(request,&response,&statusCode);&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&return&getModelAndView(viewName,&ex,&request);&&
&&&&&&&&&&&&}&else&{&&
&&&&&&&&&&&&&&&&try&{&&
&&&&&&&&&&&&&&&&&&&&PrintWriter&writer&=&response.getWriter();&&
&&&&&&&&&&&&&&&&&&&&writer.write(ex.getMessage());&&
&&&&&&&&&&&&&&&&&&&&writer.flush();&&
&&&&&&&&&&&&&&&&}&catch&(IOException&e)&{&&
&&&&&&&&&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&return&null;&&
&&&&&&&&&&&&}&&
&&&&&&&&}&else&{&&
&&&&&&&&&&&&return&null;&&
&&&&&&&&}&&
&&&&&&&&& 配置application-servelt.xml如下:(代码是在大的工程中提炼出来的,具体有些东西这里不做处理)
Java代码&&
&?xml&version=&1.0&&encoding=&UTF-8&?&&&
&beans&xmlns=&http://www.springframework.org/schema/beans&&&
&&&&&&&xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&&&
&&&&&&&xmlns:mvc=&http://www.springframework.org/schema/mvc&&&
&&&&&&&xmlns:p=&http://www.springframework.org/schema/p&&&
&&&&&&&xmlns:context=&http://www.springframework.org/schema/context&&&
&&&&&&&xmlns:aop=&http://www.springframework.org/schema/aop&&&
&&&&&&&xmlns:tx=&http://www.springframework.org/schema/tx&&&
&&&&&&&xsi:schemaLocation=&http:&&
&&&&&&&&&&&&http:&&
&&&&&&&&&&&&http:&&
&&&&&&&&&&&&http:&&
&&&&&&&&&&&&http:&&
&&&&&&&&&&&&http:&&
&&&&&&&&&&&&http:&&
&&&&&&&&&&&&http:&&
&&&&&&&&&&&&http:&&
&&&&&&&&&&&&http:&&
&&&&&&&&&&&&http:&&
&&&&&&&&&&&&http:&&
&&&&&&&&&&&&&&
&&&&&!--&配置静态资源,直接映射到对应的文件夹,不被DispatcherServlet处理&--&&&
&&&&&mvc:resources&mapping=&/images/**&&location=&/images/&/&&&
&&&&&mvc:resources&mapping=&/css/**&&location=&/css/&/&&&
&&&&&mvc:resources&mapping=&/js/**&&location=&/js/&/&&&
&&&&&mvc:resources&mapping=&/html/**&&location=&/html/&/&&&
&&&&&mvc:resources&mapping=&/common/**&&location=&/common/&/&&&
&&&&&!--&Configures&the&@Controller&programming&model&--&&&
&&&&&mvc:annotation-driven&/&&&
&&&&&!--扫描web包,应用Spring的注解--&&&
&&&&&context:component-scan&base-package=&com.jason.web&/&&&
&&&&&bean&id=&captchaProducer&&name=&&captchaProducer&&class=&com.google.code.kaptcha.impl.DefaultKaptcha&&&&&&
&&&&&&&&&property&name=&config&&&&&&
&&&&&&&&&&&&&bean&class=&com.google.code.kaptcha.util.Config&&&&&&
&&&&&&&&&&&&&&&&&constructor-arg&&&&&
&&&&&&&&&&&&&&&&&&&&&props&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&prop&key=&kaptcha.image.width&&300&/prop&&&
&&&&&&&&&&&&&&&&&&&&&&&&&prop&key=&kaptcha.image.height&&60&/prop&&&
&&&&&&&&&&&&&&&&&&&&&&&&&prop&key=&kaptcha.textproducer.char.string&&&/prop&&&
&&&&&&&&&&&&&&&&&&&&&&&&&prop&key=&kaptcha.textproducer.char.length&&4&/prop&&&&
&&&&&&&&&&&&&&&&&&&&&/props&&&&&
&&&&&&&&&&&&&&&&&/constructor-arg&&&&&
&&&&&&&&&&&&&/bean&&&&&
&&&&&&&&&/property&&&&&
&&&&&/bean&&&&
&&&&&!--&&&
&&&&&bean&id=&captchaProducer&&class=&com.google.code.kaptcha.impl.DefaultKaptcha&&&&&&
&&&&&&&&&property&name=&config&&&&&&
&&&&&&&&&&&&&bean&class=&com.google.code.kaptcha.util.Config&&&&&&
&&&&&&&&&&&&&&&&&constructor-arg&&&&&
&&&&&&&&&&&&&&&&&&&&&props&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&prop&key=&kaptcha.border&&no&/prop&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&prop&key=&kaptcha.border.color&&105,179,90&/prop&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&prop&key=&kaptcha.textproducer.font.color&&red&/prop&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&prop&key=&kaptcha.image.width&&250&/prop&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&prop&key=&kaptcha.textproducer.font.size&&90&/prop&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&prop&key=&kaptcha.image.height&&90&/prop&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&prop&key=&kaptcha.session.key&&code&/prop&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&prop&key=&kaptcha.textproducer.char.length&&4&/prop&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&prop&key=&kaptcha.textproducer.font.names&&宋体,楷体,微软雅黑&/prop&&&&&
&&&&&&&&&&&&&&&&&&&&&/props&&&&&
&&&&&&&&&&&&&&&&&/constructor-arg&&&&&
&&&&&&&&&&&&&/bean&&&&&
&&&&&&&&&/property&&&&&
&&&&&/bean&&&
&&&&--&&&&
&&&&&!--&&
&&&&&bean&id=&exceptionResolver&&class=&org.springframework.web.servlet.handler.SimpleMappingExceptionResolver&&&&
&&&&&--&&&
&&&&&&bean&id=&exceptionResolver&&class=&com.jason.exception.CustomSimpleMappingExceptionResolver&&&&
&&&&&&&property&name=&exceptionMappings&&&&&
&&&&&&&&&props&&&&
&&&&&&&&&&&prop&key=&com.jason.exception.SystemException&&error/500&/prop&&&&
&&&&&&&&&&&prop&key=&com.jason.exception.BusinessException&&error/errorpage&/prop&&&
&&&&&&&&&&&prop&key=&java.lang.exception&&error/500&/prop&&&
&&&&&&&&&&&&
&&&&&&&&/props&&&&
&&&&&&/property&&&&
&&&&&/bean&&&
&&&&&!--启动Spring&MVC的注解功能,设置编码方式,防止乱码--&&&
&&&&&bean&class=&org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter&&&&
&&&&&&&property&name=&messageConverters&&&&&&&
&&&&&&&&&&list&&&&&&
&&&&&&&&&&&&&&bean&class&=&&org.springframework.http.converter.StringHttpMessageConverter&&&&&&&
&&&&&&&&&&&&&&&&&property&name&=&&supportedMediaTypes&&&&
&&&&&&&&&&&&&&&&&&&&&&&list&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&value&text/charset=UTF-8&/value&&&&&&
&&&&&&&&&&&&&&&&&&&&&&/list&&&&&&
&&&&&&&&&&&&&&&&&/property&&&&&&
&&&&&&&&&&&&&&/bean&&&&&&
&&&&&&&&&&/list&&&&&&
&&&&&&&/property&&&&
&&&&&/bean&&&
&&&&&!--对模型视图名称的解析,即在模型视图名称添加前后缀InternalResourceViewResolver--&&&
&&&&&!--默认的就是JstlView所以这里就不用配置viewClass&--&&&
&&&&&bean&id=&viewResolver&&&class=&org.springframework.web.servlet.view.InternalResourceViewResolver&&&&
&&&&&&&&p:prefix=&/WEB-INF/pages/&&&&
&&&&&&&&p:suffix=&.jsp&&/&&&
&/beans&&&
&&&&&&&&至此,整个异常体系架构配置成功,当整个工程出现异常时,页面会根据web.xml跳转到指定的页面。当在系统应用中出现普通异常时,根据是系统异常还是应用异常,跳到相应的界面,当ajax异常时,在ajax的error中可直接获得异常。普通的异常我们都配置好了界面,系统会自动跳转,主要看一下ajax的方式。
&&&&&&& 具体演示如下:在登录界面建立如下的controller
Java代码&&
package&com.jason.&&
import&java.io.IOE&&
import&java.util.D&&
import&java.util.HashM&&
import&java.util.M&&
import&javax.servlet.http.HttpServletR&&
import&javax.servlet.http.HttpServletR&&
import&javax.servlet.http.HttpS&&
import&mons.lang.StringU&&
import&org.springframework.beans.factory.annotation.A&&
import&org.springframework.stereotype.C&&
import&org.springframework.web.bind.annotation.RequestM&&
import&org.springframework.web.bind.annotation.ResponseB&&
import&org.springframework.web.servlet.ModelAndV&&
import&com.jason.domain.U&&
import&com.jason.exception.BusinessE&&
import&com.jason.service.UserS&&
import&com.jason.util.C&&
import&com.jason.web.dto.LoginC&&
@Controller&&
public&class&LoginController&{&&
&&&&@Autowired&&
&&&&private&UserService&userS&&
&&&&@RequestMapping(value&=&&/index.html&)&&
&&&&public&String&loginPage()&throws&BusinessException&{&&
&&&&&&&&return&Constants.LOGIN_PAGE;&&
&&&&@RequestMapping(value&=&&/josontest.html&)&&
&&&&public&@ResponseBody&&
&&&&Map&String,&Object&&getjson()&throws&BusinessException&{&&
&&&&&&&&Map&String,&Object&&map&=&new&HashMap&String,&Object&();&&
&&&&&&&&try&{&&
&&&&&&&&&&&&map.put(&content&,&&123&);&&
&&&&&&&&&&&&map.put(&result&,&true);&&
&&&&&&&&&&&&map.put(&account&,&1);&&
&&&&&&&&&&&&throw&new&Exception();&&
&&&&&&&&}&catch&(Exception&e)&{&&
&&&&&&&&&&&&throw&new&BusinessException(&detail&of&ajax&exception&information&);&&
&&&&&&&&}&&
&&&&@RequestMapping(value&=&&/login.html&)&&
&&&&public&ModelAndView&loginIn(HttpServletRequest&request,&&
&&&&&&&&&&&&HttpServletResponse&respone,&LoginCommand&loginCommand)&&
&&&&&&&&&&&&throws&IOException&{&&
&&&&&&&&boolean&isValidUser&=&userService.hasMatchUser(&&
&&&&&&&&&&&&&&&&loginCommand.getUserName(),&loginCommand.getPassword());&&
&&&&&&&&boolean&isValidateCaptcha&=&validateCaptcha(request,&loginCommand);&&
&&&&&&&&ModelAndView&modeview&=&new&ModelAndView(Constants.LOGIN_PAGE);&&
&&&&&&&&if&(!isValidUser)&{&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&modeview.addObject(&loginError&,&&login.user.error&);&&
&&&&&&&&&&&&return&&&
&&&&&&&&}&else&if&(!isValidateCaptcha)&{&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&modeview.addObject(&loginError&,&&login.user.kaptchaError&);&&
&&&&&&&&&&&&return&&&
&&&&&&&&}&else&{&&
&&&&&&&&&&&&User&user&=&userService.findUserByUserName(loginCommand&&
&&&&&&&&&&&&&&&&&&&&.getUserName());&&
&&&&&&&&&&&&user.setLastIp(request.getLocalAddr());&&
&&&&&&&&&&&&user.setLastVisit(new&Date());&&
&&&&&&&&&&&&userService.loginSuccess(user);&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&request.getSession().setAttribute(Constants.LOGINED,&user);&&
&&&&&&&&&&&&String&uri&=&(String)&request.getSession().getAttribute(&&
&&&&&&&&&&&&&&&&&&&&Constants.CURRENTPAGE);&&
&&&&&&&&&&&&if&(uri&!=&null&&
&&&&&&&&&&&&&&&&&&&&&&&!StringUtils.equalsIgnoreCase(uri,&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&Constants.CAPTCHA_IMAGE))&{&&
&&&&&&&&&&&&&&&&respone.sendRedirect(request.getContextPath()&+&uri);&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&return&new&ModelAndView(Constants.FRONT_MAIN_PAGE);&&
&&&&&&&&}&&
&&&&@RequestMapping(value&=&&/logout.html&)&&
&&&&public&ModelAndView&logout(HttpServletRequest&request,&&
&&&&&&&&&&&&HttpServletResponse&response)&{&&
&&&&&&&&HttpSession&session&=&request.getSession(false);&&
&&&&&&&&if&(session&!=&null)&{&&
&&&&&&&&&&&&session.invalidate();&&
&&&&&&&&}&&
&&&&&&&&return&new&ModelAndView(&redirect:/index.jsp&);&&
&&&&protected&Boolean&validateCaptcha(HttpServletRequest&request,&Object&command)&{&&
&&&&&&&&String&captchaId&=&(String)&request.getSession().getAttribute(&&
&&&&&&&&&&&&&&&&com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);&&
&&&&&&&&String&response&=&((LoginCommand)&command).getKaptchaCode();&&
&&&&&&&&if&(!StringUtils.equalsIgnoreCase(captchaId,&response))&{&&
&&&&&&&&&&&&return&false;&&
&&&&&&&&}&&
&&&&&&&&return&true;&&
&&&&&&&& 首先,看一下ajax的方式,在controller中我们认为让ajax抛出一样,在页面中我们采用js这样调用
function&ajaxTest()&&
&&&&&&&&$.ajax(&{&&
&&&&&&&&&&&&type&:&'GET',&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&url&:&'${basePath}/josontest.html',&&&&&
&&&&&&&&&&&&async:&false,&&
&&&&&&&&&&&&dataType&:&'json',&&
&&&&&&&&&&&&success&:&function(data,textStatus){&&
&&&&&&&&&&&&&&&&alert(JSON.stringify(data));&&
&&&&&&&&&&&&},&&
&&&&&&&&&&&&error&:&function(data,textstatus){&&
&&&&&&&&&&&&&&&&alert(data.responseText);&&
&&&&&&&&&&&&}&&
&&&&&&&&});&&
&&&&&&&& 当抛出异常是,我们在js的error中采用 alert(data.responseText);将错误信息弹出,展现给用户,具体页面代码如下:
Html代码&&
%@&page&language=&java&&contentType=&text/&charset=UTF-8&&&
&&&&pageEncoding=&UTF-8&%&&
%@&include&file=&/common/taglibs.jsp&%&&
&!DOCTYPE&HTML&PUBLIC&&-//W3C//DTD&HTML&4.01&Transitional//EN&&&
&&&http-equiv=&Content-Type&&content=&text/&charset=UTF-8&&&
&&spring&login&information&&
&&&type=&text/javascript&&&
&&&&function&ajaxTest()&&
&&&&&&&&$.ajax(&{&&
&&&&&&&&&&&&type&:&'GET',&&
&&&&&&&&&&&&//contentType&:&'application/json',&&&&&
&&&&&&&&&&&&url&:&'${basePath}/josontest.html',&&&&&
&&&&&&&&&&&&async:&false,//禁止ajax的异步操作,使之顺序执行。&&
&&&&&&&&&&&&dataType&:&'json',&&
&&&&&&&&&&&&success&:&function(data,textStatus){&&
&&&&&&&&&&&&&&&&alert(JSON.stringify(data));&&
&&&&&&&&&&&&},&&
&&&&&&&&&&&&error&:&function(data,textstatus){&&
&&&&&&&&&&&&&&&&alert(data.responseText);&&
&&&&&&&&&&&&}&&
&&&&&&&&});&&
&&&&&cellpadding=&0&&cellspacing=&0&&style=&width:100%;&&&
&&&&&&&&&&&rowspan=&2&&style=&width:30&&&
&&&&&&&&&&&&
&&&&&&&&&&&style=&height:72&&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&spring&login&front&information&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&${loginedUser.userName},欢迎您进入Spring&login&information,您当前积分为${loginedUser.credits};&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&href=&${basePath}/backendmain.html&后台管理&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&style=&height:72&&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&type=button&value=&Ajax&Exception&Test&&onclick=&ajaxTest();&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&href=&${basePath}/logout.html&退出&&
&&&&&&&&&&&&&
&&&&&&&&&&&
&验证效果:
&&&&&&& 至此,ajax方式起了作用,整个系统的异常统一处理方式做到了统一处理。我们在开发过程中无需关心,异常处理配置了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:157866次
积分:3527
积分:3527
排名:第6824名
原创:111篇
转载:454篇
译文:22篇
评论:28条
(46)(39)(64)(71)(57)(154)(132)(14)(2)(3)(3)(16)(2)(2)(1)}

我要回帖

更多关于 amp lt 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信