1、学习Spring Spring框架学习文档一、基于B/S的典型三层架构 展现层 业务逻辑层持久化层WebWork/StrutsSpringHibernateAction,FormBean,配置档,模版页面IOC容器AOP,hibernate的支持,事物管理映射档,Hibernate界面,DAO模式2、问题的提出例子:你做了一个网站,其中要用到一些业务逻辑;登录(返回boolean),注册(返回boolean),查询(返回HashSet)。这个模块经常被改变,或者为不同的业务服务而切换,你怎么样在Action里面调用这个模块?new 一个对象 方案1:将所有可能出现的切换情况都拷贝到Action
2、目录下。 方案2:面向界面编程,并且用到工厂。 Spring的作用:管理业务逻辑IOC 1.这种思想可以很好的实现同类不同质的模块切换。 2.开发具备属性的程序。 3.可以方便的通过配置档改变模块行为,动态注入属性值。 4.模块组装注意:只关注配置档的修改,不需要知道他具体的调用实现三、关于Bean标签:1.Bean的初始化函数和消亡函数这些函数会自动调用2.Bean的构造函数注入(不要参数的名字,但要类型) 123 456 注意:这个功能可以充分让IDE给我们做.3.Bean的 singleton(单态)注意:构造函数和初始化函数只调用一次,4.Bean的延迟加载 延迟加载(lazy-ini
3、t)只对于单态的bean,非单态的bean,本来就是延迟加载。 写了三个例子: 1.spring_demo_1 : 是简单的spring测试 2.spring_demo_2 : 是对spring的优化写法 3.spring_bean_tag :对Bean标签的练习4、Spring与Struts的整合1.场景:Struts登陆,调用Dao,要求Dao内能够显示登陆信息。2.整合问题1: 在web工程下,使用ApplicationContext context = new FileSystemXmlApplicationContext(/WEB-INF/applicationContext.xml
4、);这样读取配置文件是错的。解决方法:在web.xml中配置:context org.springframework.web.context.ContextLoaderServlet1这样就会自动读取/WebRoot/WEB-INF/applicationContext.xml,如果自定义文件名,则还需要增加: contextConfigLocation /文件路径通过WebApplicationContextUtils.getWebApplicationContext(application);得到Bean另一种方法:用Listener接口(Servlet2.3以上的版本使用)1.建立一个W
5、EB项目,在web.xml中加入 contextConfigLocation /文件路径 org.springframework.web.context.ContextLoaderListener通过WebApplicationContextUtils.getWebApplicationContext(application);得到Bean补充:在spring框架中,也有一个专门为struts服务的action,这个类是ActionSupport。它继承Action,它有lookupDispatchActionSupport等子类。详细看spring的API。2.使用ActionSupport
6、后,就不需要WebApplicationContextUtils.getWebApplicationContext(application),需要得到WebApplicationContext用这个ActionSupport。3.struts的优化写法,将 strut中action改写,并在spring中配置文件中配置就可以第一种方式:全权委托(最常用的方法) 第二种方式:将Action的生成在这里截取掉,命令其在Spring框架中生成 1.让Struts框架认识Spring框架配置文件,配置插件 2.用org.springframework.web.struts.DelegatingActi
7、onProxy类来截获Action的生成.代替struts中的type值。在struts配置文件中添加插件 第三种方式:修改spring配置文件:常用bean的name和struts配置文件中action的path相同, 将action完全交给spring去做注意:这时就不能使用action的ActionSupport类,而使用Action类。Web.xml里面也不需要像前面二种一样,无需注册spring框架一些配置,。Action的默认是单态的,我们可以改变他的状态singleton=false。增强action的灵活性。还有第四种整合方式:不常用配置RequestProcessor来截获
8、,type还是用配置action类, 但是在struts-config.xml加入:5、Spring与数据库层的整合场景:编写一个dao传人一个姓名的模糊资料,能够返回该姓名所对应的所有学生资料(struts完成)。步骤:1.建立一个学生信息类(Student.java)2.增加struts框架支持,建立处理学生信息的Action,Actionform和相关页面3.建立一个接口类:一查询学生信息的集合的方法Public ArrayList queryStuByName(String sname);4.创建一个StudentDao实现接口类,里面有三个方法( 连接数据库的方法, 实现接口的方法,
9、关闭连接的方法)5.增加spring支持,配置相关信息,将接口类型注入Action中,修改struts配置文件的action中的type值(org.springframework.web.struts.DelegatingActionProxy)截获,添加插件: 一:Spring和JDBC整合:1.在Spring里面我们可以配置数据源,相当于封装了数据库连接的基本信息并且进行了优化 。 使用这种方式需要导入mons.dbcp.BasicDataSource包,可以通过MyEclipse中导入!步骤: 1、在applicationContext.xml中新建一个DataSource数据源,2.在
10、StudentDao中添加 private DataSource dataSource;属性,并且在 注入。StudentDao直接使用DataSource.getConnection();在这样就得到了conn连接;注意;这样做完后感觉还是要初始化数据库连接,优化写法采用提供了模版(Template)来简化数据库操作。使用jdbcTemplate,改进前面的代码:1.在原来的StudentDao中Connection conn可以不要了,直接实用化DataSource dataSource,如下:传人dataSource JdbcTemplate jt = new JdbcTemplate(
11、dataSource); List stuList = jt.queryForList(sql);Jt的很多相关操作,详细参考api;注意:这样的话stuList里面放的是什么? 每一个学生都是一个元素,放入HashMap,List内存的是HashMap,所以改变在前端显示的时候,需要取出列和值。 2.还有一种方法更加改进代码的难度:使用JdbcDaoSupport类,里面有二个方法得到模版(getJdbcTemplate)和getDataSource和setDataSource的方法,改进代码,在StudentDao继承JdbcDaoSupport类,就不需要数据源属性DataSource
12、dataSource,直接在使用; JdbcTemplate jt = this.getJdbcTemplate(); List stuList = jt.queryForList(sql);二:Spring和hibernate整合:1.加载hibernate框架支持,进行相应的设置,为Student类描述一个映射文件。2.有了hibernate框架后,原来的属性 就不需要了,数据源的配置 也不需要了,因为hibernate中带有数据源的配置。3.在applicationContext.xml点击右键新建Hibernate SessionFactory。会有三个值需要设置,由于名字可以自己随便
13、起,数据源的id,数据库的方言,都是通过hibernate所以不用写,只需要让spring框架认识hibernate框架就行,找到hibernate.cfg.xml加载配置。4.在StudentDao中创建 private SessionFactory sessionFactory;增加get和set函数,并且装配到applicationContext.xml中 在StudentDao中则改为private SessionFactory sessionFactory; public List queryStuByName3(String sname) String hql = from Stu
14、dent where stuName like % + sname + %; HibernateTemplate ht = new HibernateTemplate(sessionFactory); List sList = ht.find(hql); return sList; public SessionFactory getSessionFactory() return sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) this.sessionFactory = sessionFac
15、tory; 5.前端显示要做一些修改:注意;这种方法的完成其实就是把hibernate的配置文件注入到spring框架中使其认识,有hibernate生成数据源一些信息,再通过spring生成SessionFactory,就可以对数据库进行相关操作.6.其实还可以对这种方法进行修改 1.在StudentDao中继承HinernateDaoSupport类,在这个类通过一些get方法得到想要的方法。 2.对上面中的属性sessionFactory 可以进行省略,通过getSessionFactory得到工厂, public List queryStuByName3(String sname) S
16、tring hql = from Student where stuName like % + sname + %; HibernateTemplate ht = this.getHibernateTemplate(); List sList = ht.find(hql); return sList; 这就是对上面与hibernate整合框架的一些简单优化。剩下的问题:如何在spring配置文件中配置对数据库操作的事物?写一个完整的例子:struts、spring 、hibernate框架结合 模拟一个银行系统:1.建立一个表:T_CUSTOMER(ACCOUNT,PASSWORD,CNAME
17、,CBALANCE)2.Login.jsp:输入帐号密码,提交,如果成功,则跳转到达操作页面register.jsp:输入账号,密码,确认密码,姓名,提交,可以注册,余额初始为0,3.Ope.jsp:操作页面,上面显示欢迎xxx来到银行,你的余额是?,底部有三个链接,存款,取款,退出。4.Cunkuan,jsp:表单输入一个数字,能够将余额增加这个数字,存款成功,自动跳转到ope.jsp。5.Qukuan.jsp:表单输入一个数字,能够将余额减少这个数字,取款成功,自动跳转,自动跳转到ope.jsp,如果不够取,显示:取款失败,6.要求在页面上有一些错误提示。步骤:1、用struts框架把上面
18、的写做了(action.jsp,form),自动生成完成2、导入spring框架对业务逻辑进行管理,使其自动注入,在注入之前要使sturts的配置文件认识到spring的配置文件(通过插件,修改action的type值),把请求代理截获,并在spring中配置文件进行注入。3、导入hibernate框架改进代码量,先在spring配置文件中认识hinernate 的配置文件,点击右键生成Hibernate SessionFactory,并注入到DAO中, 4、在DAO中继承HinernateDaoSupport类,使用其sessionFactory属性,然后得到HibernateTemplat
19、e模版,三个框架之间组建的之间的关系!项目实施安排:1、提取项目需求中所有的用例(动作)2、将用例按照实体(静态的内容)分类,将每个用例的详细信息描述出来。3、根据实体大致可以设计数据库:实体表,关系表一般使用的方法4、原则上,一个用例就是一个Action,有表单就有设计ActionForm,Jsp根据实际情况设计5、适当情况下,考虑使用DispatchAaction来减少模块个数。6、设计公用模块(公用类,自定义标签)7、原则上,根据第2步的分类,建立Dao,所以Dao前面名字一般都是名词,适当设计po类来支持Dao8、设计一些辅助的工具,如果过滤器,插件等等注意技巧:模块尽量降低耦合性,分工后尽量减少代码模块之间在开发时的影响。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1