SpringMVC框架从入门到总结一

SpringMVC介绍

回顾MVC设计模式

  • model:模型 JavaBean(1.处理业务逻辑 2.封装数据)

  • view:视图 Jsp/html(展示数据)

  • controller:控制器 Servlet(1.接收请求 2.调用模型 3.转发视图)

三层架构

  • web层:用户与java交互

  • service层:处理业务逻辑

  • dao层:java与数据库交互
    在这里插入图片描述

SpringMVC介绍

SpringMVC 是一种基于 Java 的实现 MVC 设计模式的轻量级 Web 框架,它可以通过一套注解,让一个简单的Java类成为控制器,而无须实现任何接口

在这里插入图片描述
springMVC框架本质上就是一个servlet,封装了共有的行为(请求、响应),简化代码

SpringMVC快速入门

步骤:

  1. 创建maven工程
  2. 引入依赖管理
  3. 创建一个普通类,@controller,创建处理请求的方法
  4. 准备一个页面,用于响应
  5. 创建springmvc的配置文件,开启注解扫描
  6. 配置一个前端的控制器(可以理解为之前的BaseServlet的方法)将springmvc的配置文件配起来
    pom.xml:
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>cn.itcast</groupId>  
  <artifactId>SpringMvc_day01_quick</artifactId>  
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <!--
    1、创建maven工程
    2、引入依赖管理
    3、创建一个普通类,@controller,创建处理请求的方法
    4、准备一个页面,用于响应
    5、创建springmvc的配置文件,开启注解扫描
    6、配置一个前端的控制器(可以理解为之前的BaseServlet的方法)将springmvc的配置文件配起来
    -->  
  <!--依赖管理-->
  <dependencies> 
    <dependency> 
      <groupId>org.springframework</groupId>  
      <artifactId>spring-context</artifactId>  
      <version>5.0.6.RELEASE</version> 
    </dependency>  
    <!--springmvc依赖-->  
    <dependency> 
      <groupId>org.springframework</groupId>  
      <artifactId>spring-webmvc</artifactId>  
      <version>5.0.6.RELEASE</version>
    </dependency>
    <dependency> 
      <groupId>javax.servlet</groupId>  
      <artifactId>javax.servlet-api</artifactId>  
      <version>3.0.1</version>  
      <scope>provided</scope> 
    </dependency> 
  </dependencies>  
  <!--jdk1.8插件-->  
  <build> 
    <plugins> 
      <!-- 设置编译版本为1.8 -->  
      <plugin> 
        <groupId>org.apache.maven.plugins</groupId>  
        <artifactId>maven-compiler-plugin</artifactId>  
        <version>3.1</version>  
        <configuration> 
          <source>1.8</source>  
          <target>1.8</target>  
          <encoding>UTF-8</encoding> 
        </configuration> 
      </plugin> 
    </plugins> 
  </build> 
</project>

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">


    <!--配置springmvc的前端控制器-->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--将springmvc的配置文件交给spring的前端控制器来解析-->

        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </init-param>
    </servlet>

   <!--拦截url规则:/(默认)-->
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

demo.jsp:

<%--
  Created by IntelliJ IDEA.
  User: hxc
  Date: 2020/6/22
  Time: 19:30
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ${msg}
</body>
</html>

applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- bean definitions here -->


    <!-- 开启注解扫描  -->
    <context:component-scan base-package="cn.itcast"></context:component-scan>
</beans>

Controller:

@Controller //声明这是一个处理请求的controller
public class MyController {


    @RequestMapping("/demo")  //指定当前方法处理哪一个请求
    public ModelAndView demo(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg","hello springMVC");
        modelAndView.setViewName("/WEB-INF/jsp/demo.jsp");
        return modelAndView;
    }
}

SpringMVC的执行流程

时序图

在这里插入图片描述

流程图

在这里插入图片描述

SpringMVC组件概述

三大组件

  • 处理器映射器:HandlerMapping
    将 请求url 和 处理器的方法 建立映射关系

  • 处理器适配器:HandlerAdapter
    从多个处理器当中,适配其中一个,调用目标执行…

  • 视图解析器:ViewResolver
    将逻辑视图解析为物理视图

常用注解

@Controller

SpringMVC基于Spring容器,所以在进行SpringMVC操作时,需要将Controller存储到Spring容器中,故使用此注解
在这里插入图片描述

@RequestMapping

用于建立请求 URL 和处理请求方法之间的对应关系

 /**
     *  @RequestMapping:
     *      1.指定当前方法需要处理的请求的路径
     *          value:就是路径,可以是一个数组.
     *          如果有后缀,此处的后缀可以省略.
     *      2. 限定请求的方式的
     *          method: 是一个RequestMethod枚举类型的数组
     *      3. 分类管理url
     *          使用在类名上,作为当前访问controller的统一的父级路径.从而达到分类管理的目的
     *          /order/*
     *          /user/*
     *          /route/*
     *
     * @return
     */
    //@RequestMapping({"/demo.do","/abc"})  //指定当前方法处理哪一个请求
    @RequestMapping(value = "/demo",method = RequestMethod.GET)
    public ModelAndView demo(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg","hello springMVC");
//        视图路径 应该由    视图解析器的  前缀+名字+后缀
        modelAndView.setViewName("demo");
        return modelAndView;
    }

SpringMVC的请求

服务器要获取请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数:

默认支持参数

/**
 *  springMVC默认支持的参数
 *  1. HttpServletRequest : 请求
 *  2. HttpServletResponse  响应
 *  3. HttpSession   session域
 *
 *  4.Model:   model+string返回值  =  ModelAndView
 *
 * @return
 */
