1.中间件、容器、Web服务器
1.1中间件
中间件是提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通。中间件处于操作系统和更高一级应用程序之间。
J2EE提出的背景:
1)企业级应用框架的需求:在许多企业级应用中,例如数据库连接、邮件服务、事务处理等都是一些通用企业需求模块,这些模块每次再开发如果都由开发人员来完成的话,将会造成开发周期长和代码可靠性差等问题。于是许多大公司开发了自己的通用模块服务,这些服务型的软件系列被称为中间件。
2)通用的规范:因为这些中间件与用户的沟通都各有不同,从而导致用户无法将其组装在一起为自己服务,于是提出标准的概念,J2EE就是基于JAVA技术的一系列标准。
中间件的功能:将应用程序运行环境与操作系统隔离,从而实现应用程序开发者不必为更多系统问题忧虑,而直接关注该应用程序在解决问题上的能力。
商用中间件主要阵营:微软阵营、Java阵营、开源阵营。
常见的中间件:Apache-Tomcat、IBM-WebSphere、BEA-WebLogic、Kingdee-Apusic
1.2 容器
容器就是中间件的一种,充当中间件的角色。
容器的分类:
1)Web容器
给处于其中的应用程序组件(JSP,Servlet)提供一个环境(Jsp容器和Servlet),是组件(JSP,Servlet)直接跟容器中的环境变量接口交互。容器提供的接口严格遵守J2EE规范中的WEB APPLICATION标准,我们把以上标准的WEB服务器就叫做J2EE的WEB容器。
2)EJB容器
Enterprise java bean 容器。它提供给运行在其中的组件EHB各种管理功能。只要满足J2EE规范的EJB放入容器,马上就会被容器进行高效管理,并通过线程的接口获得系统级别的服务,如邮件服务、事务管理等。
3)Web容器与EJB容器的区别
WEB容器和EJB容器在原理上大体相同,它们都是把外界的交互从而减轻应用程序的负担。
主要区别是被隔离的外界环境。WEB容器主要与基于HTTP请求交互,EJB容器主要是跟数据库、其他服务交互。如Servlet不同关心HTTP的细节,直接引用环境变量session,request,response;EJB不用关心数据库连接速度、各种事务控制,直接由EJB容器完成。
1.3 WEB服务器(程序/软件)
提供Web信息浏览服务,向客户浏览器提供服务的程序
1)目前常见web服务器:
大型:Microsoft IIS、IBM WebSphere、BEA WebLogic、Apache、Tomcat
小型:nginx、 micro_httpd、mini_httpd、thttpd、 lighttpd、Shttpd
2)支持J2EE的应用服务器:
WEBSPHERE、WEBLOGIC、JBOSS、ORACLE APPLICATION SERVER、SUN ONE APPLICATION SERVER 等。
2.ServletContext功能作用
2.1 ServletContext
1)是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放,所有用户共用一个servletContext。
2)一个ServletContext对象表示了一个Web应用程序的上下文,是Web服务器中的一个已知路径的根,为了节省空间,提高效率,ServletContext中,要放必须的、重要的、所有用户需要共享的线程又是安全的一些信息。
2.2 Servlet上下文
1) 提供对应用程序中所有Servlet所共有的各种资源和功能的访问。Servlet上下文API用于设置应用程序中所有Servlet共有的信息。Servlet可能需要共享他们之间的共有信息。运行于同一服务器的Servlet有时会共享资源,如JSP页面、文件和其他Servlet。
如,做一个购物类的网站,要从数据库中提取物品信息,如果用session保存这些物品信息,每个用户都访问一便数据库,效率就太低了;所以要用来Servlet上下文来保存,在服务器开始时,就访问数据库,将物品信息存入Servlet上下文中,这样,每个用户只用从上下文中读入物品信息就行了。
2) servlet可以通过名称将对象属性绑定到上下文。任何绑定到上下文的属性可以被同一个web应用的其他servlet使用。ServletContext接口的下列方法允许访问这种功能:
setAttribute
getAttribute
getAttributeNames
removeAttribute
上下文属性对于创建它们的VM来说是本地的。这防止ServletContext属性存储于分布式容器的共享内存中。当信息需要在运行于分布式环境中的servlet之间共享时,信息被放入会话中(参见第7章“会话”),存储于数据库中,或者存储于EJB组件中。
3)ServletContext接口
ServletContext接口定义了运行servlet的web应用的servlet视图。使用ServletContext对象,servlet可以记录事件日志,获取资源的URL地址,并且设置和保存上下文内可以访问的其他servlet的属性。
容器中部署的每一个web应用都有一个ServletContext接口的实例对象与之关联。如果容器被分布在多个虚拟机上,一个web应用将在每一个VM中有一个ServletContext实例。
4)初始化参数
ServletContext接口的初始化参数允许servlet访问与web应用相关的上下文初始化参数,这些由应用开发人员在部署描述符中指定:
getInitParameter
getInitParameterNames
应用开发人员利用初始化参数传送配置信息。典型的例子是web管理员的e-mail地址或者一个持有关键数据的系统名称。
3.HTTP会话
在HTTP连接间维护用户与统一用户发出的不同请求之间关联的情况称为维护一个会话(session)。
3.1 会话的特征
1)不同用户的会话应当是相互独立的
2)会话一旦建立就应当一直存在,直到用户空闲时间超过了某一个时间界限,容器才应当释放该会话资源
3)在会话的存活期间,用户可能给服务器发送了很多请求,该用户的这些请求信息都可以存储在会话中
3.2 建立过程
1)建立tcp连接
2)发出请求文档
3)发出响应文档
4)释放tcp连接
4.GET与POST请求方式的区别
4.1 GET方法
使用GET请求方式,查询字符串以键值对方式连接在URL后面被被一起传送至服务器。
GET方法特点:
1)GET请求能被缓存;
2)GET请求主要用于获取数据;
3)GET请求的长度有限制;
4)GET请求保存在浏览器的历史记录中;
5)GET请求的URL能保存为书签。
6)请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。URL的编码格式采用的是ASCII编码,而不是uniclde,即是说所有的非ASCII字符都要编码之后再传输
4.2 POST方法
视同POST请求方式,查询字符串在POST请求中单独存在,和HTTP请求一起发送至服务器。
POST方法特点:
1) POST请求不能被缓存下来
2)POST请求不会保存在浏览器浏览记录中
3)以POST请求的URL无法保存为浏览器书签
4)POST请求没有长度限制
4.3 GET与POST区别
GET | POST | |
点击刷新或返回按钮 | 没有影响 | 重新发送数据 |
添加书签 | 不能添加 | 可以添加 |
缓存 | 不存在缓存 | 存在缓存 |
历史记录 | 存在历史记录 | 不存在历史记录 |
URL长度限制 | 有长度限制 | 没有长度限制 |
编码类型 | application/x-www-form-urlencoded |
application/x-www-form-urlencoded or multipart/form-data 若传送二进制数据,则需要为其设定multipart编码 |
传送数据类型 | 只允许ASCII字符型 | 没有限制,可为二进制类型 |
安全性 | 不要用GET方式提交敏感数据 | 传输敏感数据请加密 |
查询字符串可见性 | 可见 | 不可见 |
5.Servlet转发与重定向
response.sendRedirect("a.jsp");——转发;request.getRequestDispatcher("a.jsp").forward(request,response)——重定向
区别:
1)转发在服务器端完成的;重定向是在客户端完成的
2)转发的是同一次请求;重定向是两次不同请求
3)转发不会执行转发后的代码;重定向会执行重定向之后的代码
4)转发浏览器地址栏没有变化;重定浏览器向地址栏有变化
5)转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成