SpringMVC入门

1、什么是MVC?

  MVC模型:是一种架构型的模式,本身不引入新功能,只是帮助我们将开发的结构组织的更加合理,使展示与模型分离、流程控制逻辑、业务逻辑调用与展示逻辑分离,也就是责任分离。

2、SpringMVC框架,

  它解决了WEB开发中常见的问题(参数接收、页面跳转 、文件上传、表单验证、国际化、等等),而且使用简单,与Spring无缝集成。 Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架 (更安全,性能更好,更简单)。 支持 RESTful风格的 URL 请求 。 采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。

3、Spring的前端控制器DispatcherServlet

  所有的请求都被该控制器统一处理,处理所有请求的共同操作。

4、使用SpringMVC的流程

  第一步:搭建web项目,导入maven依赖spring-web spring-webmvc spring-context jstl servlet-api

  第二步:配置web.xml配置前端控制器,本质上是一个servlet

  第三步:处理器映射器、处理器适配器、视图解析器等都是框架已经写好的,在使用时会自动调用,不用配置

  第四步:开发和配置控制器Controller

  第五步:前端控制器关联SpringMVC配置文件

5、流程详解

  第二步:web.xml配置前端控制器

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

  <!--配置前端控制器,本质上是一个servlet-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--关联mvc.xml的配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:mvc.xml</param-value>
    </init-param>
    <!--配置启动时自动加载-->
    <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

  注:配置前端控制器后发现无法访问静态资源,如/index.html,为什么呢?

  •  因为Tomcat处理静态资源访问的servlet(defualt)的映射路径为 / 。在启动项目的时候,在Tomcat中的web.xml是先加载的,项目的web.xml是后加载的,如果配置了相同的映射路径,后面的会覆盖前者. 也就是说,SpringMVC中的DispatcherServlet的映射路径覆盖了Tomcat默认对静态资源的处理的路径。 如果SpringMVC要配置为/,那么就得设置Dispatcherservlet对静态资源进行支持。

    解决方式:在配置文件中添加对静态资源的访问<mvc:default-servlet-handler/>

  •  添加后将在 SpringMVC 上下文中定义一个 DefaultServletHttpRequestHandler,它会对进入 DispatcherServlet 的请求进行筛查,如果发现是没有经过映射的请求,就将该请求交由 Tomcat默认的 Servlet 处理,如果不是静态资源的请求,才由 DispatcherServlet继续处理。 

   / 和 /* 的区别:

  • / 会匹配url请求/index等 ,也会匹配静态资源*.js,*.html等, 但不会匹配*.jsp文件。
  • /* 会匹配url请求/index等 ,也会匹配静态资源*.js,*.html等, 会匹配*.jsp文件。如果使用JSP,直接响应JSP代码,没有渲染.

  第三步:配置视图解析器,用来添加前后缀,会给返回的字符串添加上前后缀(下一篇博客中会用到)

<!--视图解析器(前后缀控制器)-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/views/"/>
        <property name="suffix" value=".jsp"/>
</bean>

  第四步:开发和配置Controller

public class HelloController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        System.out.println("Hello springMVC");
        ModelAndView mv = new ModelAndView();
        //设置跳转视图页面
        mv.setViewName("test");
        //将数据共享到前台页面,如果没有设置key值,则默认为数据类型的首字母小写的字符串
        mv.addObject("msg","你好!");
        mv.addObject(123);//这个就为integer
        return mv;
    }
}
 <!--配置控制器-->
    <bean name="/hello" class="com.test._01_hello.HelloController"/>

SpringMVC工作流程

流程图

 流程分析

1、用户发出请求到前端控制器DispatcherServlet

2、前端控制器调用处理器映射器HandlerMapping

3、处理器映射器通过查找xml配置或注解配置,生成处理器对象的执行链,返回给前端控制器

4、前端控制器调用处理器适配器HandlerAdapter

5、处理器适配器适配调用具体的处理器Controller

6、Controller执行完成后返回ModelAndView对象

7、处理器适配器将Controller的执行结果返回给前端控制器

8、前端控制器将ModelAndView对象传给视图解析器View Resolver

9、视图解析器将解析后的视图View返回给前端控制器

10、前端控制器根据View进行视图渲染,即将模型数据填入页面中

11、前端控制器将渲染完成后的视图响应给用户 

涉及到的组件分析

1、前端控制器DispatcherServlet

  不需要程序员开发,由框架提供,只需要在web.xml中配置

  作用:接收请求,响应结果,相当于转发器,中央处理器

2、处理器映射器HandlerMapping

  不需要程序员开发,由框架提供

  作用:根据请求的url查找Handler处理器(Controller),可以通过xml和注解的方式来映射。

3、处理器适配器HandlerAdapter

  不需要程序员开发,由框架提供

  作用:按照特定规则(HandlerAdapter要求的规则)去执行Controller

4、控制器Controller

  需要程序员开发,按照HandlerAdapter的要求去做

  作用:接收用户请求信息,调用业务方法处理请求,也称之为后端控制器

5、视图解析器ViewResolver

  不需要程序员开发,由框架提供

  作用:进行视图解析,把逻辑视图解析成真正的物理视图

6、视图View

  需要程序员开发jsp等

  作用:把数据展现给用户,View是一个接口,实现类支持不同的View技术(jsp、freemarker、pdf等)。

使用注解方式开发SpringMVC

1、第一步:在SpringMVC的配置文件中配置注解解析器

  这里需要IoC的注解解析器和MVC的注解解析器

<!--IoC注解解析器,需要配置扫描的包的路径-->
    <context:component-scan base-package="com.xxx.xxx"/>
<!--mvc注解解析器
 会自动注册RequestMappingHandlerMapping、RequestMappingHandlerAdapter、ExceptionHandlerExceptionResolver三个bean。
除此之外,还支持使用 ConversionService实例对表单参数进行类型转换.
支持使用 @NumberFormat、@DateTimeFormat注解完成数据格式化操作.
支持使用 @Valid注解对JavaBean实例进行JSR303验证. 支持使用 @RequestBody和@ResponseBody注解读写JSON.
-->
<mvc:annotation-driven/>

2、第二步:贴四大标签

  控制层(Web) @Controller

  业务逻辑层(Service) @Service

  数据持久层(DAO) @Repository

  其他组件使用通用注解 @Component

  注意 :四个标签的功能一模一样,仅仅只是被贴的组件的类型不同,作用都是把被贴注解的类交给spring管理,相当于

  <bean id=”类简单名字,首字母小写” class=”类的全限定名称”/>

3、@RequestMapping注解: 设置Controller方法的访问URL,不能重名。

 作用:

  一:URL路径映射(用于指定对应的url请求路径,value的值表示路径,路径通常以"/"开头,"/"可以省略。)

  二:窄化请求映射(可以标注在类中,用于窄化请求映射,此时访问资源的路径为:"/类的路径/方法的路径")

  三:请求方法限定(可以添加method属性,用于限定请求请求后台资源的方法)

代码示例:

@Controller
@RequestMapping("/anno")
public class AnnoController {
    @RequestMapping("/save,method=RequestMethod.POST")
    public ModelAndView save(){
        System.out.println("这是注解的方式");
        return null;
    }
    @RequestMapping("/update")
    public ModelAndView update(){
        System.out.println("这是注解的方式");
        return null;
    }
}
posted on 2019-09-13 17:16  幸福的小耗子  阅读(204)  评论(0编辑  收藏  举报