资源描述
区理)火孝城市学院CITY COLLEGE,KUNMING UNIVERSITY OF SCIENCE AND TECHNOLOGY实训报告课程名称框架技术专业班级计科1211学 号_07 学生 查勇超 指导教师松彦 实训地点 明轩点3052015年 6 月18日目录1 .实训目的12 .框架技术简介 11 .介绍12 .知识点13 .图文介绍23 .具体知识点31 .实例化容器31.1 新建工程,导入 jar包31.2 新建Spring配置文件 31.3 新建类 Test1 41.4 运彳亍 testInitContext()方法42 .禾U用 Spring 容器仓U建 JavaBean对象52.1 用构造器来实例化的方式配置: 52.2 使用静态工厂方法实仞化的方式配置。 52.3 使用实例工厂方法实仞化的方式配置。 53 .如何控制Bean实例化73.1Bean对象的创建模式73.2Bean对象的初始化和销毁 93.3Bean对象的创建时机 123.4指定bean依赖关系 124 .禾U用 Spring 实现 bean属性 setter方式注入 125 .利用构造器参数实现依赖属性的注入126 .利用Spring的自动装配功能实现自动属性注入 137 . 给 MessageBean注入参数值 138 .组件扫描144 .一些常见问题155 .学习总结16一.实训目的框架技术是当今 web开发的主流技术,也是一个比较成熟的 web开发技术,使用这个技 术能够加快web开发、重用代码,并且开发出的代码可读性较好,逻辑性较强,所以学习框架是很有必要的。本次课程的目的是让我们了解并使用框架进行web开发。从而熟悉框架。二.框架技术简介1 .介绍Spring是一个开源框架,它由 Rod Johnson创建。它是为了解决企业应用开发的 复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度 而言,任何Java应用都可以从Spring中受益。Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。轻量从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1M哆的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。 此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于 Spring的特定类。控制反车专Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了 IoC, 一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。 你可以认为IoC与JNDI相反一一不是对象从容器中查找依赖, 而是容器在对象初始化时不等对象请求就主动将依赖传递给它。面向切面Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计( auditing )和事务(transaction )管理)进行聚性的 开发。应用对象只实现它们应该做的一一完成业务逻辑一一仅此而已。它们并不负责 (甚至是意识)其它的系统级关注点,例如日志或事务支持。容器一一Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种 容器,你可以配置你的每个bean如何被创建基于一个可配置原型( prototype ),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例一一以及它们 是如何相互 关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。框架Spring可以将简单的组件配置、组合成为复杂的应用。在 Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。2 .知识点实例化容器、利用 Spring容器创建JavaBean对象、如彳S控制 Bean实例化、注入 技术、组件扫描等。而除开spring还有mybaits技术,mybatis是又JBDC的整合,是使用另一种方式使 用JDBC ,后期还会将 spring和mybatis整合。框架技术3.图文介绍实例化容器如何控制Bean实例化setter方式注入自动属性注入组件扫描利用Spring容器创建JavaBean对象构造器参数实现依赖属性的注入.具体知识点1 .实例化容器1.1 新建工程,导入jar包新建名为 SpringIoC_Day01_Part1的web工程,在该工程导入如图所示的5个Spring 相关 jar 包。,Spring IcaCDajfOl.Parll.0概E crg.tarena.dao田 crg.uirena-test J appli cab o-RConteMtjxml b d J RELibrary QdkL&.0.25.xS6b * Java EE 5 Libraries * M Rferencl Ubrsrieti i corrme3n- loggrng ari spr i ng-beant-3-2-ELRE LEASE jara spring-co ntext主上mfLEAS EJ,rI 5中;n g-g r*-3.2r8.RELEASEarQ spHriig-expressicri 3.2-B, RE L EASE jar,OUflO ,上一WebRoot1.2新建Spring配置文件新建Spring配置文件applicationContext.xml。该文件名为 Spring默认的配置文 件名,也可以自由定义名称,如图所示: Spri n-gloC,Da rtl 4 src出 org.tereni.daiD 由 org.tarend.tetappli atioinCiCHTte xtsml4yMe Lbfry (jkL6. 0.25.x 86j 3 Java EE 5 Libraries B-. Referertced librariesCommons - logg-ing .jar sprirhg-b e2.8BRE-LE ASE 1PSpvinq.6 .KLEAEjrspring -core - 342.8 RE IE A&E JrSpring-prn3N&RE LE AS E rfc JUfwt 4 WebRootapplicationContext.xml文件中的代码如下所示:?xb Tarsier rncodinj=万一丁”A 匚:.二口:.、-E -J.; :一: Ai,- : L t; : . bi UE1sm titta icfraHali /Ehn/oMUiT. m!mi jflx?*hrrpt/wv.fc. Kf/jgtMfl/jklK*MIlLiC - Jre- L-J -11 j. . k Lo _ JULbEiS i 11上 3上山二 i; r L . LLJklld .ZnlziS jpfl k = ;Fsttir:TranrKirc. ctf rb2. lilt - jr3nat : sreoaLoeati rnSt In: - w.注kk制fruNKri ore.* kchm b-ar-s- bt ipwv. x prx-o-$f-ribzw.上/bikki j 屯工工 3工h*=Eu jdbc spEiiaE-J. 2. xsdhttp! htjl spri:jfranesort ctf:二hH;: http!/. tcw_ spriEiE-frEEerzrk. org. schmE. jee -5pr:E.a_j-3_.2. isdnitji; twi:. irf gf rcrr/Frheea/tT 卜tp JFprir5fTai/iiTt. ctw卜tsf FprTncTi-3r 2- ledIt in: vn, isr l nf cimwtL qe a,E4htKUtaL jpa lit tp : /mv.工 prifi uum工工 口工鼻f 工工 Inu. ci-t % p-l-eptib i;p4. 3-工立3 C/bMW1.3新建类Testi新建类TestCasg在类中使用 Applicationcontext的方式实例化Spring容器。TestCase在工程中的位置如图所示:* , * SpringIo,Dayl.Pflrtigg,tar-d由* 曲 wg,t*rtM,tf才,工/手。1 :J w西店.在TestCase类中添加测试方法testInitContext(),代码如图所示:pnDlio olcB H-”S (/*胴阻实冽化5门门口皆需水网*/pulvl ic vu kd ttnt工后工匚c口si工亡乱。l】t Stxma conf 且金目JL工匕工己至匕on匕2:xt,3cml*;XXc-iOit XqnCditext d。 ”4b Cl-ajs a FtrhJCAlAjpplX-cz&t lonCorat e jetumE); Syacem. 5t .puiRCln (ac):1.4 运行 testInitContext()方法运行testInitContext()方法,控制台输出结果如图所示:PiroWem/ssi Fac nxnLiAjii l ut % a同ncex s 3. X&lSeniDeftzoaBealeload专 fappXi c-S C-l C sCCeat - .K2l pe zt * Ie: f a Ui t;L i ia 1 eS eanF actL 2.利用Spring容器创建JavaBean对象2.1 用构造器来实例化的方式配置:用构造器来实例化的方式的配置代码如下:bean标记中id属性calendarObj1用于定义bean名字,是程序代码中获得 Spring 管理bean对象的标识,这个名字不能重复,class用于指定创建对象的类 GregorianCalendar, Spring会自动的调用 GregorianCalendar类的默认构造器创建 bean对象实例.2.2 使用静态工厂方法实例化的方式配置。使用静态工厂方法实例化的方式的配置代码如下:bean标记中id属性calendarObj2用于定义bean名字,是程序代码中获得 Spring 管理bean对象的标识,这个名字不能重复,class属性用于指定创建对象的工厂类 Calendar, factory-method属性用于指定创建对象的静态工厂方法getInstance, Spring会自动的调用工厂类Calendar静态工厂方法 getInstance创建bean对象实例.2.3 使用实例工厂方法实例化的方式配置。使用实例工厂方法实例化的方式的配置代码如下: 这里定义了两个bean,其中一个 bean calendarObj3是用于创建 dateObj对象的实例工厂.另外一个bean标记中id属性dateObj用于定义bean名字,是程序代码中获得 Spring管理bean对象的标识,这个名字不能重复,factory-bean属性用于指定创建对 象的工厂对象calendarObj3,前面定义的一个 bean, factory-method属性用于指定创 建对象的工厂方法 getTime, Spring会自动的调用工厂类 Calendar静态工厂方法 getInstance创建bean对象实例.步骤一:配置 applicationContext.xml,增加Bean对象创建声明代码如下所示:1. 2.3. 4. 6. 7.8. 9. 10. 12. 步骤二:在TestCase类中增加测试方法testCreateBeanObject,测试Spring创建对象的结果先创建Spring容器又象,再调用getBean方法获得Spring创建的对象实例,并且 利用输出语句测试对象是否存在.这个代码中要注意:getBean方法的参数必须 是上一个步骤中定义的 bean标记上的id属性的值,否则会出现运行异常.代码如下所示:1. /*测试Spring支持的多种JavaBean对象创建方式*/2. Test3. public void testCreateBeanObject()4. 实例化Spring容器示例5. String conf = applicationContext.xml;6. ApplicationContext ac = new ClassPathXmlApplicationContext(conf);7.8. /1.用构造器来实例化的方式。9. /利用 Spring 调用构造器 GregorianCalendar 创建 Calendar 实例.10. /Calendar cal1 = (Calendar)ac.getBean(calendarObj1); / 方式 111. Calendar cal1 = ac.getBean(calendarObj1, Calendar.class); / 方式 212. System.out.println(cal1:+cal1);13.14. /2.使用静态工厂方法实例化的方式。15. /利用Spring调用 Calendar的静态工厂方法getInstance()创建Calendar 实例.16. Calendar cal2 = ac.getBean(calendarObj2, Calendar.class);17. System.out.println(cal2:+cal2);18.19. /3.使用实例工厂方法实例化的方式。20. 利用 Spring 创建 GregorianCalendar对象作为工厂,调用 getTime()方法创建Date类型对象实例.21. Date date = ac.getBean(dateObj, Date.class);22. System.out.println(date:+date);23. )步骤三:运行测试方法测试bean实例化控制台输出结果如图所示:3.如何控制Bean实例化3.1Bean对象的创建模式新建ExampleBean ,该类在工程中的位置如图所示:* 1. 5 prng_yC I. ?flrC I二 1*,目 agUrg,Tao EA4mpErS-rn LjflV*j 1。mCEf# &OV rc 甲JiMr口闻工加上J UterDAOjawaii crgJ4ferenity由 (rgJTfr.r,c,JJ Tt sue jit javappIicAtionCartt 乩!(巾卜 耻但包益生套一处】 Jnv4 EE 5 L;br”;e. Rf在TestCase中新建测试方法testExampleBean(),在方法中从Spring 中获取两个ExampleBean类型对象,通过比较操作 符“=进行比较, 如果输出结果为true,则表明两次获取的是同一个对象,即创建对象的 方式单例模式,代码如图所示:运行testExampleBean(方法,控制台输出结果如图所示:控制台没有输出预期的销毁ExampleBean对象”的结果。原因在于 applicationContext.xml文件中设置的destroy-method属性仅仅对单例模式 而乍用,在prototype模式下没有意义。修改applicationContext.xml,使用singleton模式仓建Bean对象,代 码如图所示:3 gpt =”占工门?工u1thcd= inltJejtrpy 运行testExampleBean()方法,控制台输出了 销毁ExampleBean对象”,如图所在顶级的beans/元素中的default-inkmethod属性以及 default-destroy-method属性,可以为容器所有bean才旨定初始化回调方 法以及指定销毁回调方法,代码如图所示:3oaln3= ht tpr/vvw* sprltigfrwcvGrk * or7/icTiem /Jmiu-*1 ml n,: nsl= .力ednj Jktp: Z/v + sftHittqE二十 卜 t tp ; / / vw - s-pm壬= a= - hHT上 x aH j 5 =&/-con t h/ 二 11:尸:/ srvv . 三产:工二q才h?tEj/ / vvw spx 5TJ1 sh*yri . -dkr h fie r vw. rrhttpi/wtf F至pringj-aresrt.er(j/hsflu/jee http:/ww.hrtp;/wf/v R fp r i n af r#r: 5 or i .or.s ch er t / rx htspriJicfrAJnsfftrrpr/vvv.#pringfori*org/JcJi/daza/http:/v.fpruigf de ffil c-im t1w deftjlr-de5tray-r.ethocf=dMtXoywj 并KZ- M jj*,手 *入8*晨/3.2Bean对象的初始化和销毁修改ExampleBean类,加入方法init和方法destroy,代码如下 所示:1. package org.tarena.dao;2.3. public class ExampleBean 4.5. public ExampleBean()6. System.out.println(实例化 ExampleBean);7. 8.9. public void execute()10. System.out.println(执行 ExampleBean 处理)11. 12. public void init()13. System.out.println(初始化 ExampleBean 对象)14. 15. public void destroy()16. System.out.println(销毁 ExampleBean 对象);17. 18. 修改applicationContext.xml,布望在bean对象创建后自动调用 init()方法,代码如图所示:.rg- C4re4 rda?rXx2GB4n3 gpe= ro cotype 口工t Fethod=匕十/bMn运行testExampleBean()方法,自定义的初始化的方法在对象被创建后调 用,如图所示:修改applicationContext.xml ,希望在 bean对象销毁前自动调用destroy方 一肖六脩六值实也买初备.法,bean对象在spring容器关闭的时候被销毁,代码如图所示:id=ri*力讨.T力士白在J + /占+E*启叶工&E也占力xccpe = rat&type-nit dejtroy-Mthod- dertroy1:修改testExampleBean()方法,关闭 ApplicationContext对象,代码如图所/,苴毗Bem 甥餐的作用曝*,flTest.Kabila void息电案同5aL专制代。I实制化如rg中存香示例string eonc *applici.tiarkCcn:txc. jueI*;Mpl工*ti营口二口门三菖t 4? - rw* ClconOr衣 IRxAig 电Ex&fileBean. beam &a. gec-Baa ekMtn 1 tBeaa, Exaim:leaftnTciaAa) rExMEpLtBetzi be *2 - CHfccBri.(*cx wplcBchrSyatefi. jiut .FriAtln 后电4g23/关闭 普茬,SntdE-C WlplL4LLCnG&neXt kSSXJ方色Abfltr*.ctftppl kceCQntMt ct. 已t*.已le3餐11:4-_ . *JIM:/ 广_广,控制台没有输出预期的销毁ExampleBean对象”的结果。原因在于applicationContext.xml文件中设置的 destroy-method属性仅仅对单例模式起作 用,在prototype模式下没有意义。修改applicationContext.xml ,使用singleton模式创建 Bean对象,代码如 图所示:bean idexjracZflean 。10口,= .。工g. 七dd。.套廿,门”jccct= sifijlcccn* 门上-黑七:hod=:八二匕deJtrcy-nie;/运行testExampleBean()方法,控制台输出了 销毁ExampleBean对象”,如口 CoM44,n也kPv&giwn KIm1vvAidkL7jO40Ubij*wtw., 六月 1,2014Torf- spsingf zityo? k.eost*ut, sijpp*rt,O值总;卜*。鼻 0/jrrufvqtClf P*vl*六目 12P 5014 4.:1&e9 牛。gcpngF工3=d“=8皿e-w / e/1 值息:KML M自 dfini tians t芸g clf path hmuej【g 六月 1 九 加 14 4,&4小下午打 pifjLbgFEimanE hJb* Jt噌t方wy. u( 僧患,Pm*c* 希口谆 q *isglht in ctf. tpnn9 f;hro rk.bti.Fr 共例.E* 诩簟J“V*/六月12* 3014 4116:3-Fpjrx:Dqf-*BHMisr k. FdEtcait. aiapporx,M fife :e. rpr 1 oqfradcwark.qcncjcr. jppor.C1 *3Vaz hKalT六月IS. 5 j1 4 4 r 1 tQT. apfLEigif e-aamar k.b-san* . faeEoxy. smIEseyisj aifiglitSB-s isi占e寸弟.营土骼寸工?却醍1售京*日白巴。理在顶级的beans/元素中的default-init-method属性以及default-destroy-method属性,可以为容器所有 bean指定初始化回调方法以及 指定销毁回调方法,代码如图所示:shea*/d苞。i/jp1ali/X31: a cheisuiLocaXxo n* *4Is tip;/w* 4 Mp fxngfrdne * crgr/ jche-A / 2 u 餐门工 上已亡p = New . 3P工工麻 工 % t F 二 / / VW - E Jr上二f kOF* 4 O h:7 S 二卜三工近 / iC-OTl t SrX t b 二七尸; / yw* B =工 元三 ” httpi/vbwp spri.njf.&e”eheiad/jdbo h”F s.F”.sptingf thbj酬修丁: . 口rg/sriisjEj /jh.t tpr / vvv + $pr-inqfjrghttpiffvvv. sprjngf=:.orj/jht匕户*5 = sprij)3ft44 ft rrpi / vvv. fprjngfra-tf. org/h*J=*/dar/jj3d ht pi/vv v. prir.gt defailt-in i-cz=ttiod= inif defajlc-dcstrcy-tttiod=af*SErtvwi 1.38 ean对象的创建时机通过设置配置文件属性lazy-iMt=true,可以改变Spring容器创建对象的时机1.39 定bean依赖关系可以设置一个组件依赖另一个组件,在创建被依赖的组件的同时,也创建了那个依赖的组件。4 .利用Spring实现bean属性setter方式注入JDBCDataSource类封装了管理数据库连接的方法 getConnection(), 这 个方法在执行之前需要数据库连接参数:数据库驱动,连接URL,用户名和 密码,禾|用Spring实现JDBCDataSource寸象的仓建,再使用setter注入的 方式将数据库连接参数注入给JDBCDataSourca这样就可以正常的调用getConnection()方法获得数据库连接了。禾用 Spring 酉己置文件 applicationContext.xml 酉己置 bean, 并且 setter 参数注入JDBCDataSource勺连接参数,这样Spring在仓J建JDBCDataSource 对象以后就会自动化的调用setter方法注入数据库连接参数.步骤和之前的差不多,在最后的配置文件中需要加上响应的配置。5 .利用构造器参数实现依赖属性的注入Spring支持利用构造器注入参数实例化Bean方式。只要在Spring的配置文件中增加构造器参数constructor-arg, Spring就会自动的调用有参数 的构造器创建bean对象实例,整个过程无需程序编码只需要配置 applicationContext.xml文件即可,代码参考如下:?6 .利用Spring的自动装配功能实现自动属性注入 这个配置也不是很常用,就不做具体的介绍。7 .给MessageBean注入参数值Spring可以通过配置文件为bean注入多种类型的属性,MessageBean类用于演示Spring的多种类型数据的注入方式,这些类型数据和注入方式包括:1 .注入基本值。2 .注入Bean对象。3 .直接集合注入。4 .引用方式集合注入5 .注入Spring表达式值。6 .注入null或空字符串。比如:public class MessageBean private String moduleName;private int pageSize;private String username;private String password = ;public String getUsername() return username;public void setUsername(String username) this.username = username;public String getPassword() return password;public void setPassword(String password) this.password = password;public String execute()System.out.println(moduleName=+moduleName);System.out.println(pageSize=+pageSize);System.out.println(username=+username);System.out.println(password=+password);System.out.println(-List 信息如下-);return success;public String getModuleName() return moduleName;public void setModuleName(String moduleName) this.moduleName = moduleName;)public int getPageSize() return pageSize;)public void setPageSize(int pageSize) this.pageSize = pageSize;)修改applicationContext.xml文件,为 MessageBean的四个属性注入基本 参数值,代码如图所示:帙naxe-* rtIuf茜病r/frnpt 中工勺pc二二丫 nane*pd9eSi Yalyc=5XpxQpftity property na3ae=U5ernaJGF 二占二士二与匚。亡pet匚 8.组件扫描-在applicationContext.xml中开启组件扫描一在组件类定义前追加Component,Service,Controller, Repository,Named (第三方标准需要引入额外jar包)-如果需要注入,可以在接收方变量或 set方法前添加Resource /属于 javaxAutowired / 属于 springInject属于第三方标准四.一些常见问题1.输出中文问题,什么时候用response去设置,什么是时候用request去设置!2.Servlet中用out.println()进行输出,过程大概是怎样的!3 .区分servlet中调用方法时,什么时候用response,什么时候用request o4 .JSP设置中文。5 .Ajax的同步、异步解析。6 .明白DAO中的责任关系。7 .JS、CSS既要外部文件,又要在页面中抒写,注意顺序。五.学习总结前面的Servlet是整个Java课程中最重要的一部分,前面所有的知识在这里都可以得到 应用,面向对象思想,抽象类与接口,只要你的web项目中需要它,就可以应用上去;这里也是把数据库知识结合的地方,数据库的增删改查语句需要些写在dao里面,语句抒写是否正确或者效率的问题直接影响程序的执行,在明白业务逻辑后,要用适合的SQL语句,得到结果。那个时候的servlet没有任何框架的知识,随着框架的学习,使得web开发进入了一个新的阶段。框架,是开发 web的另一种方式,学习了框架之后,更加发现代码之间的美妙契合,xml文件中的设置会悄悄应用到代码中,使代码发生变化,这种变化,相对于之前web的编写方式更不显眼,所以,使用框架一定程度上增加的调错的难度。另外,框架的核心,说起来也是配置文件的抒写, 配置文件中的设置决定了代码的走向, 许多效果,代码的整合都是通过配置文件实现的, 所以,要很好地掌握框架,就要熟悉配置 文件的配置。
展开阅读全文