spring-mvc高级技术

深碍√TFBOYSˉ_ 2022-10-02 11:54 216阅读 0赞

Spring MVC高级技术包括但不限于web.xml配置、异常处理、跨重定向请求传递数据

1、web.xml文件的配置

  1. <!DOCTYPE web-app PUBLIC
  2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  3. "http://java.sun.com/dtd/web-app_2_3.dtd" >
  4. <web-app>
  5. <context-param>
  6. <param-name>contextConfigLocation</param-name>
  7. <param-value>classpath:spring-*.xml</param-value>
  8. </context-param>
  9. <listener>
  10. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  11. </listener>
  12. <servlet>
  13. <servlet-name>appServlet</servlet-name>
  14. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  15. <init-param>
  16. <param-name>contextConfigLocation</param-name>
  17. <param-value>classpath:springMvc.xml</param-value>
  18. </init-param>
  19. </servlet>
  20. <servlet-mapping>
  21. <servlet-name>appServlet</servlet-name>
  22. <url-pattern>/</url-pattern>
  23. </servlet-mapping>
  24. </web-app>

ContextLoaderListener是根容器,DispatcherServlet是子容器。父容器中管理的bean可以被子容器引用,反之,不行。它们都从各自的xml文件初始化自己的上下文

ContextLoaderListener如果未指定contextConfigLocation参数,则默认加载的配置文件为/WEB-INF/applicationContext.xml

DispatcherServlet如果未指定contextConfigLocation参数,则根据元素指定的名称,在/WEB-INF/文件夹下寻找配置文件appServlet-servlet.xml

2、处理异常

Spring提供了多种方式将异常转换为响应

  • 特定的 Spring异常会自动映射为指定的HTTP状态码
  • 异常上可以添加@ResponseStatus注解,将异常映射为某一个HTTP状态码
  • 在方法上可以添加@ExceptionHandler注解,使其用来处理异常

1)特定的 Spring异常会自动映射为指定的HTTP状态码

如果在控制器中抛出了异常,该异常不在列表中,又没有指定HTTP状态码,则默认为状态码为500

1240

2)异常上可以添加@ResponseStatus注解,将异常映射为某一个HTTP状态码

  1. @Controller
  2. public class HelloController {
  3. @RequestMapping("/home")
  4. public String home(){
  5. System.out.println("执行home");
  6. throw new MyException();
  7. // return "home"; //返回一个字符串,即逻辑视图名
  8. }
  9. }
  10. package com.cn.Exception;
  11. import org.springframework.http.HttpStatus;
  12. import org.springframework.web.bind.annotation.ResponseStatus;
  13. public class MyException extends RuntimeException{
  14. }

浏览器访问 http://localhost:8080/home

1240 1

修改自定义异常

  1. package com.cn.Exception;
  2. import org.springframework.http.HttpStatus;
  3. import org.springframework.web.bind.annotation.ResponseStatus;
  4. @ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "抛出异常的原因")
  5. public class MyException extends RuntimeException{
  6. }

浏览器访问 http://localhost:8080/home

1240 2

3)在方法上可以添加@ExceptionHandler注解,使其用来处理异常

  • 该方式是按照处理请求的方式处理异常,@ExceptionHandler注解的方法返回值为字符串表示逻辑视图名

    package com.cn.Exception;

    public class MyException2 extends RuntimeException{

    }

    @Controller
    public class HelloController {

    @RequestMapping(“/home”)
    public String home(){

    1. System.out.println("执行home");
    2. throw new MyException2();

    // return “home”; //返回一个字符串,即逻辑视图名
    }

    @ExceptionHandler(MyException2.class)
    public String handleMException(){

    1. System.out.println("处理异常逻辑");
    2. return "fail";

    }
    }

访问http://localhost:8080/home,后台输出

1240 3

浏览器页面

1240 4

@ExceptionHandler注解的方法可以处理同一个控制器中所有处理器方法所抛出的异常(注解指定的异常),注解定义如下

  1. @Target({ElementType.METHOD})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface ExceptionHandler {
  5. Class<? extends Throwable>[] value() default {};
  6. }

spring也支持为控制器添加通知,那么该通知对于所有的控制器中所有的处理器方法抛出的异常都起作用,实现如下

