Spring基础篇:MVC框架整合

简介: Spring基础篇:MVC框架整合

MVC框架整合

MVC框架整合思想

搭建Web运行环境

在Project structor当中进行创建一个maven项目,使用maven-archetype-webapp这个模式来创建maven项目(使用这种模板创建项目的好处就是好多东西都给你搭建好了。),项目下Src>main>webapps,此目录是web应用所在的位置,在main下创建源码包和资源包,这样的话,源码包、资源包、resource是平级的关系,编译时使用,所以scope是provided

<?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.dashu</groupId>
  <artifactId>sring-mvc</artifactId>
  <version>V1.0.1</version>
  <packaging>war</packaging>
  <name>sring-mvc 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>
    <!--源码的编译版本,编译之后的版本改为1.8-->
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  <dependencies>
    <!--servlet,jsp,jstl相关jar包开始,这些都是web相关的jar包-->
    <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>
    </dependency>
    <!--servlet,jsp,jstl相关jar包结束-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!--引入spring需要的jar包-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.1.4.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</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-tx</artifactId>
      <version>5.1.14.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.1.4.RELEASE</version>
    </dependency>
    <!--这个是Spring和mybatis整合的JAR包-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.2</version>
    </dependency>
    <!--整合log4j日志框架kaishi-->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.25</version>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>sring-mvc</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>
#resources?件夹根?录下
log4j.rootLogger=debug,console
#日志输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.Out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#log4j.appender.console.layout.ConversionPattern=[caoshanshan] %d{yyyy-MM-dd HH:mm:ss,SSS} - %-4r %-5p [%t] %C:%L %x - %m%n
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

为什么整合MVC框架

1、MVC框架提供了控制器也就是Controller,用于调用Service对象,目前我们的JavaEE是分层开发的,有Controller层,有Service层,有Dao层,通过前面的Spring整合Dao层之后,一旦Service开发完成之后,需要有控制器来进行调用,这个控制器是由MVC框架来提供的。
2、MVC框架可以进行请求响应的处理,在web应勇开发过程中,如何处理客户提出的请求,如何为客户提出请求进行响应,这也是MVC框架的工作
3、MVC框架可以处理请求参数,底层也就是request.getParameter(“”);
4、控制器可以根绝用户的需求决定调用哪个Service,这样就可以控制着程序的运行流程,可以控制程序运行流程
5、MVC框架提供了视图解析器,这个响应使用什么类型的进行响应呢?(JSP,JSON,freemarker,Thyemeleaf(Springboot支持的))视图解析器会根据我们的设计返回jsp还是其他的东西,这也是MVC框架提供的功能。

Spring可以整合哪些MVC框架

1、struts1
2、webwork
3、jsf
4、struts2
5、springMVC
以上都可以Spring与之进行整合,SpringMVC最为重要Mvc框架,这是当前应用最为广泛的MVC框架

Spring整合MVC框架核心思路

1、准备工厂
Spring工厂是Spring框架最为核心的内容,有了工厂才能有Spring其他的属性。在我们之前的学习中,我们把工厂对象的创建永远是写在单元测试中单元测试的第一行的代码永远是创建工厂对象,作为我们来讲,我们整合MVC框架,整合MVC框架也就是要进行web开发,在web开发中我们怎么创建工厂对象呢?这是我们需要解决的第一个问题,我们创建工厂的思路是没有改变的,都是这一行代码,通过new的方式创建工厂对象,只不过整合了MVC框架之后,我们使用的工厂对象变成了另外的一个,工厂创建好了之后,我们需要解决的第二个问题是,我们如何保证工厂唯一且同时可以被公用,工厂是重量级资源,只能创建一次,需要保证他的唯一性。我们如何来解决这个问题呢?web开发过程中,我们讲过web开发过程当中的几个作用域(request,session,ServletContext(application)),这几个作用域是专门用来存储对象的,工厂创建好之后存储到了ServletContext作用域当中,也就是把工厂对象存放在ServletContext这个对象当中,就可以被大家公用了。把工厂存储在ServletContext这个作用域当中,底层实际上就是一个ServletContext.setAttribute(“xxxx”,ctx);,这样就解决了功用的问题。比共用更加重要的问题就是这个工厂怎么保证他的唯一性?也就是说我们怎么保证Spring工厂创建的代码
只被调用一次呢?刚才我们提到了ServletContext这个对象,这个对象是全局唯一的,只要我们保证工厂对象伴随着ServletContext对象的创建就可以了,创建ServletContext对象的同时创建工厂对象,这样就可以保证工厂对象也只被创建一次,因为ServletContext对象只被创建一次,所以工厂对象也就只被创建一次。ServletContext对象何时创建呢?我们通ServletContextListener对象就可以知道,这个是ServletContext对象的监听器,通过这个监听器就知道ServletContext对象是何时创建的,只要被这个监听器监听到,我们就可以执行一些功能,而且这个功能只执行一次。所以,创建工厂对象的代码是写ServletContextListener这个监听器对象当中的。因为ServletContext对象只创建一次,所以ServletContextListener对象只会被调用一次,在被调用的同时执行工厂对象的创建,这样就完美解决了工厂对象创建唯一的问题。
思路总结:
在开发创建工厂的过程当中,我们既要创建工厂,又要保证工厂对象的唯一性和供用性,我们只需要把创建工厂的代码写在监听器里边就可以保证工厂对象的唯一性,然后把这个工厂对象存储到作用域当中就解决了工厂对象公用的问题。这就是Spring工行对象以上就是Web环境下工厂对象的创建需要解决的问题,当然我们能想到Spring肯定也可以,spring已经把这些代码帮我们封装好了,Spring封装了一个ContextLoaderListener这样的一个类,封装的就是上边
工厂创建和保存的代码,所以无需我们写什么。我们将来只需要使用这各类就可以了,两个作用:创建工厂+保存工厂。因为只有是这个接口的实现类才可以监听作用域对象的创建。

