springMVC

springMVC 总体原理

所谓 SpringMVC 的注解式开发是指,在代码中通过对类与方法的注解,便可完成处理器
在 springmvc 容器的注册。注解式开发是重点。

web.xml文件中声明dispatchservelet,springmvc容器,用于批量处理servlet,创建怎样处理servlet的处理
器类constroller类且加注释@constroller加入spring容器。controller类指明了收到什么样的请求,该怎样
处理,且返回到视图。

controller处理器中的方法,相当于原生javaweb中的一个sevelet

在这里插入图片描述

请求方法

1.get方式

@RequestMapping(value = "/some.do",method = RequestMethod.GET)
    public ModelAndView doSome(){  }

2.post

 @RequestMapping(value = "/other.do",method = RequestMethod.POST)
    public ModelAndView doOther(){ }

3.不指定方式

@RequestMapping(value = "/first.do")
    public ModelAndView doFirst(HttpServletRequest request,
                                HttpServletResponse response,
                                HttpSession session){}

接收参数3种方式

1.逐个接收参数

public ModelAndView doSome(String name, Integer age){}

2.请求中参数名和处理器方法的形参名不一样

public ModelAndView receiveParam(@RequestParam(value = "rname",required = false) String name,
                                     @RequestParam(value = "rage",required = false) Integer age){}

3.以对象方式接收

 public ModelAndView receiveParam( Student myStudent){}

框架会自动对对象赋值

controller处理器方法返回类型

1.返回String

–表示逻辑视图名称,需要配置视图解析器。框架内部调用了forward转发,请求/returnString-view.do,显示show,
访问地址仍然是/returnString-view.do

@RequestMapping(value = "/returnString-view.do")
    public String doReturnView(HttpServletRequest request,String name, Integer age){
        。。。
        return "show";
    }

2.返回String

完整视图路径,不能配置视图解析器

 return "/WEB-INF/view/show.jsp";

3.返回void, 响应ajax请求

@RequestMapping(value = "/returnVoid-ajax.do")
    public void doReturnVoidAjax(HttpServletResponse response, String name, Integer age)

4.返回对象,响应ajax请求,需加@ResponseBody注解,返回对象之后框架会自动转为json,

@RequestMapping(value = "/returnStudentJson.do")
    @ResponseBody
    public Student doStudentJsonObject(String name, Integer age) {return “对象”)

