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操作这一个配置文件就可以了。

相关文章
|
2天前
|
前端开发 Java 数据库连接
Spring框架初识
Spring 是一个分层的轻量级开源框架,核心功能包括控制反转(IOC)和面向切面编程(AOP)。主要模块有核心容器、Spring 上下文、AOP、DAO、ORM、Web 模块和 MVC 框架。它通过 IOC 将配置与代码分离,简化开发;AOP 提供了声明性事务管理等增强功能。
49 21
Spring框架初识
|
2月前
|
XML 安全 Java
|
3月前
|
缓存 NoSQL Java
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
138 0
|
20天前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
113 29
|
9天前
|
XML Java 开发者
通过springboot框架创建对象(一)
在Spring Boot中,对象创建依赖于Spring框架的核心特性——控制反转(IoC)和依赖注入(DI)。IoC将对象的创建和管理交由Spring应用上下文负责,开发者只需定义依赖关系。DI通过构造函数、setter方法或字段注入实现依赖对象的传递。Spring Boot的自动配置机制基于类路径和配置文件,自动为应用程序配置Spring容器,简化开发过程。Bean的生命周期包括定义扫描、实例化、依赖注入、初始化和销毁回调,均由Spring容器管理。这些特性提高了开发效率并简化了代码维护。
|
1月前
|
开发框架 运维 监控
Spring Boot中的日志框架选择
在Spring Boot开发中,日志管理至关重要。常见的日志框架有Logback、Log4j2、Java Util Logging和Slf4j。选择合适的日志框架需考虑性能、灵活性、社区支持及集成配置。本文以Logback为例,演示了如何记录不同级别的日志消息,并强调合理配置日志框架对提升系统可靠性和开发效率的重要性。
|
2月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
3月前
|
存储 Java 关系型数据库
在Spring Boot中整合Seata框架实现分布式事务
可以在 Spring Boot 中成功整合 Seata 框架,实现分布式事务的管理和处理。在实际应用中,还需要根据具体的业务需求和技术架构进行进一步的优化和调整。同时,要注意处理各种可能出现的问题,以保障分布式事务的顺利执行。
217 53
|
2月前
|
Java 开发者 Spring
理解和解决Spring框架中的事务自调用问题
事务自调用问题是由于 Spring AOP 代理机制引起的,当方法在同一个类内部自调用时,事务注解将失效。通过使用代理对象调用、将事务逻辑分离到不同类中或使用 AspectJ 模式,可以有效解决这一问题。理解和解决这一问题,对于保证 Spring 应用中的事务管理正确性至关重要。掌握这些技巧,可以提高开发效率和代码的健壮性。
129 13
|
2月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统