快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

伟德国际官方app下载安卓版_酒文化网进入



Servlet的核心类图如下:

上面的servlet只是接口,相称于描述了servlet的标准,也便是说与协议无关。而HttpServlet的实现是根据Http协议来完成的。看下面的截图:

打开源码看后发明大年夜多半接口和抽象类,那么真正的实现都在哪呢?在servlet容器源代码里,即类似Tomcat这样的servlet容器。

以是我感觉可以这样理解Servlet的感化:它供给了操控的按钮,这些按钮一旦被安装到Servlet容器里面,我们就可以经由过程这些按钮操控servlet容器,从而治理我们自己的Servlet实例。

这一点很紧张。以是涉猎Servlet源码着实便是懂得他的基础布局和API,我们真正要读的是Tomcat的源码!

Servlet的运行布局和API:

首先看下一次Http哀求-相应的历程:

A,首先客户端经由过程浏览器向办事器发送Http哀求;

B,Tomcat监听办事器的8080端口,当有Http哀求发过来之后,解析出项目名称,然后到webapps目录下搜索到该项目文件夹。

C,Tomcat作为servlet的容器,实例化第一次哀求调用的的servlet实例(今后再有相同的servlet的哀求,应用第一次的实例)。

D,调用init()措施,初始化事情。

E,调用HttpServlet的service措施,中心会加倍哀求,调用doGet或doPost措施,履行核心逻辑代码。

F,履行完servlet后,返回相应,客户端浏览器根据相应出现效果。

然后我们看下基础的运行机制:

从图上可以看出,不合的用户哀求并发应用同一个Servlet实例,这是一个对照紧张的根基机制。

Container解析Http哀求后,实例化Servlet,由于是Http哀求,会履行HttpServlet的代码:

首先会履行HttpServlet中的service(ServletRequest req, ServletResponse res)措施:

public void service(ServletRequest req, ServletResponse res)

throws ServletException, IOException {

HttpServletRequestrequest;HttpServletResponse response;

try {

request = (HttpServletRequest) req;//哀求转换成Http哀求response = (HttpServletResponse) res;//相应转换成Http相应

} catch (ClassCastException e) {throw new ServletException("non-HTTP request or response");

}service(request, response);//调用场置惩罚Http的service措施

}

然后会调用service(HttpServletRequest req, HttpServletResponse resp)措施:

protected void service(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

String method = req.getMethod();//取得req中的措施类型

if (method.equals(METHOD_GET)) {//根据措施类型来抉择履行后续的措施,我们只关注doGet和doPostlong lastModified = getLastModified(req);

if (lastModified == -1) {doGet(req, resp);

} else {long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);

if (ifModifiedSince 1000 * 1000)) {maybeSetLastModified(resp, lastModified);

doGet(req, resp);//如斯我们就能履行到自己写的doGet措施,从而履行自己的营业逻辑。} else {

resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);}

}

} else if (method.equals(METHOD_HEAD)) {long lastModified = getLastModified(req);

maybeSetLastModified(resp, lastModified);doHead(req, resp);

} else if (method.equals(METHOD_POST)) {

doPost(req, resp);

} else if (method.equals(METHOD_PUT)) {doPut(req, resp);

} else if (method.equals(METHOD_DELETE)) {

doDelete(req, resp);

} else if (method.equals(METHOD_OPTIONS)) {doOptions(req,resp);

} else if (method.equals(METHOD_TRACE)) {

doTrace(req,resp);

} else {//不属于http的措施类型,返回501差错String errMsg 伟德国际官方app下载安卓版= lStrings.getString("http.method_not_implemented");

Object[] errArgs = new Object[1];errArgs[0] = method;

errMsg = MessageFormat.format(errMsg, errArgs);

resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);}

}

我们自己实现的Servlet,我们只要承袭HttpServlet,实现doGet就ok了:

public class HelloWorld extends HttpServlet{

private static final long serialVersionUID = 1L;

@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {System.out.println("test");

getServletContext().getRequestDispatcher("/jsp/test.html").forward(req, resp);}

}

来关注下Servlet运行时必要留意的:

A,Servlet生命周期:

servlet类加载--->实例化--->办事--->销毁

B,此中扳连到3个措施代表了Servlet的生命周期:

1、init措施:认真初始化Servlet工具。

2、service措施:认本相应客户的哀求。

3、destroy措施:当Servlet工具退诞生命周期时,认真开释占用的资本。

C,履行自己Servlet时必要用到的几个紧张参数:

1,HttpSession:一次贯穿毗连到客户端关闭,从客户端连接的层面来治理。

2,ServletConfig:从一个servlet被实例化后,对任何客户端在任何时刻造访有效,但仅对本servlet 有效,一个servlet的ServletConfig工具不能被另一个servlet造访。 从单个servlet的层面来治理。

3,ServletContext:对任何servlet,任何人在任何光阴都有效,这才是真正全局的工具。从整个的servlet的层面来治理

4,HttpServletRequest,HttpServletResponse:从单个servlet的单次相应侧面来治理

D,API

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()返回客户真个会话IDString 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。

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定义了一个完备的伟德国际官方app下载安卓版整数常量聚拢表示有效状态值。void sendError(int status,String msg)

void setStatus(int status)设置相应状态码为指定指。只利用于不孕育发生差错的相应,而差错相应应用sendError()。

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 getRealPat伟德国际官方app下载安卓版h(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高低文中删除指定属性。

HttpSession:

Object getAttribute(String name)将会话中一个工具保存为指定名字,返回或删除前面保存的此名称工具。

void setAttribute(String name,Object value)void removeAttribute(String name)

Enumeration getAttributeName()返回绑缚到当前会话的所有属性名的罗列值。long getCreationTime()返回表示会话创建和着末造访日期和光阴的一个长整型,该整型形式为java.util.Date()构造器中应用的形式。

long getLastAccessedTime()Strin伟德国际官方app下载安卓版g getId()返回会话ID,servlet引擎设置的一个独一关键字。

ing getMaxInactiveInterval()假如没有与客户端发生交互,设置和返回会话存活的最大年夜秒数。void setMasInactiveInterval(int seconds)

void invalidate()使得会话被终止,开释此中随意率性工具。boolean isNew()假如客户端仍未加入到会话,返回true。当会话首次被创建,会话ID被传入客户端,但客户端仍未进行包孕此会话ID的第二次请示时,返回true。

ServletConfig:

getServletName()措施概述:public java.lang.String getServletName()

该措施返回一个servlet实例的名称,该名称由办事器治理员供给。

getServletContext()措施概述:public ServletContext getServletContext()返回一个ServletContext工具的引用。

getInitParameter()措施概述:public java.lang.String getInitParameter(java.lang.String name)

返回一个由参数String name抉择的初始化变量的值,假如该变量不存在,返回null。

getInitParameterNames()措施概述:public java.util.Enumeration getInitParameterNames(伟德国际官方app下载安卓版)返回一个存储所有初始化变量的罗列函数。假如servlet没有初始化变量,返回一个空罗列函数。

撤除以上的,还有很多内容会在实际编码中必要进修。

总结:

终极我们照样不得不去涉猎Tomcat的源码,才能解答更多的疑心。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: