• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

从MVC和三层架构说到ssh整合开发(下)

相关文章 搞代码 7年前 (2018-06-22) 182次浏览 已收录 0个评论
文章目录[隐藏]

  阅读上一篇

  这章主要讲整合开发,直接从实战讲起

  详细请看源代码注释:

  全部代码下载(csdn):链接

  Github链接:链接https://github.com/wpeace1212/javaBlog/tree/master/sshDemo

 1.整合流程

  针对一个简单项目,让大家对三层机构和MVC有一个简单的认识,以及怎样整合ssh框架;

  1.整合的项目介绍:

  (1) 企业人事管理系统!要求对员工信息进行维护。

  (2) 后台系统先登陆,才能操作员工: 添加/修改/删除

  (3) 没有登陆,只能查看列表,不能操作!

  2.功能分类:

  (1) 管理员模块:对应AdminAction中实现

  登陆/注册

  (2) 员工模块:对应EmployeeAction中实现

  添加一个员工, 指定添加的部门

  对指定的员工信息修改

  删除选择员工

  列表展示

  3.需要的技术:

  (1) Struts2:对是否登陆的拦截,对各个功能请求的分别处理,模型驱动。

  (2) Hibernate4:建立多对一关系的数据库,以及实现增删改查

  表t_admin:存放管理员信息

  表t_dept:存放部门信息,要用到one-to-many关联员工表

  表t_employee:存放员工信息,要用到many-to-one关联部门表

  (3) spring:实现bean对象的创建管理,整合,事务管理

  (4) 大体按照下面的流程进行介绍:设计数据库直接在实体存中实现

  - Jar包引入

  - entity层映射

  - Spring配置

  - hibernate配置

  - Dao层

  - Service层

  - web.xml配置

  - struts.xml配置

  - Action层

  - jsp层

  三层架构:其中2,4,5步是数据访问层,3,6步是业务逻辑层,7,9,10步表现层

  MVC:其中2,3,4,5,6步是模型层,7,9,步是控制层,10步是视图层

  (5) 工程简图:

从MVC和三层架构说到ssh整合开发(下)

 2.Jar包下载

  第一步当然是建立web项目、引入jar文件、准备环境了,建立就不介绍了,只介绍最小包的引入:

  我的最小包下载地址(ssh最小包):http://download.csdn.net/detail/peace1213/9412092

  1.Struts 2.3.16.1

  下载地址:http://struts.apache.org/download

  Struts中需要引入的包:struts-2.3.16.1/apps/struts2-blank/WEB-INF/lib:该lib下面的包都可以引入;

从MVC和三层架构说到ssh整合开发(下)

  2.spring-framework-4.2.3.RELEASE-dist.zip

  下载地址:http://repo.springsource.org/libs-release-local/org/springframework/spring/

  需要引入的包:

从MVC和三层架构说到ssh整合开发(下)

  3.Hibernate 4.1.6

  下载地址:http://sourceforge.net/projects/hibernate/files/hibernate4

  需要引入的包:

从MVC和三层架构说到ssh整合开发(下)

  4.AOPalliance 1.0

  该包在struts的lib中有

  下载地址:http://sourceforge.net/projects/aopalliance

 aopalliance.jar

  5.Aspectj 1.7.0

  下载地址:http://www.Eclipse.org/aspectj/downloads.php

 aspectjrt.jar    aspectjweaver.jar

  6.Cglib 2.2.3

  下载地址:http://sourceforge.net/projects/cglib/files

 cglib-2.2.3.jar

  7.Asm 3.3

  该包在struts的lib中有

  下载地址:http://forge.ow2.org/projects/asm

 asm-3.3.jar 

  8.Log4j 1.2.17

  该包在struts的lib中有

  下载地址:http://logging.apache.org/log4j/1.2/download.html

 log4j-1.2.17.jar

  9.mysql-connector-java-5.1.37-bin.jar

  下载地址:http://dev.mysql.com/downloads/connector/j

 mysql-connector-java-5.1.37-bin.jar

  10.Commons Logging 1.1.1

  该包在struts的lib中有

  下载地址:http://commons.apache.org/logging

 commons-logging-1.1.1.jar 

  其他需要引入的jar:

