170821-关于SpringMVC的知识点

           1.SpringMVC 概述以及优势

                   SpringMVC和Spring的关系:  软件开发的三层架构: web层【表示层、表现层】---->Service层---->Dao[DataBase Access Object]---->数据库!  

                   SpringMVC实际上是Spring的一个子模块,我们用SpringMVC来代替这个JavaWEB部分!

                   MVC:也是一种设计模式:M:Model【模型】-->V[View]--->C[Controller]!        

                                 Model用来封装数据的,View:用来显示数据  Controller:用于接收前端页面发送的请求,然后调用Service层处理,拿到处理结果,将该结果返回给前端页面!          

                   SpringMVC:相当于MVC架构中的C以及V!

                   JavaEE-->J2EE

                   优势:Spring 为展现层提供的基于 MVC 设计理念的优秀的Web 框架,是目前最主流的 MVC 框架之一  Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架  Spring MVC 通过一套 MVC 注解,让 POJO 成为处理请 求的控制器,而无须实现任何接口。  支持 REST 风格的 URL 请求  采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性

                   SpingMVC是基于SpingMVC4.x

            2.SpringMVC之HelloWorld   

                   步骤:  

                        – 加入 jar 包  

                        – 在 web.xml 中配置 DispatcherServlet  

                        – 加入 Spring MVC 的配置文件    

                        – 编写处理请求的处理器,并标识为处理器   

                        – 编写视图  

                                 ?jar 包:  

                                       –commons-logging-1.1.3.jar   

 –spring-aop-4.0.0.RELEASE.jar   

 –spring-beans-4.0.0.RELEASE.jar   

 –spring-context-4.0.0.RELEASE.jar   

 –spring-core-4.0.0.RELEASE.jar   

 –spring-expression-4.0.0.RELEASE.jar   

 –spring-web-4.0.0.RELEASE.jar   

 –spring-webmvc-4.0.0.RELEASE.jar

                            web.xml文件:

                                 1.配置 DispatcherServlet :

 <!-- The front controller of this Spring Web application, responsible for handling all application requests -->  

 <!--向服务器注册前端控制器!  -->

  <servlet>    

         <servlet-name>springDispatcherServlet</servlet-name>

         <!--DispatcherServlet指的是SpringMVC的前端控制器!,给服务器使用,创建servlet对象!  -->    

         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    

         <!-- 初始化参数contextConfigLocation用于指定SpringMVC配置文件的路径以及名称 -->  

         <init-param>

                <param-name>contextConfigLocation</param-name>   

                <param-value>classpath:springmvc.xml</param-value>   

         </init-param>

         <!-- 数字0或者大于0的数字表示的是:在服务器启动的时候创建Servlet对象,而不是第一次访问的时候创建     小于0的数字指的是:在第一次访问的时候创建Servlet对象.     在数字大于O的情况下,数字越小,优先级越高!     -->

        <load-on-startup>1</load-on-startup>  

 </servlet>

  <!-- Map all requests to the DispatcherServlet for handling -->

  <!-- 用 servlet-mapping指定请求映射的路径-->  

 <servlet-mapping>  

 <servlet-name>springDispatcherServlet</servlet-name>  

 <!-- 用url-pattern指定拦截 的请求路径! -->    

