Java_Maven:2. maven 构建 SSM 工程
迪丽瓦拉
2024-05-25 18:08:22
0

目录

​​​​​​​

1 需求

2 准备数据库

3 创建一个 maven 工程

4 知识点准备

4.1 依赖传递

4.2 依赖冲突的解决

4.2.1 依赖调解原则

4.2.2 排除依赖

4.2.3 锁定版本

5 定义 pom.xml

6 Dao 层

6.1 pojo 模型类

6.2 dao 层代码

6.3 配置文件

6.4 单元测试

7 Service 层

8 Web 层

9 Jsp

10 运行与测试


  • 1 需求

    • 实现 SSM 工程构建,规范依赖管理。场景:根据 id 展示商品信息
  • 2 准备数据库

    • 导入以下语句
  • 3 创建一个 maven 工程

    • 1) 新建一个 ssm_maven 项目,使用下图选中的骨架
    • 2) 填写坐标
    • 3) 查看是否使用的自己的私服
    • 4) 在 main 目录下新建 java 和 resources 文件夹
    • 5) 把 java 和 resources 文件夹转成 source root
      • Source roots (or source folders)
        • 通过这个类指定一个文件夹,告诉IntelliJ IDEA,这个文件夹及其子文件夹中包含的源代码,可以编译为构建过程的一部分。
      • Test source roots (or test source folders; shown as rootTest)
        • 这些根类似于源根,但用于用于测试的代码(例如用于单元测试)。测试源文件夹允许您将与测试相关的代码与生产代码分开。
        • 通常,源和测试源的编译结果被放置在不同的文件夹中。
      • Resource roots     (重要:springmvc使用时,web.xml常用配置的classpath所指的位置就是这个设置后的resources包下的位置)
        • 用于应用程序中的资源文件(图像、各种配置XML和属性文件等)。在构建过程中,资源文件夹的所有内容都复制到输出文件夹中.
        • 类似于源,您可以指定生成资源。您还可以指定输出文件夹中的文件夹,您的资源应该复制到。
      • Test resource roots
        • (或测试资源文件夹;如roottestresourceij;只有在java模块)是资源文件与您的测试源有关。在所有其他方面,这些文件夹类似于资源文件夹。
      • Excluded
        • 将文件标记为Excluded目录后,idea就不会为该文件创建索引,全局搜索也不会搜里面的内容,编辑代码不会智能提示,Excluded Folders相当于代码废弃场
    • 6) 修改编译版本,在 pom.xml 文件中添加
      • org.apache.maven.pluginsmaven-compiler-plugin3.11.81.8UTF-8
        
  • 4 知识点准备

    • 4.1 依赖传递

      • 先添加 springmvc 的核心依赖的坐标
      • org.springframeworkspring-webmvc4.2.4.RELEASE
        
      • 会发现出现除了 spring-webmvc 以外的其他 jar。因为我们的项目依赖 spring-webmv.jar,而spring-webmv.jar 会依赖 spring-beans.jar 等等,所以 spring-beans.jar 这些 jar 包也出现在 maven 工程中,这种现象称为依赖传递。从下图中可看到他们的关系:(请注意spring-beans 的版本)
    • 4.2 依赖冲突的解决

      • 接着添加一个依赖
      • 我们会发现这两个 jar 包同时都依赖了 spring-beans
      • 但是:
        • spring-webmvc 依赖 spirng-beans-4.2.4,
        • spring-context 依赖 spring-beans-5.0.2,
        • 发现spirng-beans-4.2.4 加入到工程中,而我们希望 spring-beans-5.0.2 加入工程。这就造成了依赖冲突。解决依赖冲突有以下原则:
        • ​​​​​​​
      • 4.2.1 依赖调解原则

        • maven 自动按照下边的原则调解:
        • 1)第一声明者优先原则
          • 在 pom 文件定义依赖,先声明的依赖为准。
          • 测试:
            • 如果将上边 spring-webmvc 和 spring-context 顺序颠倒,系统将导入 spring-beans-5.0.2。
          • 分析:
            • 由于 spring-webmvc 在前边以 spring-webmvc 依赖的 spring-beans-5.0.2 为准,所以最终
            • ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​spring-beans-5.0.2 添加到了工程中。
        • 2)路径近者优先原则
          • 例如:还是上述情况,spring-contex 和 spring-webmvc 都会传递过来 spirng-beans,那如果直接把 spring-beans 的依赖直接写到 pom 文件中,那么项目就不会再使用其他依赖传递来的 spring-beans,因为自己直接在 pom 中定义 spring-beans 要比其他依赖传递过来的路径要近。
          • 在本工程中的 pom 中加入 spirng-beans-5.0.2 的依赖,根据路径近者优先原则,系统将导入spirng-beans-5.0.2:
          • ​​​​​​​
      • 4.2.2 排除依赖

        • 上边的问题也可以通过排除依赖方法辅助依赖调解,如下:
        • 比如在依赖 spring-webmvc 的设置中添加排除依赖,排除 spring-beans,
        • 下边的配置表示:依赖 spring-webmvc,但排除 spring-webmvc 所依赖的 spring-beans。
      • 4.2.3 锁定版本

        • 面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中,此方法在企业开发中常用。
        • 如下的配置是锁定了 spring-beans 和 spring-context 的版本:
          • ​​​​​​​​​​​​​​
        • 还可以把版本号提取出来,使用标签设置成变量。
          • ​​​​​​​​​​​​​​
        • 注意:在工程中锁定依赖的版本并不代表在工程中添加了依赖,如果工程需要添加锁定版本的依赖则需要单独添加标签,如下:
          • ​​​​​​​​​​​​​​
        • 上边添加的依赖并没有指定版本,原因是已在中锁定了版本,所以在下不需要再指定版本。
  • 5 定义 pom.xml

    • maven 工程首先要识别依赖,web 工程实现 SSM 整合,需要依赖 spring-webmvc5.0.2、spring5.0.2、mybatis3.4.5 等,在 pom.xml 添加工程如下依赖:
    • 分两步:
      • 1)锁定依赖版本
      • 2)添加依赖
      • 4.0.0cn.itcast.ssm_mavenssm_maven1.0-SNAPSHOTwar5.0.2.RELEASE5.0.2.RELEASE3.4.5org.mybatismybatis${mybatis.version}org.springframeworkspring-webmvc${springmvc.version}org.springframeworkspring-context${spring.version}org.springframeworkspring-core${spring.version}org.springframeworkspring-aop${spring.version}org.springframeworkspring-web${spring.version}org.springframeworkspring-expression${spring.version}org.springframeworkspring-beans${spring.version}org.springframeworkspring-aspects${spring.version}org.springframeworkspring-context-support${spring.version}org.springframeworkspring-test${spring.version}org.springframeworkspring-jdbc${spring.version}org.springframeworkspring-tx${spring.version}org.mybatismybatisorg.mybatismybatis-spring1.3.1mysqlmysql-connector-java5.1.32com.alibabadruid1.0.9org.springframeworkspring-webmvcorg.springframeworkspring-contextorg.springframeworkspring-coreorg.springframeworkspring-aoporg.springframeworkspring-weborg.springframeworkspring-expressionorg.springframeworkspring-beansorg.springframeworkspring-aspectsorg.springframeworkspring-context-supportorg.springframeworkspring-testorg.springframeworkspring-jdbcorg.springframeworkspring-txjunitjunit4.12javax.servletservlet-api2.5providedjavax.servletjsp-api2.0providedjavax.servletjstl1.2org.apache.maven.pluginsmaven-compiler-plugin3.11.81.8UTF-8org.apache.tomcat.maventomcat7-maven-plugin2.2/8080
        
  • 6 Dao 层

    • 在 src/main/java 中定义 dao 接口,实现根据 id 查询商品信息:
    • 6.1 pojo 模型类

      • 在 src/main/java 创建模型类
      • ​​​​​​​​​​​​​​
      • public class Items {private Integer id;private String name;private Float price;private String pic;private Date createtime;private String detail;………
        }

        ​​​​​​​​​​​​

    • 6.2 dao 层代码

      • ​​​​​​​​​​​​​​
    • 6.3 配置文件

      • 注意配置文件的位置
        • ​​​​​​​​​​​​​​
      • 内容如下
        • 
          
          
          
      • 在 src/main/resources 创建applicationContext.xml
        • ​​​​​​​
          
          
          

      • ​​​​​​​​​​​​​​​​​​​​​在 src/main/resources 配置 log4j.properties
        • ### direct log messages to stdout ###
          log4j.appender.stdout=org.apache.log4j.ConsoleAppender
          log4j.appender.stdout.Target=System.out
          log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
          log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5
          p %c{1}:%L - %m%n
          ### set log levels - for more verbose logging change 'info' to 
          'debug' ###
          #在开发阶段日志级别使用 debug
          log4j.rootLogger=debug, stdout
          ### 在日志中输出 sql 的输入参数 ###
          log4j.logger.org.hibernate.type=TRACE
    • 6.4 单元测试

      • 在 src/test/java 创建单元测试类
        • ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​
          public class ItemsMapperTest {@Testpublic void testFindItemsById() {//获取 spring 容器ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");//获取 MapperItemsMapper itemsMapper = applicationContext.getBean(ItemsMapper.class);//调用 Mapper 方法Items items = itemsMapper.findById(1);System.out.println(items);}
          }
  • 7 Service 层

    • 7.1 代码
      • ​​​​​​​
        @Service
        @Transactional
        public class ItemsServiceImpl implements ItemsService {@Autowiredprivate ItemsMapper itemsMapper;@Overridepublic Items findById(int itemId) {return itemsMapper.findById(itemId);}
        }
  • 7.2 配置文件
    • 在 applicationContext.xml 中配置 service
  • 8 Web 层

    • 8.1 代码
      • @Controller
        @RequestMapping("/items/")
        public class ItemsController {@Autowiredprivate ItemsService itemsService ;
        // 展示商品信息页面@RequestMapping("/showItem") public String showItem(int id,Model model){Items items = itemsService.findById(id);model.addAttribute("item", items);return "viewItem";}
        }
        ​​​​​​​​​​​​​​
  • 8.2 配置文件
    • 在 springmvc.xml
      • ​​​​​​​
        
        
        

      • ​​​​​​​​​​​​​​Web.xml
        • 加载 spring 容器,配置 springmvc 前端控制器
          • ​​​​​​​​​​​​​​
            
            springmvcorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:springmvc.xmlspringmvc*.actionorg.springframework.web.context.ContextLoaderListenercontextConfigLocationclasspath*:applicationContext*.xml
            

  • 9 Jsp

    • /WEB-INF/jsp/viewItem.jsp 如下:
      • ​​​​​​​
        <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
        <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
        
        
        商品信息
        
        
        
        商品名称 ${item.name }
        商品价格 ${item.price }
        生成日期
        商品简介${item.detail}

  • 10 运行与测试

    • 添加tomcat7插件,双击右侧tomcat7运行
      • ​​​​​​​
    • 运行结果如下

相关内容