Spring基础篇:MVC框架整合

news2024/9/20 18:35:46

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/58381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

12月03日(第五天)

case 后面必须是常量或者字面量&#xff0c;swtich&#xff08;表达式),表达式可以是short&#xff0c;int,byte,char或者字符串&#xff0c;每个case要注意break语句&#xff0c; switch case的使用&#xff0c;stream流操作对象是数组或集合&#xff0c;第一步获取源数据&…

mysql基础部分第一次复习(9-18章)

子查询 SELECT last_name,salary FROM employees WHERE salary > ( SELECT salary FROM employees WHERE last_name Abel );SELECT department_id, MIN(salary) FROM employees GROUP BY department_id HAVING MIN(salary) > (SELECT MIN(salary) FROM employees WHERE…

JavaScript -- 09. 内置对象的介绍

文章目录内置对象1 解构赋值1.1 保留默认值1.2 接受剩余的所有参数1.3 对函数执行结果解构1.4 交换两个变量的值1.5 二维数组结构2 对象的解构2.1 声明对象同时解构对象2.2 先声明再解构2.3 解构不存在的属性2.4 设置解构别名2.5 设置解构默认值3 对象的序列化3.1 对象的序列化…

【OpenCV-Python】教程:3-15 分水岭图像分割

OpenCV Python 分水岭图像分割 【目标】 学习使用分水岭方法进行基于标记的图像分割cv2.watershed() 【理论】 任何灰度图像都可以被视为地形表面&#xff0c;其中高强度表示山峰和丘陵&#xff0c;而低强度表示山谷&#xff0c;。你开始用不同颜色的水&#xff08;标签&am…

耗时4个月,阿里架构师打造Java面试突击文档,10位朋友已拿offer

不论是校招还是社招都避免不了各种面试、笔试&#xff0c;如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有章可循的&#xff0c;我这个有章可循”说的意思只是说应对技术面试是可以提前准备。运筹帷幄之后&#xff0c;决胜千里之外&#xff01;不打毫无准备的仗 …

数据结构与算法(六) 贪心算法

这篇文章来讲贪心算法&#xff08;Greedy Algorithm&#xff09;&#xff0c;这是一种特殊的动态规划算法 1、本质 我们在之前的文章中讲过&#xff0c;动态规划可以解决一类具有最优子结构和重叠子问题特征的问题 贪心算法本质上是一种特殊的动态规划算法&#xff0c;因此在…

微前端:qiankun的五种通信方式

背景 今天盘点一下 qiankun 父子应用的通信方式都有哪些&#xff0c;我发现了 5 种。 1、localStorage/sessionStorage 2、通过路由参数共享 3、官方提供的 props 4、官方提供的 actions 5、使用vuex或redux管理状态&#xff0c;通过shared分享 接下来我们一个一个进行说明 …

S/4HANA(本地部署或云版)跟 SAP 家族系统以及非SAP系统的集成,到底什么是推荐的方式?

笔者的知识星球&#xff0c;有朋友提问&#xff1a; S4HANA(本地部署或云版)跟SAP家族系统以及非SAP系统的集成&#xff0c;sap的标准/推荐做法是通过BTP还是直接连接&#xff0c;或者是根据目标系统分别选择&#xff1f;有参考链接最好了。 首先 SAP S/4HANA 的技术栈&#xf…

java数组应用(栈和队列以及酒店模拟)

1.编写程序,使用一维数组,模拟栈数据结构 要求1.栈内可以存放任意数据2.栈内提供push方法模拟压栈3.栈内提供pop方法模拟出栈4.栈的大小默认为10 新建MyStack类 /*** author DeYou* date 2022/11/10 23:01*/ public class MyStack {Object[] element;int index;public MyStack…

blender Eevee渲染器

文章目录简介.采样.环境光遮蔽.辉光.景深.次表面散射.屏幕空间反射.间接光照明.阴影.体积.简介. 1 EV渲染器是实时渲染&#xff0c;类似于游戏引擎,效果差于Cycles 2 EV渲染器使用的设备是显卡 采样. 1 渲染和视图分别指渲染模式和视图模式的采样值&#xff0c;值越大&#…

Android Studio 中MotinLayout的简单使用

​ 一、什么是MotionLayout MotionLayout 是一种布局类型&#xff0c;可帮助您管理应用中的运动和微件动画。MotionLayout 是 ConstraintLayout 的子类&#xff0c;在其丰富的布局功能基础之上构建而成。 二、使用MotionLayout的准备 1.添加MotionLayout依赖项 要在项目中使用…

【菜鸡读论文】Face2Exp: Combating Data Biases for Facial Expression Recognition

【菜鸡读论文】Face2Exp: Combating Data Biases for Facial Expression Recognition 最近上海开始降温了&#xff0c;而且常常下雨&#xff0c;天气开始变得好冷啊&#xff01;以前年轻的时候冬天经常穿的少&#xff0c;现在膝盖开始有点遭不住了&#xff0c;小伙伴们一定要保…

Go字符串拼接6种方式及其性能测试:strings.builder最快

Go字符串拼接常见的方式有加号、fmt.Sprintf、strings.Builder、bytes.Buffer、strings.join、切片。 package concat_stringimport ("bytes""fmt""strconv""strings""testing" )const numbers 100// func BenchmarkStri…

Kafka安装与配置

1、Java环境为前提 &#xff08;1&#xff09;上传jdk-8u261-linux-x64.rpm到服务器并安装&#xff1a; rpm -ivh jdk-8u261-linux-x64.rpm &#xff08;2&#xff09;配置环境变量&#xff1a; vim /etc/profile # 生效 source /etc/profile # 验证 java -version 2、Zook…

贝叶斯定理~~概率分布

还是搬来了基础自己学习用哦 ~~ 从最基础的概率论到各种概率分布全面梳理了基本的概率知识与概念&#xff0c;这些概念可能会帮助我们了解机器学习或开拓视野。这些概念是数据科学的核心&#xff0c;并经常出现在各种各样的话题上。重温基础知识总是有益的&#xff0c;这样我们…

适应性哈夫曼编码(Adaptive Huffman coding)

适应性哈夫曼编码适应性哈夫曼编码简介算法示例适应性哈夫曼编码 简介 适应性哈夫曼编码&#xff08;Adaptive Huffman coding&#xff09;&#xff0c;又称动态哈夫曼编码&#xff08;Dynamic Huffman coding&#xff09;&#xff0c;是基于哈夫曼编码的适自适应编码技术。它…

深度学习Day07

Recurrent Neural Network 智慧客服——Slot Filling 根据上 下文产生不同的output

Java搭建宝塔部署实战毕设项目WMS仓库管理系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套Java开发的毕业设计项目WMS仓库管理系统源码。 技术架构 技术框架&#xff1a;SpringMVC Mybatis Ehcache bootstrap jquery mysql5.7运行环境&#xff1a;jdk8 nginx1.20 tomcat9 In…

基于PSO粒子群算法的MPPT最大功率跟踪Simulink仿真,PSO采用S函数实现

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 MPPT控制器的全称是“最大功率点跟踪”&#xff08;Maximum Power Point Tracking&#xff09;太阳能控制器&#xff0c;是传统太阳能充放电控制器的升级换代产品。MPPT控制器能够实时侦测太阳能…

30岁自学Python转行靠谱吗?

前言 30岁自学Python转行靠谱吗&#xff1f;若啃学习任何时候都不晚&#xff0c;关键是学习完用来做什么。提高工作效率&#xff0c;写些脚本实现自动化办公这些完全没问题。如果学python是为了转开发&#xff0c;建议慎重考虑&#xff0c;程序开发转Python相对容易些&#xf…