Spring MVC 笔记详解

一.Spring Web 框架介绍

  1. MVC思想

     

  2. Spring MVC:是Spring对MVC的思想实现

    (1)Servlet:Web服务的模块,包含对MVC与REST的实现,Spring MVC

    (2)Web:提供与Web的继承,基于Web应用程序上下文.

    (3)WebSocket:实现客户端与服务端主动通信。

    (4)Portlet:提供了在 Portlet 环境中实现 MVC。

  3. 好处:

    (1)它解决Web开发中常见的问题(参数接收,文件上传,表单验证,国际化),使用简单,与Spring无缝集成.

    (2)支持RESTful风格的URL请求,非常容易与其他视图技术集成.

    (2性能好,简单,安全,采用了松散耦合可插拔组件结构,比其他MVC框架更具扩展性和灵活性.

二.前端控制器(Controller)

  1. 在MVC框架中都存在有个前端控制器,在WEB应用的前端(Front)设置一个入口控制器,用来提供一个集中的请求处理机制,所有的请求都被发往该控制器统一处理==>然后分发给各自的处理程序==>一般用来做一个共同的处理==>提高了可重用性和可拓展性.

  2. Spring MVC中的前端控制器==DispatcherServlet类(要在web.xml中配置)

  3. 配置前端控制器,在 main 目录新建 webapp/WEB-INF/web.xml

    <servlet>
       <servlet-name>dispatcherServlet</servlet-name>
       <servletclass>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <!-- 指定 Spring 容器启动加载的配置文件-->
       <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:mvc.xml</param-value>
          </init-param>
    <!-- Tomcat 启动初始化 -->
          <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
       <servlet-name>dispatcherServlet</servlet-name>
       <url-pattern>/</url-pattern>
    </servlet-mapping>
  4. 配置Spring MVC文件

    在 resources 目录下新建 mvc.xml,配置如下

    <!--配置IoC DI注解解析器-->
        <context:component-scan base-package="cn.wolfcode.web.controller"/>
     <!--配置MVC注解解析器-->
        <mvc:annotation-driven/>
    <!--dispatcherServlet映路径为/,可以访问静态资源-->
        <mvc:default-servlet-handler/>
    ​
    <!--消除视图的前缀和后缀-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--视图前缀-->
            <property name="prefix" value="/WEB-INF/views/"/>
        <!--视图后缀-->
            <property name="suffix" value=".jsp"/>
        </bean>
    ​
    <!--配置上传解析器-->
        <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>
    ​
    <!--配置拦截器-->
    <mvc:interceptors>
       <!-- 配置拦截器 -->
       <mvc:interceptor>
          <!-- 拦截的路径 -->
          <mvc:mapping path="/**"/>
          <!-- 被排除的路径
          <mvc:exclude-mapping path="排除的路径"/> -->
          <!-- 拦截器类 -->
          <bean class="cn.wolfcode.web.interceptor.MyInterceptor"/>
       </mvc:interceptor>
    </mvc:interceptors>

三.MVC注解

  1. RequestMapping 注解:是一个用来处理请求地址映射的注解,可以用于类或方法上,需要

  2. <!--配置MVC注解解析器--> mvc:annotation-driven/

四.其他注解

  1. @RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)
    eg:处理请求参数名和处理方法的形参不同名的问题.
  2. @Controller:IoC注解,贴在类上,spring创建类对象
  3. (@DateTimeFormat(pattern="yyyy-MM-dd")Date date)
    对日期进行格式化.
  4. @ModelAttribute:
    (1)被@ModelAttribute注解的方法会在所有的controller方法执行之前执行
    (2)@ModelAttribute在方法的参数上从model中获取值
        eg:(1)
        @ModelAttribute
        public void showUser(String name){
            System.out.println("showUser");
        }
           (2)  
        @RequestMapping("/req7")
        // 给形参贴 @ModelAttribute,用来修改存在模型中使用的 key
        public String resp7(@ModelAttribute("u")User user) {
           return "m";
        }

