maven工程拆分與聚合

文章目錄

一、開發環境準備(SSM整合)

本文的開發環境的準備可以作爲一個SSM框架整合的模板

1.創建數據表

DROP TABLE IF EXISTS `items`;
CREATE TABLE `items` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(20) default NULL,
  `price` float(10,0) default NULL,
  `pic` varchar(40) default NULL,
  `createtime` datetime default NULL,
  `detail` varchar(200) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of items
-- ----------------------------
INSERT INTO `items` VALUES ('1', '蓋倫', '1000', null, '2018-03-13 09:29:30', '帶我走上人生巔峯');
INSERT INTO `items` VALUES ('2', '趙雲310', null, null, '2018-03-28 10:05:52', '插入測試');
INSERT INTO `items` VALUES ('3', '寒冰307', '199', null, '2018-03-07 10:08:04', '插入測試');
INSERT INTO `items` VALUES ('7', '插入測試', null, null, null, null);
INSERT INTO `items` VALUES ('8', '插入測試', null, null, null, null);

2.創建maven_web骨架項目

在這裏插入圖片描述

3.導入jar包

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

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

3.1觀察項目和jar包之間的依賴關係

在這裏插入圖片描述

3.2 jar包座標間的順序對jar包版本的影響

在這裏插入圖片描述

3.3 jar包衝突的第一種解決方式

  • 上述的描述折射出了一個maven工程中的一個重要的問題
  • maven工程要導入jar包的座標,就必須要考慮解決jar包衝突。
  • 解決jar包衝突的方式一:
    • 第一聲明優先原則:哪個jar包的座標在靠上的位置,這個jar包就是先聲明的。
    • 先聲明的jar包座標下的依賴包,可以優先進入項目中。

3.4 maven導入jar包的一些概念

  • 直接依賴:項目中直接導入的jar包,就是該項目的直接依賴包。
  • 傳遞依賴:項目中沒有直接導入的jar包,可以通過項目直接依賴jar包傳遞到項目中去。
  • 直接依賴比傳遞依賴路徑近,最終項目進入的jar包會是路徑近的直接依賴包

3.5 jar包衝突的第二種解決方式

  • 路徑近者優先原則。直接依賴路徑比傳遞依賴路徑近,那麼最終項目進入的jar包會是路徑近的直接依賴包。
    在這裏插入圖片描述

3.6 jar包衝突的第三種解決方式

  • 直接排除法。
  • 當我們要排除某個jar包下依賴包,在配置exclusions標籤的時候,內部可以不寫版本號。
  • 因爲此時依賴包使用的版本和默認和本jar包一樣。
    在這裏插入圖片描述

3.7 jar包版本統一管理(推薦)

  • 統一管理jar包版本後,如果jar包版本有什麼變動的地方,只需要在一個地方修改,其他地方都會生效
    在這裏插入圖片描述

  • 版本鎖定後的依賴關係
    在這裏插入圖片描述

3.8 鎖定jar包版本

在這裏插入圖片描述