从MVC和三层架构说到ssh整合开发(下)

 3.entity层映射

  1.需要建立三个实体类:Admin.java,Dept.java,Employee.java,如下:

 此处都省略getset方法:  public class Admin {      private int id;      private String adminName;      private String pwd;  ......  public class Dept {      private int id;      private String name;      private Set<Employee> emps=new LinkedHashSet<>();  ......    public class Employee {      private int id;      private String empName;      private double salary;      private Dept dept;  ......

  2.建立对应的映射文件:×.hbm.xml

   1.Admin.hbm.xml:  <class name="Admin" table="t_admin">          <id name="id">              <generator class="native"></generator>          </id>          <property name="adminName" length="20"></property>          <property name="pwd" length="20"></property>      </class>    2.Dept.hbm.xml:     <class name="Dept" table="t_dept">         <id name="id" >            <generator class="native"></generator>         </id>         <property name="name" column="Dname"></property>         <set name="emps" cascade="save-update,delete" table="t_employee" >             <key column="dept_id"></key>             <one-to-many class="Employee"></one-to-many>         </set>    3.Employee.hbm.xml:   <class name="Employee" table="t_employee">         <id name="id">          <generator class="native"></generator>         </id>        <property name="empName"  length="20"></property>          <property name="salary" type="double"></property>           <many-to-one name="dept" column="dept_id" class="Dept"></many-to-one>     </class>

 4.Spring配置 :

  Spring分为:bean-base.xml,bean-dao.xml,bean-service.xml,bean-action.xml,以及整合成一个的bean.xml

  辞去暂时介绍bean-base.xml基础功能文件和bean.xml,其他文件到相应的介绍地方再进行介绍;

  1.bean-base.xml:主要配置Hibernate的工厂sessionFactory和事务,连接池

 <?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:p="http://www.springframework.org/schema/p"      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">           <!-- 1. 数据源对象: C3P0连接池 -->          <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">              <property name="driverClass" value="com.mysql.jdbc.Driver"></property>              <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/day01?useUnicode=true&amp;characterEncoding=UTF8"></property>              <property name="user" value="root"></property>              <property name="password" value="123456"></property>              <property name="initialPoolSize" value="3"></property>              <property name="maxPoolSize" value="10"></property>              <property name="maxStatements" value="100"></property>              <property name="acquireIncrement" value="2"></property>                  </bean>                  <!-- ###########Spring与Hibernate整合  start########### -->      <!-- 【推荐】方式所有的配置全部都在Spring配置文件中完成 -->      <bean id="sessionFactory"          class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">          <!-- 注入连接池对象 -->          <property name="dataSource" ref="dataSource"></property>          <!-- Hibernate常用配置 -->          <property name="hibernateProperties">              <props>                  <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>                  <prop key="hibernate.show_sql">true</prop>                  <prop key="hibernate.hbm2ddl.auto">update</prop>              </props>          </property>       <!-- hibernate映射配置-->           <property name="mappingLocations">              <list>                  <value>classpath:com/rlovep/entity/*.hbm.xml</value>              </list>          </property>          </bean>  <!-- ###########Spring与Hibernate整合  end########### -->          <!-- 事务配置 -->      <!-- a. 配置事务管理器类 -->      <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">          <property name="sessionFactory" ref="sessionFactory"></property>      </bean>      <!-- b. 配置事务增强(拦截到方法后如果管理事务?) -->      <tx:advice id="txAdvice" transaction-manager="txManager">          <tx:attributes>              <tx:method name="*" read-only="false"/>          </tx:attributes>      </tx:advice>      <!-- c. Aop配置 -->      <aop:config>           <aop:pointcut expression="execution(* com.rlovep.service.impl.*.*(..))" id="pt"/>           <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>      </aop:config>           <!-- 用于建表 -->        <bean id="appDao" class="com.rlovep.entity.AppDao">              <property name="sessionFactory" ref="sessionFactory"></property>            </bean>   </beans>

  2.bean.xml:

 ....省略.....      <!-- 引入其他配置文件 -->      <import resource="config/bean-base.xml"/>      <import resource="config/bean-dao.xml"/>      <import resource="config/bean-service.xml"/>      <import resource="config/bean-action.xml"/>  </beans>   

 5.Hibernate配置:

  Spring中已经配置好了Hibernate,此处主要讲解建立数据库中的三个表;

  1、建立AppDao类文件:bean已经在bean.hbm.xml中配置了

 /*   * 用来创建数据库中的表   */  public class AppDao {      //工厂通过spring注入      private SessionFactory sessionFactory;      public void setSessionFactory(SessionFactory sessionFactory) {          this.sessionFactory = sessionFactory;      }      //@Test      public void test(){          //sessionFactory=(SessionFactory)ac.getBean("sessionFactory");          Session session = sessionFactory.openSession();          Transaction tx = session.beginTransaction();          //保存管理员,并创建表          Admin admin=new Admin();          admin.setAdminName("admin");          admin.setPwd("123456");          session.save(admin);          //保存部门和雇员,并创建表          Dept dept1=new Dept();          Dept dept2=new Dept();  ....省略.....  //持久化          session.save(dept1);  ....省略.....          session.save(employee4);          tx.commit();          session.close();      }

  2.建立类App类创建数据库和存数据:

 public class App {      private ApplicationContext ac=new ClassPathXmlApplicationContext("config/bean-base.xml");      @Test      public void test(){          //ac.getBean("deptDao");          AppDao appDao = (AppDao)ac.getBean("appDao");          appDao.test();      }  }

  3.点击运行App的test方法就可以完成数据库的创建;

 6.Dao层:实现数据增删改查;

  1.先建立接口: IAdminDao,IDepDao,IEmployee,IBaseDao(所有Dao的通用操作接口定义)

  此处只贴出IBaseDao接口的定义:

 /*   * * 所有dao的通用操作接口定义   */  public interface IBaseDao<T> {      /**       * 保存       * @param obj       */      void save(T obj);    ....省略.....  }

  2.接口的实现:AdminDao,DepDao,Employee,BaseDao(所有Dao的通用操作,希望所有的dao都继承此类)

  BaseDao实现:

 /*   * 所有dao的通用操作,希望所有的dao都继承此类   */  public class BaseDao<T> implements IBaseDao<T>{      //当前操作实际的bean类型      private Class<T>clazz;      //获取类名称      private String className;      // IOC容器(依赖)注入SessionFactory对象      private SessionFactory sessionFactory;      public void setSessionFactory(SessionFactory sessionFactory) {          this.sessionFactory = sessionFactory;      }       public BaseDao() {          Type type=this.getClass().getGenericSuperclass();          //转换为参数化类型          ParameterizedType pt=(ParameterizedType)type;// BaseDao<Employee>          //得到实际类型          Type types[]=pt.getActualTypeArguments();          //获取实际类型          clazz=(Class<T>)types[0];          className = clazz.getSimpleName();//例如:Employee      }  ....省略.....      @Override      public List<T> getAll() {          Query query = sessionFactory.getCurrentSession().createQuery("from "+className);          List<T> list = query.list();          return list;      }  }

  其他接口实现:

 //只需要继承通用操作,和特点接口就行:这里接口中没有方法,可以加方法  public class DeptDao extends BaseDao<Dept> implements IDepDao{  }

 7.Service层:

  同样先建立接口再建立类,此处不贴出代码,介绍bean-dao.xml,bean-service.xml的建立,以及对刚刚建立的Dao和service进行测试

  1.bean-dao.xml

  <!-- dao实例 -->           <bean id="adminDao" class="com.rlovep.dao.impl.AdminDao">               <property name="sessionFactory" ref="sessionFactory"></property>            </bean>            <bean id="deptDao" class="com.rlovep.dao.impl.DeptDao">               <property name="sessionFactory" ref="sessionFactory"></property>            </bean>            <bean id="employeeDao" class="com.rlovep.dao.impl.EmployeeDao">               <property name="sessionFactory" ref="sessionFactory"></property>            </bean>

  2.bean-service.xml

  <!-- service 实例 -->            <bean id="adminService" class="com.rlovep.service.impl.AdminService">              <property name="adminDao" ref="adminDao"></property>            </bean>             <bean id="deptService" class="com.rlovep.service.impl.DeptService">              <property name="deptDao" ref="deptDao"></property>            </bean>             <bean id="employeeService" class="com.rlovep.service.impl.EmployeeService">              <property name="employeeDao" ref="employeeDao"></property>            </bean>

  3.测试刚刚建立的dao和service:

  在包service中建立App测试类:

public class App {

    //加载spring的配置文件

   private ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");

   //测试Admin的操作

   @Test

   public void testAdmin(){

       //获得bean

     IAdminService adminService=(IAdminService)ac.getBean("adminService");

     Admin admin=new Admin();

     admin.setAdminName("admin");

     admin.setPwd("123456");

    System.out.println( adminService.login(admin));

   }

   //测试Dept的操作

   @Test

   public void testDept(){

     IDeptService service=( IDeptService)ac.getBean("deptService");

    System.out.println( service.findById(1));

   }

   //测试Employee的操作

   @Test

   public void testEmployee(){

     IEmployeeService service=( IEmployeeService)ac.getBean("employeeService");

     List<Employee> list = service.getAll();

    System.out.println( service.findById(9));

   }

}

 8.web.xml配置:

  1、需要配置Spring

  2、需要配置Struts2

  3、配置文件如下:

 <?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_3_0.xsd" id="WebApp_ID" version="3.0">    <display-name>sshDemo</display-name>    <!-- 配置spring的OpenSessionInView模式 【目的:JSp页面访问懒加载数据】 -->          <!-- 注意:访问struts时候需要带上*.action后缀 -->          <filter>              <filter-name>OpenSessionInView</filter-name>              <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>          </filter>          <filter-mapping>              <filter-name>OpenSessionInView</filter-name>              <url-pattern>*.action</url-pattern>          </filter-mapping>                <!-- Struts2的配置 -->            <filter>            <!-- 配置过滤器的名字 -->              <filter-name>struts2</filter-name>            <!--  配置核心过滤器类 -->              <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>            </filter>          <!--配置要拦截的URL,辞去配置全部拦截 -->            <filter-mapping>                <filter-name>struts2</filter-name>                <url-pattern>/*</url-pattern>            </filter-mapping>              <!--在web.xml中加入如下代码令服务器自动加载Spring   -->           <context-param>              <param-name>contextConfigLocation</param-name>              <param-value>classpath:bean.xml</param-value>          </context-param>          <listener>              <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>          </listener>           <!-- 首页配置 -->      <welcome-file-list>          <welcome-file>index.jsp</welcome-file>      </welcome-file-list>  </web-app>

 9.struts.xml配置 :

  1.由于spring的整合,在 struts.xml配置文件中的class属性直接使用:spring的配置文件bean-action.xml中定义的bean

  2.struts.xml文件:

 <package name="struts2" extends="struts-default">  <!-- 配置action,class属性使用Spring中定义的bean->        <action name="admin_*" class="adminAction" method="{1}">         <!-- 登陆失败 -->              <result name="loginFaild">/login.jsp</result>              <!-- 登陆成功 -->              <result name="index" type="redirectAction">emp_list</result>        </action>         <action name="emp_*" class="employeeAction" method="{1}">             <!-- 列表展示 -->              <result name="list">/WEB-INF/list.jsp</result>              <!-- 进入添加页面视图 -->              <result name="add">/WEB-INF/add.jsp</result>              <!-- 添加成功,进入列表 (防止刷新就多一条记录问题,所以用重定向) -->              <result name="listAction" type="redirectAction">emp_list</result>                     <!-- 进入修改页面 -->              <result name="edit">/WEB-INF/edit.jsp</result>        </action>

  3.bean-action.xml文件:

     <!-- 指定action多例 -->      <bean id="adminAction" class="com.rlovep.action.AdminAction" scope="prototype">          <property name="adminService" ref="adminService"></property>      </bean>      <bean id="employeeAction" class="com.rlovep.action.EmployeeAction" scope="prototype">          <property name="deptService" ref="deptService"></property>          <property name="employeeService" ref="employeeService"></property>      </bean>

 10.Action层 :

  1、建立AdminAction文件:继承ActionSupport类,和实现ModelDriver接口

  2、建立EmployeeAction文件:继承ActionSupport类,和实现ModelDriver接口

  3、建立拦截器类:AdminInterceptor类用于判断是否登陆;继承AbstractInterceptor

 @Override      public String intercept(ActionInvocation invocation) throws Exception {          //得到当前执行的方法          String method = invocation.getProxy().getMethod();          //判断:当不为登陆方法和list方法时          if(!"login".equals(method)&&!"list".equals(method)){              Object obj= ActionContext.getContext().getSession().get("adminInfo");              if(obj==null){                  //没有登陆                  return "login";              }else{                  //放行                  return invocation.invoke();              }          }          //放行          return invocation.invoke();      }

  建立相应的jsp文件:

  主要有:index,login,edit,add,list等jsp文件;详情见工程源代码;

 11.测试图:部署动态工程

  测试登陆

从MVC和三层架构说到ssh整合开发(下)

  测试添加

从MVC和三层架构说到ssh整合开发(下)

  测试删除

从MVC和三层架构说到ssh整合开发(下)

  测试修改

从MVC和三层架构说到ssh整合开发(下)

  好的本章介绍到这里

  相关文档:从MVC和三层架构说到ssh整合开发(上)

欢迎大家阅读《从MVC和三层架构说到ssh整合开发(下)》,跪求各位点评,若觉得好的话请收藏本文,by 搞代码


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:从MVC和三层架构说到ssh整合开发(下)

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址