五.前端控制器(DispatcherServlet)映射路径

  1. 映射路径

    (1).do==>可以访问静态文件,但不支持RESTful风格,想要访问控制器里的处理方法,请求路径必须携带.do

    (2)/==>可以支持流行的RESTful风格,但会导致访问不了静态资源.原因是

    ==>先加载容器的web.xml,再加载项目中的web.xml,

    ==>当拦截路径一致时,后者会覆盖前者,

    ==>所有静态资源会交给前端控制器处理

    ==>而处理静态资源是交由内置 DefaultServlet 来处理的

    解决:在mvc.xml中配置:mvc:default-servlet-handler/即可

    对进入 DispatcherServlet 的静态资源的请求,会创建对象去交给DefaultServlet 处理

    2.

     

六.处理响应

  1. 在控制器里面编写处理方法接收请求做响应(往作用域中存入数据和找视图文件(可以写配置消除前后缀)),一般处理方法返回的类型为 ModelAndView 和 String

  2. @Controller
    public class ResponseController {
    // 提供方法处理请求,localhost/resp1
        @RequestMapping("/resp1")
        public ModelAndView resp1() {
    // 通过创建这个类对象,告诉 Spring MVC 找什么视图文件, 往作用域或者说往模型中存入什
    么数据
        ModelAndView mv = new ModelAndView();
    // 往作用域或者模型中存入数据
        mv.addObject("msg", "方法返回类型是 ModelAndView");
    // 找视图
        mv.setViewName("/WEB-INF/views/resp.jsp");
        return mv;
    }
    @Controller
    public class ResponseController {
    // 提供方法处理请求,localhost/resp2
        @RequestMapping("/resp2")
        public String resp2(Model model) {
    // 往作用域或者模型中存入数据
        model.addAttribute("msg", "方法返回类型是 String");
    // 返回视图名
        return "/WEB-INF/views/resp.jsp";
       }
    }
  3. String==>return null==>会找视图,找不到报错

    ModelAndView==>return null=>不会找视图

七.请求转发和重定向

  1. public String forward() {
    	return "forward:/WEB-INF/views/welcome.jsp";
    }
    public String redirect() {
    	return "redirect:/static/demo.html";
    }

八.处理请求参数

  1. 简单类型

    @Controller
    public class RequestController {
    	@RequestMapping("/req2")
    	// 此时请求参数为 name,而形参名为 username
    	public ModelAndView resp2(@RequestParam("username")String name, int age) {
    	System.out.println(name);
    	System.out.println(age);
    	return null;
    	}
    }
  2. 复合类型(数组和自定义类型)

    注意:传递参数名与封装对象的属性名一致

    //请求路径 /req3?ids=1&ids=2&ids=3
    @Controller
    public class RequestController {
    	@RequestMapping("/req3")
    	public ModelAndView resp3(Long[] ids) {
    	System.out.println(Arrays.toString(ids));
    	return null;
    	}
    }
    // /req4?username=hehe&password=666
    public class User {
    	private Long id;
    	private String Username;
    	private String password;
    	//  setter getter toString
    }
    @Controller
    public class RequestController {
    	@RequestMapping("/req4")
    	public ModelAndView resp4(User user) {
    	System.out.println(user);
    	return null
    	}
    }
  3. 日期类型

    @DateTimeFormat

    // /req5?date=2020-05-19
    @Controller
    public class RequestController {
    	@RequestMapping("/req5")
    	// 注意形参的类型为 java.util.Date
    	public ModelAndView resp5(@DateTimeFormat(pattern="yyyy-MM-dd")Date date) {
    	System.out.println(date.toLocaleString());
    	return null;
    	}
    }

九.拦截器

  1. Spring MVC提供,若配置在Spring MVC配置文件中,则被Spring容器管理

  2. 作用:主要用于对请求访问控制器的方法进行拦截,用于登录与权限判断.

  3. 在mvc.xml中配置拦截器

  4. public class MyInterceptor implements HandlerInterceptor {
    	//前置拦截
        //若返回true,放行访问控制器的处理方法
        //若返回false,阻止访问孔子器的处理方法
    	@Override
    	public boolean preHandle(HttpServletRequest request, HttpServletResponse
    		response, Object handler) throws Exception {
    		System.out.println("preHandle");
    		return true;
    	}
    }

     

  5.  

十.Spring MVC执行流程

  1.  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值