Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等
,当服务器决定将实例销毁的时候调用其destroy方法
。html
与CGI的区别在于Servlet处于服务器进程中,它经过多线程方式运行其service方法,一个实例能够服务于多个请求
,而且其实例通常不会销毁,而CGI对每一个请求都产生新的进程
,服务完成后就销毁,因此效率上低于servlet。java
forward是服务器内部请求资源
,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,而后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,因此它的地址栏中仍是原来的地址。sql
redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器从新去请求那个地址,通常来讲浏览器会用刚才请求的全部参数从新请求,因此session,request参数均可以获取。后端
动态INCLUDE用jsp:include动做实现 <jsp:include page="included.jsp" flush="true" />
它老是会检查所含文件中的变化
,适合用于包含动态页面,而且能够带参数。设计模式
静态INCLUDE用include伪码实现,不会检查所含文件的变化
,适用于包含静态页面<%@ include file="included.htm" %>
数组
request
表示HttpServletRequest对象。它包含了有关浏览器请求的信息,而且提供了几个用于获取cookie, header, 和session数据的有用的方法。浏览器
response
表示HttpServletResponse对象,并提供了几个用于设置送回浏览器的响应的方法(如cookies,头信息等)。安全
out
对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。bash
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实例。
<%@page language=”java” contenType=”text/html;charset=gb2312” session=”true” buffer=”64kb” autoFlush=”true” isThreadSafe=”true” info=”text” errorPage=”error.jsp” isErrorPage=”true” isELIgnored=”true” pageEncoding=”gb2312” import=”java.sql.*”%>
复制代码
isErrorPage(是否能使用Exception对象),isELIgnored(是否忽略表达式)
<%@include file=”filename”%>
<%@taglib prefix=”c”uri=”http://……”%>
Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。
<%@ page isThreadSafe=”false”%>
request,session,application,cookie等
JSP 是Servlet技术的扩展
,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"
。Servlet和JSP最主要的不一样点在于,Servlet的应用逻辑是在Java文件中,而且彻底从表示层中的HTML里分离开来。而JSP的状况是Java和HTML能够组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑
。
page
是表明与一个页面相关的对象和属性。一个页面由一个编译好的 Java servlet 类(能够带有任何的 include 指令,可是没有 include 动做)表示。这既包括 servlet 又包括被编译成 servlet 的 JSP 页面。
request
是表明与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(因为 forward 指令和 include 动做的关系)。
session
是表明与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话能够也常常会跨越多个客户机请求。
application
是表明与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局做用域。
setAttribute(String name,Object)
:设置名字为name的request的参数值
getAttribute(String name)
:返回由name指定的属性值
getAttributeNames()
:返回request对象全部属性的名字集合,结果是一个枚举的实例
getCookies()
:返回客户端的全部Cookie对象,结果是一个Cookie数组
getCharacterEncoding()
:返回请求中的字符编码方式
getContentLength()
:返回请求的Body的长度
getHeader(String name)
:得到HTTP协议定义的文件头信息
getHeaders(String name)
:返回指定名字的request Header的全部值,结果是一个枚举的实例
getHeaderNames()
:返回因此request Header的名字,结果是一个枚举的实例
getInputStream()
:返回请求的输入流,用于得到请求中的数据
getMethod()
:得到客户端向服务器端传送数据的方法
getParameter(String name)
:得到客户端传送给服务器端的有name指定的参数值
getParameterNames()
:得到客户端传送给服务器端的全部参数的名字,结果是一个枚举的实例
getParameterValues(String name)
:得到有name指定的参数的全部值
getProtocol()
:获取客户端向服务器端传送数据所依据的协议名称
getQueryString()
:得到查询字符串
getRequestURI()
:获取发出请求字符串的客户端地址
getRemoteAddr()
:获取客户端的IP地址
getRemoteHost()
:获取客户端的名字
getSession([Boolean create])
:返回和请求相关Session
getServerName()
:获取服务器的名字
getServletPath()
:获取客户端所请求的脚本文件的路径
getServerPort()
:获取服务器的端口号
removeAttribute(String name)
:删除请求中的一个属性
J2EE自己是一个标准
,一个为企业分布式应用的开发提供的标准平台。J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。
J2EE是一套全然不一样于传统应用开发的技术架构,包含许多组件,主要可简化且规范应用系统的开发与部署,进而提升可移植性、安全与再用价值,其核心是一组技术规范与指南,其中所包含的各种组件、服务架构及技术层次,均有共通的标准及规格,让各类依循J2EE架构的不一样平台之间,存在良好的兼容性,解决过去企业后端使用的信息产品彼此之间没法兼容,致使企业内部或外部难以互通的窘境。
public void init(ServletConfig config) public ServletConfig getServletConfig() public String getServletInfo() public void service(ServletRequest request,ServletResponse response) public void destroy() 复制代码
Web容器
: 给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互,没必要关注其它系统问题。主 要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵照J2EE规范中的WEB APPLICATION 标准。咱们把遵照以上标准的WEB服务器就叫作J2EE中的WEB容器。
EJB容器
:Enterprise java bean 容器。更具备行业领域特点。他提供给运行在其中的组件EJB各类管理功能。只要知足J2EE规范的EJB放入该容器,立刻就会被容器进行高效率的管理。而且能够经过现成的接口来得到系统级别的服务。例如邮件服务、事务管理。
JNDI
:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下本身的索引,从而知足快速查找和定位分布式应用程序的功能。
JMS
:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通信。包括点对点和广播。
JTA
:(Java Transaction API)JAVA事务服务。提供各类分布式事务服务。应用程序只需调用其提供的接口便可。
JAF
:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者经过各类部署和自定义实现本身的个性安全控制策略。
RMI/IOP
: (Remote Method Invocation /internet对象请求中介协议)他们主要用于经过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,咱们能够在本地计算机 上实现对其直接调用。固然这是要经过必定的规范才能在异构的系统之间进行通讯。RMI是JAVA特有的。
MVC 是Model-View-Controller的简写。"Model" 表明的是应用的业务逻辑(经过JavaBean,EJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(通常是一个Servlet),经过这种设计模型把应用逻辑,处理过程和显示逻辑分红不一样的组件实现。这些组件能够进行交互和重 用。
JSP 共有如下6种基本动做:
jsp:include
:在页面被请求的时候引入一个文件。jsp:useBean
:寻找或者实例化一个JavaBean。jsp:setProperty
:设置JavaBean的属性。jsp:getProperty
:输出某个JavaBean的属性。jsp:forward
:把请求转到一个新的页面。jsp:plugin
:根据浏览器类型为Java插件生成OBJECT或EMBED标记。
Cookie机制采用的是在客户端保持状态
的方案,而session机制采用的是在服务器端保持状态
的方案。
Cookie机制
:正统的Cookie分发是经过 扩展HTTP协议来实现的,服务器经过 在HTTP的响应头中加上一行特殊的指示 以提示浏览器按照指示生成相应的Cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也能够生成Cookie。而Cookie的使用是由浏览器按照必定的原则在后台自动发送给服务器的。浏览器检查全部存储的Cookie,若是某个Cookie所声明的做用范围大于等于将要请求的资源所在的位置,则把该Cookie附在请求资源的HTTP请求头上发送给服务器。
Cookie的内容主要包括:名字,值,过时时间,路径和域。路径与域一块儿构成Cookie的做用范围。若不设置过时时间,则表示这个Cookie的生命期为浏览器会话期间,关闭浏览器窗口,Cookie就消失
。这种生命期为浏览器会话期的Cookie被称为会话Cookie。
会话Cookie通常不存储在硬盘上而是保存在内存里
,固然这种行为并非规范规定的。若设置了过时时间,浏览器就会把Cookie保存到硬盘上
,关闭后再次打开浏览器,这些Cookie 仍然有效直到超过设定的过时时间。存储在硬盘上的Cookie 能够在不一样的浏览器进程间共享,好比两个IE窗口。而对于保存在内存里的Cookie ,不一样的浏览器有不一样的处理方式 。
Session机制:session机制是一种服务器端的机制,服务器使用一种相似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序须要为某个客户端的请求建立一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),若是已包含则说明之前已经为此客户端建立过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),若是客户端请求不包含session id,则为此客户端建立一个session而且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。保存这个session id的方式能够采用Cookie
,这样在交互过程当中浏览器能够自动的按照规则把这个标识发送给服务器。通常这个cookie的名字都是相似于SEEESIONID
。但Cookie 能够被人为的禁止,则必须有其余机制以便在cookie被禁止时仍然可以把session id传递回服务器。
常常被使用的一种技术叫作 URL重写
,就是把session id直接附加在URL路径的后面。
还有一种技术叫作 表单隐藏字段
。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时可以把session id传递回服务器。好比:
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>
复制代码
实际上这种技术能够简单的用对action应用URL重写来代替。
Cookie 和Session 的区别:
- cookie数据存放在客户的浏览器上,session数据放在服务器上。
- cookie不是很安全,别人能够分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
- session会在必定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用 COOKIE。
- 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
JSP共有如下9种基本内置组件(可与ASP的6种内部组件相对应):
request
用户端请求,此请求会包含来自GET/POST请求的参数response
网页传回用户端的回应pageContext
网页的属性是在这里管理session
与请求有关的会话期application
servlet 正在执行的内容out
用来传送回应的输出config
servlet的构架部件page
JSP网页自己exception
针对错误网页,未捕捉的例外
带request参数的跳转
request.setAttribute("param", "value");
request.getRequestDispatcher("test.jsp").forward(request, response);
复制代码
在目的页面能够获取参数:
String Value = request.getAttribute("param")==null?:(String)request.getAttribute("param");
复制代码
不带request参数的跳转
response.sendredirect("test.jsp");
复制代码
forward 是服务器内部重定向
,程序收到请求后从新定向到另外一个程序,客户机并不知道;
redirect则是服务器收到请求后发送一个状态头给客户,客户将再请求一 次,这里多了两次网络通讯的来往。固然forward也有缺点,就是forward的页面的路径若是是相对路径就会有些问题了。
forward 会将 request state , bean 等等信息带往下一个 jsp。 redirect 是送到 client 端后再一次 request , 因此资料不被保留。
使用 forward 你就能够用 getAttribute() 来取的前一个 jsp 所放入的 bean 等资料
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,而后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,因此它的地址栏仍是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器从新去请求那个地址.因此地址栏显示的是新的URL.因此redirect等于客户端向服务器端发出两次request,同时也接受两次response。
forward:转发页面和转发到的页面能够共享request里面的数据. redirect:不能共享数据.redirect不只能够重定向到当前应用程序的其余资源,还能够重定向到同一个站点上的其余应用程序中的资源,甚至是使用绝对URL重定向到其余站点的资源. forward,方法只能在同一个Web应用程序内的资源之间转发请求. forward 是服务器内部的一种操做. redirect 是服务器通知客户端,让客户端从新发起请求. 因此,你能够说 redirect 是一种间接的请求, 可是你不能说"一个请求是属于forward仍是redirect "。
forward:通常用于用户登录的时候,根据角色转发到相应的模块. redirect:通常用于用户注销登录时返回主页面和跳转到其它的网站等.
forward:高. redirect:低.
JSP在本质上就是SERVLET,可是二者的建立方式不同.Servlet彻底是JAVA程序代码构成擅长于流程控制和事务处理而经过Servlet来生成动态网页;JSP由HTML代码和JSP标签构成,能够方便地编写动态网页,所以在实际应用中采用Servlet来控制业务流程,而采用JSP来生成动态网页.在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层.
<jsp:include page="b.jsp" />
<%@ include file="b.jsp" />
区别:
<jsp:include page="b.jsp" />(先执行,后包含)
此标签表示法:能动态区别加进来的是动态页面仍是静态页面对于静态页面则直接将资源包含(仅取其文本)。
<%@ include file="b.jsp">
此指令表示:静态地包含页面,无论其内容如何,不过是静态页面仍是动态页面都首先将页面的内容先加进来
。
<jsp:include page="b.jsp" />能够传递参数,以下:
<jsp:include page="b.jsp" >
<jsp:param name="参数名" value="参数值"/>
</jsp:include>
复制代码
servlet的转发方式有两种:
response.sendRedirect(response.encodeURL(相对路径或绝对路径)); request.getRequestDispatcher(相对路径).forward();
jsp是servlet的扩展,除可用上面两种以外,还能够用标签:
<jsp:forward page="相对路径" />
复制代码