二、servlet/jsp的网络拓扑图
三、Servlet的开发流程(以Tomcat为例,纯手工建立)
1、在%TOMCAT_HOME%\webapps下 WEB-INF的文件夹建立classes、lib目录,classes目录存放编译后的文件,lib目录存放要用到的外部库文件,另外创建一个很重要的文件:web.xml。web.xml是网站的配置文件,配置了网站的相关内容和servlet的信息,通过这个文件Tomcat知道系统有哪些 servlet,以及如何调用这些servlet。
2、开发servlet(引入servlet-api.jar。J2SE中的JDK不包括这个库文件,要从Tomcat或J2EE等其他途径去拷贝),实现servlet的相关接口,其中重要的三个接口init()、service()、 destroy()就代表了servlet的生命周期。
3、部署servlet,在web.xml文件中添加配置信息
4、启动Tomcat,访问servlet
....................................................................................
一、Servlet API结构
Servlet API包含两个包:javax.servlet包与javax.servlet.http包。
1)javax.servlet包中定义的类和接口是独立于协议的。
2)javax.servlet.http中包含了具体于HTTP协议的类和接口。
3)javax.servlet.http包中的某些类或接口继承了某些javax.servlet包中的类或接口。
1、Servlet主要类结构
1)Servlet
Servlet:Servlet接口,包括初始化方法init、销毁方法destroy和请求处理方法service,可通过init方法获得ServletConfig实例
GenericServlet:基础Servlet类,对Servlet一些常用的方法做简单的封装
HttpServlet:HTTP协议相关的Servlet类,将服务方法拆分成doGet、doPost、doDelete等
ServletConfig:可通过ServletConfig获得相关的Servlet的配置信息和获得应用全局上下文信息
2)全局环境
ServletContext:ServletContext 接口定义了servlet运行环境的信息,通过该对象servlet能够获得log事件,资源的URL,设置或存储servlet之间通信的变量。对于每个web应用,在每个java虚拟机上有且只有一个ServletContext实例
3)请求
ServletRequest:代表了Web请求的对象,通过该对象可以获取到请求内容、参数、请求客户端相关数据等
HttpServletRequest:除ServletRequest的功能之外,增加一些跟http相关的功能,譬如获取Cookie、Head信息等
ServletResponse:代表了Web响应的对象,通过该对象可以设置响应的内容等
HttpServletResponse:除ServletResponse的功能之外,增加一些跟http相关的功能,譬如Cookie、响应码等
HttpSession:超文本转移协议(HTTP)是无状态的协议,servlet规范中提供了一个简单的HttpSession接口,不需要开发者关心会话跟踪的具体细节,可通过该接口处理会话相关的功能
2、Servlet中重要的类和接口
1)在javax.servlet包中的GenericServlet类封装了Servlet的基本特征和功能。它实现了Servlet和ServletConfig接口。该类中的service()方法是抽象方法,所有子类都应当实现这个方法。
2)在javax.servlet.http包中的HttpServlet类是 GenericServlet的子类,该类提供了处理HTTP协议的基本架构。在继承HttpServlet的Servlet类中不仅仅可以使用 HttpServlet类中提供的方法,而且还可以使用在Servlet、ServletConfig接口和GenericServlet类中定义的一些方法。
二、servlet的生命周期
基本类和接口
一、javax.servlet.Servlet接口
servlet抽象集是javax.servlet.Servlet接口,它规定了必须由Servlet类实现由servlet引擎识别和管理的方法集。
Servlet接口的基本目标是提供生命期方法init()、service()和destroy()方法。
servlet接口中的方法
void init(ServletConfit config)throws ServletException
ServletConfig getServletConfig()
void service(ServletRequest request, ServletResponse response)throws ServletException,IOException
String getServletInfo()
void destory()
二、javax.servlet.GenericServlet类(协议无关版本)
GenericServlet是一种与协议无关的servlet,是一种跟本不对请求提供服务的servlet,而是简单地从init()方法启动后台线程并在destory()中杀死。它可以用于模拟操作系统的端口监控进程。
servlet API提供了Servlet接口的直接实现,称为GenericServlet。此类提供除了service()方法外所有接口中方法的缺省实现。这意味着通过简单地扩展GenericServlte可以编写一个基本的servlet。
除了Servlet接口外,GenericServlet也实现了ServletConfig接口,处理初始化参数和servlet上下文,提供对授权传递到init()方法中的ServletConfig对象的方法。
GenericServlet类中的方法
void destory()
String getInitParameter(String name)
Enumeration getInitParameterNames()
ServletConfig getServletConfig()
ServletContext getServletContext()
String getServletInfo()
void init(ServletConfig config)throws ServletException
void init()throws ServletException
void log(String msg)
void log(String msg,Throwable t)
abstract void service(Request request,Response response)throws ServletException,IOException
String getServletName()
三、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
Void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
Void doPut(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
Void doDelete(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
Void doOptions(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
Void doTrace(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
Void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
Void service(Request request,Response response)throws ServletException,IOException
四、javax.servlet.ServletRequest类(协议无关版本)
ServletRequest接口封装了客户端请求的细节。它与协议无关,并有一个指定HTTP的子接口。
ServletRequest主要处理:
1.找到客户端的主机名和IP地址
2.检索请求参数
3.取得和设置属性
4.取得输入和输出流
ServletRequest类中的方法
Object getAttribute(String name)
Enumeration getAttributeName()
String getCharacteEncoding()
Int getContentLength()
ServletInputStream getInputStream()throws IOException
String getParameter(String name)
Enumeration getParameterName()
String[] getParameterValues(String name)
String get Protocol()
String getScheme()
String getServerName()
String getServerPort()
BufferedReader getReader()throws IOException
String getRemoteAddr()
String getRemoteHost()
void setAttribute(String name,Object obj)
void removeAttribute(String name)
Locale getLocale()
Enumeration getLocales()
boolean isSecure()
RequestDispatcher getRequestDispatcher(String name)
五、javax.servlet.http.HttpServletRequest接口(HTTP版本)
HttpServletRequest类主要处理:
1.读取和写入HTTP头标
2.取得和设置cookies
3.取得路径信息
4.标识HTTP会话
HttpServletRequest接口中的方法
String getAuthType()
String getContextPath()
Cookie[] getCookies()
Long getDateHeader(String name)
String getHeader(String name)
Enumeration getHeaderNames()
Enumeration getHeaders(String name)
int getIntHeader(String name)
String getMethod()
String getPathInfo()
String getPathTranslated()
String getQueryString()
String getRemoteUser()
String getRequestedSessionId()
String getRequestURI()
String getServletPath()
HttpSession getSession()
HttpSession getSession(boolean create)
Principal getPrincipal()
boolean isRequestedSessionIdFrom
boolean isRequestedSessionIdFrom
boolean isRequestedSessionIdVali
Boolean isUserInRole(String role)
六、javax.servlet.ServletResponse接口(协议无关版本)
ServletResponse对象将一个servlet生成的结果传到发出请求的客户端。ServletResponse操作主要是作为输出流及其内容类型和长度的包容器,它由servlet引擎创建.
ServletResponse接口中的方法
void flushBuffer()throws IOException
int getBufferSize()
String getCharacterEncoding()
Locale getLocale()
OutputStream getOutputStream()throws IOException
Writer getWriter()throws IOException
boolean isCommitted()
void reset()
void setBufferSize(int nBytes)
void setContentLength(int length)
void setContentType(String type)
void setLocale(Locale locale)
七、javax.servlet.http.HttpServletResponse接口(HTTP版本)
HttpServletResponse加入表示状态码、状态信息和响应头标的方法,它还负责对URL中写入一Web页面的HTTP会话ID进行解码。
HttpServletResponse接口中的方法
void addCookie(Cookie cookie)
void addDateHeader(String name,long date)
void setHeader(String name,String value)
void addIntHeader(String name,int value)
boolean containsHeader(String name)
String encodeRedirectURL(String url)
String encodeURL(String url)
void sendError(int status)
void sendError(int status,String msg)
void setStatus(int status)
八、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)
void setAttribute(String name,Object obj)
Enumeration getAttributeNames()
ServletContext getContext(String uripath)
String getInitParameter(String name)
Enumeration getInitParameterNames()
int getMajorVersion()
int getMinorVersion()
String getMimeType(String fileName)
RequestDispatcher getNameDispatcher(String name)
RequestDispatcher getNameDispatcher(String path)
String getRealPath(String path)
URL getResource(String path)
InputStream getResourceAsStream(String path)
String getServerInfo()
void log(String message)
void log(String message,Throwable t)
void removeAttribute(String name)
九、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()
long getLastAccessedTime()
String getId()
ing getMaxInactiveInterval()
void setMasInactiveInterval(int seconds)
void invalidate()
boolean isNew()