本帖最后由 我的女友叫丹丹 于 2018-9-6 15:27 编辑
servlet的简单运行过程 servlet接口和实现类
对于servlet接口,sun公司定义了两个实现类,分别为:GenericServlet,HttpServlet HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。 HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。 [Java] 纯文本查看 复制代码 package cn.itcast;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
URL映射配置由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。 <servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。 一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。
[XML] 纯文本查看 复制代码 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
[url=http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd]http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd[/url]"
version="3.0">
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>cn.itcast.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
同一个Servlet可以被映射到多个URL上[AppleScript] 纯文本查看 复制代码 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
[url=http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd]http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd[/url]"
version="3.0">
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>cn.itcast.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
<!---->
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/aa</url-pattern>
</servlet-mapping>
</web-app>
Servlet访问URL使用*通配符映射[XML] 纯文本查看 复制代码 <!--
在Servlet映射到的URL中也可以使用* 通配符,有两种固定的格式:一种格式是*.扩展名,另一种格式是/*
* 代表任意的字符也就是说所有的URL都会访问到MyServlet上
-->
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>cn.itcast.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
-----------------------------------我是分隔符------------------------------------------
<!--
对于如下的一些映射关系:
Servlet1 映射到 /abc/*
Servlet2 映射到 /*
Servlet3 映射到 /abc
Servlet4 映射到 *.do
问题:
当请求URL为“/abc/a.html”,“/abc/*”和“/*”都匹配,哪个servlet响应
Servlet引擎将调用Servlet1。
当请求URL为“/abc”时,“/abc/*”和“/abc”都匹配,哪个servlet响应
Servlet引擎将调用Servlet3。
当请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet1。
当请求URL为“/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet2。
当请求URL为“/xxx/yyy/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet2。
匹配的原则就是"谁长得更像就找谁"
-->
缺省Servlet 如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。 凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。 例如:
[XML] 纯文本查看 复制代码 <servlet>
<servlet-name>ErrorServlet</servlet-name>
<servlet-class>cn.itcast.ErrorServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 将ServletDemo2配置成缺省Servlet -->
<servlet-mapping>
<servlet-name>ErrorServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> 在tomcat的安装目录\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为了缺省Servlet。
下面是tomcat的conf\web.xml文件的部分内容 [XML] 纯文本查看 复制代码 <servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- The mapping for the default servlet -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
ServletConfig
当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,我们通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
根据上面的图,首先在web.xml里配置MyServlet的初始化参数<init-param>
[XML] 纯文本查看 复制代码 <servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>cn.itcast.MyServlet</servlet-class>
<!--配置MyServlet的初始化参数 -->
<init-param>
<param-name>param01</param-name>
<param-value>程序员找不到女朋友</param-value>
</init-param>
<init-param>
<param-name>param02</param-name>
<param-value>还脱发</param-value>
</init-param>
<init-param>
<param-name>param03</param-name>
<param-value>太可怕</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
[XML] 纯文本查看 复制代码 package cn.itcast;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取servletConfig对象
ServletConfig servletConfig = this.getServletConfig();
//获取初始化参数的值
String param01 = servletConfig.getInitParameter("param01");
String param02 = servletConfig.getInitParameter("param02");
String param03 = servletConfig.getInitParameter("param03");
System.out.println("param01:" + param01);
System.out.println("param02:" + param02);
System.out.println("param03:" + param03);
}
}
ServletContextWEB容器在启动时,它会为每个WEB应用程序(就是我们在idea里创建的项目)都创建一个对应的ServletContext对象,它代表当前web应用。 ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。 由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。
在web.xml中配置<context-param>, 可以配置多个
[XML] 纯文本查看 复制代码 <?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
[url=http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd]http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd[/url]"
version="3.0">
<!-- 配置WEB应用的初始化参数 -->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</context-param> <context-param>
<param-name>aa</param-name>
<param-value>haha</param-value>
</context-param>
<!--Servlet的配置省略--></web-app>
在任意的一个Servlet里都能获取到<context-param>里的内容
[Java] 纯文本查看 复制代码 package cn.itcast;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletConfig servletConfig = this.getServletConfig();
String param01 = servletConfig.getInitParameter("param01");
String param02 = servletConfig.getInitParameter("param02");
String param03 = servletConfig.getInitParameter("param03");
System.out.println("param01:" + param01);
System.out.println("param02:" + param02);
System.out.println("param03:" + param03);
//通过servlet对象获取servletContext对象
ServletContext servletContext = this.getServletContext();
String url = servletContext.getInitParameter("url");
System.out.println(url);
//通过servletConfig对象获取servletContext对象
ServletContext servletContext1 = servletConfig.getServletContext();
String aa = servletContext1.getInitParameter("aa");
System.out.println(aa);
}
}
|