《Java高级编程》节课作业.doc
Java高级编程结课大作业题目:分别谈谈你对Struts2、Hibernate和Spring框架的理解,并举例说明。 1、Struts2的理解: Struts2 这个框架,struts1是世界上第一个mvc框架,现在的MVC框架很多 最著名的是Struts springmvc 等 Struts2的体系结构和struts1差别巨大,它明确的说它不是一个新的MVCweb框架,它不是从struts1升级过来的,它是基于webwork的xwork的 ,是xwork2的升级版, Struts2吸取了struts1和xwork2的 两者的优点 ,Strus2是以webwork为核心。所以struts2更加优秀的,更加整洁的MVC 框架 ,采用拦截器的机制处理用户的请求 这样的设计能够与原生的servletAPI完全脱离,在struts2中有一个核心类它就是StrutsPreparedAndExecuteFilter struts2准备执行过滤器 我们要想使用Struts2 对用户的请求处理 我们必须在web.xml中进行配置这个核心过滤器。 基本上是过滤所有请求的。一般的Struts2框架的处理流程: 1、加载类 StrutsPrepareAndExecuteFilter 会执行准备操作执行操作准备操作: 使用AcionMapper 进行读取对URL进行映射,执行操作: 会交给actionproxy 来 调用配置管理器,来读取struts.xml 等读取完毕 actionproxy 交给第三者 : actionInvocation 来递归调用一组拦截器, 基本上就是我们使用的拦截器栈进行预处理操作 2、等预处理操作完毕之后,第三种进行调用我们的action 和result 在依次递归反向调用我们的那组拦截器进行后处理操作 最后发出response 给浏览器2、hibernate的理解 hibernate 是一个持久层框架,又是一个ORM框架,通俗的来讲就是 一个对象关系映射框架。使应用程序的持久化类到数据库中的表之间的关系的映射;hibernate其实就是是对jdbc的封装,减轻了程序员使用jdbc操作数据库的繁琐工作。让程序员操作数据库关心的不再是数据库中的表而是我们的持久化对象javabean,比如: 进行保存操作的时候仅仅使用一个save() 的方法,删除一条记录的时候仅仅调用delete()方法就能方便的完成对数据库中的数据的增加、删除操作。 使用Hibernate 的基本的流程是 配置Configuration对象,产生SessionFactory 创建session对象,开启事务 完成增加 删除 修改 查询 的操作 提交事务 关闭 session在使用hibernate的时候 要先配置hibernate.cfg.xml 文件 其中配置数据库连接信息和方言【不过这些固定的可以配置在hibernate.properties 属性配置文件中,在应用程序启动的时候,会先加载 src目录下的hibernate.properties 再加载 src目录下的hibernate.cfg.xml 再加载 对应的持久化配置映射文件*.hbm.xml 等加载完成后 开始创建sessionFactory 】3、对spring 的理解 说起spring ,spring实现了工厂模式的工厂类-beanFactory这是一个轻量级框架,其中在spring中包含有三个重要的技术IOC 、DI、 AOP。IOC: 控制反转 这个IOC是一种编程思想,也是一种架构的艺术,利用这个技术可以很好的实现模块与模块之间的解耦,耦合性降低 。如使用了Spring的IOC技术,对自己想使用的对象进行实例化的时候 ,不需要你自己进行new 操作了 ,而是交给 Spring容器帮你实例化对象。 那什么是DI呢? 其实IOC也成为DI DI 是英文的缩写 依赖注入这这个名词更能说明IOC的设计理念。就是将服务注入到使用它的地方中,组件之间的依赖关系由容器在应用系统运行前来决定。【依赖注入的方式一般分为4个: 通过gettter 和setter方法进行注入,和通过构造函数进行注入 通过对象工厂进行注入 和通过静态工厂进行注入】。AOP是面向切面编程,这解决了在整个系统中很多毫不相干的模块或者具体的类添加相同的功能,比如输出日志信息,权限设置, 和事务管理等。实现AOP功能就是实现了代理功能,对目标类进行代理 ,动态的代理可以分为两种: jdk的动态代理和CGLIB的动态代理,它们之间的区别是, 使用jdk的动态代理 代理对象必须实现一个接口 ,而cglib 没有必要,对字节码也可以动态代理了。 很强大 不过我们一般在做应用程序的开发的时候面向接口的编程,减少类与类之间的耦合,所以我们用jdk的动态代理。Spring的作用贯穿了整个中间层,将Web层、Service层、DAO层及PO无缝整合,其数据服务层用来存放数据。一个良好的框架可以让开发人员减轻重新建立解决复杂问题方案的负担和精力;它可以被扩展以进行内部的定制化;并且有强大的用户社区来支持它。框架通常能很好的解决一个问题。然而,你的应用是分层的,可能每一个层都需要各自的框架。仅仅解决UI问题并不意味着你能够很好的将业务逻辑和持久性逻辑和UI 组件很好的耦合。 Struts2+Spring+Hibernate是J2EE的最新流行框架。本篇是我搭建这个框架的经验总结,有很多人搭建这个框架总会遇到大大小小的问题,网上也没有什么行之有效的方案或成体系的介绍,所以我就决定总结一下我的搭建过程。给一些搭建尚存问题的朋友提供帮助。我用这个框架,实现的是基本的CRUD功能的一个雇员管理系统,本来打算丰富一下功能,但是一直没能抽出空去搞。目前版本暂定为1.0,除了CRUD外还配置了表单验证框架JSValidation。功能都能很顺利的实现。现在分享部分源码,来说明一些注意事项。以下是部分搭建过程及源码:1.先组合实现Hibernate3.2+Spring2.5支持,删除hibernate.cfg.xml文件,修改applicationContext.xml文件的内容,增加SessionFactory和dataSource的设置。2.通过MyEclipse的向导方式,生成POJO类和对应的映射文件。3.修改applicationContext.xml文件中<property name="mappingResources">元素的内容。4.编写DAO接口和实现类。5.修改applicationContext.xml文件,增加对Dao实现类的配置。6.组合Struts2和Spring2.5,修改web.xml文件,增加struts2的所需要的过滤器配置。7.增加struts2相应类库,增加struts2与spring的配置jar包。8.拷贝struts.xml文件到src根目录下,再修改struts.xml文件,进行常量配置。9.修改web.xml文件,配置Spring监听器,和上下文变量。并增加OpenSessionInViewFilter的设置。10.写入action类。11.配置struts.xml文件。12.修改applicationContext.xml13.编写Jsp文件。14.加载运行项目。下面是关键文件的源码:struts.xml源码:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-/Apache Software Foundation/DTD Struts Configuration 2.0/EN" "http:/struts.apache.org/dtds/struts-2.0.dtd"><struts><!- struts2委托spring管理 -> <constant name="struts.objectFactory" value="spring"/> <!- /crm/emp/add.action -> <package name="crm_employee" extends="struts-default" namespace="/emp"> <action name="add" class="addBean" method="add"> <result>add.action</result> <result>/emp/add_suc.jsp</result> </action> <action name="list" class="listBean" method="list"> <result>/emp/list.jsp</result> </action> <action name="delete" class="deleteBean" method="delete"> <result>delete.action</result> <result>/emp/delete_suc.jsp</result> </action> <action name="update" class="updateBean" method="update"> <result>update.action</result> <result>/emp/edit_suc.jsp</result> </action> <action name="edit" class="editBean" method="edit"> <result>/emp/edit.jsp</result> </action> <!- Add actions here -> </package></struts> web.xml源码:<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns=" xmlns:xsi="http:/www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" <!- 配置spring的监听器 -> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext*.xml</param-value> </context-param> <!- 开启监听 -> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <!- 配置OpenSessionInViewFilter,必须在struts2监听之前 -> <filter> <filter-name>lazyLoadingFilter</filter-name> <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class> </filter> <!- 设置监听加载上下文 -> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>lazyLoadingFilter</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <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>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: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-2.5.xsd http:/www.springframework.org/schema/tx http:/www.springframework.org/schema/tx/spring-tx-2.0.xsd http:/www.springframework.org/schema/aop http:/www.springframework.org/schema/aop/spring-aop-2.0.xsd"> <!- 配置Hibernate支持 -> <bean id="dataSource" class="mons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"> </property> <property name="url" value="jdbc:mysql:/localhost:3306/tables"> </property> <property name="username" value="root"></property> <property name="password" value="hicc"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.show_sql">true</prop> </props> </property> <property name="mappingResources"> <list> <value>com/sy/crm/model/Employee.hbm.xml</value> </list> </property> </bean> <bean id="employeeDao" class="com.sy.crm.dao.hibernate.EmployeeDaoHibernate"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <bean id="employeeManager" class="com.sy.crm.service.impl.EmployeeManagerImpl"> <property name="employeeDao"> <ref bean="employeeDao" /> </property> </bean> <bean id="addBean" class="com.sy.crm.action.EmployeeAction" scope="prototype"> <property name="employeeManager"> <ref bean="employeeManager" /> </property> </bean> <bean id="listBean" class="com.sy.crm.action.EmployeeAction" scope="prototype"> <property name="employeeManager"> <ref bean="employeeManager" /> </property> </bean> <bean id="deleteBean" class="com.sy.crm.action.EmployeeAction" scope="prototype"> <property name="employeeManager"> <ref bean="employeeManager" /> </property> </bean> <bean id="updateBean" class="com.sy.crm.action.EmployeeAction" scope="prototype"> <property name="employeeManager"> <ref bean="employeeManager" /> </property> </bean> <bean id="editBean" class="com.sy.crm.action.EmployeeAction" scope="prototype"> <property name="employeeManager"> <ref bean="employeeManager" /> </property> </bean> <!- 事务管理器 -> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory"/> </property> </bean> <!- 配置事务特性,配置add,delete,update开始的方法,事务传播特性为required -> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="*" read-only="true"/> </tx:attributes> </tx:advice> <!- 配置那些类的方法进行事务管理,当前com.sy.crm.service包中的子包, 类中所有方法需要,还需要参考tx:advice的设置 -> <aop:config> <aop:pointcut id="allManagerMethod" expression="execution(* com.sy.crm.service.*.*(.)"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/> </aop:config> </beans> add.jsp源码:<% page language="java" pageEncoding="utf-8"%><% taglib uri="/struts-tags" prefix="s" %><!DOCTYPE HTML PUBLIC "-/W3C/DTD HTML 4.01 Transitional/EN"><html> <head> <title>add page</title> <script language="JavaScript" src="validation-framework.js"></script> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <body> <center> <h3>雇员注册:</h3><br> <h4><a href="./emp/list.action">查看所有雇员</a></h4> <div id="error" style="color:blue; font-weight:bold;"></div> <s:form action="add" method="post" onsubmit="return doValidate('form')" name="form" id="form"> <s:textfield name="employee.name" label="姓名" id="name"/> <s:textfield name="employee.address" label="地址"/> <s:textfield name="employee.phone" label="电话"/> <s:submit value="员工注册"/> </s:form> </center> </body></html>list.jsp源码: <% page language="java" pageEncoding="utf-8"%><% taglib uri="/struts-tags" prefix="s"%><!DOCTYPE HTML PUBLIC "-/W3C/DTD HTML 4.01 Transitional/EN"><html> <head> <title>list employee page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <style type="text/css">table border: 1px solid black; border-collapse: collapse;table thead tr th border: 1px solid black; padding: 3px; background-color: #cccccc;table tbody tr td border: 1px solid black; padding: 3px;</style> </head> <body> <center> <h3> 雇员管理: </h3> <br> <h4> <a href="./emp/add.jsp">员工注册</a> </h4> <s:form action="delete" theme="simple"> <table> <thead> <tr> <th> 选择 </th> <th> 编号 </th> <th> 姓名 </th> <th> 电话 </th> <th> 地址 </th> <th> 操作 </th> </tr> </thead> <tbody> <s:iterator value="employees"> <tr> <td> <input type="checkbox" name="id" value='<s:property value="id" />' /> </td> <td> <s:property value="id" /> </td> <td> <s:property value="name" /> </td> <td> <s:property value="phone" /> </td> <td> <s:property value="address" /> </td> <td> <a href='<s:url action="edit"><s:param name="id" value="id" /></s:url>'> 修改 </a> <a href='<s:url action="delete"><s:param name="id" value="id" /></s:url>'> 删除 </a> </td> </tr> </s:iterator> </tbody> </table> <s:submit value="delete" /> </s:form> </center> </body></html> 显示界面如图: 下面是项目的构图:第一点注意的是,搭建出项目,一定会报错,因为Spring 2.5 AOP Libraries中的asm的三个jar包会和Hibernate 3.2 Core Libraries中的asm的ja