数据库
oracle-->数据库管理系统-->SQL、PL/SQL-->Java(JDBC+SQL)
DBA,数据库编程程序员
1.概念导论
1)什么是数据库
有组织和结构存储数据。可以存储
字符、字节、图形、图像等类型数据
DB(数据库):数据集合
DBMS(数据库管理系统):对数据集合进行管理和操作的软件
--Oracle
--DB2
--MySQL
--SQLSERVER
JDBC
1.什么是JDBC
全称Java DataBase Connection,Java数据库访问。
JDBC是Java访问数据库的一项技术
JDBC是SUN推出的Java访问数据库的一套标准。由一系列接口构成。 各个数据库厂商负责提供JDBC接口API的实现包。
开发者只需要掌握JDBC接口的使用,就可以实现对各种数据库的操作,不需要了解开发商的实现类。
XML
1、什么是xml(xtendsible markup language可扩
展的标记语言)?
1)定义
基于文本的通用的数据保存格式。
(1)通用的点的坐标
Point类 point对象(x=10,y=20)
a,序列化
b,数据库表
c,文件
...
(2)数据格式
<point>
<x>10</x>
<y>20</y>
</point>
HTML
知识准备
1、分层:表现层:UI界面(DOS界面、桌面类型、web类型)
业务层:
数据层:文件、Oracle数据库
2、Web类型的应用程序----B/S 类型 打开 Browser,输入 URL,浏览器将请求发送到服务器 服务器得到请求,分析,返回响应 浏览器得到响应,解析(翻译),显示为页面 3、web 学习阶段 客户端技术:HTML+CSS+Javascript---Web 基础 服务器端技术:JSP、PHP、ASP.NET 4、web基础的课程 HTML:页面的创建 CSS:页面的外观 JavaScript:页面的动态效果和交互行为--3
一:HTML 概述
1、超文本标记语言:一种编写页面的纯文本的标记语言,文件以.html或者.htm 为后缀,依靠浏览器运行显示----解释性的语言
2、标记:一些用 <> 括起来的内容,特殊的显示
3、主流浏览器:IE/Firefox/Chrome/
4、浏览器兼容性:符合标准规范,具体问题
CSS
一:CSS 概述
1、CSS:级联样式表(层叠样式表)
2、特征:为页面定义外观的语言,实现内容和表现的分离,多个样式可以合为一个,如果冲突,以优先级为准
二:基础语法
1、语法: 属性名称:值;属性名称:值;比如--color:red;
2、如何应用
方式一(内联方式):<元素 style="" />---将样式直接定义在元素的 style 属性里 方式二(内部样式表):在页面的 head 里的 style 里定义样式
方式三(外部样式表):定义一个单独的.css的文件(定义样式);然后,在页面的 head 里用 link 引入---推荐方式
3、外部样式表的优点:实现内容和表现的分离,提高代码的可重用性和可维护性
---可以准备多套样式---换皮肤/主题 4、样式表,如果重复定义 a、样式不同,取并集 b、相同,按照优先级 内联 > 内部或者外部 c、相同优先级下,以最后定义的为准
javascript
一:javascript 概述
1、什么是 javascript:一种基于对象和事件驱动的解释性脚本语言,嵌入到网页上
2、历史:js代码---W3C定义了标准规范的 js 代码
3、浏览器兼容问题:标准代码,个别情况个别对待
4、怎么写
方式一:直接写在事件里,仅限于代码很少
方式二:写在 head 的 script 里,仅限于当前页面重用
方式三:写在 js 文件里,html 页面的head 里用 script 引入
5、js的特征53………………………………………………..
一种解释性的脚本语言,适用于为网页添加动态效果和交互行为
6、错误:
二:基础语法
1、写法:以 ;结束,大小写敏感
名
2、标识符:以字母、数字和下划线还有 $组成,不以数字开头---不能和系统关键字重3、变量 ***----声明变量,以 var 开始 var i = 1; var s = "mary"; var b = true; js是一种弱类型的语言---变量声明时不需要确定类型,数据类型以赋值为准 4、数据类型 简单类型:string、number、bool 特殊类型:null、undefined var i; alert(i);---undefined 复杂类型:对象 5、(string)字符串类型 var s = "mary"; var s = 'mary';
特殊字符:使用转义---转换为普通字符,解决汉字的问题 "hello\'w\"or\nld" alert("一"); alert("\u4e00"); [\u4e00-\u9fa5] 6、number:并不区分整数和小数 var n = 12; var n1 = 12.34; 7、bool:true(1) 和 false(0) 8、数据类型之间的转换 var n = 18; var name = "mary"; 隐式转换(直接) string + number-- number + bool-- bool + bool-- string + bool-- 显式转换(调用方法)*** xxx.toString() parseInt(xxx); parseFloat(xxx);--确实能转,如果不能转,将返回 NaN NaN---not a number 判断 isNaN("aaa")--is not a number--返回 bool 9、运算符 算术运算符、比较、逻辑、位。。。 特殊一:*** === 严格相等:值和类型 if( a == b) if( a === b)
servlet
1、web开发的背景知识(了解)
b/s架构:
特点:
客户端使用浏览器,服务器端使用web服务器, 客户端与服务器端使用标准化的http协议来进行通信。 优点:
与c/s架构相比,有两个优点:
a,客户端不需要单独安装 b,开发相对简单(因为c/s架构需要自定义协议,开发相应的 通信模块,而b/s使用标准化的http协议,浏览器与 web服务器都提供了相应的通信模块)。
2、什么是servlet?
sun公司制订的一种用来扩展web服务器功能的组件规范。
(1)扩展web服务器功能
早期的web服务器(iis,apache ws等等),只能够处理静态 资源的请求(即需要事先将html文件写好并保存到web服务器 相应的文件夹下面),不能够处理动态资源的请求(即需要进行 计算,然后生成相应的html)。
a,可以使用cgi程序来扩展。
cgi程序可以使用c/c++,perl等语言来开发,但是, 程序比较复杂,而且可移值性不好,性能也比较差, 现在用得不多。
b,servlet可以扩展这些web服务器的功能。
浏览器发送请求给web服务器(apache ws),web服务器 检查请求是否需要计算,如果需要,web服务器会访问 servlet容器,servlet容器会调用servlet来进行计算。
(2)组件规范
1)什么是组件?
符合一定规范,实现部分功能,并且需要部署到 相应的容器里面才能运行的软件模块。
2)什么是容器?
符合一定规范,为组件提供运行环境及相应服务的 程序。
3、如何开发一个servlet?
step1,先写一个java类,实现Servlet接口或者继承
HttpServlet类(一般会使用继承的方式)。
step2,编译
step3,打包(创建一个具有如下结构的文件夹)
appname(应用名称)
WEB-INF
classes(放.class文件)
lib(可选,放.jar文件)
web.xml(部署描述文件)
step4,部署
将step3创建好的文件夹拷贝到servlet容器指定的 某个文件夹下面(比如,如果容器是tomcat,可以拷贝到 webapps文件夹下面)。
注意:也可以使用jar命令将step3创建好的文件夹 压缩成一个以".war"为后缀的文件,然后拷贝。
step5,启动servlet容器,访问servlet
http://ip:port/appname/servlet-url
6、servlet是如何运行的?
比如,在浏览器地址栏输入
http://ip:port/web01/hello
step1,浏览器依据ip,port建立与servlet容器(容器同时 也是一个简单的web服务器)之间的连接。 step2,浏览器将请求数据打包(按照http协议,该数据包 也称为请求数据包)。 step3,浏览器发送请求数据包给容器。 step4,容器收到请求数据包之后,解析该数据包,并将 解析之后得到的数据封装到request(请求数据包)对象上,同时,容器 还要创建response对象。 step5,容器要依据请求资源路径("/web01/hello")找到 servlet的配置,然后创建servlet对象。 step6,容器调用servlet对象的service方法。容器会将事先 创建好的request,response作为参数传递给service方法。 step7,在service方法里面,可以通过request对象获得 请求参数,并进行相应的处理,处理结果会放到response对象 里面。 step8,容器从response对象中取出处理结果,然后打包( 按照http协议,该数据包称之为响应数据包)。然后将 响应数据包发送给浏览器。 step9,浏览器收到响应数据包之后,解析处理结果,然后生成 相应的页面。 http://localhost:8080/web01/hello?uname=jetty ?后是请求参数,其中uname是参数名,jetty是参数值。
JSP
1、什么是jsp(java server page java服务器端页面技术)?
1)定义
sun公司制订的一种服务器端动态页面生成技术规范。
2)理解
a,因为直接使用servlet,虽然也可以生成动态页面, 但是比较繁琐(需要使用out.println语句),并且维护困难 (如果页面发生改变,必须修改java代码),所以,sun 在servlet规范制订之后,又添加了jsp规范。
b,jsp其实就是一个以".jsp"为后缀的文本文件, 该文件会被容器(比如tomcat)转换成一个servlet。
2、如何写一个jsp文件?
step1,写一个以".jsp"为后缀的文件。
step2,在该文件里面,可以添加如下的内容:
1)html(css,javascript)
直接写即可(不用out.println)
2)java代码
a, java代码片断
<% java代码; %>
b, jsp表达式
<%= java表达式 %>
3)指令
a,什么是指令?
告诉容器,在容器将.jsp文件转换成.java文件时
做一些额外的处理,比如导包。
b,基本语法
<%@指令名称 属性名称=属性值 %>
c,page指令
import属性:导包,比如
<%@page import="java.util.*"%>
<%@page import="java.util.*,java.text.*"%> contentType属性:设置
response.setContentType的内容,比如
<%@page contentType="text/html;charset=utf-8"%> pageEncoding属性:告诉容器jsp文件的编码。
因为容器需要读jsp文件的内容(也就是 说,需要解码,某些容器,如果没有该
属性,默认情况下会按照iso-8859-1
去解码,会产生乱码问题)。
4)隐含对象
a,什么是隐含对象?
在jsp文件里面可以直接使用的对象,比如
out,request,response。
b,为什么可以直接使用这些隐含对象?
因为容器会自动添加创建这些对象的语句。
3、jsp是如何运行的?
step1,容器要将.jsp文件转换成.java文件(其实就是
一个servlet类)。
a, html(css,javascript) --->
在service方法里,使用out.write输出。 (out.write方法会将null转换成""输出) b,<% %> ----->
在service方法里,照搬。
c, <%= %> ----->
在service方法里,使用out.print输出。
step2,容器调用servlet来处理请求。
4、转发
(1)什么是转发?
一个web组件(servlet/jsp)将未完成的处理通过 容器交给另外一个web组件继续完成。
最常见的情况:
一个servlet获得数据,然后转发给一个jsp来展现 这些数据。
(2)如何转发?
step1,绑订数据到request对象上。
request.setAttribute(String name,Object value);
说明: name:绑订名称 value:绑订值 step2,获得转发器 RequestDispatcher rd = request.getRequestDispatcher(String uri); 说明: url : 转发的目的地 step3,转发 rd.forward(request,response); request对象的其它和绑订相关的方法: 依据绑订名称找到绑订值,如果找不到对应的 值,返回null。 Object request.getAttribute(String name); 解除绑订 request.removeAttribute(String name) (3)转发的特点 a,转发之后,浏览器地址栏的地址不变。 b,转发的目的地必须是同一个应用内部某个 web组件的地址。
Ajax
1、ajax是什么?
(asynchronous javascript and xml 异步的javascript 和xml)
ajax是一种用来改善用户体验的技术,其实质是 利用浏览器提供的一个特殊的对象(XMLHttpRequest 对象,一般称之为ajax对象)异步地(当ajax对象向 服务器发请求时,浏览器不会销毁当前页面,用户
仍然可以对当前页面做其它的操作)向服务器发送请求。
服务器返回的数据不再是一个完整的新的页面, 而是部分数据,利用这些数据,更新当前页面。整个 过程,页面无刷新,不打断用户的操作。
2、如何获得ajax对象?
XMLHttpRequest没有标准化,要区分浏览器。 function getXhr(){
var xhr = null;
if(window.XMLHttpRequest){
} //非ie浏览器 xhr = new XMLHttpRequest(); }else{ //ie浏览器 xhr = new ActiveXObject('MicroSoft.XMLHttp'); } return xhr;
4、编程步骤
step1,获得ajax对象。
比如:
var xhr = getXhr();
step2,使用ajax对象发请求。 1)发送get请求 xhr.open('get', 'check_username.do?username=tom',true); xhr.onreadystatechange=f1; xhr.send(null); 注意: true:发送异步请求(ajax对象发请求时, 浏览器不会销毁当前页面,用户仍然可以 做其它操作)。 false:发送同步请求(ajax对象发请求时, 浏览器不会销毁当前页面,浏览器会锁定 当前页面,用户不能操作当前页面)。 step3,编写服务器端的处理代码,一般不再需要返回 一个完整的页面,只需要返回部分数据。 step4,编写事件处理函数 function f1(){ if(xhr.readyState == 4){ var txt = xhr.responseText; 更新当前页面 } }
jQuery
1、jQuery介绍
(1)特点
利用选择器查找要操作的节点,并且会将这些节点 封装成一个jQuery对象。通过调用jQuery对象的属性 或者方法来实现对底层节点的操作,这样做的好处有 两个:一是兼容性更好了,另外,代码得到简化。
(2)编程步骤
step1,使用jQuery选择器查找要操作的节点。 step2,调用jQuery对象的方法或者属性。
(3)一个简单例子 first.html
(4)jQuery对象与dom对象如何相互转换?
1)dom对象 ---> jQuery对象
$(dom对象)
2)jQuery对象 ---> dom对象
2、选择器
(1)选择器是什么?
jQuery借鉴了css选择器的语法,用来查找要操作的 节点。
(2)基本选择器 selector / s1.html
#id
.class
element
select1,select2..selectn
*
(3)层次选择器 selector / s2.html
select1 select2:查找所有的后代
select1>select2:只查找子节点
select1+select2:下一个兄弟
select1~select2:下面所有兄弟
(4)过滤选择器
1)基本过滤选择器 selector / s3.html
:first
:last
:not(select) 排除满足select要求的节点 :even :odd :eq(index) :gt(index) :lt(index) 2)内容过滤选择器 selector / s4.html :contains(text) 匹配包含给定文本的元素 :empty 匹配所有不包含子元素或者文本的空元素
:has(select) 匹配含有选择器所匹配的元素的元素 :parent 匹配含有子元素或者文本的元素 3)可见性过滤选择器 selector / s5.html :hidden 匹配所有不可见元素, 或者type为hidden的元素 :visible 匹配所有的可见元素 4)属性过滤选择器 selector / s6.html [attribute] [attribute=value] [attribute!=value] 5)子元素过滤选择器 selector / s7.html :nth-child(index/even/odd) 注意: 下标从1开始。 6)表单对象属性过滤选择器 selector / s8.html :enabled :disabled :checked :selected (5)表单选择器 :input :text :pasword :radio :checkbox :submit :image :reset :button :file :hidden
3、dom
1)查询 dom / d1.html
找到节点之后,可以读取或者修改节点的 html内容,文本,值,属性。
a, html() 读取或者修改节点的html内容 b, text() 读取或者修改节点的文本内容 c, val() 读取或者修改节点的值 d, attr() 读取或者修改节点的属性
2)创建 dom / d2.html
$(html);
3)插入节点
append():作为最后一个孩子添加进来。 prepend():作为第一个孩子添加进来。 after():作为下一个兄弟
before():作为上一个兄弟 4)删除节点 dom / d3.html remove() remove(selector) empty():清空节点 5)数据与行为分离 dom / d4.html d5.html 即不用修改html文件,通过引入外部的js文件来 为页面提供动态效果。 $(fn); fn是一个函数的名称 或者 $(function(){ //当整个页面加载完毕,会执行这儿的代码。 }); 6)复制节点 dom / d6.html clone() clone(true):使复制的节点也具有行为(将事件 处理代码一块复制) 7)属性操作 读取:attr('id'); 设置: attr('id','d1') 或者一次 设置多个 attr({"id":"d1","class":"s1"}); 删除:removeAttr('id') 8)样式操作 dom / d7.html 获取和设置: attr("class","") attr("style","") 追加:addClass('') 移除:removeClass('') 或者removeClass('s1 s2') 或者removeClass()//会删除所有样式 切换样式:toggleClass,有该样式,就删除,没有, 就添加。 是否有某个样式 hasClass('') 读取css('') 设置css('','')或者 css({'':'','':''})//设置多个样式 9)遍历节点 dom / d8.html children()/children(select):只考虑子元素, 不考虑其它后代元素。 next()/next(select):下一个兄弟 prev()/prev(select):上一个兄弟 siblings()/siblings(select):其它兄弟 find(select):从当前节点向下查找所有的后代 (满足select要求的) parent():父节点
struts
1、什么是Struts?
Struts是基于MVC的轻量级框架,主要处理请求分发的问题,重心在控制层和表现层。 --基于MVC:实现了MVC,满足MVC的设计思想。
--轻量:侵入性低,是我们业务代码对框架的依赖程度很小,既很少需要import Struts包。
--框架:基础的代码,引入之后可以减少我们的开发工作量,提高开发效率。
2、为什么用Struts?
1)对比Servlet
--Servlet优缺点
优点:直接、效率高
缺点:业务代码耦合度高,不便于维护
--Struts优缺点
优点:将业务代码解藕,便于维护
缺点:效率低
--Servlet中的MVC与Struts中的MVC,
参考图理解
2)对比其他框架
--健壮性(4*):稳定程度
--易用性(4*):好学、好用
--扩展性(5*):就软件未来而言,将来有更复杂
的需求时,是否有处理方式。
--侵入性(4*):与依赖性/耦合度成正比
3、Struts发展史
1)Struts1,结构简单、易用,由Apache推出。
与Servlet/JSP耦合紧密,导致发展受限。
2)WebWork,技术先进,核心是XWork。
3)Struts2,基于XWork,在此基础上发展形成。
面试题:Struts1和Struts2的区别和联系?
--Struts2与Struts1差别很大,不能理解为Struts1
的升级版本。
--Struts2以XWork为核心,可以理解为WebWork
的升级版本。
*4、Struts2使用步骤,HelloWorld
--使用版本Struts2.1.8
1)创建web项目
2)导包
3)配置前端控制器(filter)
--在web.xml中配置filter
--控制请求分发的控制器
4)创建struts.xml --放在src根路径 --名称必须是struts.xml 5)*创建Action --控制业务流程的控制器 6)*创建JSP 7)*配置struts.xml --体现请求和Action的关系 --体现Action和JSP的关系
*5、扩展HelloWorld
目标:掌握Action与JSP页面数据交换的方式。
1)Action如何向页面发送数据?
--通过EL表达式
2)*Action如何从页面接收数据?
--注入:调用JavaBean的set方法,为其属性赋值 的行为称之为注入。
*a、基础属性注入
--Action中定义基本类型的属性,给它set方法 --表单中,文本框的name="属性名"
--表单提交时,Struts2会自动将表单的内容, 传递给Action里的属性。
--Struts2会自动初始化属性
--注意:Action跳转的页面,EL表达式${属性名} *b、域模型注入
--Action中定义JavaBean类型的属性, 给他set方法
--表单中,文本框的name="对象名.属性名" --表单提交时,Struts2会自动将表单的内容, 传递给Action里定义的对象
--Struts2会自动的初始化对象
--注意:Action跳转的页面,
EL表达式${对象名.属性名}
c、模型驱动注入(了解即可)
--需要Action实现接口ModelDriven
*6、使用Struts2实现NetCTOSS中的资费列表
--准备:分析需求、了解表结构、建表
1)创建web项目
2)导包
3)前端控制器(filter)
4)创建struts.xml
5)创建Action
-->filter->struts.xml->Action
-->DAO-->DBUtil,Entity a、Entity b、DBUtil c、DAO d、Action 6)JSP 7)配置struts.xml
Hibernate
1、什么是Hibernate
1)Hibernate是数据访问层的框架,对JDBC进行了 封装,是针对数据访问层的面向对象的解决方案。
2)Hibernate允许我们直接访问对象,然后将访问
自动转化为SQL去执行,从而达到间接访问数据库 的目的,简化代码开发,提升开发效率。
2、为什么使用Hibernate
1)使用JDBC开发出现的问题
--需要在代码中写大量的SQL
--需要给大量的?赋值
--需要将结果集转换为实体对象
--在SQL中可能会写数据库特定的函数, 移植性差。
2)使用Hibernate可以解决上面的问题
--基本上不需要写SQL,因为Hibernate可以 自动生成SQL并执行
--可以自动给?赋值
--可以自动将结果集转换为实体对象
--Hibernate提供通用的API来访问不同的数据库, 移植性好。
3)补充JDBC与Hibernate的优缺点
a、JDBC优点:
效率高
b、Hibernate缺点:
效率相对于JDBC要低
*3、Hibernate的设计原理
1)Hibernate是采用了ORM的思想,对JDBC进行的 封装。
2)ORM:Object Relation Mapping,即对象关系 映射,指的是Java对象和关系数据库的映射。 --之前使用JDBC开发时,需要知道数据库表和实体 对象的关系,以及字段和对象属性的关系,比如
需要知道COST表和Cost对象的关系。那么这种 关系我们之前是手动维护的,比如: cost.setName(rs.getString("name")); ps.setString(2,cost.getName()); --ORM思想是希望将这种关系的维护提炼出来, 用一个公共的组件描述,那么在我们访问数据库 时,需要使用这种关系时,可以复用基于ORM 思想提炼出来的关系 --正是由于存在这样通用关系的描述,Hibernate 才可以让我们直接访问Java对象,从而通过 关系转换成SQL自动执行。 --Hibernate中将这种关系定义在XML配置文件中。
4、Hibernate体系结构
1)hibernate.cfg.xml
是Hibernate的主配置文件,用于配置数据库连接 参数,以及Hibernate框架参数。
2)实体类
是Java类型,用于封装表中的数据
3)xxx.hbm.xml
是关系映射文件,用于配置表与实体类的关系, 以及表中字段与类中属性的关系。
4)Hibernate底层API
主要是用于解析主配置文件,以及关系映射文件, 然后根据关系自动生成SQL并执行。
5、Hibernate常用API
1)Configuration
用于解析主配置文件的
2)SessionFactory
用于创建Session的
3)Session
是数据库连接会话,相当于是数据库连接。 注意:此Session和HttpSession没有任何关系。
4)Transaction
用于控制事务
5)Query
用于做特殊查询
*6、Hibernate使用步骤
1)导包
2)引入主配置文件hibernate.cfg.xml
3)创建实体类Emp
4)*创建关系映射文件Emp.hbm.xml
--该配置文件必须和实体类同名 --该配置文件必须和实体类位于同一个包下 --在主配置文件中引入该关系映射文件 5)使用Hibernate的API,来进行增、删、改、查
Spring
1.什么是Spring,有什么作用
Spring框架属于一个解决方案框架
可以对其他技术和框架进行整合
应用。
*好处是:将程序中的各个组件和
框架技术进行解耦,便于日后系统
维护,升级和扩展操作。
在SSH中,会将Action,DAO组件都
交给Spring框架管理,由Spring
框架创建这些对象,建立这些对象
关联。
*2.Spring都含有哪些功能
--可以创建和管理程序组件对象
(相当于工厂的作用)
--提供了IoC机制实现组件对象关系的解耦
--提供了AoP机制实现共通组件低耦合的调用。 (例如事务处理)
--提供了对其他技术,例如JDBC,
Hibernate,Struts等框架整合API
--提供了一个Spring MVC框架实现
*3.Spring基本使用
1)创建和管理程序组件对象
--引入Spring IOC开发包
--在src下添加Spring配置文件
--将Bean组件定义到Spring配置
文件中
--(编码)实例化Spring容器对象
利用getBean获取Bean对象实例
*a.控制Bean对象创建模式
在使用时,可以在<bean>定义
部分利用scope属性指定bean对象
采用单例模式创建还是原型模式
创建。
scope="singleton"表示单例模式
(默认值)
scope="prototype"表示原型模式, 每次调用getBean都返回一个新的 Bean对象。
b.控制Bean对象创建时机
scope="singleton"时,Bean对象
是在容器实例化时创建。
在<bean>中使用lazy-init="true"
可以将Bean创建推迟到getBean方法 scope="prototype"时,Bean对象 是在getBean方法时创建。
c.追加初始化和销毁方法
在<bean>中利用init-method指定 一个初始化方法。可以在对象创建 之后自动调用。
<bean init-method="myinit">
创建Bean对象后,会自动执行
myinit方法。
同理destroy-method="mydestroy" 在容器销毁时,也释放单例的Bean 对象,此时会自动调用mydesctory 方法。(该属性仅适用于singleton 模式的Bean对象)
2)Spring的核心IoC容器
a.IoC概念
Inversion of Control 控制反转
或反向控制(控制转移)
2004 Martin fowler提出的IoC思想.
IoC思想:两个组件之间调用(例如A调用B) 原有方式是A负责创建B对象;现在变成了 B对象由第三方框架或容器负责实例化, 然后给A对象注入。即A对象获取B对象的 方式发生了反转。
IoC技术方案有两种:依赖注入和依赖查找 Spring采用依赖注入技术实现IoC控制。 依赖技术主要以下两种方式:
--set方式注入(推荐)
在A中定义setB(B b),接收传进来的B对象 --构造方式注入
在A中定义构造方法 public A(B b){}
DI:Dependency Injection依赖注入
b.IoC使用方法
--编写Action,定义到Spring配置中 --编写DAO,定义到Spring配置中
--在Action中定义DAO接口类型变量和 setter方法
--在Action的<bean>配置中使用下面 配置
<bean id="addCostAction"...> <property name="属性名"
ref="要注入的Bean对象id值"> </property>
</bean>