3.9 導入完整的jar包

	<!-- 統一管理jar包版本 -->
	<properties>
		<spring.version>5.0.2.RELEASE</spring.version>
		<slf4j.version>1.6.6</slf4j.version>
		<log4j.version>1.2.12</log4j.version>
		<shiro.version>1.2.3</shiro.version>
		<mysql.version>5.1.6</mysql.version>
		<mybatis.version>3.4.5</mybatis.version>
		<spring.security.version>5.0.1.RELEASE</spring.security.version>
	</properties>

	<!-- 鎖定jar包版本 -->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-context</artifactId>
				<version>${spring.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-web</artifactId>
				<version>${spring.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-webmvc</artifactId>
				<version>${spring.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-tx</artifactId>
				<version>${spring.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-test</artifactId>
				<version>${spring.version}</version>
			</dependency>
			<dependency>
				<groupId>org.mybatis</groupId>
				<artifactId>mybatis</artifactId>
				<version>${mybatis.version}</version>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<!-- 項目依賴jar包 -->
	<dependencies>
		<!-- spring -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.6.8</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.version}</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.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
		<!-- log start -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>${log4j.version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${slf4j.version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${slf4j.version}</version>
		</dependency>
		<!-- log end -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>${mybatis.version}</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.3.0</version>
		</dependency>
		<dependency>
			<groupId>c3p0</groupId>
			<artifactId>c3p0</artifactId>
			<version>0.9.1.2</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper</artifactId>
			<version>5.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-web</artifactId>
			<version>${spring.security.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-config</artifactId>
			<version>${spring.security.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-core</artifactId>
			<version>${spring.security.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-taglibs</artifactId>
			<version>${spring.security.version}</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.0.9</version>
		</dependency>
	</dependencies>
	<!-- 添加tomcat7插件 -->
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.2</version>
			</plugin>
		</plugins>
	</build>

4 dao層編寫和配置

4.1編寫對應數據表的實體類

注意屬性名和數據類型和數據表的字段名和數據類型一一對應,生成對應的getter和setter方法即可

public class Items {

    private Integer id;
    private String name;
    private Double price;
    private String pic;
    private Date createtime;
    private String detail;
 }

4.2 編寫接口ItemsDao

public interface ItemsDao {
    //根據id查詢一條記錄
    @Select("select * from items where id = ${id}")
    Items findById(@Param("id") Integer id);
}

4.3 在spring的核心配置文件applicationContext.xml中編寫dao層的配置

下面的3個配置是mybatis框架中,dao層必須的配置,以後在自己搭建SSM項目的環境的時候,也可以參照這樣的配置方式

<!--dao層配置開始-->
    <!--1.優先配置連接池(這裏連接池的選擇可以靈活,c3p0都可以)
        配置連接數據庫的四大基本信息
    -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/maven"/>
        <property name="username" value="root"/>
        <property name="password" value="admin"/>
    </bean>

        <!--2.配置SqlSession對象的工廠-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!--掃描pojo包-->
        <!-- 用於指定要配置別名的包,當指定之後,該包下的實體類都會註冊別名,並且類名就是別名,不再區分大小寫-->
        <property name="typeAliasesPackage" value="com.xpt.domain"/>
    </bean>
        <!--掃描接口包所在的路徑,生成所有的代理對象,並且放入IOC容器
            本質上就是在添加對註解的支持
        -->
    <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.xpt.dao"/>
    </bean>
    <!--dao層配置結束-->

4.4 dao層測試

針對dao層的配置進行測試,看是否配置成功

  • 代碼
public class ItemsTest {
    
    @Test
    public void findById(){
        //獲取IOC容器
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.獲取dao代理對象
        ItemsDao itemsDao = ac.getBean(ItemsDao.class);
        //3.執行方法
        Items item = itemsDao.findById(1);
        System.out.println(item);
    }
}
  • 效果
    在這裏插入圖片描述
  • 說明dao層的配置成功

5.service層編寫和配置

5.1提供接口和實現類

  • 接口
public interface ItemsService {
    //根據id查詢一條記錄
    public Items findById(Integer id);
}
  • 實現類
//自己寫的類儘量用註解 框架寫的類儘量用配置文件
@Service("itemsService")
public class ItemsServiceImpl implements ItemsService {
    @Autowired
    private ItemsDao itemsDao;
    public Items findById(Integer id) {
        System.out.println("正在執行業務層方法.........");
        return itemsDao.findById(id);
    }
    
}

5.2在spring的核心配置文件applicationContext.xml中編寫service層的配置

5.2.1開啓註解掃描

注意只掃描到service層

 <!--
        1.組件掃描配置
        2.精確到service是爲了避免對controller註解的掃描
        -->

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

5.2.2配置AOP和事務

業務層一般都需要事務的支持,下面的配置方法也近乎於模板配置

 <!-- spring中基於XML的聲明式事務控制配置步驟
         1、配置事務管理器
         2、配置事務的通知
                 此時我們需要導入事務的約束 tx名稱空間和約束,同時也需要aop的
                 使用tx:advice標籤配置事務通知
                     屬性:
                         id:給事務通知起一個唯一標識
                         transaction-manager:給事務通知提供一個事務管理器引用
         3、配置AOP中的通用切入點表達式
         4、建立事務通知和切入點表達式的對應關係
         5、配置事務的屬性
                是在事務的通知tx:advice標籤的內部
      -->
       <!--2.aop面向切面編程,配置事務-->
        <!--2.1首先需要配置事務管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

        <!--2.2配置事務的通知-->
    <tx:advice id="advice">
        <tx:attributes>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <!--查詢方法的事務控制-->
            <tx:method name="find*" read-only="true"/>

            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

        <!--2.3配置切面-->
    <aop:config>
        <!--爲service下的所有方法添加事務的支持-->
        <aop:pointcut id="pointcut" expression="execution(* com.xpt.service.impl.*.*(..))"/>
        <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
    </aop:config>

5.2.3配置允許基於類上註解的動態代理(推薦配置)

<!--3.配置基於類的動態代理的實現-->
    <aop:aspectj-autoproxy proxy-target-class="true"/>
  • 這一步的意義在於如下
    在這裏插入圖片描述- 如果不進行配置,或者配置爲’false’,那麼只能通過接口.class來進行對象的獲取,但是配置了之後,即可以實現基於接口的動態代理,也能實現基於類的動態代理,所以,推薦配置上!!

5.2.4 完整配置


    <!--Service層配置開始-->
        <!--
        1.組件掃描配置
        2.精確到service是爲了避免對controller註解的掃描
        -->

    <context:component-scan base-package="com.xpt.service"/>
    <!-- spring中基於XML的聲明式事務控制配置步驟
         1、配置事務管理器
         2、配置事務的通知
                 此時我們需要導入事務的約束 tx名稱空間和約束,同時也需要aop的
                 使用tx:advice標籤配置事務通知
                     屬性:
                         id:給事務通知起一個唯一標識
                         transaction-manager:給事務通知提供一個事務管理器引用
         3、配置AOP中的通用切入點表達式
         4、建立事務通知和切入點表達式的對應關係
         5、配置事務的屬性
                是在事務的通知tx:advice標籤的內部
      -->
       <!--2.aop面向切面編程,配置事務-->
        <!--2.1首先需要配置事務管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

        <!--2.2配置事務的通知-->
    <tx:advice id="advice">
        <tx:attributes>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <!--查詢方法的事務控制-->
            <tx:method name="find*" read-only="true"/>

            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

        <!--2.3配置切面-->
    <aop:config>
        <!--爲service下的所有方法添加事務的支持-->
        <aop:pointcut id="pointcut" expression="execution(* com.xpt.service.impl.*.*(..))"/>
        <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
    </aop:config>

    <!--3.配置基於類的動態代理的實現-->
    <aop:aspectj-autoproxy proxy-target-class="true"/>
    <!--service層配置結束-->

5.3service層配置測試

  • 代碼
   @Test
    public void findById(){
        //獲取IOC容器
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.獲取service對象
        ItemsService itemsService = ac.getBean("itemsService",ItemsServiceImpl.class);
        //3.執行方法
        Items item = itemsService.findById(1);
        System.out.println(item);
    }
  • 結果
    在這裏插入圖片描述

6.spring核心配置文件applicationContext.xml完整配置信息

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
			    http://www.springframework.org/schema/beans/spring-beans.xsd
			    http://www.springframework.org/schema/context
			    http://www.springframework.org/schema/context/spring-context.xsd
			    http://www.springframework.org/schema/aop
			    http://www.springframework.org/schema/aop/spring-aop.xsd
			    http://www.springframework.org/schema/tx
			    http://www.springframework.org/schema/tx/spring-tx.xsd
			    http://www.springframework.org/schema/mvc
			    http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--dao層配置開始-->
    <!--1.優先配置連接池(這裏連接池的選擇可以靈活,c3p0都可以)
        配置連接數據庫的四大基本信息
    -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/maven"/>
        <property name="username" value="root"/>
        <property name="password" value="admin"/>
    </bean>

    <!--2.配置SqlSession對象的工廠-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!--掃描pojo包-->
        <!-- 用於指定要配置別名的包,當指定之後,該包下的實體類都會註冊別名,並且類名就是別名,不再區分大小寫-->
        <property name="typeAliasesPackage" value="com.xpt.domain"/>
    </bean>
    <!--掃描接口包所在的路徑,生成所有的代理對象,並且放入IOC容器
        本質上就是在添加對註解的支持
    -->
    <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.xpt.dao"/>
    </bean>
    <!--dao層配置結束-->

    <!--Service層配置開始-->
        <!--
        1.組件掃描配置
        2.精確到service是爲了避免對controller註解的掃描
        -->

    <context:component-scan base-package="com.xpt.service"/>
    <!-- spring中基於XML的聲明式事務控制配置步驟
         1、配置事務管理器
         2、配置事務的通知
                 此時我們需要導入事務的約束 tx名稱空間和約束,同時也需要aop的
                 使用tx:advice標籤配置事務通知
                     屬性:
                         id:給事務通知起一個唯一標識
                         transaction-manager:給事務通知提供一個事務管理器引用
         3、配置AOP中的通用切入點表達式
         4、建立事務通知和切入點表達式的對應關係
         5、配置事務的屬性
                是在事務的通知tx:advice標籤的內部
      -->
       <!--2.aop面向切面編程,配置事務-->
        <!--2.1首先需要配置事務管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

        <!--2.2配置事務的通知-->
    <tx:advice id="advice">
        <tx:attributes>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <!--查詢方法的事務控制-->
            <tx:method name="find*" read-only="true"/>

            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

        <!--2.3配置切面-->
    <aop:config>
        <!--爲service下的所有方法添加事務的支持-->
        <aop:pointcut id="pointcut" expression="execution(* com.xpt.service.impl.*.*(..))"/>
        <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
    </aop:config>

    <!--3.配置基於類的動態代理的實現-->
    <aop:aspectj-autoproxy proxy-target-class="true"/>
    <!--service層配置結束-->
    
</beans>

7.controller層編寫和配置(springmvc的相關配置)

7.1 編寫ItemsController

@Controller
@RequestMapping("/items")
public class ItemsController {

    @Autowired
    //調用service層方法
    private ItemsService itemsService;
    @RequestMapping("/findDetail")
    private String findDetail(Model model){
        Items item = itemsService.findById(1);
        //注意這裏的"name"要和前端使用的名稱對應起來
        model.addAttribute("item",item);
        return "itemDetail";
    }

}

7.2編寫springmvc的核心配置文件springmvc.xml

  • 下述配置也是幾乎於模板的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
			    http://www.springframework.org/schema/beans/spring-beans.xsd
			    http://www.springframework.org/schema/context
			    http://www.springframework.org/schema/context/spring-context.xsd
			    http://www.springframework.org/schema/aop
			    http://www.springframework.org/schema/aop/spring-aop.xsd
			    http://www.springframework.org/schema/tx
			    http://www.springframework.org/schema/tx/spring-tx.xsd
			    http://www.springframework.org/schema/mvc
			    http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--組件掃描-->
    <context:component-scan base-package="com.xpt.controller"/>

    <!--註解支持-->
    <mvc:annotation-driven/>

    <!--視圖解析器-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--釋放靜態資源-->
    <mvc:default-servlet-handler/>
</beans>

8.spring和spring配置的整合配置:web.xml

也是近乎於模板的配置

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
    
    <!--配置Spring核心監聽器-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!--指定spring配置文件路徑-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!--springmvc的核心前端控制器-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

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


    <!--編碼過濾器-->
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
</web-app>

9 測試整個配置環境是否成功

9.1必要的前端頁面支持

  • index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="items/findDetail"><h2>查詢產品細節</h2></a>
</body>
</html>
  • itemDetail.jsp(這裏的命名和前面controller中方法的返回值一致)
<%@ 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"%>    
 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> 
	<form>
		<table width="100%" border=1>
			<tr>
				<td>商品名稱</td>
				<td> ${item.name } </td>
			</tr>
			<tr>
				<td>商品價格</td>
				<td> ${item.price } </td>
			</tr>
			<tr>
				<td>生成日期</td>
				<td> <fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/> </td>
			</tr>
			<tr>
				<td>商品簡介</td>
				<td>${item.detail} </td>
			</tr>
		</table>
	</form>
</body>
</html>

9.2運行測試

在這裏插入圖片描述

二、maven工程拆分與聚合的思想

本質上還是在避免重複造輪子,提高項目的可維護性,提升效率

在這裏插入圖片描述

三、maven父子工程的創建

父工程最小可用的單位只需要一個pom.xml文件即可,所以父工程本質上就是用來管理jar包的

1首先創建父工程project

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

2.創建子工程(dao和service)

都是普通的maven工程即可
在這裏插入圖片描述在這裏插入圖片描述

2.1注意父子工程各自的pom.xml的變化

在這裏插入圖片描述

3.創建子工程(web-app)

在這裏插入圖片描述

3.1刪除由模板工程創建出來的pom文件中不必要的內容

在這裏插入圖片描述

  • 只保留如下信息:
    在這裏插入圖片描述

四、工程和模塊的區別以及繼承和依賴

1.關係

  • 工程和模塊的區別:工程不等於完整的項目,模塊也不等於完整的項目,一個完整的項目看的是代碼,代碼完整,就可以說這是一個完整的項目,和此項目是工程和模塊沒有關係。

  • 工程天生只能使用自己內部資源,工程天生是獨立的。後天可以和其他工程或模塊建立關聯關係。

  • 模塊天生不是獨立的,模塊天生是屬於父工程的,模塊一旦創建,所有父工程的資源都可以使用。

  • 父子工程直接,子模塊天生集成父工程,可以使用父工程所有資源。

  • 子模塊之間天生是沒有任何關係的。

  • 父子工程直接不用建立關係,繼承關係是先天的,不需要手動建立。

  • 平級直接的引用叫依賴,依賴不是先天的,依賴是需要後天建立的。

    在這裏插入圖片描述

2 編寫父工程的pom.xml

將前面項目的pom.xml中的內容複製過去即可

3.傳遞依賴下來的包是否可以使用(瞭解即可)

在這裏插入圖片描述

五、父子工程中填充代碼

將前面項目中各層的代碼拷入對應的模塊中即可
在這裏插入圖片描述

六、maven父子工程三種啓動方式

1在父工程中啓動

最簡單的方式,可以啓動完成
在這裏插入圖片描述

2.在web模塊中啓動

2.1直接啓動報錯以及原因

在這裏插入圖片描述在這裏插入圖片描述

  • 但是爲什麼直接啓動父工程就可以正常運行呢?因爲他是根據自己的pom文件來找的,它裏面的Jar包本地倉庫都有

2.2解決方案:先打包整個項目

  • 需要首先把所有的子模塊打包成jar包然後安裝在本地倉庫即可
  • 這個也在父工程進行,可以一次打包所有的子模塊

在這裏插入圖片描述

2.3再次在web模塊下啓動

在這裏插入圖片描述

3 使用本地安裝的tomcat

就是之前web項目使用的配置和使用方式,配置一個tomcat啓動即可
前兩種方式就是使用的maven提供了tomcat插件來啓動的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章