@ControllerAdvice 所标注的类会被组件扫描实例化,交给容器管理。最为实用的一个场景是将所有@ExceptionHandler标注的方法收集到一个类中,这样所有的控制器异常就能在一个地方进行一致处理。以下HandleException类定义表明在控制器中的处理器抛出MyException2类的异常,就会被handleMException方法处理,最终跳转fail.jsp页面

  1. package com.cn.advice;
  2. import com.cn.Exception.MyException2;
  3. import org.springframework.web.bind.annotation.ControllerAdvice;
  4. import org.springframework.web.bind.annotation.ExceptionHandler;
  5. @ControllerAdvice
  6. public class HandleException {
  7. @ExceptionHandler(MyException2.class)
  8. public String handleMException(){
  9. System.out.println("处理异常逻辑");
  10. return "fail";
  11. }
  12. }

3、跨重定向请求传递数据

如果是forward转发请求,那么处理器方法业务处理完成后,该方法所指定的模型数据会复制到请求中,作为请求的一部分,转发到下一个处理器,下一个处理器可以从请求中获取上一个处理的模型数据;

如果是redirect重新向,原始请求就结束了,并且会重新发起一个GET请求。因此原始请求中的模型数据也就消失了,在请求到达下一个处理器,没有任何的模型数据,需要模型数据必须自己处理。

针对重定向传递数据,有两种方案:

使用URL模板以路径变量和/或查询参数的形式传递数据

使用flash属性传递数据

1)使用URL模板以路径变量和/或查询参数的形式传递数据

  1. @Controller
  2. public class HelloController {
  3. @RequestMapping("/home2")
  4. public String home2(Model model){
  5. model.addAttribute("id","12324131343256");
  6. model.addAttribute("name","pick");
  7. return "redirect:home3/{id}"; //含有redirect的字符串,表示重定向到另一个处理器;
  8. //如果含有forward的字符串,表示转向到另一个处理器
  9. }
  10. @RequestMapping("/home3/{id}")
  11. public String home3(@PathVariable String id, Model model){
  12. System.out.println("传递的ID="+id);
  13. model.addAttribute(new User());
  14. return "home";
  15. }
  16. }

浏览器访问localhost:8080/home2,抓包得访问的url。从以下可以看出,处理器完成后重定向时,模型中的数据填充到了路径变量中,路径变量中没有的key,则以查询参数的形式赋在url之后,组成了新的url访问。

1240 5

2)使用flash属性传递数据

重定向时候,采用1)中的方式传递数据,仅仅能够传递简单的数据,不能传递对象。如何将对象也能传递到下一个处理器呢?可以将要传递到下一个处理器的数据放入用户会话中,然后在下一个处理器从会话的取出来,并删除会话中的该数据。然而,spring提供了将数据发送为flash属性的功能,不需要我们管理这些数据,flash属性会一致携带这些数据直到下一次请求才消失。

Spring提供RedirectAttributes是Model接口的子接口,除了提供Model的所有功能,还提供了几个方法用来设置flash属性。

  1. @Controller
  2. public class HelloController {
  3. @RequestMapping("/home2")
  4. public String home2(RedirectAttributes model){
  5. model.addAttribute("id","12324131343256");
  6. model.addFlashAttribute("user",new User("liming","123456"));//设置flash属性,也可以 model.addFlashAttribute(new User("liming","123456"))
  7.                                        //则通过值得类型自行推断出key为user
  8. return "redirect:home3/{id}";
  9. }
  10. @RequestMapping("/home3/{id}")
  11. public String home3(@PathVariable String id, RedirectAttributes model){
  12. System.out.println("传递的ID="+id);
  13. if (model.containsAttribute("user")) {
  14. System.out.println("传递的对象:" + model.getFlashAttributes().get("user"));
  15. }
  16. return "home";
  17. }
  18. }

发表评论

表情:
评论列表 (有 0 条评论,216人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringMVC技术 - 2

    响应页面/跳转页面 看样子,能看懂,这个页面就是现有的页面跳转,SpringMVC,都给我们封装好了,这tm不就是重定向 ![736472914e3b46e2a76cc

    相关 SpringMVC核心技术

    请求重定向和转发 当处理器对请求处理完毕后,向其它资源进行跳转是,有两种跳转方式:请求转发与重定向。而根据索要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器。

    相关 高级碰撞检测技术

    自从计算机游戏出现以来,程序员就不断地想办法来更精确地模拟现实世界。就拿乒乓游戏为例子(译者:Pong—被誉为电子游戏的祖先,有幸见过一次:),能见到祖先做的游戏感觉真是爽啊,

    相关 Java 高级技术

    一、Java基础篇 1、Java平台的特点 1.1 跨平台:一次开发,处处运行 因为java编译后并非直接生成二进制的机器指令,而是可以在jvm虚拟机中运行的字节码(.c