//这个类实现了ServletContextListener这个类,
public class ContextLoaderListener extends ContextLoader implements ServletContextListener {
    public ContextLoaderListener() {
    }
    public ContextLoaderListener(WebApplicationContext context) {
        super(context);
    }
    public void contextInitialized(ServletContextEvent event) {
        this.initWebApplicationContext(event.getServletContext());
    }
    public void contextDestroyed(ServletContextEvent event) {
        this.closeWebApplicationContext(event.getServletContext());
        ContextCleanupListener.cleanupAttributes(event.getServletContext());
    }
}
if (this.context == null) {
              this.context = this.createWebApplicationContext(servletContext);
 }
          servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);

ContextLoadListener使用方式,只需要在web.xml当中进行配置即可,一个是配置的监听器的创建,另一个配置的是监听器中Spring创建工厂对象的时候指定配置文件的位置。

2、代码整合
假设我们现在有一个控制器,证控制器可以是SpringMVC的Controller,也可以是Struts2的action,控制器的三个作用:1、接收客户端的请求参数,2、调用Service对象,3、返回结果流程跳转。在这里我们可以知道Controller是依赖Service的,所以我们就可以将Service作为依赖,最终通过Spring进行依赖注入,在配置文件中进行赋值。
整合的核心:依赖注入

Spring开发过程中多配置文件的处理

Spring的核心配置文件将来会越来越多,配置文件越来越长,这样不利于我们的维护,Spring为我们提供了多配置文件的开发方式就是在Spring当中提供多个核心配置文件的机制这样可以进行分门别类的区分,有利于我们的维护,Spring核心配置文件可以随意取,取多个不同的名字就好了比如:
applicationContext-dao.xml
applicationContext-service.xml
applicationContext-action.xml
分割成多个配置文件之后如何进行整合呢?
一共有两种方式
第一种方式是通配符的方式
1、非web环境下
ApplicationContext ctx = new ClassPathXmlApplicatonContext(“/applicationContext-*.xml”)
2、web环境下

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext-*.xml</param-value>
</context-param>

第二种是通过import标签
这种方式需要提供一个主配置文件,比如说:applicatonContext.xml在这个配置文件当中写

<import resource="applicatonContext-dao.xml"/>
<import resource="applicatonContext-service.xml"/>
<import resource="applicatonContext-action.xml"/>

将来在操作的时候web和非web操作这一个配置文件就可以了。

相关文章
|
22天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
148 1
|
1月前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
36 0
|
26天前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
43 1
Spring 框架:Java 开发者的春天
|
19天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
36 2
|
18天前
|
消息中间件 NoSQL Java
springboot整合常用中间件框架案例
该项目是Spring Boot集成整合案例,涵盖多种中间件的使用示例,每个案例项目使用最小依赖,便于直接应用到自己的项目中。包括MyBatis、Redis、MongoDB、MQ、ES等的整合示例。
73 1
|
26天前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
1月前
|
人工智能 Java API
阿里云开源 AI 应用开发框架:Spring AI Alibaba
近期,阿里云重磅发布了首款面向 Java 开发者的开源 AI 应用开发框架:Spring AI Alibaba(项目 Github 仓库地址:alibaba/spring-ai-alibaba),Spring AI Alibaba 项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。本文将详细介绍 Spring AI Alibaba 的核心特性,并通过「智能机票助手」的示例直观的展示 Spring AI Alibaba 开发 AI 应用的便利性。示例源
|
1月前
|
人工智能 开发框架 Java
总计 30 万奖金,Spring AI Alibaba 应用框架挑战赛开赛
Spring AI Alibaba 应用框架挑战赛邀请广大开发者参与开源项目的共建,助力项目快速发展,掌握 AI 应用开发模式。大赛分为《支持 Spring AI Alibaba 应用可视化调试与追踪本地工具》和《基于 Flow 的 AI 编排机制设计与实现》两个赛道,总计 30 万奖金。