SpringMVC知识大览

SpringMVC大览

springMVC的基础知识

什么是SpringMVC?

springmvc框架原理(掌握)

前端控制器、‘处理映射器、处理适配器、视图解析器

springmvc的入门程序

目的:对前端控制器、‘处理映射器、处理适配器、视图解析器学习

非注解的处理映射器、处理器适配器

注解的处理器映射器、处理器适配器

springmvc和mybatis整合(掌握)

springmvc的注解开发

常用的注解学习

参数绑定(简单类型、pojo、集合类型)

自定义参数绑定

springmvc和struts2区别

springmvc的高级应用

参数绑定

数据回显

上传图片

json数据交互

RESTful支持

拦截器

SpringMVC框架

什么是springmvc

springmvc是spring 框架的一个模块,SpringMVC和spring无需通过中间整合层进行整合。

Springmvc是基于mvc的web框架

1.2什么是MVC

mvc是一个设计模式

model view controller

1.3springMVC框架

前端控制器:

DispatcherServlet接口用户请求,响应

请求查找Handler ↓↓

处理器映射器:

HandlerMapping

返回一个执行链:HandlerExecutionChain{

handletInterceptor1

handletInterceptor1

Handler

}

Handler处理器

Handler(controller)

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

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

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

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

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

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

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

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

ModelAndView 是springmvc框架的一个底层对象,包括Model和View

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

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

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

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

视图渲染讲模型数据填充到request域

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

组件

  1. 前端控制器

    作用:接受请求,响应结果,相当于转发器

  2. 处理器映射器

    作用:根据请求的url查找Handler

  3. 处理器适配器HandlerAdapter

    作用按照规则去执行Handler

    要按照HandlerAdapter编写Handler

  4. 视图解析器 View resolver
    作用:进行视图解析,根据逻辑图名解析成真正的视图(view)

  5. 视图View
    View是一个接口,实现类支持不同的View类型

Spring环境搭建

2.1入门程序

基础搭建

https://blog.csdn.net/qq_40709468/article/details/78757783

2.3配置前端控制器

在web.xml中配置前端控制

<!--    spring 前端控制器-->
    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--        contextConfiguration配置springmvc的加载文件(配置处理器映射器,适配器等等)
            如果不配置的话,默认加载WEB-INF目录下名称-servlet.xml  for example:SpringMVC-servlet.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:Springmvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
<!--        第一种: *.action 访问以.action结尾的由dispatcherServlet解析-->
<!--        第二种:/. 所有访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析
            使用此种方式可以实现RestFul风格的URL
            第三种:/*,错误!!,在转发后一样会被拦截
-->
        <servlet-name>SpringMVC</servlet-name>
        <url-pattern></url-pattern>
    </servlet-mapping>

新建Springxml文件配置处理器映射器、处理器适配器、处理器解析器

  1. 配置处理器适配器bean: SimpleControllerHandlerAdapter
  <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
  1. 配置处理器映射器

    <!--处理器映射器将bean的name作为url查找,需要在配置handler的时候指定beanName(就是URL)-->   
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    
  2. 编写Handler(Controller类)

  public class testController1 implements Controller {    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {        List<blog> blogs= new ArrayList<blog>();        blog blog1=new blog();        blog1.setId(1);        blog blog2=new blog();        blog2.setId(2);        blogs.add(blog1);        blogs.add(blog2);        /**         * 返回ModelAndView         */        ModelAndView modelAndView=new ModelAndView();        /**         * 相当于request的setAttribute         */        modelAndView.addObject("id", blogs);        /**         * 指定视图         */        modelAndView.setViewName("/WEB-INF/jsp/test.jsp");        return modelAndView;    }}
  1. 编写视图解析器

    <!--    处理器解析器    解析jsp视图,默认使用jstl标签classpath下要有jstl包-->    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
    
  2. 配置handler

    将编写的handler在Spring容器中加载,依据前端控制器的配置

<!--    配置Handler-->    <bean id="/ids.do" class="controller.testController1"></bean>

处理器映射器(注解与非注解)

非注解的处理器映射器

处理器映射器:

org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping

简单URL映射

org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/getids1.do">controller的Bean id</prop>
                <prop key="/getids2.do">controller的Bean id</prop>
            </props>
        </property>
    </bean>

非注解的适配器

  1. SimpleUrlHandlerMapping

  2. HttpRequestHandlerAdapter

    要求编写的Handler实现HTTPRequestHandler接口

    
    

注解开发SpringMVC

配置注解映射器和适配器

<!--    注解映射器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--注解适配器-->    
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<!--    使用mvc的注解驱动mvc:annotion-driven可以代替上面两个注解映射器和注解适配器
mvc:annotation-driven默认加载很多参数绑定方法,比如json转换解析器-->    
<mvc:annotation-driven></mvc:annotation-driven>

开发注解Handler

import org.springframework.stereotype.Controller;
@Controller
public class testController {
      /**
     * 一般建议URL和方法名字相同
     * @return
     * @throws Exception
     */
    @RequestMapping("/queryIds")
    public ModelAndView queryIds()throws Exception{
        List<Userid> userids=new ArrayList<>();
        Userid userid1=new Userid();
        userid1.setId(1);
        Userid userid2=new Userid();
        userid2.setId(54);
        userids.add(userid1);
        userids.add(userid2);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("idList", userids);
        modelAndView.addObject("message", "nice!");
        modelAndView.setViewName("index.html");
        return modelAndView;
    }
}

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

RequestMapping 有两个子类PostMapping & GetMapping

加载Handler

<!--    扫描controller包-->
<context:component-scan base-package="controller"></context:component-scan>

视图解析器

prefix:前缀

suffix:后缀

原理是在返回的文件名上添加前缀和后缀

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">    
    <property name="prefix" value="/WEB-INF/html/"/>
    <property name="suffix" value=".html"/>
</bean>

PS:为什么不能访问html文件

https://blog.csdn.net/Henry_Lin_Wind/article/details/81110635

原因:

【/】:它会拦截所有的url,如:/test,/test1.html,/1.jpg……,但是除了以jsp结尾的url不会交给前端控制器。所以导致了不能访问html文件。对于*.jsp,由于servlet容器中内置了jspServlet,所以不会被/拦截

解决方法

在web.xml中添加,类似的css,jpg,gif,png,都可以使用这个办法解决

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.html</url-pattern>
  </servlet-mapping>
posted @ 2019-11-02 18:10  jirath  阅读(125)  评论(0编辑  收藏  举报