@RequestMapping("/demo2")
public ModelAndView demo2(HttpServletRequest request, HttpServletResponse response, HttpSession session){

    System.out.println(request);
    System.out.println(response);
    System.out.println(session);

    ModelAndView modelAndView = new ModelAndView();
    //设置视图
    modelAndView.setViewName("item/list");
    return modelAndView;
}

基本类型参数

  /**
     *  @RequestParam : 用来获取请求中的参数的.
     *       value值就是表单提交时的key. 底层就是 request.getParameter(key);
     *
     *       如果表单提交时的key和方法中声明的参数名一致时,这个@RequestParam注解可以省略
     *
     *
     *  对于请求中基本类型参数,直接在handler中声明参数,保证参数名和请求中提交的key值一样即可
     *
     */
    @RequestMapping("/queryItem.do")
    public ModelAndView demo1(@RequestParam("productName") String productName){
        System.out.println(productName);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("item/list");
        return modelAndView;
    }

pojo类型的参数

//只是用于页面跳转
@RequestMapping("/queryItemById.do")
public String queryItemById(int id){
    System.out.println("拿到id,调用service去获取数据,然后跳转修改页面:"+id);

    return "item/edit";
}


/**
 *  请求中的数据封装到pojo对象. 直接声明pojo即可.但是注意,pojo的属性名必须和请求中的key值一致.
 *
 *  请求参数的乱码,直接配置spring提供的乱码过滤器 ,在spring-web包
 *
 * @return
 */
@RequestMapping("/updateItem.do")
public String updateItem(Item item){

    System.out.println("请求中的数据封装成的item对象:"+item);

    return "item/edit";
}

web.xml配置乱码过滤器:

<!-- spring的乱码过滤器-->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <!-- 配置编码格式-->
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

pojo包装类型的参数

pojo.java:

package com.itheima.pojo;

public class QueryVo {


    private Item item;

    public Item getItem() {
        return item;
    }

    public void setItem(Item item) {
        this.item = item;
    }
}
/**
 *   包装类型:  保证前端提交的 key 是如下格式:
 *          包装类型的属性名.属性名
 *
 * @param queryVo
 * @return
 */

@RequestMapping("/queryItem.do")
public String queryItem(QueryVo queryVo){

    System.out.println(queryVo.getItem());
    return "item/list";
}

自定义类型的转换器

StringToDateConverterl.java

public class StringToDateConverter  implements Converter<String, Date>{

    /**
     实现Converter<S,T>接口
     S(source): 需要被转的类型
     T(target): 需要转成的类型
     */
    @Override
    public Date convert(String s) {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM--dd hh:mm:ss");
        Date date=null;
        try {
            date=format.parse(s);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--开启注解扫描-->
    <context:component-scan base-package="cn.itcast.controller"></context:component-scan>

    <!--前端控制器是/,所以要配置释放静态资源-->
    <mvc:default-servlet-handler></mvc:default-servlet-handler>

    <!--springmvc的注解驱动
    1、显示配置使用注解的 映射器和适配器
    2、支持json解析
    -->
    <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

    <!--配置springmvc的类型转换器-->
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">

        <!--配置工厂创建的对象-->
        <property name="converters">
            <set>
                <!--自定义的类型转换器-->
                <bean class="cn.itcast.converter.StringToDateConverter"></bean>
            </set>
        </property>

    </bean>

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


</beans>

集合类型的参数

数组

提交数组类型,直接声明数组类型的变量,变量和前端提交的key值保持一致

/*

    提交数组类型,直接声明数组类型的变量,变量和前端提交的key值保持一致
 */
@RequestMapping("/demo4.do")
public String demo4(Integer[] ids){

    System.out.println(Arrays.toString(ids));
    return "item/list";
}

集合类型

/*
    提交的是集合.

    1.后台应该创建一个包装类,将集合属性作为包装类的属性
    2.前端提交的参数应该通过key来指定  数据封装到包装类的集合属性的第几个对象中去.

 */
@RequestMapping("/demo5.do")
public String demo5(QueryVo queryVo){

    System.out.println(queryVo.getItemList());

    return "item/list";
}

controller返回值

modelAndView类型

ModelAndView : 用于封装数据和视图名的对象.springmvc自动解析这个对象


@RequestMapping("/demo1")
public ModelAndView demo1(){
    ModelAndView modelAndView = new ModelAndView();

    //设置参数  向request域存放数据.
    modelAndView.addObject("msg","消息");
    //设置视图名  完整的路径 = 视图解析器的前缀  + 名字 + 后缀  ,底层是java的转发技术.
    modelAndView.setViewName("demo");

    return modelAndView;
}

void类型

@RequestMapping("/demo2")
public  void demo2(HttpServletRequest request, HttpServletResponse response){

    try {
        request.setAttribute("msg","原生态的转发技术");
        request.getRequestDispatcher("/WEB-INF/jsp/demo.jsp").forward(request,response);
    } catch (ServletException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@RequestMapping("/demo3")
public void demo3(HttpServletResponse response){
    try {
        response.sendRedirect("/a.html");
    } catch (IOException e) {
        e.printStackTrace();
    }
}


@RequestMapping("/demo4")
public void demo4(HttpServletResponse response){

    try {
        response.getWriter().write("<font color='red'>hello</font>");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@RequestMapping("/demo5")
@ResponseStatus(HttpStatus.OK)  //如果handler是void类型,并且不给任何响应体,必须使用当前注解
public void demo5(){
    System.out.println("我不给浏览器响应");
}

String类型

string类型返回值,springmvc直接默认就是视图名

 
    @RequestMapping("/demo6")
    public String demo6(Model model){

        //设置数据,向request域保存数据
        model.addAttribute("msg","hello");

        return "demo";
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章