SpringMVC整理

一、项目构建

创建webapp项目,配置TomCat

启动Tomcat。

二、三层架构和MVC

1. 三层架构

01、开发服务器端程序,一般都基于两种形式,一种C/S架构程序,一种B/S架构程序

02、使用Java语言基本上都是开发B/S架构的程序,B/S架构又分成了三层架构

03、三层架构

表现层:WEB层,用来和客户端进行数据交互的。表现层一般会采用MVC的设计模型

业务层:处理公司具体的业务逻辑的

持久层:用来操作数据库的

2.MVC模型

1、MVC全名是Model View Controller 模型视图控制器,每个部分各司其职。

2、Model:数据模型,JavaBean的类,用来进行数据封装

3、View:指JSP、HTML用来展示数据给用户

4、Controller:用来接收用户的请求,整个流程的控制器。用来进行数据校验等

三、SpringMVC的入门案例

1、SpringMVC的概述

  1. SpringMVC的概述

    1. 是一种基于Java实现的MVC设计模型的请求驱动类型的轻量级WEB框架。
    2. Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。
    3. 使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts2等。
  2. SpringMVC在三层架构中的位置

    1. 表现层框架
  3. SpringMVC和Struts2框架的对比

2、SpringMVC的入门程序

创建WEB工程,引入开发的jar包

具体的坐标如下

XML 复制代码
<!-- 版本锁定 -->
  <properties>
    <spring.version>5.0.2.RELEASE</spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </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>2.5</version>
      <scope>provided</scope>
    </dependency>

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

编写index.jsp页面

html 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>入门程序</title>
</head>

<body>
​
<h3>入门</h3>
​
<a href="/hello" >入门程序</a>
​
</body>
</html>

编写suc.jsp页面,路径为:/WEB-INF/pages/suc.jsp

html 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>成功</title>
</head>
<body>

<h3>入门成功了...</h3>

</body>
</html>

编写Controller类和方法

java 复制代码
@Controller
public class HelloController {

    @RequestMapping("/hello")
    public String sayHello(){
        System.out.println("入门方法执行成功!!!");
        return "suc";
    }
}

配置核心的控制器(配置DispatcherServlet)

在web.xml配置文件中核心控制器DispatcherServlet

XML 复制代码
<!--配置前端控制器-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--加载springmvc.xml配置文件,配置的是Spring配置-->
    <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>

编写springmvc.xml的配置文件

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

    <!-- 配置spring创建容器时要扫描的包 -->
    <context:component-scan base-package="com.qcby"></context:component-scan>

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

    <!-- 配置spring开启注解mvc的支持
    <mvc:annotation-driven></mvc:annotation-driven>-->
    <mvc:annotation-driven></mvc:annotation-driven>
</beans>

启动Tomcat服务器,进行测试

3、 入门案例的执行过程分析

入门案例的执行流程

  1. 当启动Tomcat服务器的时候,因为配置了load-on-startup标签,所以会创建DispatcherServlet对象,就会加载springmvc.xml配置文件
  2. 开启了注解扫描,那么HelloController对象就会被创建
  3. 从index.jsp发送请求,请求会先到达DispatcherServlet核心控制器,根据配置@RequestMapping注解找到执行的具体方法
  4. 根据执行方法的返回值,再根据配置的视图解析器,去指定的目录下查找指定名称的JSP文件
  5. Tomcat服务器渲染页面,做出响应

**为什么访问/hello和/hello.do都可以成功访问到页面?

Spring MVC 会使用默认的处理器映射器 (如BeanNameUrlHandlerMapping)和处理器适配器。这些默认组件对 URL 的匹配规则比较宽松,会忽略 URL 中的扩展名(如.do.action等),导致/hello/hello.do被认为是 "匹配" 的,从而都能映射到@RequestMapping("/hello")的方法。

开启注解支持无效果?

XML 复制代码
<!--配置spring开启注解mvc的支持-->
<mvc:annotation-driven></mvc:annotation-driven>

4、RequestMapping注解

RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系

RequestMapping注解可以作用在方法和类上

1、作用在类上:第一级的访问目录

2、作用在方法上:第二级的访问目录

3、细节:路径可以不编写 / 表示应用的根目录开始

RequestMapping的属性

