一个web工程项目通常会有三个功能块,1、UI,2、Service,3、Dao,那么使用Maven创建web工程项目,就可以将工程分成多个模块开发
一、拆分原理
将三层的内容分别独立为一个项目,进一步将耦合性降低
创建parent父工程来管理其下三个子模块并让其子模块继承:继承是为了消除重复,如果将dao、service、web分开创建独立的工程则每个工程的pom.xml文件中的内容存在重复,比如:设置编译版本、锁定spring的版本的等,可以将这些重复的配置提取出来在父工程的pom.xml中定义
web层调用service层的代码其实很简单,因为service是一个完整的项目,那么在web层想要使用别的项目中的方法,只需要通过maven添加依赖(pom.xml文件编写对应的坐标),ssh-web依赖ssh-service,ssh-service依赖ssh-dao。
二、Maven整合SSH(分模块)
Ⅰ、创建maven-parent父模块
使用pom打包方式,为了使用maven的分模块开发功能
父工程结构:
父工程本身不写代码,它里面有一个pom.xml文件,这个文件可以将多个子模块中通用的jar所对应的坐标,集中在父工程中配置,将来的子模块就可以不需要在pom.xml中配置通用jar的坐标
Ⅱ、创建maven_dao
点击next
点击next
注意:打包方式为jar
点击Finish,查看父工程中多出一个maven_dao的文件夹,并且父工程中的pom.xml文件中多出
<modules> <module>maven_dao</module> </modules>
maven_dao的结构,和pom.xml内容
①、创建dao的接口、接口实现类和持久化类(class文件和映射文件)
注意:持久化类的java文件所在的包和xml文件所在的包名要一致,这样在以后打包时,就会把相同包名的文件放在一起
hibernate.cfg.xml配置:sessionFactory基本配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 配置Hibernate的方言 --> <property name="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</property> <!-- 控制台打印sql语句 --> <property name="hibernate.show_sql">true</property> <!-- 控制台打印sql语句 格式化--> <property name="hibernate.format_sql">false</property> <!-- 自动创建|更新|验证数据库表结构 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 懒加载 --> <property name="hibernate.enable_lazy_load_no_trans">true</property> <!-- 实体类的验证 --> <property name="javax.persistence.validation.mode">none</property> </session-factory> </hibernate-configuration>
配置数据库连接信息jdbc.properties
jdbc.driverClass=com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc.url=jdbc:sqlserver://localhost:1433;databaseName=HibernateDB; jdbc.username=sa jdbc.password=AAA@111
配置applicationContent_dao.xml:数据源(数据库连接信息)、sessionFactory(数据源注入,加载hibernate.cfg.xml,加载映射文件)、数据访问层(dao层)
<?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" 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"> <!-- 引入数据库连接属性文件 --> <context:property-placeholder location="classpath:jdbc.properties" /> <!-- 配置C3P0连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}" /> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="user" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <!-- 加载hibernate配置文件 --> <property name="configLocations" value="classpath:hibernate.cfg.xml" /> <!-- 注入连接池 --> <property name="dataSource" ref="dataSource" /> <!-- 配置映射 private String[] mappingResources;对应<list>标签 --> <property name="mappingLocations" value="classpath:com/xxx/maven/domain/*.hbm.xml"/> </bean> <bean id="customerDao" class="com.xxx.maven.dao.impl.CustomerDaoImpl" scope="prototype"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> </beans>
②、编写测试
@Test public void tt() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "classpath:applicationContext-dao.xml"); ICustomerDao dao = (ICustomerDao) applicationContext.getBean("customerDao"); System.out.println(dao.findAll().size()); }
Ⅲ、创建Service模块
与dao层的创建一样
Service结构
依赖dao层
创建Service接口、Service接口实现类
配置applicationContext-service.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" 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"> <!-- 事务 --> <!-- hiberntae事务管理器,也需要将sessionFactory加进来,从hibernate中得代码就可以看出来,事务也是由sessionFactory获取来的 --> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 通知 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="get*" read-only="true" /> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <!-- 切面 --> <aop:config> <aop:pointcut id="pointcut" expression="execution(* com.xxx.maven.service.impl.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" /> </aop:config> <!-- 业务 --> <bean id="customerService" class="com.xxx.maven.service.impl.CustomerServiceImpl"> <property name="customerDao" ref="customerDao"></property> </bean> <!-- 测试使用 --> <import resource="classpath:applicationContext-dao.xml"/> </beans>
编写测试代码
@Test public void tt() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "classpath:applicationContext-service.xml"); ICustomerService service = (ICustomerService) applicationContext.getBean("customerService"); System.out.println(service.findAll().size()); }
注意:以上配置(import)只是测试使用,项目运行时要删掉此配置
Ⅳ、创建web模块
与DAO、Service创建方式一样,打包方式不同,web打包为war
解决违反Maven项目目录约定(webapp目录中没有WEB-INF和web.xml)
创建index.jsp测试web层
右击maven_parent => Run As => Maven build...
没有错误log,浏览器地址栏输入:http://localhost:8080/maven_web
创建Action
public class CustomerAction extends ActionSupport implements ModelDriven<Customer> { private Customer customer=new Customer(); @Override public Customer getModel() { return customer; } // 属性注入 private CustomerService customerService; public void setCustomerService(CustomerService customerService) { this.customerService = customerService; } public String find() { System.out.println("find方法执行了"); customerService.findAll(); return NONE; } }
配置applicationContext-action.xml(管理Action)
<?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" 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/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id="customerAction" class="com.xxx.maven.web.action.CustomerAction" scope="prototype"> <property name="customerService" ref="customerService"></property> </bean> </beans>
配置struts.xml(action访问方式)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="default" namespace="/" extends="struts-default"> <action name="cst_*" class="customerAction" method="{1}"></action> </package> </struts>
配置web.xml(spring配置文件的加载的监听器、struts2核心过滤器)
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name>maven_web</display-name> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:applicationContext-*.xml</param-value> </context-param> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
访问action