从MVC和三层架构说到ssh整合开发(下)
来源:互联网 发布:风火轮软件 编辑:程序博客网 时间:2024/05/18 00:12
这章主要讲整合开发,直接从实战讲起
详细请看源代码注释:
全部代码下载(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) 工程简图:
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下面的包都可以引入;
2.spring-framework-4.2.3.RELEASE-dist.zip
下载地址:http://repo.springsource.org/libs-release-local/org/springframework/spring/
需要引入的包:
3.Hibernate 4.1.6
下载地址:http://sourceforge.net/projects/hibernate/files/hibernate4
需要引入的包:
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:
3.entity层映射
1.需要建立三个实体类:Admin.java,Dept.java,Employee.java,如下:
此处都省略get和set方法: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&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整合开发
- 从MVC和三层架构说到ssh整合开发(上)
- SSH框架mvc三层架构
- SSH学习之MVC和三层架构的区别
- 三层架构和MVC
- 三层架构和MVC
- MVC和三层架构
- MVC和三层架构
- MVC和三层架构
- 三层架构和MVC
- MVC和三层架构
- mvc和三层架构
- MVC和三层架构
- 多线程退出
- Java学习----day4——(2)方法中可变参数
- spark数据倾斜解决方案(一)炫酷的4个方案
- 在 MySQL Workbench 中如何可视的建立 MySQL 物理数据模型,并使用它来创建一个 MySQL 数据库
- 关于富文本编辑内容存储到数据库在移动端显示的问题
- 从MVC和三层架构说到ssh整合开发(下)
- 第五章 信用评分模型的开发流程
- notepad++设置用空格取代tab键及修改背景主题
- struts1和spring的整合
- 434. Number of Segments in a String
- svg 透视
- 类和对象的关系
- Python--matplotlib绘图可视化知识点整理
- jqery easyui 给角色分配菜单 利用tree来实现