<url-pattern>/</url-pattern>  

 </servlet-mapping>

                                              注意:当我们不用init-param指定springMVC配置文件的路径好位置的时候,SpringMVC默认会去/WEB-INF/<servlet-name>-servlet.xml

                                                        创建SpringMVC配置文件的名字要和上面在web.xml文件中指定的名字一致!
                              2.我们创建SpringMVC配置文件的时候使用的是Spring Bean Configuration File创建的,不是XML!
                                              <!-- 配置SpingMVC容器要扫描的包! -->
                                              <context:component-scan base-package="com.neuedu.controller"></context:component-scan>

                                           

                 配置视图解析器 :视图名称解析器:将视图逻辑名解析为: /WEB-INF/pages/<viewName>.jsp        

                 <!--InternalResourceViewResolvers 是视图解析器 ,它会将逻辑视图转换成实际的物理视图,做一个转发操作!也就是说具体步骤:prefix +  方法的返回值  + suffix-->               

                   <!-- /WEB-INF/views/success.jsp -->                  

                   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">             

                   <property name="prefix" value="/WEB-INF/views/"></property>                  

                   <property name="suffix" value=".jsp"></property>        

                   </bean>   

            3. 在springMVC扫描的包下创建控制器类[Controller/Handler],注意要加入@Controller注解
                          /**
                             * 我们通过@RequestMapping做请求URL的映射!
                             * @return
                             */
                          @RequestMapping("/sayHello")
                           public String sayHello(){
                           return "/WEB-INF/views/success.jsp";
                          }
                          注意:在类的方法上我们使用的是@RequestMapping,然后在括号里指定请求url的请求路径!

                            

            4. 使用 @RequestMapping 映射请求

                        ?Spring MVC  使用 @RequestMapping 注解为控制器指定可以处理哪些 URL 请求  

                        ?在控制器的类定义及方法定义处都可标注  @RequestMapping

                                 – 类定义处:提供初步的请求映射信息。相对于 WEB 应用的根目录  

                                 – 方法处:提供进一步的细分映射信息。相对于类定义处的 URL。

                                 若 类定义处未标注 @RequestMapping,则方法处标记的 URL 相当于当前 WEB 应用的根目录
                                 若 类定义处标注 @RequestMapping,则方法处标记的 URL 相对于类定义处的@RequestMapping而言的!

                        ?DispatcherServlet 截获请求后,就通过控制器上@RequestMapping 提供的映射信息确定请求所对应的处理方法。

                        映射请求参数、请求方法或请求头

                        ?@RequestMapping 除了可以使用请求 URL 映射请求外,还可以使用请求方法、请求参数及请求头映射请求

                        ?@RequestMapping 的 value、method、params 及 heads 分别表示请求   URL、请求方法、请求参数及请求头的映射条件,他们之间是与的关系,联合使用多个条件可让请求映射 更加精确化。        

                        ?params 和 headers支持简单的表达式:

                                 – param1: 表示请求必须包含名为 param1 的请求参数  

                                 – !param1: 表示请求不能包含名为 param1 的请求参数

                                 – param1 != value1: 表示请求包含名为 param1 的请求参数,但其值 不能为 value1

                                 –{“param1=value1”, “param2”}: 请求必须包含名为 param1 和param2 的两个请求参数,且 param1 参数的值必须为 value1!         使用 @RequestMapping 映射请求

                        

                        ? Ant 风格资源地址支持 3 种匹配符:

                                 – ?:匹配文件名中的一个字符

                                 – *:匹配文件名中的任意字符

                                 – **:** 匹配多层路径

                        ?@RequestMapping 还支持 Ant 风格的 URL:

                                 –/user/*/createUser: 匹配   /user/aaa/createUser、/user/bbb/createUser 等 URL

                                 –/user/**/createUser: 匹配   /user/createUser、/user/aaa/bbb/createUser 等 URL

                                 –/user/createUser??: 匹配   /user/createUseraa、/user/createUserbb 等 URL     

                           @PathVariable 映射 URL 绑定的占位符

                        ?带占位符的 URL 是 Spring3.0 新增的功能,该功能在 SpringMVC 向 REST 目标挺进发展过程中具有里程碑的 意义   

                        ?通过 @PathVariable 可以将 URL 中占位符参数绑定到控 制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过   

                                  @PathVariable("xxx") 绑定到操作方法的入参中,需要注意的是:该注解的value属性值要与占位符保持一致。

                        

                         

            6.REST:

                       即 Representational State Transfer。(资源)表现层状态转化。是目前最流行的一种互联网软件架构。

                       它结构清晰、符合标准、易于理解、扩展方便, 所以正得到越来越多网站的采用.  

                       HTTP 协议里面,四个表示操作方式的动 词:GET、POST、PUT、DELETE。

                              它们分别对应四种基本操作:

                                               GET 用来获 取资源,

                                               POST 用来新建资源,

                                               PUT 用来更新资源,

                                               DELETE 用来删除资源。  

                         示例:   –/order/1 HTTP GET :得到 id = 1 的 order    

                                       –/order/1 HTTP DELETE:删除 id = 1的 order

                                       –/order/1 HTTP PUT:更新id = 1的 order  

                                       –/order HTTP POST:新增 order   

                                       ?HiddenHttpMethodFilter:浏览器 form 表单只支持 GET 与 POST 请求,而DELETE、PUT 等 method 并不支 持,Spring3.0  添加了一个过滤器,可以将这些请求转换 为标准的 http 方法,使得支持 GET、POST、PUT 与 DELETE 请求。

              7.  ?HiddenHttpMethodFilter

                       浏览器 form 表单只支持 GET 与 POST 请求,而DELETE、PUT 等 method 并不支 持,Spring3.0  添加了一个过滤器,可以将这些请求转换 为标准的 http 方法,使得支持 GET、POST、PUT 与 DELETE 请求。
                       POST请求如何转化为put请求和delele请求?
                            1.在web.xml文件中配置:
                                   <!-- HiddenHttpMethodFilter过滤器可以将POST请求转化为put请求和delete请求! -->
                                   <filter>
                                       <filter-name>hiddenHttpMethodFilter</filter-name>
                                       <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
                                   </filter>
                                   <filter-mapping>
                                       <filter-name>hiddenHttpMethodFilter</filter-name>
                                       <url-pattern>/*</url-pattern>
                                   </filter-mapping>

                              
                            2.在表单域中需要携带一个name值为_method,value值为put或者delete的参数,如下所示:
                                   <form action="${pageContext.request.contextPath }/order/1" method="post">
                                      <input type="hidden" name="_method" value="put"/>
                                      <input type="submit" value="Submit"/>
                                   </form>
                                   <form action="${pageContext.request.contextPath }/order/1" method="post">
                                     <input type="hidden" name="_method" value="delete"/>
                                     <input type="submit" value="Submit"/>
                                  </form>    

                              .jsp页面

                       

                        controller类中:

                            
            8.@RequestParam

                        可以接收请求的参数,相当于Servlet的getParameter()方法!
                        注意:要把@RequestParam和@PathVariable区分开: 
                        三个默认属性:
                             value:这个字段要与请求参数的name属性值一致!
                             required:布尔值,默认是true,当指定为false的时候,说明这个参数不是必须的,可以不带!
                             defaultValue:在我们不传值的时候,默认使用defaultValue的值,传递参数的时候,使用我们传递的参数值!

                       

                        

                             
              9.@RequestHeader:

                        获取请求头信息,默认属性:
                        value:这个字段要与请求参数的name属性值一致!
                        required:布尔值,默认是true,当指定为false的时候,说明这个参数不是必须的,可以不带!
                        defaultValue:在我们不传值的时候,默认使用defaultValue的值,传递参数的时候,使用我们传递的参数值!

                      
              10.针对POST请求乱码的处理:
                        在web.xml文件中加上CharacterEncodingFilter
                        <filter>
                           <filter-name>CharacterEncodingFilter</filter-name>
                           <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
                           <init-param>
                               <param-name>encoding</param-name>
                               <param-value>utf-8</param-value>
                           </init-param>
                      </filter>
                      <filter-mapping>
                           <filter-name>CharacterEncodingFilter</filter-name>
                           <url-pattern>/*</url-pattern>
                      </filter-mapping> 

                     

          10. MVC 的 Handler 方法可以接受哪些 ServletAPI 类型的参数

                           HttpServletRequest  

                           HttpServletResponse   

                           HttpSession  

                        

                      

          11.使用 POJO 对象绑定请求参数值  ?

                          Spring MVC 会按请求参数名和 POJO 属性名进行自动匹 配,自动为该对象填充属性值。支持级联属性。 如:dept.deptId、dept.address.tel 等

                         

          12.处理模型数据  Spring MVC 提供了以下几种途径输出模型数据:  

                          –ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据  

                          –Map 及 Model、ModelMap: 入参为 org.springframework.ui.Model、org.springframework.ui. ModelMap 或 java.uti.Map 时,处理   方法返回时,Map 中的数据会自动添加到模型中。  

                          无论我们的返回值是String类型还是ModelAndView类型,SpringMVC框架执行目标Handler方法之后都会将返回值解析为ModelAndView;  我们放入到Map或者Model、ModelMap中的数据都会放入ModelAndView对象中,作为MOdel使用!  

                          

                        

           13.关于重定向  

                          一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理  如果返回的字符串中带 forward: 或 redirect: 前缀 时,SpringMVC 会对他们进行特殊处理:将 forward: 和 redirect: 当成指示符,其后的字符串作为 URL 来处理

                          –redirect:/success.jsp:会完成一个到 success.jsp 的重定向的操作   

                          –forward:/success.jsp:会完成一个到 success.jsp 的转发操作

                             

                           可以在spingmvc配置文件中配置  <mvc:view-controller path="/j1sp" view-name="success"/>标签,就可以让我们的请求不经过Controller,直接进入另一个目标页面!

                           <!-- 但是此时原来访问正常的@RequestMapping URL现在却不能正常访问了,如果想正常访问,需要加入<mvc:annotation-driven>该标签-->   <mvc:annotation-driven></mvc:annotation-driven>  

                           

                          –@SessionAttributes: 将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性  

                           @ModelAttribute: 方法入参标注该注解后, 入参的对象 就会放到数据模型中  

                           

           14.@ModelAttribute注解用于修饰方法,这个@ModelAttribute注解修饰的方法在我们每次请求目标方法之前都会被执行一次!  

                           

           15.SpringMVC确定目标方法POJO类型入参的过程:

                          1.确定一个key:   

                                     1).若目标方法的POJO类型的参数木有使用@ModelAttribute作为修饰,则key为POJO类名第一个字母的小写。  

                                     2).若使用@ModelAttribute修饰,则key为@ModelAttribute注解的value属性值.

                         2.在implicitModel中查找key对应的对象,若存在,则作为入参传入。  

                                     1).若在@ModelAttribute标记的方法中在Map保存过,且key和1确定的key一致,则会获取到!

                         3.在implicitModel中不存在key对应的对象,则检查当前的Handler是否使用@SessionAttribute注解修饰,若使用了该主机,且@SessionAttributes注解的value属性值中包含了key,则会从HttpSession中来获取key所对应的value值,若存在则直接传入到目标方法的入参中,若不存在则将抛出异常。  

                         4.若Handler没有标识@SessionAttributes注解或者@SessionAttributes注解的value值中不包含key,则会通过反射来创建POJO类型的参数,传入为目标方法的参数。    

                         5.SpringMVC会把key和POJO对象保存到implicitModel中,进而会保存到request域中!  

                    注意:

                         1.@ModelAttribute标记的方法,会在每个目标方法执行之前被SpringMVC调用!   

                         2.@ModelAttribute注解可以来修饰目标方法POJO类型的入参,其value属性值有如下作用:

                                      1).SpringMVC会使用value属性值在implicitModel中查找对应的对象,若存在则会直接传入到目标方法的入参中   

                                      2)SpringMVC会以value为key,POJO类型的对象为value,存入到request域中。  

           16.@SessionAttributes注解只能标记在类上,可以使得多次请求共享某部一部分数据!  value:指定放入session域中键  types:指定放入Session域中的对象的字节码!    

           17.当出现遍历的情况我们就是用JSTL标签,  当我们使用下拉菜单及单选按钮、多选按钮的时候我们就使用springmvc提供的表单标签,  在表单标签中的path属性值相当于我们原生HTML中的name属性值!

                            

           18.对于静态资源文件如【js/css/图片】的访问我们需要在spingmvc配置文件中配置一个标签,如下所示:   

                   <!-- 1.可以映射静态资源的访问请求 -->   <mvc:default-servlet-handler/>    <mvc:annotation-driven></mvc:annotation-driven>

                    

           19.EmployeeCRUD:  SpringMVC处理静态资源【导入js文件】:     

                   1.为什么出现这样的问题:    优雅的REST风格的资源URL不希望带.html或.do等后缀,若将DispatcherServlet请求映射配置为/,   则SpringMVC将捕获WEB容器的所有请求,包括静态资源的请求,SpringMVC会将他们当成一个普通请求处理,因此找不到对应处理器将导致错误。

                   2.解决:在SpringMVC的配置文件中配置<mvc:default-servlet-handler>

                     

            21. 当需要表单回显或者使用下拉列表的时候,就使用form表单标签,而如果使用遍历的标签就使用JSTL标签【导包】!

            22.视图和视图解析器

                       【参见Springmvc如何解析视图流程图片】  

                         ?请求处理方法执行完成后,最终返回一个 ModelAndView 对象。对于那些返回 String,View 或 ModeMap 等类型的处理方法,SpringMVC 也会在内部将它们装配成一个 ModelAndView 对象,它包含了逻辑名和模型对象的视图

                         Spring MVC 借助视图解析器(ViewResolver)得到最终 的视图对象(View),最终的视图可以是 JSP ,也可能是Excel、JFreeChart等各种表现形式的视图    视图   视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。   视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全的问题。

                         自定义视图  1.自定义视图,实现view接口或者继承AbstractView抽象类,并加入到IOC容器中。  2.在springmvc配置文件中配置BeanNameViewResolver视图解析器。    

             23. 数据格式化标签:

                         1.在SpringMVC配置文件中配置<mvc:annotation-driven/>

                         2.在目标POJO对象的属性上加上@NumberFormat 或者 @DateTimeFormat 注解!    @DateTimeFormat   

                                 – pattern 属性:类型为字符串。指定解析/格式化字段数据的模式, 如:”yyyy-MM-dd hh:mm:ss”   

                                @NumberFormat    

                                –pattern:类型为 String,自定义样式, 如patter="#,###";    

              24.数据类型转换以及数据格式化标签:    数据类型转换【了解】   

                          1. 自定义类型转换器实现Converter<S,T>接口并加入到SpringMVC的IOC容器中,     

                               @Component    

                                 public class EmployeeConverter implements Converter<String, Employee>{

@Override     

public Employee convert(String source) {       

System.out.println(source);     

if(source != null){       

String[] vals = source.split("-");       

if(vals != null && vals.length ==5){        

String name = vals[0];        

String email = vals[1];        

Integer gender = Integer.parseInt(vals[2]);       

Department department = new Department();        

department.setId(Integer.parseInt(vals[3]));           

Employee employee = new Employee(null, name, email, gender, department);        

return employee;       

}      

}     

return null;     

}    

}       

                            2.配置自定义转换器到FormattingConversionServiceFactoryBean工厂中!       

                                     <!-- 将ConversionService再作为annotation-driven的一个属性存在! -->    

                                     <mvc:annotation-driven conversion-service="conversionService">

                                     </mvc:annotation-driven>        

                                     <!-- 配置ConversionService -->    

                                     <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">     

                                     <property name="converters">      

                                     <set>       

                                         <ref bean="employeeConverter"/>      

                                     </set>     

                                    </property>    

                                    </bean>     

              25.SpringMVC如何处理JSON数据?   

                          1.加入json的3个jar包     

                                    jackson-annotations-2.1.5.jar  

                                    jackson-core-2.1.5.jar  

                                    jackson-databind-2.1.5.jar    

                          2. 编写目标方法,使其返回 JSON 对应的对象或集合  3. 在方法上添加 @ResponseBody 注解

               26.文件上传
                          Spring MVC 上下文中默认没有为文件上传提供了直接的支持,因 此默认情况下不能处理文件的上传工作,如果想使用 Spring 的文件上传功能,需现在上下文中配置 CommonsMultipartResovler:
                          1.加入jar包:
                                      commons-fileupload-1.3.1.jar
                                      commons-io-2.4.jar
                          2.在SpringMVC配置文件中配置CommonsMultipartResovler
                                      <!-- 配置CommonsMultipartResolver -->
                                      <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
                                               <property name="defaultEncoding" value="utf-8"></property>
                                               <!-- 以字节为单位 -->
                                               <property name="maxUploadSize" value="1024000"></property>
                                      </bean>
                          2.表单:POST请求,file类型,enctype="multipart/form-data"
                               1. 文件上传
                                     @RequestMapping(value="testUpload",method=RequestMethod.POST)
                                     public String testUpload(HttpServletRequest request,@RequestParam(value="desc",required=false) String desc,@RequestParam("photo") CommonsMultipartFile file) throws Exception{
                                          ServletContext servletContext = request.getServletContext();
                                          String realPath = servletContext.getRealPath("/upload");

    File file1 = new File(realPath);
    if(!file1.exists()){
     file1.mkdir();
    }
   OutputStream out;
    InputStream in;
    //uuid_name.jpg
    String prefix = UUID.randomUUID().toString();
    prefix = prefix.replace("-","");
    String fileName = prefix+"_"+file.getOriginalFilename();
    System.out.println(fileName);
    out = new FileOutputStream(new File(realPath+"\\"+fileName));
    in = file.getInputStream();
    IOUtils.copy(in, out);
    out.close();
    in.close();
    return "success";

   }

       2.用ResponseEntity<byte[]> 返回值完成文件下载:

 @RequestMapping(value="testResponseEntity")
   public ResponseEntity<byte[]> testResponseEntity(HttpServletRequest request) throws Exception{
    byte[] body = null;
    ServletContext servletContext = request.getServletContext();
    String fileName = "风吹麦浪.mp3“;
    String path = servletContext.getRealPath("/WEB-INF/"+fileName);
    File file = new File(path);
    InputStream in = new FileInputStream(file);
    body = new byte[in.available()];
    in.read(body);
    HttpHeaders headers = new HttpHeaders();
    fileName = new String(fileName.getBytes("gbk"),"iso8859-1");
    headers.add("Content-Disposition", "attachment;filename="+fileName);
    HttpStatus statusCode=HttpStatus.OK;
    ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(body, headers, statusCode);
    return response;
   }    

27.自定义拦截器

 Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必 须实现HandlerInterceptor接口
 1.自定义实现类实现 HandlerInterceptor接口
 2.在springmvc配置文件中配置相对应的拦截器
    <mvc:interceptors>
        <!--配置自定义拦截器 ,所有的路径都拦截 -->
        <bean class="com.neuedu.springmvc.filter.MyFilter"></bean>
    </mvc:interceptors>
    preHandle():该方法在目标方法之前被调用,
    若返回值为true,则继续调用后续的拦截器和目标方法
    若返回值为false,则不会再调用后续的拦截器和目标方法   
    可以考虑做权限,日志或者事务等!
    postHandle():调用目标方法之后,但渲染视图之前被调用可以对请求域中的属性或者视图做出修改
    afterCompletion():渲染视图之后被调用,  可以在该方法中进行一些资源清理的操作。   
    关于拦截器的配置:
    <mvc:interceptors>

   <!--配置自定义拦截器 ,所有的路径都拦截 -->
   <bean class="com.neuedu.springmvc.filter.MyFilter"></bean>
   <!-- 关于拦截器的配置问题 ,可以通过<mvc:interceptor>来配置使用哪个拦截器来【不】拦截的路径-->

   <mvc:interceptor>
          <!-- 用<mvc:mapping>标签指定要拦截的路径 -->
          <mvc:mapping path="/employ"/>
          <!-- 指定使用哪个拦截器进行拦截 -->
          <bean class="com.neuedu.springmvc.filter.SecondFilter"></bean>
   </mvc:interceptor>

   </mvc:interceptors>

测试:
 

Secondin类实现HandlerInterceptor

Myin类实现HandlerInterceptor

在springmvc中的配置

运行结果:

            28.  SpringMVC的异常处理:

                           1.加上<mvc:annotation-driven>标签:    

                           2.在当前Handler中定义由@ExceptionHandler注解修饰的方法,用于处理异常信息!

                           注意:

                                1.@ExceptionHandler方法修饰的入参中可以加入Exception类型的参数,该参数即对应发生的异常信息  

                                2.@ExceptionHandler方法的入参中不能传入Map.若希望把异常信息传到页面上,需要使用ModelAndView作为方法的返回值。    

                                3.@ExceptionHandler 注解定义的方法优先级问题:  例如发 生的是NullPointerException,但是声明的异常有 RuntimeException 和 Exception,此候会根据异常的最近 继承关系找到继承深度最浅的那个 @ExceptionHandler 注解方法,即标记了 RuntimeException 的方法      

                                4.ExceptionHandlerMethodResolver 内部若找不 到@ExceptionHandler 注解的话,会找@ControllerAdvice 中的@ExceptionHandler 注解方法

                                       本类中的优先级:

                                   

                                      本类找不到时,去找@ControllerAdvice 中的@ExceptionHandler 注解方法

                                      

            29.  基于配置的异常处理:  如果希望对所有异常进行统一处理,可以使用 SimpleMappingExceptionResolver,它将异常类名映射为 视图名,即发生异常时使用对应的视图报告异常   

                                <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">    

                                <!-- 指定在在request域中获取异常信息所需要的key:即ex -->    

<property name="exceptionAttribute" value="ex"></property>    

<!-- 指定异常映射 -->    <property name="exceptionMappings">     

<props>       

<!--  由prop标签的key属性指定发生异常的全类名,由值指定出现异常去哪个页面! -->      

<prop key="java.lang.ArithmeticException">error</prop>     

</props>    

</property>   

</bean>

                               

                              

 

 

转载于:https://www.cnblogs.com/12344321hh/p/7404433.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

写在前面的一些话:《Learning OpenCV》中文版 .

2009-09-17 15:51 7578人阅读 评论(4) 收藏 举报 <!-- /* Font Definitions */ font-face {font-family:Helvetica; panose-1:2 11 5 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-sign…

独家 | 一文读懂自然语言处理NLP(附学习资料)

前言 自然语言处理是文本挖掘的研究领域之一&#xff0c;是人工智能和语言学领域的分支学科。在此领域中探讨如何处理及运用自然语言。 对于自然语言处理的发展历程&#xff0c;可以从哲学中的经验主义和理性主义说起。基于统计的自然语言处理是哲学中的经验主义&#xff0c;基…

GNU/Linux下有多少是GNU的?

导读&#xff1a;一个葡萄牙的学生写了一篇文章 《How much GNU is there in GNU/Linux?》由酷壳网的陈皓整理编译为《GNU/Linux下有多少是GNU的》。这篇文章主要分布了今年4月份的Ubuntu Natty的Linux分发包。其主要是用代码行来做的分析&#xff0c;用两个饼图对比分析。 内…

Unity 富文本

参考链接&#xff1a;http://www.ceeger.com/Manual/StyledText.html 首先要说的是不仅仅ugui的text组件支持富文本&#xff0c;Debug.Log也是支持的 Debug.Log("<color#ffff00ff><b>爱生活</b></color> <color#00ffffff><b> 爱海澜&…

Linux shell 之 提取文件名和目录名的一些方法

很多时候在使用Linux的shell时&#xff0c;我们都需要对文件名或目录名进行处理&#xff0c;通常的操作是由路径中提取出文件名&#xff0c;从路径中提取出目录名&#xff0c;提取文件后缀名等等。例如&#xff0c;从路径/dir1/dir2/file.txt中提取也文件名file.txt&#xff0c…

bzoj 2752: [HAOI2012]高速公路(road)

Description Y901高速公路是一条重要的交通纽带&#xff0c;政府部门建设初期的投入以及使用期间的养护费用都不低&#xff0c;因此政府在这条高速公路上设立了许多收费站。Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链&#xff0c;我们按照由西向东的顺序将收费…

长沙java技术_长沙如何提高自身的Java技术

长沙如何提高自身的Java技术&#xff1f;Java自发行二十多年来&#xff0c;一直都是开发者的宠儿&#xff0c;在编程界的位置一直十分稳固。虽然Java人才需求量大&#xff0c;薪资水平高&#xff0c;但想要用Java语言胜任企业工作不容易。比如要成为一名Java架构师&#xff0c;…

互联网

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/u/3127489/blog/1550726

GCC笔记 命令行分析

1984年&#xff0c;Richard Stallman发起了自由软件运动&#xff0c;GNU (Gnus Not Unix)项目应运而生&#xff0c;3年后&#xff0c;最初版的GCC横空出世&#xff0c;成为第一款可移植、可优化、支持ANSI C的开源C编译器。GCC最初的全名是GNU C Compiler,之后&#xff0c;随着…

Session(数据)共享的前后端分离Shiro实战

1&#xff0c;前言本文期望描述如何使用Shiro构建基本的安全登录和权限验证。本文实战场景有如下特殊需求&#xff1a;1&#xff0c;在集群和分布式环境实现session共享&#xff1b;2&#xff0c;前端只使用HTML/CSS/JS。因此无法直接使用Shiro提供的SessionManager&#xff0c…

java 年计算_java实现计算某年某月的天数

在计算某年某月的天数时&#xff0c;需要注意平年闰年。分析&#xff1a;闰年具体的判定方法就要看它的判定条件&#xff1a;四年一闰 &#xff0c; 百年不闰 &#xff0c;400年再闰。而计算该年该月的天数&#xff0c;又分大月和小月&#xff0c;特殊月份2月之分。(视频教程推…

添加自定义菜单,报错40155

2019独角兽企业重金招聘Python工程师标准>>> 提交的json中&#xff0c;某个自定义菜单对应的URL访问是有问题的&#xff0c;请挨个检查一下。 转载于:https://my.oschina.net/selly1025/blog/1551496

【bzoj2132】圈地计划 网络流最小割

题目描述 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地。据了解&#xff0c;这块土地是一块矩形的区域&#xff0c;可以纵横划分为NM块小区域。GDOI要求将这些区域分为商业区和工业区来开发。根据不同的地形环境&#xff0c;每…

Linux基础

Linux的特点&#xff1a; 系统版本&#xff1a;常见的有debian、Redhat更适合做服务器&#xff0c;更安全和稳定&#xff0c;Ubuntu唯一的优势就是图形界面好&#xff0c;centos目前被redhat收购&#xff0c;红旗已经倒闭。 1、免费的/开源的&#xff1b;2、支持多线程/多用户&…

yum查询已经安装mysql_通过yum安装mysql

在linux中安装数据库首选MySQL&#xff0c;Mysql数据库的第一个版本就是发行在Linux系统上&#xff0c;其他选择还可以有postgreSQL&#xff0c;oracle等在Linux上安装mysql数据库&#xff0c;我们可以去其官网上下载mysql数据库的rpm包&#xff0c;http://dev.mysql.com/downl…

JAVA命令符找不到符号_[转]Java命令行编译文件时出现的错误,找不到符号或软件包不存在等...

标签(空格分隔)&#xff1a; Javajavascript习惯了eclipse的自动编译&#xff0c;Java命令行编译、执行文件只会最基础的部分&#xff0c;就是对单文件的编译和执行&#xff0c;并且不包含任何外部JAR包。但有时候你还非得用命令行&#xff0c;会碰到一些问题&#xff0c;博主这…

C#中POST数据和接收的几种方式

POST方式提交数据&#xff0c;一种众所周知的方式&#xff1a; html页面中使用form表单提交&#xff0c;接收方式&#xff0c;使用Request.Form[""]或Request.QueryString[""]来获取。 这里介绍另外一种POST方式和接收方式&#xff0c;就是将整个数据作为加…

一卡通vip充值消费线上oracle库服务器故障排查过程

上图是oracle体系总架构图今天突然公司所有终端pos机不能刷卡消费&#xff0c;财务室不能充值&#xff0c;一下很多电话打过来了&#xff0c;第一反应肯定数据库出问题了&#xff0c;登陆到数据库服务器&#xff0c;果然sqlplus连进去后就不断提示要求输入用户名&#xff0c;弹…

数据库学习,树形结构的数据库表Schema设计方案

2019独角兽企业重金招聘Python工程师标准>>> 程序设计过程中&#xff0c;我们常常用树形结构来表征某些数据的关联关系&#xff0c;如企业上下级部门、栏目结构、商品分类等等&#xff0c;通常而言&#xff0c;这些树状结构需要借助于数据库完成持久化。然而目前的各…

Systemd 入门教程之命令篇

Systemd 是 Linux 系统工具&#xff0c;用来启动守护进程&#xff0c;已成为大多数发行版的标准配置。 本文介绍它的基本用法&#xff0c;分为上下两篇。今天介绍它的主要命令&#xff0c;下一篇介绍如何用于实战。 一、由来 历史上&#xff0c;Linux 的启动一直采用init进程。…