servlet概述
Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面。它担当Web浏览器或其他HTTP客户程序发出请求,与HTTP服务器上的数据库或应用程序之间的中间层。
Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet 的Java虚拟机。
servlet由来
servlet是在服务器上运行的小程序。这个词是在Java applet的环境中创造的,Java applet 是一种当作单独文件跟网页一起发送的小程序,它通常用于在客户端运行,结果得到为用户进行运算或者根据用户互作用定位图形等服务。
服务器上需要一些程序,常常是根据用户输入访问数据库的程序。这些通常是使用公共网关接口(CGI)应用程序完成的。然而,在服务器上运行Java,这种程序可使用Java编程语言实现。在通信量大的服务器上,Java servlet的优点在于它们的执行速度更快于CGI 程序。各个用户请求被激活成单个程序中的一个线程,而创建单独的程序,这意味着各个请求的系统开销比较小。
Java Servlet 与Applet 的比较
相似之处:
* 它们不是独立的应用程序,没有main()方法。
* 它们不是由用户或程序员调用,而是由另外一个应用程序(容器)调用。
* 它们都有一个生存周期,包含init()和destroy()方法。
不同之处:
* Applet具有很好的图形界面(AWT),与浏览器一起,在客户端运行。
* Servlet 则没有图形界面,运行在服务器端。
与传统CGI的比较
Java Servlet 与CGI(Common Gateway Interface) 的比较:
与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资。在未来的技术发展过程中,Servlet 有可能彻底取代CGI。
在传统的CGI中,每个请求都要启动一个新的进程,如果CGI程序本身的执行时间较短,启动进程所需要的开销很可能反而超过实际执行时间。而在Servlet中,每个请求由一个轻量级的Java线程处理(而不是重量级的操作系统进程)。
在传统CGI中,如果有N个并发的对同一CGI程序的请求,则该CGI程序的代码在内
存中重复装载了N次;而对于Servlet,处理请求的是N个线程,只需要一份Servlet类代码。在性能优化方面,Servlet也比CGI有着更多的选择。
* 方便
Servlet提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。
* 功能强大
在Servlet中,许多使用传统CGI程序很难完成的任务都可以轻松地完成。例如,Servlet 能够直接和Web服务器交互,而普通的CGI程序不能。Servlet还能够在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现。
* 可移植性好
Servlet用Java编写,Servlet API具有完善的标准。因此,为IPlanet Enterprise Server 写的Servlet无需任何实质上的改动即可移植到Apache、Microsoft IIS或者WebStar。几乎所有的主流服务器都直接或通过插件支持Servlet。
* 节省投资
不仅有许多廉价甚至免费的Web服务器可供个人或小规模网站使用,而且对于现有的服务器,如果它不支持Servlet的话,要加上这部分功能也往往是免费的(或只需要极少的投资)。
Java Servlet 与JSP 的比较
JavaServer Pages(JSP) 是一种实现普通静态HTML和动态HTML混合编码的技术,JSP 并没有增加任何本质上不能用Servlet实现的功能。但是,在JSP中编写静态HTML更加方便,不必再用println语句来输出每一行HTML代码。更重要的是,借助内容和外观的分离,页面制作中不同性质的任务可以方便地分开:比如,由页面设计者进行HTML设计,同时留出供Servlet程序员插入动态内容的空间。
HTTP Servlet应用编程接口
HTTP Servlet 使用一个HTML 表格来发送和接收数据。要创建一个HTTP Servlet,请扩展HttpServlet 类,该类是用专门的方法来处理HTML 表格的GenericServlet 的一个子类。HTML 表单是由
标记定义的。表单中典型地包含输入字段(如文本输入字段、复选框、单选按钮和选择列表)和用于提交数据的按钮。当提交信息时,它们还指定服务器应执行哪一个Servlet(或其它的程序)。HttpServlet 类包含init()、destroy()、service() 等方法。其中init() 和destroy() 方法是继承的。(1) init() 方法
在Servlet 的生命期中,仅执行一次init() 方法。它是在服务器装入Servlet 时执行的。可以配置服务器,以在启动服务器或客户机首次访问Servlet 时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init() 。
缺省的init() 方法通常是符合要求的,但也可以用定制init() 方法来覆盖它,典型的是管理服务器端资源。例如,可能编写一个定制init() 来只用于一次装入GIF 图像,改进Servlet 返回GIF 图像和含有多个客户机请求的性能。另一个示例是初始化数据库连接。缺省的init() 方法设置了Servlet 的初始化参数,并用它的ServletConfig 对象参数来启动配置,因此所有覆盖init() 方法的Servlet 应调用super.init() 以确保仍然执行这些任务。在
调用service() 方法之前,应确保已完成了init() 方法。
(2) service() 方法
service() 方法是Servlet 的核心。每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,而且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象作为参数。在HttpServlet 中已存在service() 方法。缺省的服务功能是调用与HTTP 请求的方法相应的do 功能。例如,如果HTTP 请求方法为GET,则缺省情况下就调用doGet() 。Servlet 应该为Servlet 支持的HTTP 方法覆盖do 功能。因为HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖service() 方法。只需覆盖相应的do 方法就可以了。
Servlet的响应可以是下列几种类型:
一个输出流,浏览器根据它的内容类型(如text/HTML)进行解释。
一个HTTP错误响应, 重定向到另一个URL、servlet、JSP。
(3)doGet()方法
当一个客户通过HTML 表单发出一个HTTP GET请求或直接请求一个URL时,doGet()方法被调用。与GET请求相关的参数添加到URL的后面,并与这个请求一起发送。当不会修改服务器端的数据时,应该使用doGet()方法。
(4)doPost()方法
当一个客户通过HTML 表单发出一个HTTP POST请求时,doPost()方法被调用。与POST请求相关的参数作为一个单独的HTTP 请求从浏览器发送到服务器。当需要修改服务器端的数据时,应该使用doPost()方法。
(5) destroy() 方法
destroy() 方法仅执行一次,即在服务器停止且卸装Servlet 时执行该方法。典型的,将Servlet 作为服务器进程的一部分来关闭。缺省的destroy() 方法通常是符合要求的,但也可以覆盖它,典型的是管理服务器端资源。例如,如果Servlet 在运行时会累计统计数据,则可以编写一个destroy() 方法,该方法用于在未装入Servlet 时将统计数字保存在文件中。另一个示例是关闭数据库连接。
当服务器卸装Servlet 时,将在所有service() 方法调用完成后,或在指定的时间间隔过后调用destroy() 方法。一个Servlet 在运行service() 方法时可能会产生其它的线程,因此请确认在调用destroy() 方法时,这些线程已终止或完成。
(6) GetServletConfig()方法
GetServletConfig()方法返回一个ServletConfig 对象,该对象用来返回初始化参数和ServletContext。ServletContext 接口提供有关servlet 的环境信息。
(7) GetServletInfo()方法
GetServletInfo()方法是一个可选的方法,它提供有关servlet 的信息,如作者、版本、版权。
当服务器调用sevlet 的Service()、doGet()和doPost()这三个方法时,均需要"请求"和"响应"对象作为参数。"请求"对象提供有关请求的信息,而"响应"对象提供了一个将响应信息返回给浏览器的一个通信途径。
javax.servlet 软件包中的相关类为ServletResponse和ServletRequest,而javax.servlet.http 软件包中的相关类为HttpServletRequest 和HttpServletResponse。Servlet 通过这些对象与服务器通信并最终与客户机通信。Servlet 能通过调用"请求"对象的方法获知客户机环境,服务器环境的信息和所有由客户机提供的信息。Servlet 可以调用"响应"对象的方法发送响应,该响应是准备发回客户机的。
Servlet API 中文版
基本类和接口
一、javax.servlet.Servlet接口
servlet抽象集是javax.servlet.Servlet接口,它规定了必须由Servlet类实现由servlet引擎识别和管理的方法集。
Servlet接口的基本目标是提供生命期方法init()、service()和destroy()方法。
servlet接口中的方法
void init(ServletConfit config)throws ServletException 在servlet被载入后和实施服务前由servlet引擎进行?次性调用。如果init()产生溢出UnavailableException,则servle退出服务。ServletConfig getServletConfig() 返回传递到servlet的init()方法的ServletConfig对象void service(ServletRequest request, ServletResponse response)throws ServletException,IOException 处理request对象中描述的请求,使用response对象返回请求结果
String getServletInfo() 返回描述servlet的一个字符串
void destory() 当servlet将要卸载时由servlet引擎调用
二、javax.servlet.GenericServlet类(协议无关版本)
GenericServlet是一种与协议无关的servlet,是一种跟本不对请求提供服务的servlet,而是简单地从init()方法启动后台线程并在destory()中杀死。它可以用于模拟操作系统的端口监控进程。
servlet API提供了Servlet接口的直接实现,称为GenericServlet。此类提供除了service()方法外所有接口中方法的缺省实现。这意味着通过简单地扩展GenericServlte可以编写一个基本的servlet。
除了Servlet接口外,GenericServlet也实现了ServletConfig接口,处理初始化参数和servlet 上下文,提供对授权传递到init()方法中的ServletConfig对象的方法。
GenericServlet类中的方法
void destory() 编飞组成单词“destory”的一个注册入口
String getInitParameter(String name) 返回具有指定名称的初始化参数值。通过凋用config.getInitParameter(name)实现。
Enumeration getInitParameterNames() 返回此serv]et已编码的所有初始化参数的?个枚举类型值。调用config.getInitParameterNames()获得列表。如果未提供初始化参数,则返回?个空的枚举类型值(但不是null)
ServletConfig getServletConfig() 返回传递到init()方法的ServletConfig对象ServletContext getServletContext() 返回在config对象中引用的ServletContext
String getServletInfo() 返回空字符串
void init(ServletConfig config)throws ServletException 在一实例变量中保存config对象。编写组成单词“init”的注册入口,然后调用方法init()
void init()throws ServletException 可以被跳过以处理servlet初始化.在config对象被保存
后init(ServletConfig config)的结尾处自动被调用.servlet作者经常会忘记调用super.init(config)
void log(String msg) 编写注册servlet的入口.为此调用servlet上下文的log()方法.servlet 的名字被加到消息文本的开头。
void log(String msg,Throwable t) 编写一个入口和servlet注册的栈轨迹。此方法也是ServletContext中相应方法的一个副本。
abstract void service(Request request,Response response)throws ServletException,IOException 由servlet引擎调用为请求对象描述的请求提供服务。这是GenericServlet中唯一的抽象方法。因此它也是唯一必须被子类所覆盖的方法。
String getServletName() 返回在Web应用发布描述器(web.xml)中指定的servlet的名字。
三、javax.servlet.http.HttpServlet类(HTTP版本)
虽然servlet API允许扩展到其它协议,但最终所有的servlet均在Web环境下实施操作,只有几种servlet直接扩展了GenericServlet。对servlet更一般的是扩展其HTTP子类HttpServlet。HttpServlet 类通过调用指定到HTTP请求方法的方法实现service(),亦即对DELETE、HEAD、GET、OPTIONS、POST、PUT和TRACE,分别调用doDelete()、doHead()、doGet()、doOptions()、doPost()、doPut()和doTrace()方法,将请求和响应对象置入其HTTP指定子类。
HttpServlet类中的方法
Void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException 由servlet引擎调用用处理一个HTTP GET请求。输入参数、HTTP头标和输入流可从request对象、response头标和response对象的输出流中获得。V oid doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException 由servlet引擎调用用处理一个HTTP POST请求。输入参数、HTTP头标和输入流可从request对象、response头标和response对象的输出流中获得。V oid doPut(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException 由servlet引擎调用用处理一个HTTP PUT请求。本方法中请求URI指出被载入的文件位置。
V oid doDelete(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException 由servlet引擎调用用处理一个HTTP DELETE请求。请求URI指出资源被删除。
V oid doOptions(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException 由servlet引擎调用用处理一个HTTP OPTIONS请求。返回一个Allow响应头标表明此servlet支持的HTTP方法。一个servlet不需要覆盖此方法,因为HttpServlet方法已经实现规范所需的功能。
V oid doTrace(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException 由servlet引擎调用用处理一个HTTP TRACE请求。使得请求头标被反馈成响应关标。一个servlet不需要覆盖此方法,因为HttpServlet方法已经实现HTTP规范所需的功能。
V oid service(HttpServletRequest request,HttpServletResponse response)throws
ServletException,IOException Service(Request request,Response response)调用的一个立即方法,带有指定HTTP请求和响应。此方法实际上将请求导向doGet()、doPost()等等。不应该覆盖此方法。
V oid service(Request request,Response response)throws ServletException,IOException 将请求和响应对象置入其指定的HTTP子类,并调用指定HTTP的service()方法。
四、javax.servlet.ServletRequest类(协议无关版本)
ServletRequest接口封装了客户端请求的细节。它与协议无关,并有一个指定HTTP的子接口。
ServletRequest主要处理:
1.找到客户端的主机名和IP地址
2.检索请求参数
3.取得和设置属性
4.取得输入和输出流
ServletRequest类中的方法
Object getAttribute(String name) 返回具有指定名字的请求属性,如果不存在则返回null。属性可由servlet引擎设置或使用setAttribute()显式加入。
Enumeration getAttributeName() 返回请求中所有属性名的枚举。如果不存在属性,则返回一个空的枚举。
String getCharacteEncoding() 返回请求所用的字符编码。
Int getContentLength() 指定输入流的长度,如果未知则返回-1。
ServletInputStream getInputStream()throws IOException 返回与请求相关的(二进制)输入流。可以调用getInputStream()或getReader()方法之一。
String getParameter(String name) 返回指定输入参数,如果不存在,返回null。Enumeration getParameterName() 返回请求中所有参数名的一个可能为空的枚举。String[] getParameterValues(String name) 返回指定输入参数名的取值数组,如果取值不存在则返回null。它在参数具有多个取值的情况下十分有用。
String get Protocol() 返回请求使用协议的名称和版本。
String getScheme() 返回请求URI的子串,但不包含第一个冒号前的内容。
String getServerName() 返回处理请求的服务器的主机名。
String getServerPort() 返回接收主机正在侦听的端口号。
BufferedReader getReader()throws IOException 返回与请求相关输入数据的一个字符解读器。此方法与getInputStream()只可分别调用,不能同时使用。
String getRemoteAddr() 返回客户端主机的数字型IP地址。
String getRemoteHost() 如果知道,返回客户端主机名。
void setAttribute(String name,Object obj) 以指定名称保存请求中指定对象的引用。
void removeAttribute(String name) 从请求中删除指定属性
Locale getLocale() 如果已知,返回客户端的第一现场或者为null。
Enumeration getLocales() 如果已知,返回客户端的第一现场的一个枚举,否则返回服务器第一现场。
boolean isSecure() 如果请求使用了如HTTPS安全隧道,返回true RequestDispatcher getRequestDispatcher(String name) 返回指定源名称的
RequsetDispatcher对象。
五、javax.servlet.http.HttpServletRequest接口(HTTP版本)
HttpServletRequest类主要处理:
1.读取和写入HTTP头标
2.取得和设置cookies
3.取得路径信息
4.标识HTTP会话。
HttpServletRequest接口中的方法
String getAuthType() 如果servlet由一个鉴定方案所保护,如HTTP基本鉴定,则返回方案名称。
String getContextPath() 返回指定servlet上下文(web应用)的URL的前缀。
Cookie[] getCookies() 返回与请求相关cookie的一个数组。
Long getDateHeader(String name) 将输出转换成适合构建Date对象的long类型取值的getHeader()的简化版。
String getHeader(String name) 返回指定的HTTP头标指。如果其由请求给出,则名字应为大小写不敏感。
Enumeration getHeaderNames() 返回请求给出的所有HTTP头标名称的权举值。Enumeration getHeaders(String name) 返回请求给出的指定类型的所有HTTP头标的名称的枚举值,它对具有多取值的头标非常有用。
int getIntHeader(String name) 将输出转换为int取值的getHeader()的简化版。
String getMethod() 返回HTTP请求方法(例如GET、POST等等)
String getPathInfo() 返回在URL中指定的任意附加路径信息。
String getPathTranslated() 返回在URL中指定的任意附加路径信息,被子转换成一个实际路径。
String getQueryString() 返回查询字符串,即URL中?后面的部份。
String getRemoteUser() 如果用户通过鉴定,返回远程用户名,否则为null。
String getRequestedSessionId() 返回客户端的会话ID
String getRequestURI() 返回URL中一部分,从“/”开始,包括上下文,但不包括任意查询字符串。
String getServletPath() 返回请求URI上下文后的子串
HttpSession getSession() 调用getSession(true)的简化版。
HttpSession getSession(boolean create) 返回当前HTTP会话,如果不存在,则创建一个新的会话,create参数为true。
Principal getPrincipal() 如果用户通过鉴定,返回代表当前用户的java.security.Principal 对象,否则为null。
boolean isRequestedSessionIdFromCookie() 如果请求的会话ID由一个Cookie对象提供,则返回true,否则为false。
boolean isRequestedSessionIdFromURL() 如果请求的会话ID在请求URL中解码,返回true,否则为false
boolean isRequestedSessionIdValid() 如果客户端返回的会话ID仍然有效,则返回true。
Boolean isUserInRole(String role) 如果当前已通过鉴定用户与指定角色相关,则返回true,如果不是或用户未通过鉴定,则返回false。
六、javax.servlet.ServletResponse接口(协议无关版本)
ServletResponse对象将一个servlet生成的结果传到发出请求的客户端。ServletResponse操作主要是作为输出流及其内容类型和长度的包容器,它由servlet引擎创建.
ServletResponse接口中的方法
void flushBuffer()throws IOException 发送缓存到客户端的输出内容。因为HTTP需要头标在内容前被发送,调用此方法发送状态行和响应头标,以确认请求。
int getBufferSize() 返回响应使用的缓存大小。如果缓存无效则返加0。
String getCharacterEncoding() 返回响应使用字符解码的名字。除非显式设置,否则为ISO-8859-1
Locale getLocale() 返回响应使用的现场。除非用setLocale()修改,否则缺省为服务器现场。
OutputStream getOutputStream()throws IOException 返回用于将返回的二进制输出写入客户端的流,此方法和getWrite()方法二者只能调用其一。
Writer getWriter()throws IOException 返回用于将返回的文本输出写入客户端的一个字符写入器,此方法和getOutputStream()二者只能调用其一。
boolean isCommitted() 如果状态和响应头标已经被发回客户端,则返回true,在响应被确认后发送响应头标毫无作用。
void reset() 清除输出缓存及任何响应头标。如果响应已得到确认,则引发事件IllegalStateException。
void setBufferSize(int nBytes) 设置响应的最小缓存大小。实际缓存大小可以更大,可以通过调用getBufferSize()得到。如果输出已被写入,则产生IllegalStateException。
void setContentLength(int length) 设置内容体的长度。
void setContentType(String type) 设置内容类型。在HTTP servlet中即设置Content-Type 头标。
void setLocale(Locale locale) 设置响应使用的现场。在HTTP servlet中,将对Content-Type头标取值产生影响。
七、javax.servlet.http.HttpServletResponse接口(HTTP版本)
HttpServletResponse加入表示状态码、状态信息和响应头标的方法,它还负责对URL中写入一Web页面的HTTP会话ID进行解码。
HttpServletResponse接口中的方法
void addCookie(Cookie cookie) 将一个Set-Cookie头标加入到响应。
void addDateHeader(String name,long date) 使用指定日期值加入带有指定名字(或代换所有此名字头标)的响应头标的方法。
void setHeader(String name,String value) 设置具有指定名字和取值的一个响应头标。
void addIntHeader(String name,int value) 使用指定整型值加入带有指定名字的响应头标(或代换此名字的所有头标)。
boolean containsHeader(String name) 如果响应已包含此名字的头标,则返回true。String encodeRedirectURL(String url) 如果客户端不知道接受cookid,则向URL加入会话ID。第一种形式只对在sendRedirect()中使用的URL进行调用。其他被编码的URLs应被传递到encodeURL()
String encodeURL(String url)
void sendError(int status) 设置响应状态码为指定值(可选的状态信息)。HttpServleetResponse定义了一个完整的整数常量集合表示有效状态值。
void sendError(int status,String msg)
void setStatus(int status) 设置响应状态码为指定指。只应用于不产生错误的响应,而错误响应使用sendError()。
八、javax.servlet.ServletContext接口
一个servlet上下文是servlet引擎提供用来服务于Web应用的接口。Servlet上下文具有名字(它属于Web应用的名字)唯一映射到文件系统的一个目录。
一个servlet可以通过ServletConfig对象的getServletContext()方法得到servlet上下文的引用,如果servlet直接或间接调用子类GenericServlet,则可以使用getServletContext()方法。Web应用中servlet可以使用servlet上下文得到:
1.在调用期间保存和检索属性的功能,并与其他servlet共享这些属性。
2.读取Web应用中文件内容和其他静态资源的功能。
3.互相发送请求的方式。
4.记录错误和信息化消息的功能。
ServletContext接口中的方法
Object getAttribute(String name) 返回servlet上下文中具有指定名字的对象,或使用已指定名捆绑一个对象。从Web应用的标准观点看,这样的对象是全局对象,因为它们可以被同一servlet在另一时刻访问。或上下文中任意其他servlet访问。
void setAttribute(String name,Object obj) 设置servlet上下文中具有指定名字的对象。Enumeration getAttributeNames() 返回保存在servlet上下文中所有属性名字的枚举。ServletContext getContext(String uripath) 返回映射到另一URL的servlet上下文。在同一服务器中URL必须是以“/”开头的绝对路径。
String getInitParameter(String name) 返回指定上下文范围的初始化参数值。此方法与ServletConfig方法名称不一样,后者只应用于已编码的指定servlet。此方法应用于上下文中所有的参数。
Enumeration getInitParameterNames() 返回(可能为空)指定上下文范围的初始化参数值名字的枚举值。
int getMajorVersion() 返回此上下文中支持servlet API级别的最大和最小版本号。
int getMinorVersion()
String getMimeType(String fileName) 返回指定文件名的MIME类型。典型情况是基于文件扩展名,而不是文件本身的内容(它可以不必存在)。如果MIME类型未知,可以返回null。
RequestDispatcher getNameDispatcher(String name) 返回具有指定名字或路径的servlet 或JSP的RequestDispatcher。如果不能创建RequestDispatch,返回null。如果指定路径,必须心“/”开头,并且是相对于servlet上下文的顶部。
RequestDispatcher getNameDispatcher(String path)
String getRealPath(String path) 给定一个URI,返回文件系统中URI对应的绝对路径。如果不能进行映射,返回null。
URL getResource(String path) 返回相对于servlet上下文或读取URL的输入流的指定绝对路径相对应的URL,如果资源不存在则返回null。
InputStream getResourceAsStream(String path)
String getServerInfo() 返顺servlet引擎的名称和版本号。
void log(String message)
void log(String message,Throwable t) 将一个消息写入servlet注册,如果给出Throwable 参数,则包含栈轨迹。
void removeAttribute(String name) 从servlet上下文中删除指定属性。
九、javax.servlet.http.HttpSession接口
HttpSession类似于哈希表的接口,它提供了setAttribute ()和getAttribute()方法存储和检索对象。HttpSession提供了一个会话ID关键字,一个参与会话行为的客户端在同一会话的请求中存储和返回它。servlet引擎查找适当的会话对象,并使之对当前请求可用。
HttpSession接口中的方法
Object getAttribute(String name) 将会话中一个对象保存为指定名字,返回或删除前面保存的此名称对象。
void setAttribute(String name,Object value)
void removeAttribute(String name)
Enumeration getAttributeName() 返回捆绑到当前会话的所有属性名的枚举值。
long getCreationTime() 返回表示会话创建和最后访问日期和时间的一个长整型,该整型形式为java.util.Date()构造器中使用的形式。
long getLastAccessedTime()
String getId() 返回会话ID,servlet引擎设置的一个唯一关键字。
ing getMaxInactiveInterval() 如果没有与客户端发生交互,设置和返回会话存活的最大秒数。
void setMasInactiveInterval(int seconds)
void invalidate() 使得会话被终止,释放其中任意对象。
boolean isNew() 如果客户端仍未加入到会话,返回true。当会话首次被创建,会话ID 被传入客户端,但客户端仍未进行包含此会话ID的第二次请示时,返回true。
"*"表示重要性,星号越多越重要
day1
一、Web应用基础
1.B-S架构(***)
架构的发展
c/s vs. b/s
c/s架构(client客户端-server服务端)
(胖客户端:要求客户端运行业务;把业务放到服务器端,则是瘦客户端)
典型的c/s应用:ftp工具、QQ、邮件系统、杀毒软件...
1.建立在tcp/ip协议之上,有自己的通信规则(建立业务)
2.需要相互配合才能完成一个完整业务逻辑
3.允许多个客户端程序同时接入一个server程序(并发)
4.每一个client(机器)都必须安装客户软件
5.修改了server程序,通常client程序都要修改(升级)
优点:利用客户端的计算能力,分担服务器的负荷(大型网络游戏就利用这点)
缺点:用户必须安装客户端程序;客户端需要升级(麻烦)
b/s架构(browser - web server(cluster集群))
(极瘦客户端:最低限度地减少客户端程序,只需要browser(浏览器))
1.基于http协议(应用层)
2.几乎所有的业务逻辑处理都在server完成
3.支持并发
4.client要求很少,只需要安装browser(浏览器)
5.修改server之后,client不需要任何变化
6.server端开发技术:html/js,xhtml,... php,asp,jsp,servlet
缺点:所有业务都在服务器端完成,服务器负荷大。
优点:支持高并发访问;不需另外安装软件(只需浏览器),免去更新的麻烦。
2.开发一个静态的Web应用(*)
1)下载一个tomcat服务器
2)web服务器-Tomcat的启动和配置(熟练使用和配置)
先进入Tomcat主目录下的bin目录// %catalina_home%/bin
window平台:启动---startup.bat
关闭---shutdown.bat
Linux平台:启动---startup.sh 或catalina.sh run //catalina单次启动;startup启动直至shutdown
关闭---shutdown.sh 或Ctrl+C
测试:打开浏览器,访问Tomcat 首页:http://localhost:8080 或者http://127.0.0.1:8080/ 获取进程Id强行杀死tomcat进程
ps ef|grep tomcat ---查看tomcat的进程id
kill -9 tomcat进程Id号--- 强行杀死tomcat进程
3)介绍Web应用的结构
严格定义为两部分
Web应用的根目录下有一个特定的子目录称为WEB-INF,其中包含不能被客户访问的专用Web应用程序软件,
包括Servlet类文件、部署描述符web.xml、外部库以及其它任何由此应用程序使用的专用文件。
所有位于WEB-INF之外的文件都被看作是公共的,它们可以从客户端被访问。资源包括HTML页面、JSP页面和图像等。
web.xml的模板(一个web.xml中可以配置多个Servlet):
xmlns="https://www.doczj.com/doc/9f12736479.html,/xml/ns/javaee" xmlns:xsi="https://www.doczj.com/doc/9f12736479.html,/2001/XMLSchema-instance" xsi:schemaLocation="https://www.doczj.com/doc/9f12736479.html,/xml/ns/javaee https://www.doczj.com/doc/9f12736479.html,/xml/ns/javaee/web-app_2_5.xsd">
4)注意事项
3.介绍Web服务器的一些特点
什么是静态内容?什么是动态内容?
静态:返回页面每个客户端都相同。动态:各个客户端的页面各不相同。
产生动态内容的Web辅助应用:CGI & Servlet
CGI(Common Gateway Interface): 可以产生动态内容,跨语言(C/C++, Perl, python...)
1.本身是一个进程(数据共享,跨进程调用) --性能较差
2.可移植性很差(本地语言)
3.安全性差--可以访问本地的操作系统,容易受黑客攻击
web server / servlet container
1.性能好--多线程(而不是进程)
2.可移植性--相对好
3.安全性
4.Http基础(**)
HTTP(Hyper Text Transfer Protocol)是超文本传输协议的缩写,它用于传送WWW 方式的数据。
HTTP 协议采用了请求/响应模型。基于TCP/IP 之上的协议,在Web 上广泛使用。无状态。
如果来自服务器的响应是html 页面,那么html 内容会嵌入到Http 响应中。
Http 会话:是一个简单的请求-响应序列。
1)请求响应模型
请求的关键要素:1.http方法(要完成的动作) 2.要访问的页面(URL请求) 3.表单参数响应的关键要素:1.状态码(请求是否成功) 2.内容类型(txt,img,html等) 3.返回内容(具体资源:html,图片等)
2)URL的分析
URL(Uniform Resoure Locator)统一资源定位器。Web 上的每一个资源都有唯一的地址,采用的就是url 格式
3)使用Http Monitor截获http的请求与响应信息
Http 请求方法包括:Get()方法;Post()方法; 其它方法:Head, Trace, Put, Delete, Connect 等
Get()方法:Http 最简单的方法,其最主要的任务:从服务器上获取资源
Post()方法:更强大的请求方法,不仅可以请求资源,还可以向服务器发送表单数据4)分析http请求的信息
客户端向服务器发送一个请求,请求头包含:
1.请求的方法;
2.URI;
3.协议版本;
4.以及包含请求修饰符;
5.客户信息和内容的类似于MIME 的消息结构
5)分析http响应的信息
截获内容:
HTTP/1.1 200 OK // HTTP/1.1 是web服务器使用的版本;200 是状态码;OK 是状态码的文本版本
ETag: W/"472-1198101802343"
Last-Modified: Wed, 19 Dec 2007 22:03:22 GMT
Content-Type: text/html // MIME类型:告诉浏览器所要接收的是哪一类型的数据。以供浏览器显示。
Content-Length: 472
Date: Wed, 19 Dec 2007 22:05:44 GMT
Server: Apache-Coyote/1.1
//以上是Http响应的首部
//响应体中包含了Html以及其它要显示的内容
Http 响应状态码分析(具体代码含义参看http 代码对照表):
1xx:信息响应类,表示接收到请求并且继续处理
2xx:处理成功响应类,表示动作被成功接收、理解和接受
3xx:复位向响应类,为了完成指定的动作,必须接受进一步处理
4xx:客户端错误,客户请求包含语法错误或者是不能正确执行
如:404——无法找到,表示无法找到指定位置的资源。
5xx:服务端错误,服务器不能正确执行一个正确的请求
二、Servlet基础
1.介绍Servlet的基本概念(***)
(Servlet、Servlet容器、Servlet vs. CGI)——————图示
1)它是由java 编写的、服务端的小程序。相对而言,Applet和javaScript是客户端小程序。
2)基于Http协议的,运行在web服务器内的。Servlet和CGI都是运行在Web服务器上,用来生成Web页面。
3)没有main 方法。是接受来自网络的请求(form表单,以及其它的请求),并对不同请求作出不同的响应。
4)由容器管理和调用。这个web容器可以控制Servlet对象的生命周期,控制请求由Servlet 对象处理。
5)Web 服务器的辅助应用,处理特定的用户请求,并返回响应。
web服务器,这里的服务器不是硬件概念,而是软件,常用的web服务器有Tomcat,Jboss等
Tomcat是一个用java语言编写的web服务器,所以需要有相应的java运行环境,也就是JVM,还要配置tomcat的具体路径。
6)继承java 的优点,与协议、平台无关
2.开发第一个Servlet应用(**)
Web应用的结构
开发一个Servlet应用的步骤
1)建立Web 应用目录(注意细节:各目录的位置、名称与包含的内容)
2)编写Java 代码,如:HelloWorld.java
把生成的.class 文件放置到WebRoot/WEB-INF/classes 目录下
3)编写配置文件:web.xml
放置到WebRoot/WEB-INF/ 目录下
4)把整个web 应用放到%catalina_home%/webapps //放到tomcat的webapps目录下
3.分析Servlet应用(***)
1)Servlet的继承体系
javax.servlet.Servlet接口--> GenericServlet抽象类--> HttpServlet --> 自定义类
所有的servlet都必须实现该接口处理各种协议(包括http) 专职处理http协议也可继承GenericServlet
2)Servlet接口;GenericServlet抽象类;HttpServlet类
Servlet接口(位置:javax.servlet.Servlet) 定义了特定的生命周期方法:
init(ServletConfig config)
service(HttpServletRequest request, HttpServletResponse response)
destroy()
GenericServlet implements Servlet
实现了init(ServletConfig config)、destroy()等方法;并提供了init()方法。
还实现了ServletConfig 接口。由于这是抽象类,所以必须实现抽象方法:service() HttpServlet extends GenericServlet (位置:javax.servlet.http.HttpServlet)
具有父类GenericServlet 类似的方法和对象,是使用Servlet 编程常用的类
支持HTTP 的post 和get 等方法。
3)容器如何找到指定的Servlet?(图示)
Servlet有3 个"名字":url 名、应用中的逻辑名、实际的名字
配置文件web.xml 都把这几个名字一一对应起来了
Servlet是受容器管理的
request对象、response对象都是容器根据客户端请求而产生的。
容器根据url请求,通过DD(web.xml)配置(url名,内部逻辑名,完全限定名)定位具体的servlet。
容器根据客户请求创建/分配一个线程,并调用servlet的service()方法,把request对象、respone对象作为参数传过去
service()方法会根据客户端请求的Http方法调用不同的HttpServlet的方法(doGet(),doPost(),...);
Servlet使用response对象把处理完的结果响应到客户端。
service()方法结束后,线程要么撤销,要么返回容器的线程池;request对象、response 对象都被gc回收。
4.使用Servlet来发送用户输入的信息
1)开发用户登录的应用
2)如何使用Form表单来提交数据