SpringMVC

Posted 梦Dreamer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC相关的知识,希望对你有一定的参考价值。

什么是springmvc

springmvcspring框架的一个模块,springmvcspring无需通过中间整合层进行整合。springmvc是一个基于mvcweb框架。


 springmvc框架


第一步:发起请求到前端控制器(DispatcherServlet)

第二步:前端控制器请求HandlerMapping查找 Handler

         可以根据xml配置、注解进行查找

第三步:处理器映射器HandlerMapping向前端控制器返回Handler

第四步:前端控制器调用处理器适配器去执行Handler

第五步:处理器适配器去执行Handler

第六步:Handler执行完成给适配器返回ModelAndView

第七步:处理器适配器向前端控制器返回ModelAndView

         ModelAndViewspringmvc框架的一个底层对象,包括 Modelview

第八步:前端控制器请求视图解析器去进行视图解析

         根据逻辑视图名解析成真正的视图(jsp)

第九步:视图解析器向前端控制器返回View

第十步:前端控制器进行视图渲染

         视图渲染将模型数据(ModelAndView对象中)填充到request

第十一步:前端控制器向用户响应结果

Springmvc的使用

web.xml中配置前端控制器

springmvc.xml中配置处理器适配器、处理器映射器、处理器配置(Controller)、视图解析器。

配置前端控制器

web.xml中配置springmvc前端控制器。

load-on-startup:表示servlet随服务启动;

servlet拦截方式解析:

1、拦截固定后缀的url,比如设置为 *.do、*.action,例如:/user/add.action

此方法最简单,不会导致静态资源(jpg,js,css)被拦截。

 

2、拦截所有,设置为/,例如:/user/add  /user/add.action

此方法可以实现REST风格的url,很多互联网类型的应用使用这种方式。

但是此方法会导致静态文件(jpg,js,css)被拦截后不能正常显示。需要特殊处理。

 

3、 拦截所有,设置为/*,此设置方法错误,因为请求到Action,当action转到jsp时再次被拦截,提示不能根据jsp路径mapping成功。

配置处理器适配器、处理器映射器、处理器配置(Controller)、视图解析器

此处配置的是非注解的处理器适配器和处理器映射器

 <!--配置Handler  -->
    <bean name="/queryItems.action" class="cn.itcast.ssm.controller.ItemsController1"/>
    
    <!--处理器适配器:所有处理器适配器都实现HandlerAdapter接口  -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    
    <!--配置处理器映射器:HandlerMapping  -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    
    <!--配置视图解析器:ViewResolver,解析jsp,默认使用jstl标签,classpath下需要有jstl标签  -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>

处理器开发,也就是Controller需要实现Controller接口才能org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter适配器执行。

配置注解处理器映射器和处理器适配器

注:注解的映射器和注解的适配器必须配对使用

springmvc.xml的配置

	<!--注解映射器 -->
    <!-- <bean
        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" /> -->
    <!--注解适配器 -->
    <!-- <bean
        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" /> -->

    <!--也可以使用这种方式 -->
    <!-- 使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置 mvc:annotation-driven默认加载很多的参数绑定方法, 
        比如json转换解析器就默认加载了,如果使用mvc:annotation-driven不用配置上边的RequestMappingHandlerMapping和 
        RequestMappingHandlerAdapter 实际开发时使用mvc:annotation-driven -->
    <mvc:annotation-driven />


    <!-- 配置controller扫描 -->
    <context:component-scan base-package="com.dmsd.itoo.card.controller" />

    <!-- 配置视图解析器 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <!-- 后缀 -->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!-- 写法二 -->
    <!-- <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/> -->

    <!--资源映射 -->
    <mvc:resources location="/css/" mapping="/css/**" />
    <mvc:resources location="/Script/" mapping="/Script/**" />
    <!-- <mvc:resources location="/images/" mapping="/images/**"/> -->

  配置了视图解析器的前缀和后缀,在Handler中可以不用指定前缀和后缀:


注解Handler的开发:

   1、需要在类上面添加@Controller,说明这个类是一个控制器;

   2、@RequestMapping(“/queryItems”)用来定义访问Url,可以为整个类或者方法定义;

   3、可以在方法的参数上添加@PathVariable("pageIndex")注解,表示方法参数绑定到地址URL的模板。即,获取RequestMapping中的参数,如果RequestMapping中没有参数,则使用PathVariable将会报错。

   4、@ModelAttribute:应用于方法参数,参数可以在页面直接获取,相当于request.setAttribute。

   5、@ResponseBody:放在方法上,表示返回类型将会直接作为HTTP响应字节流输出。出去json格式的数据时,经常使用。和@ResponseBody类似的注解,@RequestBody,指定方法参数应该被绑定到HTTP请求Body上。

   6、@RequestParam:应用于方法参数,如果jsp传递的参数和方法中使用的参数不一致,可以使用此参数。

   7、@SessionAttributes:session管理,Spring 允许我们有选择地指定 ModelMap 中的哪些属性需要转存到 session 中,以便下一个请求属对应的 ModelMap 的属性列表中还能访问到这些属性,只能声明在类上,不能声明在方法上。

   8、@CookieValue: 获取cookie信息

   9、@RequestHeader: 获取请求的头部信息

以上是关于SpringMVC的主要内容,如果未能解决你的问题,请参考以下文章

Spring和SpringMVC的区别

SpringMVC返回json字符串(非注解方式)

SpringMVC学习03SpringMVC中注解和非注解方式下的映射器和适配器总结

springmvc和其他mvc框架有啥区别?

使用maven搭建ssm框架的javaweb项目

SpringMVC