5.返回List 响应ajax请求,需加@ResponseBody注解,返回对象之后框架会自动转为json,

 @RequestMapping(value = "/returnStudentJsonArray.do")
    @ResponseBody
    public List<Student> doStudentJsonObjectArray(String name, Integer age) {

        return list;

6.返回的是String , String表示数据的,不是视图。

区分返回值String是数据,还是视图,看有没有@ResponseBody注解
* 如果有@ResponseBody注解,返回String就是数据,反之就是视图

 @RequestMapping(value = "/returnStringData.do",produces = "text/plain;charset=utf-8")
@ResponseBody
public String doStringData(String name,Integer age){
    return "Hello SpringMVC 返回对象,表示数据";
}

一进一出

转发

处理器方法返回ModelAndView,实现转发forward
* 语法: setViewName(“forward:视图文件完整路径”)
* forward特点: 不和视图解析器一同使用,就当项目中没有视图解析器

@RequestMapping(value = "/doForward.do")
    public ModelAndView doSome(){

        ModelAndView mv  = new ModelAndView();
        mv.addObject("msg","欢迎使用springmvc做web开发");
        mv.addObject("fun","执行的是doSome方法");
        //显示转发
        //mv.setViewName("forward:/WEB-INF/view/show.jsp");

        mv.setViewName("forward:/hello.jsp");
        return mv;
    }

重定向

处理器方法返回ModelAndView,实现重定向redirect
语法:setViewName(“redirect:视图完整路径”)
redirect特点: 不和视图解析器一同使用,就当项目中没有视图解析器

框架对重定向的操作:

  1. 框架会把ModelAndView中的简单类型的数据,转为string使用,作为重定向对象的请求参数使用。
  2. 在目标hello.jsp页面可以使用参数集合对象 ${param}获取请求参数值
    • ${param.myname}
      3.重定向不能访问/WEB-INF资源

异常

@ControllerAdvice : 控制器增强(也就是说给控制器类增加功能)
位置:在类的上面。
@ControllerAdvice

public class GlobalExceptionHandler {

特点:必须让框架知道这个注解所在的包名,需要在springmvc配置文件声明组件扫描器。
*<context:component-scan base-package=“com.bjpowernode.handler” />
//处理NameException的异常。先写好nameException类,nameException在创建时,就会自动给nameException增加功能

 @ExceptionHandler(value = NameException.class)
    public ModelAndView doNameException(Exception exception){
    }

处理异常的方法和控制器方法的定义一样, 可以有多个参数,可以有ModelAndView,
String, void,对象类型的返回值

形参:Exception,表示Controller中抛出的异常对象。
通过形参可以获取发生的异常信息。

@ExceptionHandler(异常的class):表示异常的类型,当发生此类型异常时,
由当前方法处理

处理其它异常, NameException, AgeException以外,不知类型的异常

 @ExceptionHandler
    public ModelAndView doOtherException(Exception exception){}        

拦截器

先写拦截类,继承自HandlerInterceptor
public class MyInterceptor implements HandlerInterceptor {
重写3个方法preHandle()、postHandle()、afterCompletion()
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
1.方法在控制器方法(MyController的doSome)之前先执行的。
用户的请求首先到达此方法
2.在这个 方法中可以获取请求的信息, 验证请求是否符合要求。

Object handler 被拦截的控制器对象

postHandle(HttpServletRequest request,
                           HttpServletResponse response,
                           Object handler, ModelAndView mv)

ModelAndView mv:处理器方法的返回值

特点:
1.在处理器方法之后执行的(MyController.doSome())
2.能够获取到处理器方法的返回值ModelAndView,可以修改ModelAndView中的
数据和视图,可以影响到最后的执行结果。
3.主要是对原来的执行结果做二次修正,

afterCompletion(HttpServletRequest request, HttpServletResponse response,
                                Object handler, Exception ex)
                                Exception ex:程序中发生的异常

特点:
1.在请求处理完成后执行的。框架中规定是当你的视图处理完成后,对视图执行了forward。就认为请求处理完成。
2.一般做资源回收工作的, 程序请求过程中创建了一些对象,在这里可以删除,把占用的内存回收。

配置文件声明拦截器

 <!--声明拦截器: 拦截器可以有0或多个-->
 <mvc:interceptors>
        <!--声明第一个拦截器-->
        <mvc:interceptor>
  <!--指定拦截的请求uri地址-->
            <mvc:mapping path="/**"/>
            <!--声明拦截器对象-->
            <bean class="com.bjpowernode.handler.MyInterceptor" />
        </mvc:interceptor>
        <!--声明第二个拦截器,如果有的话-->
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.bjpowernode.handler.MyInterceptor2" />
        </mvc:interceptor>
    </mvc:interceptors>

拦截器和过滤器的区别

1.过滤器是servlet中的对象, 拦截器是框架中的对象
2.过滤器实现Filter接口的对象, 拦截器是实现HandlerInterceptor
3.过滤器是用来设置request,response的参数,属性的,侧重对数据过滤的。
拦截器是用来验证请求的,能截断请求。
4.过滤器是在拦截器之前先执行的。
5.过滤器是tomcat服务器创建的对象
拦截器是springmvc容器中创建的对象
6.过滤器是一个执行时间点。
拦截器有三个执行时间点
7.过滤器可以处理jsp,js,html等等
拦截器是侧重拦截对Controller的对象。 如果你的请求不能被DispatcherServlet接收, 这个请求不会执行拦截器内容
8.拦截器拦截普通类方法执行,过滤器过滤servlet请求响应

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值