SpringMVC (Thymeleaf版)

SpringMVC (Thymeleaf版)

文章目录

第一章、SpringMVC的引言

1.1 什么是SpringMVC

1. 概念: SpringMVC是基于Spring Framework衍生而来的一个MVC框架。主要解决了原有MVC框架开发过程中,控制器(Controller)的问题。
  • SpringMVC是一个MVC框架
1. MVC是一个架构思想,在JavaEE开发中多用于Web开发。
2. 应用MVC架构思想开发应用,会把一个项目划分为了3个层次,M(Model) 模型层,V(View) 视图层,C(Controller) 控制层。
		View       JSP
		Model      Service+DAO
		Controller Servlet
3. MVC这种分层开发,体现了面向对象各司其职的设计思想,也更加有利于后续的项目维护(修改)。
  • 为什么要基于Spring Framework

    • 通过工厂(容器)创建对象,解耦合 (IOC DI)。
    • 通过AOP的方式,为目标类(原始类),增加额外功能。
    • 方便与第三方框架的集成
      • MyBatis
      • JPA
      • MQ
  • 原有MVC开发中控制器存在的问题

1. 原有MVC开发中的控制器是通过哪些技术实现的?
2. 这些技术在实现控制器时,存在着哪些问题?
  • 原有控制器的实现技术

    • Servlet [基于Java Model2模式]
    • Struts2中的Action
  • Servlet实现控制器存在的问题

  • 控制器的核心作用
    image-20211217161214389

1. 接受用户的请求,调用业务功能(Service),并根据处理结果控制程序的运行流程。
  • 控制器的核心代码

image-20211217161252534

1. 接受client请求参数
2. 调用业务对象(Service)
3. 流程跳转(页面跳转)
  • 控制器存在的问题

    • 接受client请求参数

    image-20211217161326091

    1. 代码冗余
    2. 只能接受字符串类型的数据,需要手工进行类型转换
    3. 无法自动封装对象
    
UserService userService = new UserServiceImpl(); //耦合代码
boolean isLogin = userService.login(name,password);
1. 通过new的方式获得业务对象(service),存在耦合
  • 流程跳转(页面跳转)
    image-20211217161446257
1. 跳转路径耦合
2. 与视图层技术的耦合

1.2 SpringMVC课程的学习要点

1.2.1 SpringMVC的三种开发模式

● 传统视图开发

1. 通过作用域(request,session)进行数据的传递。
2. 通过视图层技术进行数据的展示(JSP,FreeMarker,Thymeleaf)。

● 前后端分离开发

1. 多种新的请求发送方式
2. Restful的访问
3. 通过HttpMessageConverter进行数据响应

● Spring5 WebFlux开发

1. 替换传统JavaWeb开发的一种新的Web开发方式。
2. 通过NettyServer,进行Web通信。
1.2.2 控制器开发
1. 接受client请求参数
2. 调用业务对象
3. 流程跳转

第二章、第一个SpringMVC程序的开发

2.1 开发版本

1. JDK1.8+
2. Maven3.6+
3. IDEA2021+
4. SpringFramework 5.1.4 
5. Tomcat8.5.29
6. MySQL5.7.18

2.2 环境搭建

2.2.1 引入相关相关jar
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.1.14.RELEASE</version>
</dependency>

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.1.0</version>
  <scope>provided</scope>
</dependency>

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>

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

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>5.1.14.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>5.1.14.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-beans</artifactId>
  <version>5.1.14.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-test</artifactId>
  <version>5.1.14.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
  <version>5.1.14.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>5.1.14.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>2.0.2</version>
</dependency>

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.1.18</version>
</dependency>

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.48</version>
</dependency>

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.4.6</version>
</dependency>

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.13</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.1.4.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <version>5.1.14.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjrt</artifactId>
  <version>1.8.8</version>
</dependency>

<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.8.3</version>
</dependency>

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.25</version>
</dependency>

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>jcl-over-slf4j</artifactId>
  <version>1.7.25</version>
</dependency>

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.2.3</version>
</dependency>

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-core</artifactId>
  <version>1.2.3</version>
</dependency>

