servlet是动态网页的一种技术,用java语言实现。在tomcat中,servlet的创建是有tomcat实现。
Servlet对象介绍:
servlet接口中有5个函数:
void init(ServletConfig config):系统的初始化,在浏览器第一次访问servlet对象的时候有tomcat的容器管理器创建。创建以后就初始化Servlet对象,配置参数信息与初始化。ServletConfig对象是管理器给的。
ServletConfig getServletConfig():调用配置信息,这个一般是service函数中调用。
void service(ServletRequest req, ServletResponse res):处理请求,每次网页有请求的时候就调用一次这个函数,注意每一个网页请求是不同的线程,servlet对象是线程不安全的
String getServletInfo():serlvet的配置信息,这个对servlet对象的描述,相当于toString()函数。
void destroy():管理器调用的函数,收回内存。
其他信息:init、service、destroy是生命周期函数。init destroy是调用一次。而service是调用多次。
servlet的路径配置
servlet其实就是应用中的一个小程序,一个应用部署中可以由多个servlet。根据url的应用信息可以找到对应的web应用。servlet的路径需要在web的文件中进行指定。多个url可以指定一个name。或者使用通配符。
url路径匹配:
路径匹配: /abc/*
后缀匹配: *.do
匹配所有: /*
*不能放到中间。
<servlet>
<name></name>
<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
<name></name>
<url-pattern></url-pattern>
</servlet-mapping>
复制代码
*********注意servlet的url路径前要有/表示相对地址。如果没有/部署会报错。
servletConfig类
主要实现是管理容器传给servlet一些信息。初始化参数与servletContext,serverlet标签在配置文件中的写法如下图:name是唯一标识,class代表真是的servlet类。里面包含一些initparameter配置信息。
servletConfig函数
String getServletName() servlet标签的名字。
ServletContext getServletContext():servlet的环境信息,这个很重要包含应用的私有信息与公共信息。下一章节介绍。
String getInitParameter(String name):初始化参数的name得到值。
Enumeration getInitParameterNames():得到初始化参数name迭代器。
genericservlet类
继承了servlet与configservlet接口。并且实现log的方法,这个方法主要方便我们编写servlet接口的函数。
httpservlelt类
基于http协议继承了servlet类。将service()函数分散到http中的各种方法中 相关函数介绍:
HttpServlet()构造函数,donothing。一般通过反射调用类,构造函数都是无参的。
protected void doGet(HttpServletRequest req, HttpServletResponse resp)针对http的get方法,servlet的处理过程,一般get方法都是相对安全的,每次请求是相同的。
protected long getLastModified(HttpServletRequest req)这个函数是get函数调用,在http使用缓存的时候,请求报文中有if-Modified-Since,servlet对比这个时间,如果cookie的是新的,就返回304方法。
protected void doHead(HttpServletRequest req, HttpServletResponse resp)head请求方法是服务器只返回包的头部。这个是针对head请求报文的处理
protected void doPost(HttpServletRequest req, HttpServletResponse resp)针对http中post报文的处理方法,会修改服务信息的内容,一般是不安全的。
protected void doPut(HttpServletRequest req,HttpServletResponse resp)http中上传文件报文,处理对应的方法
protected void doDelete(HttpServletRequest req,HttpServletResponse resp)删除文件的方法
protected void doOptions(HttpServletRequest req,HttpServletResponse resp)查询服务器支持的方法,一般不用覆盖
protected void doTrace(HttpServletRequest req, HttpServletResponse resp)原样返回收到内容。用于调试。一般不用覆盖
protected void service(HttpServletRequest req, HttpServletResponse resp)http的协议处理service函数,把功能分给以上的doXXX函数;这个函数是被下面的函数调用。不可以覆盖
public void service(ServletRequest req, ServletResponse res)调用上面的service函数,不可以覆盖
ServletContext
简介
servletContext对应一个应用,包含一个servlet容器的相关信息。这个类是很重要的,也称为一个数据域(一个应用的servlet可以相互传递信息)
函数介绍
String getContextPath()返回uri中的应用地址,以/开头。如果是默认根context,返回一个空字符串。注意这个方法可能与HttpServletRequest.getContextPath()返回的不同,但context对应几个不同的context path的时候。后面再分析HttpServletRequest的函数。
System.out.println(context1.getContextPath());// return /web3 。uri对象的应用地址
复制代码
ServletContext getContext(String uripath):通过context path地址返回相应的context对象。这个函数基本没有什么用处,如果一个servlet调用其他servlet的相对路径,会返回null。
ServletContext context2=context1.getContext("/web2");
System.out.println(context2.getContextPath());//抛出异常,null指针
ServletContext context3=context1.getContext("/web3");
System.out.println(context3.getContextPath());// /web3 没有任何用处。
复制代码
int getMajorVersion();int getMinorVersion();int getEffectiveMajorVersion();int getEffectiveMinorVersion()前两个函数返回servlet容器支持的版本号,下面两个返回serlvet的真实版本号。
String getMimeType(String file):返回MIME的类型。MIME的类型是对互联网文件的标识,存放在/config/web.xml中
System.out.println(context1.getMimeType("abc.text")); //text/plain
System.out.println(context1.getMimeType("abc.jpg")); //image/jpeg
复制代码
Set getResourcePaths(String path):返回文件夹路径下对应的资源路径。子文件夹以/结束。
For example, for a web application containing:
/welcome.html
/catalog/index.html
/catalog/products.html
/catalog/offers/books.html
/catalog/offers/music.html
/customer/login.jsp
/WEB-INF/web.xml
/WEB-INF/classes/com.acme.OrderServlet.class
/WEB-INF/lib/catalog.jar!/META-INF/resources/catalog/moreOffers/books.html
getResourcePaths("/") would return {"/welcome.html", "/catalog/", "/customer/", "/WEB-INF/"}, and getResourcePaths("/catalog/") would return {"/catalog/index.html", "/catalog/products.html", "/catalog/offers/", "/catalog/moreOffers/"}.
复制代码
URL getResource(String path):这个函数是调取资源的URL地址,如果以/开头是相对地址,相对与context的地址。如果是其他地址默认调用url的函数处理
System.out.println(context1.getResource("a.txt"));
//print:file:/D:/java_temp/plug1/out/artifacts/web3_war_exploded/a.txt
复制代码
InputStream getResourceAsStream(String path)在上一步的继承上打开资源,变为输入流。
RequestDispatcher getRequestDispatcher(String path)返回一个资源调度字,内容指向path的资源,path以/开始,
RequestDispatcher getNamedDispatcher(String name):同上,知识name代表servlet的name。
void log(String msg):void log(String message,Throwable throwable)。log内容的写入
String getRealPath(String path):打开资源相对与操作系统的地址。
String getServerInfo():返回servlet container的信息。
String getInitParameter(String name) Enumeration getInitParameterNames() boolean setInitParameter(String name, String value) 这三个方法是关于servletContext初始化参数的信息。初始化参数不能被覆盖,serinitparameter覆盖的时候返回false,并且初始化参数不能被设置,当应用启动的时候;初始化的标签为:
<context-param>
<param-name>name1</param-name>
<param-value>value1</param-value>
</context-param>
复制代码
Object getAttribute(String name) Enumeration getAttributeNames() void setAttribute(String name, Object object) void removeAttribute(String name) 属性参数,可以覆盖。进而完成servlet之间的数据通信
String getServletContextName()返回servletContext的name。一般在配置文件的标签中存在。没有返回null
ServletRegistration.Dynamic addServlet(String servletName, String className)
ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet)
ServletRegistration.Dynamic addServlet(String servletName, Class<? extends Servlet> servletClass)把servlet增加到context里面,相当于注册。
T createServlet(Class clazz) throws ServletException创建servlet的类 18.
ServletRegistration getServletRegistration(String servletName)
Map<String,? extends ServletRegistration> getServletRegistrations()返回注册的servlet。
FilterRegistration.Dynamic addFilter(String filterName, String className)
FilterRegistration.Dynamic addFilter(String filterName,Filter filter)
FilterRegistration.Dynamic addFilter(String filterName, Class<? extends Filter> filterClass)
T createFilter(Class clazz)
FilterRegistration getFilterRegistration(String filterName)
Map<String,? extends FilterRegistration> getFilterRegistrations() 同上servlet 20.其他的都是关于listener、session、classloader、declareRoles
网页的相对地址与绝地地址
web的工程如下图,在hello.html增加超链接的网页,其中第一个不能进行相对地址到servlet程序:相对地址为http://localhost:8080/bservlet。相对地址一般采用三张方式:
绝地地址
相对当前站点的地址。以/开始
相对当面目录的地址,开头不能以/开始
<a href="/bservlet" target="_blank">bservlet</a>
<a href="bservlet" target="_blank">bservlet</a>
<a href="/web3/bservlet" target="_blank">bservlet</a>
<a href="http://localhost:8080/web3/bservlet" target="_blank">bservlet</a>
复制代码
https://juejin.im/post/5cff63fb6fb9a07edb393db2