1.servlet基础
(1)什么是servlet?
servlet就是sun公司用来扩展web服务器功能的组件规范,因为web服务器它通常只能够处理一些静态资源的请求,在生活中我们会需要到很多的需要加载动态资源的请求,而servlet刚好满足了它的这点要求,它是用来加载动态资源的。
(2)如何写一个servlet?
1.通常我们是先新建一个java类,新建的这个java类实现servlet这个接口或者继承HttpServlet这个抽象类,通常情况下我们都是用这个类来继承HttpServlet。
2.编译
3.打包
4.部署,在web.xml当中进行部署文件。
5.启动这个容器,访问servlet
静态资源和动态资源
- 静态资源:任何用户,任何时间访问的内容都一样,包括图片,html和各种文件
- 动态资源:不同用户会根据某些逻辑使用户显示的内容不一样的资源,通过各种计算生成的网页
(3)servlet是如何运行的?(可以参照老师的给的图)
当在客户端访问浏览器时,会再浏览器的地址栏输入相对应的地址信息,在我们点击回车的那一刻开始,我们的浏览器就会进行对相对应的web服务器进行发送一个请求,单在这个发送请求之前,浏览器会把这个需要发送的请求进行了一次打包,打包的要求他是按照http协议来打包的,打包结束之后,在将这个包的请求发送给服务器,发送到服务器之后,服务器会将这个包进行拆包,把里面的数据解析出来,拆包它也是按照http协议进行拆分,解析数据,然后存放到request这个对象上面同时服务器也会创建一个response这个对象,这时候就看访问请求的是静态资源还是动态资源,如果是动态资源的话它会优先访问我们的部署文件web.xml,找到需要访问的部署问、文件路径,通过这个部署文件路径然后再找到相对应的servlet对象,在这个对象中调用一个service方法,在service方法当中进行写具体的业务逻辑,同时把请求对象和响应对象传递到这service方法当中,然后将处理结果写到response当中,web服务器最后将响应对象的内容进行一次打包,同时也是按照http协议将包响应到浏览器中,在浏览器中拆包然后显示相对应的页面。
(4)http协议:
a.什么是http协议?
http协议也就是网络引用层协议,它规定了浏览器于web服务器之间是如何通信以及数据包的结构,它的通信过程有四步:
1.建立连接
2.发送请求:
a>.请求行(请求方式,请求资源路径,协议类型和版本)
b>.消息头(是一些健值对使用": "表示特定的含义,比如浏览器可以发送"user-agent"消息头,告诉服务器浏览器的类型和版本)。
c>.实体内容。
3.发送响应:
a>.状态行(协议类型和版本,状态描述[200,500,404])
b>.消息头(服务器可以发送一些消息头给浏览器,比如Content-type消息头,告诉浏览器服务返回的数据类型)
c>.实体内容。
4.关闭连接
b.特点
一次请求,一次响应。即如果浏览器需要发送新的请求就需要建立新的连接,这样设计优点就是服务器可以利用有限的连接尽可能多的请求服务。
c.数据包的结构
d.状态码、消息头
(5)什么是servlet容器?
符合一定的规范,提供组件运行环境的程序。
2.servlet核心
(1)如何获得请求参数值?
a.String request.getParameter(String paramName),如果请求参数值不存在,则返回null,表单当中的密码框和文本输入框不写东西的话会获得空字符串。
b.String[] request.getParameterValues(String paraName),如果有多请求参数名的话使用,对于多选框不写的话会返回一个null。
(2)表单包含有中文参数值,如何处理?
1.保证表单提交时,按照指定的字符集编码:
2.服务端使用对应的字符集来解码:
a.request.setCharacterEncoding(“utf-8”);(好用,方便)
b.uname=new String(uname.getBytes(“iso-8859-1”),“utf-8”);
注:先还原得到浏览器发送过来的字节数组,然后使用正确的字符集来编码。
(3)servlet输出中文,如何处理?
response.setContentType(“text/html;charset=utf-8”);
(4)容器如何处理请求资源路径?
在部署文件中定义设置资源路径(web.xml)
a.精确匹配:/abc.html
b.通配符匹配:/
c.后缀匹配:.do
(5)如何让一个servlet处理多种请求?
在web.xml中设置为后缀匹配:*.do
(6)转发与重定向
a.什么是重定向?
服务器通知浏览器向一个新的地址发送请求。
注:可以发送一个302状态码和一个location消息头(该消息头包含了一个地址,称之为重定向地址)浏览器收到之后,会立即重定向地址发请求。
b.如何重定向?
response.sendRedirect(String url);//url就是重定向的地址
c.重定向的特点:
1.重定向的地址是任意的
2.重定向之后,浏览器地址的地址会发生变化。
d.什么是转发?
一个web组件(servlet或jsp)将完成的处理交给另外一个web组件继续做就是转发。
e.如何转发?
1.绑定数据到request上:
request.setAttribute(String name,Object obj);//key,value
注:依据绑定名获得绑定值
Object request.getAttribute(String name);
2.获得转发器:
RequestDispatcher rd=request.getRequestDispatcher(String name);
3.转发:
rd.forward(request,response);
f.转发的特点
1.转发后,浏览器地址栏的地址不变,
2.转发的地址有限制(必须是同一个web应用)
g.转发与重定向的区别?
1.转发所涉及的哥哥web组件可以共享一个request的对象,重定向不可以。
注:容器收到请求,会创建request对象和response对象,当响应对象发送完毕,容器会立即删除request对象和response对象,也就是说,request对象和response对象的生存事件是一次请求和响应期间存在(重定向是两次,转发一次)
2.重定向之后,浏览器地址的地址会边,转发则不会。
3.重定向地址是任意的,而转发必须是同一个wen应用
4.转发是一件事未完成,让另一个web组件继续做,而重定向是一件是结束之后再去做另一件事。
(7)servlet的生命周期
a.什么是servlet的生命周期?
指的是容器如何去创建servlet对象,如何对其进行初始化处理,如何调用其他方法来处理请求,以及如何销毁该对象的整个过程。
b.分成哪几个阶段?
实例化,初始化,就绪,销毁。
c.容器在什么时候创建servlet实例?
1.容器收到请求后(容器只创建一个实例)
2.容器启动之后,立即创建。(1<…>越小优先级越高)
d.init方法会执行几次?
只会执行一次
e.初始化参数如何配置?
1.配置:
compary
北京达内
2.读取
String servletConfig.getInitParameter(String ParamName);
f.doGet,doPost方法的作用?
doGet:
doPost:
g.Servlet接口,
servlet接口实现了三个方法:1.init()
2.service();
3.destroy();
GenericServlet抽象类,
实现了servlet接口中的部分方法(init,destroy)。
HttpServlet抽象类
继承GenericServlet抽象类,实现了service方法。
(8)Servlet上下文
a.什么是Servlet上下文?
容器启动之后,会为每一个web应用创建唯一的一个符合ServletContext接口要求的对象,该对象就称之为servlet的上下文。
b.特点
1.唯一性:一个web应用对应一个上下文
2.持久性:只要容器不关闭,并且应用没有被卸载,则上下文会一直存在。
c.如何获得Servlet上下文?
它由四个接口来获得
GenericServlet,ServletConfig,FilterConfig,HttpSession.
d.作用
1.绑定数据
2.读取全局的初始化参数
e.绑订数据到(request,session,上下文)的区别?
1.从生存事件的长短去比较,request2.从访问的范为看,绑定到session对象上的数据,只能被session对应的用户访问到,帮定到上下文的数据,可以被所有用户看到(共享)。
(9)线程安全问题
a.为什么说servlet会有线程安全问题?
1.容器只会创建一个servlet实例;
2.容器收到一个请求,就会启动一个线程,再由该线程来处理请求
注:如果有多个线程同时访问某个servlet,就又可能产生线程安全问题,比如这些线程都在修改某个属性值。
b.如何解决?
当然就是锁机制咯,使用synchronized对有可能产生线程安全问题的代码块加锁。
注意:加锁之后会影响性能。
(10)路径问题
a.什么是相对路径?
不是以“/”开头的路径
b.什么是绝对路径?
是以“/”开头的路径
c.如何写绝对路径?
链接地址,表单提交地址,重定向从应用名开始写;转发从应用名之后开始。
3.状态管理
(1)什么是状态管理?
将浏览器于服务器之间的次交互请求作为一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来
(2)如何进行状态管理?
(3)cookie
a.什么是cookie?
服务器临时存放在浏览器上的少量数据。
b.工作原理?
当浏览器访问服务器时,服务器可以将少量数据以set-cookie消息头的方式发送给浏览器,浏览器会将这些数据零时保存下来。
当浏览器再次访问服务器时,会将之前保存的这些数据以cookie消息头的方式发送给服务器。
c.添加cookie?
cookie c=new cookie(String name,String value);
response.addcookie©;
d.三个问题(编码问题,生存时间问题,路径问题)
e.读取cookie?(获取客户端多有的cookie对象)
cookie[] request.getcookies();
a.一个cookie对象封装了一个cookie信息(包括cookie的名称和值)
String cookie.getName();
String cookie.getValue();
b.有可能返回null。
f.cookie的限制
1.cookie可以被用户自己禁止;
2.不安全;
3.只能保存少量的数据约4kb左右;
4.cookie的数量有限制,约几百个;
5.cookie只能保存字符串。
a.什么是session? 服务器为了保存状态而创建的一个特殊的对象。 b.session的工作原理? 浏览器访问服务器时,服务器会创建session对象(该对象由一个唯一的id,一般称之为sessionId),服务器会将sessionId以cookie的形式发送给浏览器。当浏览器再次访问服务器时,会将sessionId发送过来,服务器依据sessionId就可以找到之前创建的session对象。 c.如何获得session? 1.HttpSession s=request.getSession(boolean flag); 2.HttpSession s=request.getSession();//也可以是HttpSession s=request.getSession(true); d.session超时 服务器会将空闲时间过长的session对象删除掉。时长大约30分钟(什么时候开始:从访问服务器停止再不发送请求的那一秒开始)。 e.删除session 可以使用invalidate()方法。 f.*****session和cookie的比较***** 1.安全性:session更安全些,cookie不安全(将数据保存再浏览器中); 2.数据量大小:session保存的数据量更大,cookie只能保存少量的数据大约4kb. 注意:实际使用中建议再session对象上绑定尽可能少的数据,因为会占用服务器过多的内存空间。
4.数据库访问
dao
5.过滤器与监听器
(1)什么是过滤器?
servlet规范当中定义的一种特殊组件,用来拦截servlet容器的调用过程;
注意:容器收到请求后,会先调用过滤器,再调用后面的组件(比如servlet);
(2)如何写一个过滤器?
a.写一个java类,实现过滤器接口(filter);
b.再接口当中实现拦截处理逻辑(doFilter);
c.配置过滤器。(web.xml);
(3)优先级
当有多个过滤器都满足拦截要求,容器会依据的先后顺序来调用各个过滤器。
(3-1)过滤器的优点:
a.在不修改原代码的基础上,增加新的功能;
b.将多个组件相同处理逻辑即中写在一个类里面(即过滤器里面),方便代码的维护。
(3-2)和过滤器有关得接口有那些
Filte,FilterConfig,FilterChain.
(4)初始化参数
1.再web.xml文件中,配置初始化参数
…
…
(5)什么是监听器?
servlet规范当中定义的一个特殊的组件,用来监听servlet容器产生的事件,并相应的处理。
(6)如何写一个监听器?
1.写一个java类,实现相应的监听器接口;
注:具体要看监听的事件类型,比如监听session的创建和销毁,就需要实现HttpSession,Listener接口。
2.再接口方法中,实现相应的监听处理逻辑;
3.再web.xml文件注册该监听器。
6.JSP基础:
1.什么是jsp:
sun公司指定一种服务器端的动态页面技术组件规范,JSP是一个以“.jsp”后缀的文件,主要是html和少量的java代码,jsp文件会被容器转换成一个servlet类,然后执行。
2.jsp是如何运行的?
容器要将jsp文件转换程一个servlet(.java),然后再按照servlet的过程执行。
html:在service方法里,使用out.write输出;
<% %>:在service方法里照搬(.java代码)
<%= %>:在service方法里使用out.println()输出
<%! %>:jsp的声明,给servlet添加新的属性和方法。
3.隐含对象
a。什么是隐含对象?
可以直接使用的对象,如out;
b.为什么可以直接使用这些隐含对象?
容器会自动添加获得这些对象的代码。
c.有那些隐含对象?(9种)
out,request,response,application(servletContext),session(五种)
pageContext,config exception,page (四种)
注:
pageContext:
1.容器会为每一个实例(jsp对应的servlet)创建唯一的一个符合pageContext接口要求的对象(页面上下文)
特点:(2点)
唯一性:一个jsp实例对应一个页面上下文
持久性:只要jsp实例没有被删除,则页面上下文会一直存在。
作用:a.绑定数据(绑定到页面上下文的数据,只有对应的jsp能访问)。
b.提供了获取得到其他所有隐含对象的方法。
page:jsp实例本身。
config:就是servletConfig,用于读取初始化参数。
exception:作用:用来获得jsp运行时产生得异常信息。
只有当page指令得isErrorPage属性值为true时,才能使用(如:day11/a7.jsp)。
4.指令
A.什么是指令
通知容器,在将jsp文件转换程servlet类时,做一些额外得处理,比如倒包;
a. Page指令:
1.import到包。
2.ContentType属性设置:response.setContType得方法得参数值:
比如:<%@ page ContentType=“text/html;charset=“utf-8”%>
3.pageEncoding属性:告诉容器jsp文件得编码(有些容器在读取jsp文件得内容时,默认是iso-8859-1去解码,如果jsp文件里面包含中文,会出现乱码)
4.session属性:缺省值为true,如果值为false,则容器不再添加获得session对象得语句(即session隐含对象就不能用了)
5.errorPage属性:指定一个异常处理页面。
注:当jsp运行时产生了异常,则容器会调用异常处理页面。
6.isErrorPage属性:缺省值时false,如果值为true,则可以使用exception隐含对象。
b.include指令
file属性:用来指定被包含得文件。
<%@ include file=“header.jsp”%>作用:容器在将jsp文件转换程servlet(.java)时,会将file属性指定得文件内容插入到指令锁在得位置。
c.taglib(标签库)z指令:
注:用于导入jsp标签的。
5.jsp标签和el表达式
1.什么是jsp标签?
jsp标签语法类似于html标签,用于替换jsp文件当中嗯的java代码。
注意:直接在jsp当中写java代码,不利于jsp文件的维护(比如,将带有java代码的jsp文件交给美工去修改就很不方便),所以sun公司指定了jsp标签技术规范。容器依据jsp标签找到对应的标签然后执行。
2.什么是el表达式?
一套简单的运算规则,用于给jsp标签的属性赋值。
注意:现在el表达式也可以脱离jsp标签,直接使用。
3.el表达式的使用
1.访问bean的属性
注:javabean:它就是一个java的类,它有一个无参的构造器,有一些属性以及属性对应的get/set方法,方法名于属性名要一致。
2.写法有两种:
第一种:a
a.
u
s
e
r
.
u
s
e
r
n
a
m
e
>
>
>
>
{user.username}>>>>
user.username>>>>{对象名.属性名}
执行过程:容器一次从pageContext,request,session,application种查找绑定名为"user"的对象(getAttribute),找到之后,会调用该对象的“getUsername”方法,然后输出。
优点:会将null转换成”“输出。
如果找不到对应的对象,并不会发生空指针异常,指定查找范为可以通过:pageScope,requestScope,sessionScope,applicationScope指定范围查找。
第二种:b
b.
u
s
e
r
[
′
u
s
e
r
n
a
m
e
′
]
>
>
>
>
>
{user['username']}>>>>>
user[′username′]>>>>>{对象名[‘属性名’]};执行过程和上面一样
特点:[]里面可以使用绑定名
[]里面可以使用从0开始的下标,用于访问数组中的某个元素。
3.进行一些简单的运算
a.算术运算:+,-,*,/,%;//”+“只能求和;
b.关系运算:<,<,>=,<=,==,!=;
c.逻辑运算:&&,//,!;
d.empty:判断集合是否为空,或者是否为空字符串。
4.读取请求参数值
${param.username}等价于request.getparameter(“username”);
${paramValues.city}等价于request.getParameter(“city”);
6.JSTL(java standard Tag lib):java标准 标签 库。
1.JSTL是什么?apache开发的一套jsp标签,后来捐献给了sun公司,sun公司命名为JSTL。
2.变成步骤:
a.导包
b.使用taglib(标签库)指令导入耀哦使用的标签。
3.核心标签:
1>.if标签:
注:当test属性值为true,容器执行标签体的内容,test属性可以使用el表达式来赋值。
2>.标签的执行过程:容器依据命名空间找到标签的描述文件(.tld文件),然后依据签名(比如if标签)找到对应的标签类(比如找到IfTag类)然后将该标签实例化,最后执行该标签的方法。
3>.choose标签:
…
when:表示一个处理分支,当test属性为true时,会执行该分支,可以出现1次或多次。
otherwise:表示例外,可以出现0次或者1次。
4>.forEach标签:
test属性:指定耀遍历的集合,一般使用EL表达式来复制;
var属性:指定一个绑定名称,容器每次从集合中取一个对象,然后绑定到上下文(pagecontext)对象上.
5>.如何开发自定义标签;
a.编写java类,继承SimpleTagSupport类;
b.在doTag方法中添加处理逻辑
c.配置标签说明文件
6>标签的运行原理:
a.容器依据jsp标签的命名空间找到标签的描述文件(.tld文件),然后依据标签名字找到标签类,接下来将该标签实例化。
b.容器会依据标签的属性给标签实例的属性赋值,然后调用标签实例的doTag方法。
4.JSTL应用
1.使用JSTL时,JSP页面中不在出现的内容是:
<%= %>
<% %>
2.替换形式:
${ }
Jsp/servlet面试题
- 四种会话跟踪技术是什么?(jsp) (中)
答:cookie,url重写,session,隐藏表单域。 - 不同客户端可不可以共享Session?不可以 (易)
Jps和Servlet之间可不可以用session传值?可以 - 简介cookie的有关知识 (中)
浏览器与WEB服务器之间是使用HTTP协议进行通信的,当某个用户发出页面请求时,WEB服务器只是简单的进行响应,然后就关闭与该用户的连接。因此当一个请求发送到WEB服务器时,无论其是否是第一次来访,服务器都会把它当作第一次来对待,这样的不好之处可想而知。为了弥补这个缺陷,Netscape 开发出了cookie这个有效的工具来保存某个用户的识别信息,因此人们昵称为“小甜饼”。cookies是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段:Netscape Navigator使用一个名为cookies.txt本地文件保存从所有站点接收的cookie信息;而IE浏览器把cookie信息保存在类似于C: windowscookies的目录下。当用户再次访问某个站点时,服务端将要求浏览器查找并返回先前发送的cookie信息,来识别这个用户。
cookies给网站和用户带来的好处非常多:
1、cookie能使站点跟踪特定访问者的访问次数、最后访问时间和访问者进入站点的路径
2、cookie能告诉在线广告商广告被点击的次数 ,从而可以更精确的投放广告 3、cookie有效期限未到时,cookie能使用户在不键入密码和用户名的情况下进入曾经浏览过的一些站点
4、cookie能帮助站点统计用户个人资料以实现各种各样的个性化服务
JSP是使用如下的语法格式来创建cookie的:
cookie cookie_name =new cookie("“Parameter”","“Value”");
例如:cookie newcookie =new cookie("“username”","“zheng”"); response.addcookie(newcookie); - 在浏览器的打开时再新打开一个浏览器还是同一个session吗? (中)
对IE而言不是同一个SESSION - 描述cookie和Session的作用,区别和各自的应用范围 (中)
cookie和Session都可以用来在多个页面之间共享数据,区别是cookie保存在客户端,可以设置比较长的保存时间.而Session保存在服务器端,通常生存时间较短。如果客户端禁用了cookie,cookie将无法工作,而session不受这一影响。一般来说保密性高、保存时间短的信息适合用session来存放,而cookie适合存放需要长期保存的非敏感数据。 - 如何实现购物车添加新项,又不使购物车中原有项目被取消? (易)
可以将购物车存放在session当中 - cookie的过期时间如何设置? (易)
使用setMaxAge(int exp)方法 - 如果BROWSER已关闭了cookies,在JSP中我如何打开session? (中)
如果cookie被禁用,session将通过url重写的方式来传送,所以不会影响session的使用
9.include指令和include动作的区别 (中) - Jsp有哪些常用动作?作用分别是什么?(jsp) (中)
答:JSP有6种常用基本动作 jsp:include:在页面被请求的时候引入一个文件。 jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或embed标记。 - “forward与redirect区别? (中)
Forward是在服务器端进行分发,分发后地址栏无变化,用户看不到分发后的地址.而redirect是在客户端进行的页面重定向,地址栏上会显示重定向后的网页.forward的页面只能是在同一个web应用程序之内,而重定向可以定位到外部资源.forward后还是同一个request请求,而重定向后以前的request请求就不存在了.
12.Jsp和Servlet中的请求转发分别如何实现? (易)
Jsp中使用jsp:forward动作,servlet中使用RequestDistpatcher对象的forward方法”
13.什么是web容器?(易)
答:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。
14.应用服务器有那些? (中)
答:BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i Application Server,JBoss,Tomcat。"
15.请说出JSP的内置对象及方法 (中)
答:request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。
response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等)
out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。
pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。 session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息
applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息
config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。 page表示从该页面产生的一个servlet实例。
16.使用JSP如何获得客户浏览器的信息? (易)
request对象的getXXXX方法"
17.B/S与C/S的联系与区别。 (中)
答:C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或SQL Server。客户端需要安装专用的客户端软件。
B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape
Navigator或Internet Explorer,服务器安装Oracle、Sybase、Informix或 SQL Server等数据库。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。
C/S 与 B/S 区别:
1).硬件环境不同: C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务. B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行
2).对安全要求不同 C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S发布部分可公开信息. B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。 3).对程序架构不同 C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑. B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟.
4).软件重用不同



