0
点赞
收藏
分享

微信扫一扫

SpringMVC中的常用注解

月白色的大狒 2022-04-14 阅读 35
spring

SpringMVC中使用 servlet 的对象:(Request,Response,Session,Cookie)
           springmvc已经帮我们封装好了这些对象,只需在方法参数上使用所需要的对象即可

@Controller
public class ServletController {
 
    /**
     * 只要在控制器方法上加入request,response,session类型的参数,springmvc框架会把这些对象准备好作为方法参数传入
     *      建议不要直接在方法参数上使用 Servlet 的(request,response,session)对象
     * @param request
     * @param response
     * @param session
     * @return
     */
    @RequestMapping("/s1")
    public String s1(HttpServletRequest request, HttpServletResponse response, HttpSession session){
        System.out.println("获取实际请求路径:"+request.getRequestURI());
        System.out.println("获取客户端的ip:"+request.getRequestURI());
        System.out.println("response的对象:"+response);
        response.addCookie(new Cookie("user","chen"));
        System.out.println("session的对象:"+session);
 
        return "hello";
    }
}
  

SpringMVC页面转发:
       服务器内部跳转(forward)和 客户端重定向(redirect)

             1) 转发

                        (1) 转发到JSP页面:  请求处理方法返回字符串,默认使用服务器内部跳转                                                                                                   (  request.getRequestDispatcher("指定页面").forward(request,response)  )

                示例: return "hello";  (视图名: 视图解析器会根据视图名拼接成正确的访问路径  " /hello.jsp")

                        (2)转发到服务器内部的请求:在返回的字符串前面加入 “ forward:/ 路径名 ”

                示例: return " forward:/ main ";( 在服务器内部跳转到名为 main 的请求处理方法中)

            2)重定向

                        (1)重定向到 JSP页面:在返回字符串的前面加上 “ redirect:/xxx.jsp ”

                 示例:return " redirect:/xxx.jsp "

    ***注意:

              由于客户端重定向(redirect)相当于在浏览器重新发一次请求,所以不能访问 WEB-INF 下的资源文件,而且资源文件必须写完整(xxx.jsp),因为此时的视图解析器不会将该字符串进行解析,拼接

                         (2)重定向到 Controller 上 :  在返回的字符串前面加上  “ redirect:/路径名 ”

                  示例: return " redirect:/main "; ( 客户端重定向到名为 main 的请求处理方法中 )

 
 Spring MVC 传值:
            方法一:使用session传值 :

                 优点:信息相对比较安全,可以传输任意类型的数据

                 缺点:每个session都会占用服务器的内存

              测试代码:

@Controller
public class RedirectController {
 
    /**
     *  方法一: 利用 HttpServletResponse 对象的重定向
     *    session 传值:
     *        优点: 安全性高,可传任意类型的数据
     *        缺点: 每个session都会占用服务器的内存
     *
     * @param response
     * @return
     * @throws IOException
     */
    @RequestMapping("/r1")
    public String r1(HttpServletResponse response, HttpSession session) throws IOException {
        System.out.println("r1");
        // 一次会话之内有效
        session.setAttribute("name","chen");
 
        //response.sendRedirect("/r2");
        // 在视图名前面添加 `redirect:`,这时候springmvc就会把字符串当做重定向进行跳转,而不是再通过视图解析器进行解析
        return "redirect:/r2";
    }
 
    @RequestMapping("/r2")
    public String r2(HttpSession session){
        System.out.println("r2");
        System.out.println(session.getAttribute("name"));
 
        // 需要手动移除 session 的值
        session.removeAttribute("name");
        return "hello";
    }
}
           方法二: 利用重定向后面跟上请求参数的方法

           优点: 不会占用服务器的内存,可以向站外地址传值

           缺点:  信息不安全,暴露在地址栏后面,可以传输的数据类型和数据大小有限制

  测试代码:

@Controller
public class RedirectController {
 
    /**
     * 利用重定向地址后跟请求参数的方式
     *     优点: 不会占用服务器内存,可以向站外地址传参
     *     缺点: 安全性不高,数据大小有限制,不能传 复杂的 数据类型
     * @return
     */
    @RequestMapping("/r3")
    public String r3(){
        System.out.println("r3");
        return "redirect:/r4?username=zhangsan";
    }
 
    @RequestMapping("/r4")
    public String r4(String username){
        System.out.println("r4");
        System.out.println("username: "+username);
        return "hello";
    }
 
  
}
           方法三:使用 Spring MVC提供的传参的对象(RedirectAttributes):专门在重定向时传参,综合了上面两种方法

              RedirectAttributes : 传参,专门在重定向时传参

              @ModelAttributes: 接收值

                     方式一(重定向后面跟请求参数的方式): redirect.addAttribute("参数名",参数值);

                     方式二(使用session传值的方式):redirect.addFlashAttribute("参数名",参数值);

测试代码:

@Controller
public class RedirectController {
 
    /**
     *  SpringMVC提供的重定向方法:结合了上面两种方式的传参方式
     *    RedirectAttributes : 传参,专门在重定向时传参
     *    @ModelAttributes:  接收值
     *       方式一(重定向后面跟请求参数的方式): redirect.addAttribute("username","chen");
     *       方式二(使用session传值的方式):redirect.addFlashAttribute("username","kobe");
     *
     * @param redirect
     * @return
     */
 
    @RequestMapping("/r5")
    public String r5(RedirectAttributes redirect){
        System.out.println("r5");
        // 采用的是 重定向后面跟请求参数的方式
        redirect.addAttribute("username","chen");
 
        // 采用的是 session 的传值方式
        redirect.addFlashAttribute("username","kobe");
        return "redirect:/r6";
    }
 
    @RequestMapping("/r6")
    public String r6(@ModelAttribute("username")String name){
        System.out.println("r6");
        System.out.println("username: "+name);
        return "hello";
    }
}
 
Spring MVC中的异常处理:
      SpringMVC提供了两种方式

         1)使用 SpringMVC提供的简单异常处理器 SimpleMapperingExceptionResolver (需要配合 .xml 文件来配置)

         2)使用注解@ExceptionHandler( 用在方法上) 实现局部异常处理或使用注解@ControllerAdvice(类)实现全局统一处理异常

***注意:不建议在请求处理方法中写异常处理块(catch),因为这种处理方式非常繁琐,而且一旦改变异常处理方式,                       需要修改大量的代码,耦合性较高

      
方式一: 使用 SimpleMapperingExceptionResolver  进行异常处理

           1)在 spring.xml 文件中配置:

<!-- 
        p:defaultErrorView="error":表示所有没有指定的异常,都跳转到默认异常处理页面 error.jsp 
        p:exceptionAttribute="ex" :表示异常处理页面中访问的异常对象变量名是 ex
        exceptionMappings: 表示映射的异常,接受参数是一个 Properties
                            key:是异常类名, values:处理异常的页面
 
-->
 
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"
 
      p:defaultErrorView="error"
      p:exceptionAttribute="ex" 
>
      <property name="exceptionMappings">
            <props>
                <prop key="java.lang.ArrayIndexOutOfBoundsException">error1</prop>
                <prop key="java.lang.ArithmeticException">error2</prop>          
            </props>
      </property>
</bean>
         2)模拟异常的处理方法:

 @RequestMapping("/testSimpleMapingExceptionResolver")
 public String testSimpleMapingExceptionResolver(@RequestParam("i") int i){
        String[] values=new String[10];
        System.out.println(values[i]);
        return "success";
 
}
          3)error.jsp页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
 
</head>
<body>
错误页面!
<br>
${requestScope.ex.message}
</body>
</html>

举报

相关推荐

0 条评论