第一篇:Java反射技术总结
Java反射技术知识点总结
1、反射:
反射是指程序可以访问、检测和修改它本身状态或行为的一种能力。
2、Java语言的反射机制主要提供以下功能:
在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法 在运行时调用任意一个类所具有的成员变量和方法 生成动态代理
3、在java.lang.reflect包当中提供了实现反射机制的类:
Class类:代表一个类。
Field类:代表类的成员变量,也称为类的属性。Method类:代表类的方法。Constructor类:代表类的构造方法。
Array类:该类提供动态地生成和访问java数组的方法。
4、Class实例: Class类和其它的类一样继承自Object类,Class对象包含了与类相关的信息。
事实上,Class对象就是用来创建类的所有的“普通”对象的。类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并且编译了一个新类时,就会产生一个Class对象(恰当地说,该对象被保存在一个同名的.class文件中)。在运行时,当我们想生成这个类的对象时,运行这个程序的java虚拟机(JVM)首先检查这个类的Class对象是否已经加载。如果尚未加载,JVM就会根据类名查找.class文件,并将其载入。
一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。这些对象都会对应于同一个Class对象。
要想使用反射,首先需要获得待处理类或对象所对应的Class实例。获取Class实例的四种方式: 第一种:调用类本身的.class属性。Class c =String.class;第二种:调用对象的getClass()方法获取该对象的Class实例。
String str = “abc”;Class c = str.getClass();第三种:使用Class类的静态方法forName(),用类的全名(包名.类名)来获取一个Class实例。
Class.forName(“java.lang.String”);
第四种:对于基本数据类型的封装类,可以采用.TYPE来获取相对应的基本数据类型的Class实例。
Class intClass = Integer.TYPE
5、Class类的其它方法: Object newInstance()
使用Class对象生成该类的新实例。它调用了缺省(无参数)的类构造方法创建一个新的对象。所以使用newInstance()方法创建的类必须有一个无参数的构造方法。
boolean isInstance()该方法提供了一种动态地调用instanceof运算符的途径。Class[] getInterfaces()该方法返回Class对象的数组,这些对象代表的是某个Class对象所包含的接口 Class getSuperclass()该方法获取该Class对象的直接基类。这个方法自然也是返回一个Class引用,所以可以进一步查询其基类。这意味着在运行时,可以找到某个对象的完整类层次结构。
6、获得类的构造方法可以调用Class类对象的以下方法:
Constructor getConstructor(Class[] params):获得类的指定参数类型的公共构造方法。Constructor[] getConstructors():获得类的所有公共构造方法。
Constructor getDeclaredConstructor(Class[] params):获得类的指定参数类型的构造方法(与访问级别无关)。
Constructor[] getDeclaredConstructors():获得类的所有构造方法(与访问级别无关)
7、获得类的成员变量可以调用Class类对象的以下方法:
Field getField(String name):获得指定的公共字段(属性)Field[ ] getFields():获得类的所有公共字段(属性)Field getDeclaredField(String name):获得类声明的指定的字段(与访问级别无关)Field[ ] getDeclaredFields():获得类声明的所有字段
8、获得类的成员方法可以调用Class类对象的以下方法:
Method getMethod(String name, Class[ ] params):获取包含指定的参数类型及名称的公共方法 Method[ ] getMethods():获得类的所有公共方法
Method getDeclaredMethod(String name, Class[ ] params):获取包含指定的参数类型及名称的类声明的方法 Method[ ] getDeclaredMethods():获得类声明的所有方法
9、使用反射来动态的调用类的方法,需要使用java.lang.reflect.Method中的:Object invoke(Object obj, Object[ ] args)方法
obj :指需要调用的那个方法的隐式参数,也即那个方法所属的对象,如果调用的是一个静态方法将第一个参数指定为null。
args :指需要调用的那个方法的显式参数,因为一个方法可以有很多个参数所以在这里我们必须要用一个数组来存放这些参数,在存放时需要把值类型的参数转换成相应的包装类型存放进去。
10、使用反射来动态的改变成员变量
调用Class的getField()并指定field名称,获得特定的Field对象之后便可直接调用Field的get()和set()方法来改变成员变量了
第二篇:java开发技术总结
数据库
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)数据格式
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“ornld” 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介绍 www.xiexiebang.com
(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对象创建模式
在使用时,可以在
scope=”singleton“表示单例模式(默认值)scope=”prototype“表示原型模式,每次调用getBean都返回一个新的 Bean对象。
b.控制Bean对象创建时机
scope=”singleton“时,Bean对象 是在容器实例化时创建。
在
scope=”prototype“时,Bean对象 是在getBean方法时创建。
c.追加初始化和销毁方法
在
同理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的
配置
ref=”要注入的Bean对象id值">
第三篇:Java技术路线图
在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了。但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平。
Java程序员 高级特性
反射、泛型、注释符、自动装箱和拆箱、枚举类、可变
参数、可变返回类型、增强循环、静态导入
核心编程
IO、多线程、实体类、集合类、正则表达式、XML和属性文件
图形编程
AWT(Java2D/JavaSound/JMF)、Swing、SWT、JFace 网路编程
Applet、Socket/TCP/UDP、NIO、RMI、CORBA Java语法基础
类、抽象类、接口、最终类、静态类、匿名类、内部类、异常类、编码规范 Java开发环境
JDK、JVM、Eclipse、Linux Java核心编程技术
Java,设计而又非常精巧的语言。学习Java,须从Java开发环境开始,到Java语法,再到Java的核心API。
1.Java开发入门:Java开发环境的安装与使用,包括JDK命令、EclipseIDE、Linux下Java程序的开发和部署等。
2.Java语法基础:基于JDK和Eclipse环境,进行Java核心功能开发,掌握Java面向对象的语法构成,包括类、抽象类、接口、最终类、静态类、匿名类、内部类、异常的编写。
3.Java核心API:基于JDK提供的类库,掌握三大核心功能:
A。Java核心编程:包括Java编程的两大核心功能——Java输入/输出流和多线程,以及常用的辅助类库——实体类、集合类、正则表达式、XML和属性文件。B。Java图形编程:包括Sun的GUI库AWT(Java2D、JavaSound、JMF)和Swing,IBM和GUI库SWT和Jface;C.Java网路编程:Applet组件编程,Socket编程,NIO非阻塞Socket编程、RMI和CORBA分布式开发。
4.Java高级特性:掌握JDK1.4、JDK5.0、JDK6.0中的Java高级特性,包括反射、泛型、注释,以及java高级特性——自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入等。JavaEE初级软件工程师 JSF框架开发技术
配置文件(页面导航、后台Bean)、JSF组件库(JSF EL语言、HTML标签、事件处理、)、JSF核心库(格式转换、输入验证、国际化)Javaweb核心开发技术 开发环境(Eclipse、Linux)
三大组件(JSP、JavaBean、Servlet)
扩展技术(EL、JSTL、Taglib)网页开发技术
HTML、XML、CSS、JavaScript、AJAX 数据库设计技术
SQL、MySql、Oracle、SQLServer、JDBC Web服务器(Tomcat/Jetty/Resin/JBossWeb)JavaWeb核心技术:
JavaWeb项目开发的全过程可以分解为:
网页开发+数据库设计——>JavaWeb项目开发,其中,javaWeb由6项基本技术组成:JSP+JavaBean+Servlet+EL+JSTL+Taglib,而JSF正是将这6种技术进行有机结合的技术框架:
JavaEE中级软件工程师
四种经典架构SSH1、SSI1、SSH2、SSI2 Struts1表现层框架
入门配置、核心组件、标签库、国际化、数据检验、数据库开发、Sitemesh集成、集成Hibernate/iBATIS Struts2表现层框架
入门配置、核心组件、标签库、国际化、数据校验、Sitemesh集成转换器、拦截器、集成Hibernate/iBATIS Spring业务层框架
入门配置、IoC容器、MVC、标签库、国际化、数据校验、数据库开发 Hibernate持久层框架
MySQL、Oracle、SQLServer iBATIS持久层框架 MySQL、Oracle、SQLServer Web服务器(Tomcat/Jetty/Resin/JBossWeb)Java高级软件工程师 javaWeb开源技术与框架
工作流、规则引擎 搜索引擎、缓存引擎、任务调度、身份认证
报表服务、系统测试、集群、负载平衡、故障转移 JavaWeb分布式开发技术 JTA(Java事物管理)
JAAS(Java验证和授权服务)JNDI(Java命名和目录服务)JavaMail(Java邮件服务)JMS(java信息服务)WebService(web服务)JCA(java连接体系)JMS(java管理体系)
应用服务器(JBossAS/WebLogic/WebSphere)JavaEE系统架构师
面向云架构(COA)
COA、SaaS、网格计算、集群计算、分布式计算、云计算
面向资源架构(ROA)ROA、RESI 面向web服务架构(SOA)
WebService、SOA、SCA、ESB、OSGI、EAI Java设计模式
创建式模式:抽象工厂/建造者/工厂方法/原型/单例
构造型模式:适配器/桥接/组合/装饰/外观/享元/代理
行为型模式:责任链/命令/解释器/迭代子/中介者/备忘录/观察者/状态/策略/模板方法/访问者 Java与UML建模
对象图、用例图、组件图、部署图、序列图、交互图、活动图、正向工程与逆向工程 CTO首席技术官
发展战略
技术总监
团队提升
团队建设
项目管理
产品管理
企业级项目实战(带源码)地址:http://zz563143188.iteye.com/blog/1825168
收集五年的开发资料下载地址: http://pan.baidu.com/share/home?uk=4076915866&view=share
下面的更深入的有兴趣可以了解一下,我的目的不是要大家掌握下面的知识,只是希望扩展自己的思维,摘自牛人的技术博客。
/**************************************************牛人必看*****************************************************************/
系统后台框架:
前端工程师技能:
B2C电子商务基础系统架构解析 运营B2C日 久,越来越深刻的意识到IT系统对确保规范化业务流转,支撑消费者端的均一服务有着决定性的作用。于是,一直想好好整理下相关的系统架构,怎奈俗务缠身,一直拖到今日,猛然发现下周娃很可能就要出生,拖无可拖,快马加笔,居然整出来了。本文的重点是理清系统的逻辑关系,详细的功能模块请参见结尾附上的系统 架构图。
首先,聊下对系统逻辑架构的看法;我个人始终坚持认为,系统的开发与演化,前台严格follow消费者的购买流程,后台则盯牢订单流转,牢牢抓住这两条主线,才能高屋建瓴的看清B2C的逻辑链和数据流,更深刻的规划功能模块,从而更有效支撑实际业务的流转。前台系统包括:商品展示,内容展示,订单确认,支付系统,用户中心四大模块 一,商品展示
按照Ebay的内部分类,任何将商品以单个或批量的方式展示给消费者的功能均应归入此系统。因此,该系统至少包括:
A,站内搜索(搜索提示,搜索规则,搜索成功页,搜索不成功页,相似推荐)
B,导航(频道导航,其他导航如销售排行,广告位,推荐位,文字链,Also buy等)C,商品分类(品牌分类,品类分类,属性分类如剪裁形式)D,登陆页(商品列表页,商品详细页,商品活动页)
这里的访问逻辑是:A /B/C分流消费者去往相对个性化的页面,由登陆页体现商家的核心诉求和价值传递,完成call-to-action的第一步。二,内容展示
内容展示较为简单,对纯购物品牌而言包括: A,公告区 B,帮助中心
C,论坛(如需商城与论坛发生交互,则需自行开发,否则可集成discuz做同步登陆即可)大家都知道,就不多说了。三,订单确认
订单确认,就是帮助消费者正确提交订单信息的环节,看似简单,实则非常复杂,需要对很多信息逻辑判断和处理,一般由2个部分组成:
A,购物车(购物车浮层,购物车页面,无注册购买)
无注册购买是需要慎用的功能,除非刻意追求用户的短平快下单,如团购/换购,一般不推荐使用,会造成系统异常复杂,开发量也很大。B,订单提交(返回购物车,收货地址&地址薄,支付方式判断,配送方式,发票,订单标记,实付金额计算等等)值得一提的是,几乎大多数的促销逻辑运算在这个环节完成,充分考虑各种促销方式之间的互斥与重叠是系统设计的核心,需要充分考虑各种情况,避免出现逻辑漏洞。四,支付系统
与一般的想象不同,支付系统其实并不简单等于第三方支付工具接入:
A,外部支付系统(支付宝将接口,财付通接口,网银直联端口,信用ka分期端口)B,内部支付系统(账户余额,积分,礼品卡,优惠券)支付系统的逻辑设计不但需要考虑到各种极端情况的发生(如一张订单先用礼品卡,再用积分,最后网银支付),还要预留财务做账所需的相关字段,并充分考虑订单取消之后如何回滚各类内部账户。五,用户中心
用户中心的实质是用户自助功能的dashboard,一般4个部分组成: A,注册&登陆(快速注册,完整注册,注册有礼,推荐注册,密码找回,主站id登陆,open-id登陆如QQ,新浪微博等)
B,订单中心(历史订单状态,中间状态订单修改,物流追踪)
C,服务中心(各类自助服务如退款申请,退换货申请,建议与投诉等)D,信息管理(用户基本信息管理和账户信息管理)用户中心的价值在于:尽可能引导用户自行获取所需的信息并提交所需的服务,在提升服务准确率,及时性的同时降低对人工成本。
后台系统包括:商品&促销,CRM,订单处理,WMS,采购管理,财务管理,报表管理,系统设置,WA系统9大模块 一,商品&促销
商品&促销模块的核心在于确保消费者下单之前,前台内容所见即所得 A,商品管理(品类管理,品牌管理,单品管理)B,促销管理(活动管理和自定义活动模板管理)在上述模块中,最重要的是2个部分:单品管理中的批量产品生成的自动程序和活动管理中“共享与互斥”管理。前者用于大幅提升上新速度,后者避免促销活动失控。二,CRM CRM是对B2C核心资源—会员的管理,服务与再营销系统,包括如下部分: A,会员管理(会员信息的增删改查和到其他系统的链接)B,用户关怀(条件触发和人工触发相关EDM & 短信 & OB)C,定向营销(会员分组和营销活动管理)
D,客服管理(内容非常多,集成所有需前台与后台交互的功能,详情还是看图吧)E,呼叫中心(IVR,坐席管理,统计报表,参数传递与窗口嵌入)
值得注意的,EDM和短信通道市面上已经有成熟的外包服务商,一般都会外包;呼叫中心和在线客服自行开发成本太高,特别是呼叫中心系统,业务初期也都是外包的。三,订单处理
订单处理是在订单未正式进入仓储部门处理之前,对订单的前置性处理环节。A,订单录入(电话订购,网上下单,外部团购订单,无金额订单录入如礼品单)B,订单审核(自动审核和人工审核)C,RMA处理(RMA申请单和RMA处理单)
RMA的逻辑也异常复杂,需要在效率和成本之间找平衡,确保在不拖垮仓储部门的正常出入库的前提下对消费者端快速有效close工单;对内部则需要控制成本,货损不能超过预算上限。
四,WMS(Warehouse Management system仓库管理系统)
WMS的流程很长,功能模块也很多,大致分为入库管理,库存管理,出库管理和票据管理4个模块四个模块,细细道来就是另外一篇文章了,各位可以参考 我这篇文章:庖丁解牛—B2C仓储内部运作解密(上,中,下)http://blog.sina.com.cn/wangxida0855 五,采购管理
采购管理的核心是有效跟进采购合同/发票的状态,大货的采购入库/退库,财务结算和在仓库存查询和处理。
A,供应商管理(供应商信息管理,合同发票管理)B,采购单管理(PO单管理,负PO单管理)
C,库存管理(库存查询,库存占用单,库存变动log)六,财务管理
B2C的财务管理,主要是对供应商,渠道和内部费用支出的成本控制。A,供应商结算 B,渠道结算 C,配送结算 D,内部结算 说实在的,哥对财务这块也不算很了解,大家将就看看,图片上有明细。七,报表管理
报表是B2C业务的宏观表现,理论上说,每个部门的KPI都应该从中找到。A,搜索报表(站内搜索量查询)
B,销售报表(多个维度销量查询,优惠券使用情况,报表导出)C,财务报表
D,客服报表(客服日报和坐席报表)
前者反映与消费者发生的日常交互(包括正常与异常),后者考核客服的工作绩效 E,仓储物流报表
这几块报表,是业务运作的核心,涉及到公司机密,就不能写的太细了,见谅。八,系统设置
这块大家都知道是干嘛的,也就不多说了,分成三块。A,基础设置(和业务有关的一些字段值)
B,权限设置(不同账号的操作权限和操作记录)C,其他设置
九,WA系统(Web Analytcis)
网 站分析系 统,几乎全是外购,很少有能够自建的,即使自建,最多做几个简单的模块。用于实战的,要么是免费的GA(Google Analytics),要么是昂贵的Omniture。这块的知识,细细说来也是另外一篇文章了,有兴趣的同学可以看我这篇科普文章:揭秘—我所知道的网 站分析(上,下)http://blog.sina.com.cn/wangxida0855 最后,上全系统大图,再感慨一句,B2C系统,真是一个大工程啊。fr http://blog.sina.com.cn/s/blog_59d6717c0100syh3.html
第四篇:java技术架构
Java技术体系图
Java程序员
高级特性
反射、泛型、注释符、自动装箱和拆箱、枚举类、可变
参数、可变返回类型、增强循环、静态导入
核心编程
IO、多线程、实体类、集合类、正则表达式、XML和属性文件
图形编程
AWT(Java2D/JavaSound/JMF)、Swing、SWT、JFace
网路编程
Applet、Socket/TCP/UDP、NIO、RMI、CORBA
Java语法基础
类、抽象类、接口、最终类、静态类、匿名类、内部类、异常类、编码规范
Java开发环境
JDK、JVM、Eclipse、Linux
Java核心编程技术
Java,设计而又非常精巧的语言。学习Java,须从Java开发环境开始,到Java语法,再到Java的核心API。
1.Java开发入门:Java开发环境的安装与使用,包括JDK命令、EclipseIDE、Linux下Java程序的开发和部署等。
2.Java语法基础:基于JDK和Eclipse环境,进行Java核心功能开发,掌握Java面向对象的语法构成,包括类、抽象类、接口、最终类、静态类、匿名类、内部类、异常的编写。
3.Java核心API:基于JDK提供的类库,掌握三大核心功能:
A。Java核心编程:包括Java编程的两大核心功能——Java输入/输出流和多线程,以及常用的辅助类库——实体类、集合类、正则表达式、XML和属性文件。
B。Java图形编程:包括Sun的GUI库AWT(Java2D、JavaSound、JMF)和Swing,IBM和GUI库SWT和Jface;
C.Java网路编程:Applet组件编程,Socket编程,NIO非阻塞Socket编程、RMI和CORBA分布式开发。
4.Java高级特性:掌握JDK1.4、JDK5.0、JDK6.0中的Java高级特性,包括反射、泛型、注释,以及java高级特性——自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入等。
JavaEE初级软件工程师
JSF框架开发技术
配置文件(页面导航、后台Bean)、JSF组件库(JSF EL语言、HTML标签、事件处理、)、JSF核心库(格式转换、输入验证、国际化)
Javaweb核心开发技术
开发环境(Eclipse、Linux)
三大组件(JSP、JavaBean、Servlet)
扩展技术(EL、JSTL、Taglib)
网页开发技术
HTML、XML、CSS、JavaScript、AJAX
数据库设计技术
SQL、MySql、Oracle、SQLServer、JDBC
Web服务器(Tomcat/Jetty/Resin/JBossWeb)
JavaWeb核心技术:
JavaWeb项目开发的全过程可以分解为:
网页开发+数据库设计——>JavaWeb项目开发,其中,javaWeb由6项基本技术组成:JSP+JavaBean+Servlet+EL+JSTL+Taglib,而JSF正是将这6种技术进行有机结合的技术框架:
JavaEE中级软件工程师
四种经典架构SSH1、SSI1、SSH2、SSI2
Struts1表现层框架
入门配置、核心组件、标签库、国际化、数据检验、数据库开发、Sitemesh集成、集成Hibernate/iBATIS
Struts2表现层框架
入门配置、核心组件、标签库、国际化、数据校验、Sitemesh集成转换器、拦截器、集成Hibernate/iBATIS
Spring业务层框架
入门配置、IoC容器、MVC、标签库、国际化、数据校验、数据库开发
Hibernate持久层框架
MySQL、Oracle、SQLServer iBATIS持久层框架
MySQL、Oracle、SQLServer
Web服务器(Tomcat/Jetty/Resin/JBossWeb)
Java高级软件工程师
javaWeb开源技术与框架
工作流、规则引擎
搜索引擎、缓存引擎、任务调度、身份认证
报表服务、系统测试、集群、负载平衡、故障转移
JavaWeb分布式开发技术
JTA(Java事物管理)
JAAS(Java验证和授权服务)
JNDI(Java命名和目录服务)
JavaMail(Java邮件服务)
JMS(java信息服务)
WebService(web服务)
JCA(java连接体系)
JMS(java管理体系)
应用服务器(JBossAS/WebLogic/WebSphere)
JavaEE系统架构师
面向云架构(COA)
COA、SaaS、网格计算、集群计算、分布式计算、云计算
面向资源架构(ROA)
ROA、RESI
面向web服务架构(SOA)
WebService、SOA、SCA、ESB、OSGI、EAI
Java设计模式
创建式模式:抽象工厂/建造者/工厂方法/原型/单例
构造型模式:适配器/桥接/组合/装饰/外观/享元/代理
行为型模式:责任链/命令/解释器/迭代子/中介者/备忘录/观察者/状态/策略/模板方法/访问者
Java与UML建模
对象图、用例图、组件图、部署图、序列图、交互图、活动图、正向工程与逆向工程
CTO首席技术官
发展战略
技术总监
团队提升
团队建设
项目管理
产品管理
第五篇:基于java技术的软件开发架构总结
基于java技术的软件开发架构总结
在具体的实现中,表现层可为Struts/JSF等,业务层、访问层可为JavaBean或EJB等,资源层一般为数据库。
宏观上的层次就是这样,在具体现实中,有如下几种实现形式:
1,轻量级实现
表现层使用基于MVC的框架,比如Struts或JSF 业务层使用JavaBean(就是常说的Service)访问层使用JavaBean(就是常说的DAO)优点:
轻量级实现,简单明了 缺点:
难以无法实现分布式应用
以下功能必须通过编程实现
事务控制 资源管理(包括组件的创建)
线程安全问题
安全性
2,重量级J2EE实现
表现层依然是基于MVC的框架
访问层采用实体Bean实现,如果可能最好采用CMP,实现起来更简洁。此处的实体Bean可以考虑采用本地接口
业务层一分为二,服务控制器可以由会话Bean充当,用来封装业务流程(相当于轻量级实现中的Service),也可以考虑采用本地接口;门面也可以由会话Bean充当(一般来说无状态会话Bean足矣),作为业务层的入口,应该采用远程接口。优点:
以下功能可由EJB容器自动实现,或通过配置实现
事务控制
远程访问
线程安全
资源管理
安全性
可以进行分布式应用
因为采用了EJB,故部分特征可以由装配人员来配置(比如事务,安全性等),不需要在软件中硬编码 EJB组件有更好的重用性
可利用容器提供的其他企业级的功能(比如集群,容错,灾难恢复等)
可以加入MDB(实现异步通讯)等技术 缺点:
开发难度较高
如果不恰当的使用实体Bean,会造成效率低下。如果采用CMP,则很多数据访问的操作不能直接实现。
缺少良好的开发环境
软件可能依赖于具体的EJB容器 EJB容器可能很贵,开发软件也可能很贵
3,轻量级和重量级J2EE的切换
如果项目有需求,并有充分的时间,还可以通过在表现层和业务层的交界处加入“业务代表”(JavaBean + 服务定位器实现)来对表现层隐藏对业务层访问的细节(JavaBean和EJB的访问方式显然不同),只需替换“业务代表”就可以切换轻量级和重量级两种实现。举例说明,一般电话上都有一个P/T开关(脉冲/音频开关),随着开关状态的不同,拨号时电话机会判断是使用脉冲拨号还是音频拨号。
这种架构唯一的缺点就是必须写两套实现代码„„
4,轻量级J2EE实现
访问层通过JavaBean调用ORM框架实现(Hibernate,iBatis等),代码简洁,功能完备(相对于EJB 2.x而言),如果用的是Hibernate,可以忽略底层数据库的差异,如果用的是iBatis,则方便对SQL进行优化。
业务层和访问层依靠AOP框架(如Spring)可以在切面中实现事务,安全性等功能,同时不影响业务代码。如果采用Spring,其中已经内置了事物切面,并可以轻易的与主流ORM框架进行整合,实现声明式的事物管理。当然,更可以使用IoC模式降低组件间的耦合性。优点:
可以通过AOP框架实现事物、安全性等功能,同时不影响业务代码
ORM框架比CMP更灵活,比BMP更简洁(相对于EJB 2.x而言),运行效率也比较高
如果使用Spring,可以用更简单的方式实现J2EE中比较复杂的功能
无需额外的容器
ORM和AOP框架可以找到免费的开源实现,降低项目成本(不过也有人认为采用开源项目可能综合成本更高) 缺点:
非官方框架,缺少文档、技术支持和业界经验
采用技术太多,学习曲线较高,难以招到合适的程序员(咱们学员可以考虑在这方面下点功夫,呵呵)
某些企业级的功能轻量级框架还不能实现(或独立实现)
测试、调试均比较复杂
另类之处:
使用BMP + Hibernate(具体做法为BMP中的持久化方法,比如ejbLoad, ejbStore等都委托给Hibernate实现)优点:
借助于Hibernate强大的ORM功能弥补CMP的不足(特别是EJB-QL)缺点:
事物不好控制
不伦不类,容易发生未知的错误(比如Hibernate自身的缓存可能会于容易提供的缓存冲突)另类之处:
将业务层(也可能包含访问层)包装成Web Services,支持远程调用 优点:
借助于Web Services可以实现松散耦合分布式应用,说的大一点,就是传说中的SOA,呵呵 缺点:
Web Services自身效率不高,无状态,安全性差
当然,即使不分层,也能做出软件来,但我们应该思考怎么做才能最好?如果说分层不好,那么不分层的优势又在哪里呢??如果说分层有性能的损耗,那么性能损耗在哪里呢??如果不分层,软件工程思想中的“分而治之”的原则启不受到了质疑?
有人说,分层是为了减少代码量,如果分层是为了减少代码量,那怎么能减少,代码的重用也许会减少一些,但是程序更多的是业务,我们关心的也只是业务,试问分层的意义就是为了减少代码量?
总之我的观点就是:软件分层是必须做的。至于框架,不应该问用不用,而应该问用什么?要选用实践检验过的框架,毕竟实践是检验真理的唯一标准。
二年的J2EE开发之后,我们应该掌握了一些主流的架构模式,总结一下:
宏观上讲,我们采用了分层的架构,将软件分为如下的层次: