SpringMVC入门

一、SpringMVC介绍

1. 三层架构

B/S架构和C/S架构。服务器端分成三层框架。

表现层业务层持久层
SpringMVCSpringMyBatis
web层,接收浏览器传来的请求,并响应结果处理公司具体的业务逻辑用来操作数据库

2. MVC设计模型

Model:JavaBean的对象,封装数据
View:前端技术
Controller:Servlet等,请求首先进入部分

3. SpringMVC概述

定义:一种基于Java实现的MVC设计模型的请求驱动类型的轻量级Web框架。
优势:清晰的角色划分,多个模块/组件;强大的JSP标签库。
SpringMVC与Struts2:
共同点:表现层框架,基于MVC模型,基层都是ServletAPI(request,response),处理请求的机制都是一个核心控制器。
区别:SpringMVC入口是Servlet,基于方法设计的,效率高简洁,JSTL表达式执行效率高;
Struts2入口是Filter,基于类设计的,每次执行都会创建一个动作类,OGNL表达式开发效率高。

二、 环境搭建

Step 1. 创建项目

Intellij构建Maven webapp项目,为了创建快速可以添加一条属性:archetypeCatalog:internal

Step 2. 补全Maven文件夹

创建java、resources文件夹,并Mark Directory As相应的目录。

Step 3. 添加依赖

在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>com.ustc</groupId>
  <artifactId>springmvc_test</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>springmvc_test Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <spring.version>5.0.2.RELEASE</spring.version>
    <javax.servlet.version>2.5</javax.servlet.version>
    <javax.servlet.jsp.version>2.0</javax.servlet.jsp.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>${javax.servlet.version}</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>${javax.servlet.jsp.version}</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>springmvc_test</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

Step 4. 配置前端控制器

在web.xml中

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <!--配置前端控制器-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--初始化加载配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!--服务器启动就开始加载扫描-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

Step 5. 配置SpringMVC的配置文件

在resources文件夹下新建一个springmvc.xml的XML Configuration File - Spring Config。

<?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:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.2.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
        http://www.springframework.org/schema/task
        http://www.springframework.org/schema/task/spring-task-4.2.xsd">

    <!-- 使用注解开发,不用配置controller,需要配置一个组件扫描器 -->
    <context:component-scan base-package="com.ustc.controller"/>
    <!-- 视图解析器 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 配置从项目根目录到指定目录一端路径 ,建议指定浅一点的目录-->
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <!-- 文件的后缀名 -->
        <property name="suffix" value=".jsp"></property>
    </bean>
    <!--开启SpringMVC框架注解的支持-->
    <mvc:annotation-driven/>
</beans>

Step 6. 配置Tomcat服务器

Deployment添加相应的项目和路径名。

注意:其中xml的格式和配置项信息在代码中均给出,创建文件时有出入的地方可以以该文中代码内容为主。

  • 总结 在这里插入图片描述

三、 SpringMVC的处理请求流程

1. SpringMVC框架基于组件方式执行流程

在这里插入图片描述
DispatcherServlet是整个流程控制的中心,由它调用其他组件处理用户的请求,其存在降低了组件之间的耦合性。
HandlerMapping负责根据用户请求找到Handler处理器(业务控制器),返回一个执行链(某个类中的某个方法),通过配置文件、实现结构、注解等方式来实现映射。
HandlerAdapter处理器适配器才是根据执行链找到具体的Handler来处理请求,返回一个jsp。
ViewResolver视图解析器负责将处理结果生成View视图。
三大组件配置:<mvc:annotation-driven>会自动加载处理映射器和处理适配器,视图解析器则需要自己配置。

2. RequestMapping注解

  • 作用
    用于建立请求URL和处理请求方法之间的对应关系。
  • 属性
    path/value均指路径映射,有多个值时不可省略
    method指可以接收的请求方式(超链接一般为Get方法)
    params指定限制请求参数的条件(必须要有这个String要求的属性)
    headers指定限制消息头的条件(必须有这个String名的请求头)

四、请求参数的绑定

  1. 绑定机制
    表单提交的数据都是k-v格式的,SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制其中方法的参数进行绑定的,要求提交表单的name和参数名称是相同的。

  2. 支持的数据类型
    基本数据类型和字符串类型;实体类型JavaBean;集合数据类型。

2.1 JavaBean中包含引用类型
name命名为“引用类型名.属性名”
解决POST中文乱码问题:过滤器
在web.xml中

<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>
    <init-param>
       <param-name>forceEncoding</param-name>
       <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</filter>

2.2 集合数据类型
name命名为“集合名[位置].属性名”

2.3 自定义类型转换器
SpringMVC中自动进行数据类型转换,进入Web默认都是String。需要Converter注册类型转换器(组件)。
例如:Data数据类型


2.4 Servlet原生API
在Controller方法中直接添加HttpServletRequest等的参数。

五、常用注解

  1. RequestParam
    参数:name、required

  2. RequestBody
    作用:用于获取请求体内容,直接使用得到的是key=value … 结构的数据,不适用于get请求。常用于异步处理。

  3. PathVaribale
    用于绑定url中的占位符,例如/delete/{id}中的{id}。传递url的方式是/test/10,并不是/test/{id}
    参数:name

  • restful编程风格
    请求地址都一样,根据不同的请求方式来区分不同的方法。
  1. 基于HiddentHttpMethodFilter的示例
    由于浏览器的form表单只支持GET和POST请求,而DELETE、PUT等method并不支持,该过滤器用于模拟这些方法。需要配置。
    此外,可以通过WebClient使用静态方法发送请求,模拟各种请求方式;或通过浏览器插件,如火狐的RESTer。

  2. RequestHeader
    用于获得请求消息头。参数:value、required

  3. CookieValue
    用于把指定的cookie名称的值传入控制器方法参数。
    浏览器每次请求访问服务器,都会创建一个session空间,并以cookie的形式返回一个JESSIONID。

  4. ModelAttribute
    修饰方法:表示当前方法会再控制器的方法执行之前先执行,修饰的方法可以有也可以没有返回值。(场景:使用原来数据库中的某一个属性值,其他值传递)
    修饰参数:获取指定的数据给参数赋值。
    参数:value用于获取数据的key,key可以是POJO的属性名称,也可以是map结构的key。

  5. SessionAttribute
    用于多次执行控制器方法间的参数共享。
    参数:value指定存入的属性名称,type指定存入的数据类型。

可以是用${…}EL表达式,sessionScope。可以直接使用Model/ModelMap类。

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
@Controller
@RequestMapping("/test")
@SessionAttributes(value = "msg")
public class TestController {
    @RequestMapping("/setSessionAttributes")
    public String testSetSession(ModelMap modelMap) {
        modelMap.addAttribute("msg", "CAN YOU SEE ME?");
        return "success";
    }

    @RequestMapping("/getSessionAttributes")
    public String testGetSession(ModelMap modelMap) {
        String msg = (String) modelMap.get("msg");
        System.out.println(msg);
        return "success";
    }

    @RequestMapping("/delSessionAttributes")
    public String testDelSession(SessionStatus sessionStatus) {
        sessionStatus.setComplete();
        return "success";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值