<dependency>
  <groupId>org.logback-extensions</groupId>
  <artifactId>logback-ext-spring</artifactId>
  <version>0.1.4</version>
</dependency>

<dependency>
  <groupId>org.yaml</groupId>
  <artifactId>snakeyaml</artifactId>
  <version>1.25</version>
</dependency>

注意 SpringMVC比前面我们所学习的Spring,就多引入了一个jar包,叫做spring-webmvc.jar

2.2.2 配置文件

SpringMVC的配置文件,就是Spring的配置文件

1. 名字可以随便命名,本次课程取名dispatcher.xml。
2. 放置路径可以根据需要,随意放置,本次课程放置在资源目录的根下。

image

2.2.3 初始化配置
  • web.xml
<servlet>
  <servlet-name>dispatcher</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <!--用于配置SpringMVC的配置文件-->
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:dispatcher.xml</param-value>
  </init-param>
  <!--设置servlet在Tomcat启动时自动加载创建-->
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>dispatcher</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

DispatcherServlet

1. DispatcherServlet称为前端控制器(中央控制器)
2. DispatcherServlet的核心作用:
    1. 用于创建Spring的工厂(容器)。
       ApplicationContext ctx = new ClassPathXmlApplicationContext("dispatcher.xml");
       因为DispatcherServlet封装的Spring工厂(容器)只能读取xml,所以无法迁移到纯注解
    2. 控制SpringMVC内部的运行流程。

SpringMVC的配置文件dispacher.xml

<mvc:annotation-driven/>

<context:component-scan base-package="com.baizhiedu"/>

mvc:annotation-driven

# <mvc:annotation-driven/> 这段配置的主要作用:引入SpringMVC的核心功能。 
# 主要引入了2个核心类型
# 1.RequestMappingHandlerMapping
# 2.RequestMappingHandlerAdapter

1. RequestMappingHandlerMapping实现了HandlerMapping接口【了解】
    它会处理@RequestMapping注解,并将其注册到请求映射表中。
2. RequestMappingHandlerAdapter实现了 HandlerAdapter接口【了解】
    它是处理请求的适配器,确定调用某个符合要求的控制器类中具体服务的方法。

SpringMVC对mvc:annotation-driven的封装

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-31I0JGz2-1665022310089)(https://cdn.ycode-nav.top/img/image (8)].png)

context:component-scan

1. 进行注解扫描
2. DispatcherServlet所创建的工厂需要读取XML的配置文件,不能使用纯注解的开发。所以目前使用Spring配置文件+基础注解的形式,进行开发。
		基础注解:@Component,@Service,@Repository,@Controller,@Scope,@Transactional等
		高级注解:@Configuration,@Bean,@ComponentScan等
		后续SpringMVC高级版的课程,会使用纯注解版开发,与SpringBoot的使用方式高度一致。

2.3 编码开发

2.3.1 思路分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BVyCsHPx-1665022310089)(https://cdn.ycode-nav.top/img/image (6)].png)

#  基本流程
1. 开发一个类在上面加入@Controller注解
2. 提供一个控制器方法:参数是HttpServletRequest,HttpServletResponse,返回值是String的,同时加入@RequestMapping注解定义请求路径
3. 在控制方法中,完成核心开发功能,把对应JSP页面的路径,作为方法的返回值返回。
2.3.2 编码
@Controller
public class FirstController {
   

  @RequestMapping("/first")
  public String first(HttpServletRequest request, HttpServletResponse response) {
   

    System.out.println("FirstController.first");

    return "/result.jsp";
  }
}

必须要进行@Controller注解的扫描,<context:component-scan base-package="com.baizhiedu"/>
2.3.3 一个控制器中,提供多个服务方法
  • Servlet作为控制器,一个类中只能提供一个服务方法
1. Servlet开发中,明确控制器的方法必须实现接口规定的service(HttpServletRequest,HttpServletResponse)方法,一个类中是能实现一次,所以一个类中只能有一个服务方法。
http://localhost:8989/basic/loginServlet

public class LoginServlet extends HttpServlet {
   
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) 
                                                       throws ServletException
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值