1、path 指定请求路径的url

2、value value属性和path属性是一样的

3、mthod 指定该方法的请求方式

4、params 指定限制请求参数的方式

四、请求参数的绑定

请求参数的绑定说明

1、绑定机制

01、表单提交的数据都是k=v格式的 username=haha&password=123

02、SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的

03、要求:提交表单的name和参数的名称是相同的

2、支持的数据类型

01、基本数据类型和字符串类型

02、实体类型(JavaBean)

03、集合数据类型(List、map集合等)

基本数据类型和字符串类型

1、提交表单的name和参数的名称是相同的

2、区分大小写

实体类型(JavaBean)

1、提交表单的name和JavaBean中的属性名称需要一致

2、如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name

给集合属性数据封装

1、JSP页面编写方式:list[0].属性

jsp代码

html 复制代码
<html>
<head>
    <title>请求参数绑定</title>
</head>
<body>
    <h3>请求参数绑定入门</h3>
    <form action="/user/save1" method="post">
        姓名:<input type="text" name="username" /><br>
        年龄:<input type="text" name="age" /><br>
        <input type="submit" value="提交">
    </form>

    <h3>请求参数绑定入门(封装到实体类)</h3>
    <form action="/user/save2" method="post">
        姓名:<input type="text" name="username" /><br>
        年龄:<input type="text" name="age" /><br>
        <input type="submit" value="提交">
    </form>

    <h3>请求参数绑定(封装到实体类)</h3>
    <form action="/user/save3" method="post">
        姓名:<input type="text" name="username" /><br/>
        年龄:<input type="text" name="age" /><br/>
        金额:<input type="text" name="account.money" /><br/>
        <input type="submit" value="提交" />
    </form>

    <h3>请求参数绑定(封装到实体类,存在list集合)</h3>
    <form action="/user/save4" method="post">
        姓名:<input type="text" name="username" /><br/>
        年龄:<input type="text" name="age" /><br/>
        金额:<input type="text" name="account.money" /><br/>

        集合:<input type="text" name="list[0].money" /><br/>
        集合:<input type="text" name="list[1].money" /><br/>
    </form>


</body>
</html>

实体类(JavaBean)代码

User类

java 复制代码
public class User implements Serializable{

    private String username;
    private Integer age;

    private Account account;

    private List<Account> list;

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", account=" + account +
                ", list=" + list +
                '}';
    }

    public List<Account> getList() {
        return list;
    }

    public void setList(List<Account> list) {
        this.list = list;
    }



    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Account getAccount() {
        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    }
}

Account类

java 复制代码
public class Account {

    private Double money;

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "money=" + money +
                '}';
    }
}

controller代码

java 复制代码
@Controller
@RequestMapping("/user")
public class UserController {


    @RequestMapping("save1")
    public String save1(String username,String age){

        System.out.println("姓名:"+username);
        System.out.println("年龄:"+age);
        return "suc";
    }

    @RequestMapping("save2")
    public String save2(User user){
        System.out.println("User对象是:"+user);
        return "suc";
    }

    @RequestMapping("save3")
    public String save3(User user){
        System.out.println("User对象是:"+user);
        return "suc";
    }

    @RequestMapping("save4")
    public String save4(User user){
        System.out.println("User对象是:"+user);
        return "suc";
    }


}

请求参数中文乱码的解决

在web.xml中配置Spring提供的过滤器类

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>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

自定义类型转换器

相关推荐
東雪木2 小时前
Spring Boot 2.x 集成 Knife4j (OpenAPI 3) 完整操作指南
java·spring boot·后端·swagger·knife4j·java异常处理
数学难2 小时前
Java面试题2:Java线程池原理
java·开发语言
Charles_go2 小时前
C#8、有哪些访问修饰符
java·前端·c#
qwer12321ck762 小时前
srcType instanceof Class 及泛型 vs 普通类
java
咸鱼求放生2 小时前
Java 8 Stream API
java·开发语言
moiumxf0278q2 小时前
C++中智能指针是如何工作的?
java·jvm·c++
尼古拉斯·纯情暖男·天真·阿玮3 小时前
泛型与数据结构
java·数据结构
半旧夜夏3 小时前
【Gateway】服务调用和网关配置攻略
java·spring boot·spring cloud·gateway