Servlet一(web基础学习笔记二十)
一、Servlet简介
Servlet是sun公司提供的一门用于开发动态web资源的技术。
Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
1、编写一个Java类,实现servlet接口。
2、把开发好的Java类部署到web服务器中。
按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet
二、ServletAPI
三、Servlet的方法
四、Servlet的运行
Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
②装载并创建该Servlet的一个实例对象。
③调用Servlet实例对象的init()方法。
④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应 对象作为参数传递进去。
⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
五、Servlet生命周期
其中,加载和实例化,初始化,销毁都只进行一行
五、Serlvet部署
5.1、新建类Myservlet3继承HttpServlet
重写doGet,doPost,destroy(),init方法
package com.pb.servletdemo; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Myservlet3 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doGet方法被调用"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doPost方法被调用"); } /*@Override protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { // TODO Auto-generated method stub super.service(arg0, arg1); }*/ @Override public void destroy() { System.out.println("Servlet销毁,destroy方法被调用"); } @Override public void init(ServletConfig config) throws ServletException { System.out.println("Servlet初始化,init方法被调用"); String initParam=config.getInitParameter("charSetContent"); System.out.println(initParam); } }
5.2、在web.xml中配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>servletdemo</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 首先是servlet标签 --> <servlet> <!-- 指定servlet的名字 可以与建立的servlet名字不一样,别名--> <servlet-name>myserlvet</servlet-name> <!-- servlet的类名 包名.类名的完整路径--> <servlet-class>com.pb.servletdemo.Myservlet3</servlet-class> <!-- 初始参数 --> <init-param> <!-- 设置字符集 --> <param-name>charSetContent</param-name> <!--值 --> <param-value>utf-8</param-value> </init-param> </servlet> <!-- 截获请求 servlet映射--> <servlet-mapping> <!-- 些servlet-name要与上方的servlet-name名字一样不然会报错 --> <servlet-name>myserlvet</servlet-name> <!-- 一个servlet可以 有多个url-pattern--> <!-- 精确匹配 --> <url-pattern>/myservlet3</url-pattern> <!-- 加上虚拟目录 --> <url-pattern>/demo/myservlet3</url-pattern> <!-- 通配符来配置* --> <url-pattern>/*</url-pattern> <!-- 后缀名来配置 --> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
5.3、精确匹配
5.4、虚拟目录匹配--可以有多个虚拟目录
5.5、*通配符
5.6、后缀名来访问
六、url-pattern
6.1、url-pattern 概述
<url-pattern>元素,用于把一个Servlet 别名映射为一个URL 访问规则。在Servlet 的配置过程中,我们首先使用servlet 元素中的servlet-name、servlet-class 等子元素把一个Servlet 实现类映射为一个别名,然后再使用servlet-mapping 元素把这个别名映射为一个可以在浏览器中访问的url,我们对Servlet 的访问正是通过这个URL 进行的。而不是通过别名。因此,配置这个URL 是Servlet 配置过程中非常重要的一个环节。那么我们应该如何对这个URL进行配置呢?也就是说url-pattern 有几种配置规则呢?在配置url-pattern 元素的时候,有这样三种规则,分别是精确匹配、目录匹配和后缀匹配。
6.2、精确匹配
所谓的精确匹配,就是我们在使用浏览器访问一个 Servlet 的时候,输入的URL 中除了工程名之前的部分之外要和我们在配置Servlet 时,配置的url-pattern 元素要完全一致。比如说,在下面实例中,配置了一个名称为 HelloServlet 的Servlet,它的url-pattern 我们配置为/helloServ , 那么这个配置就是完全匹配的方式。假如说我们这个工程的名字是
TestServlet,我们的Web 服务器的端口号为8080,那么在浏览器中访问本地的这个Servlet的时候就需要使用这样的URL:http://127.0.0.1:080/TestServlet/helloServ。其中,127.0.0.1 是保留的IP 地址,指代本机,8080 是我们设置的Web 服务器的端口号,TestServlet是我们这个Servlet 所在的Web 项目的名称。而最后面的这个helloServ 就是我们配置的需要完全匹配的Servlet 的URL pattern。
<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>javaee.sg.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/helloServ</url-pattern> </servlet-mapping>
6.3、目录匹配
相对于精确匹配,目录匹配是一种相对灵活的配置方式,它以斜杠开始,以星号结尾,并且规定了一个虚拟的目录。为了更加形象的说明这种配置方式,我们仍然以刚才的例子进行说明,比如说刚才的那个Servlet,它的url-pattern 我们就可以使用这种形式进行配置:
<servlet-name>HelloServlet</servlet-name> <url-pattern>/helloServ/*</url-pattern>
在这个url-pattern 中,我们使用了一个虚拟的目录, helloServ,那么我们在访问这个Servlet 的时候输入的URL 就会有多种选择,我们只要保证这个URL 中,除了工程
名之外的部分以这个虚拟目录helloServ 开始就可以了。比方说,我们可以使用这样的URL 访问这个Servlet:http://127.0.0.1:8080/ TestServlet/helloServ/theServlet。在这个URL中, TestServlet 是这个Web 项目的工程名。 helloServ 是虚拟目录的名称,最后面的theServlet 是我们在访问的时候随机输入的一个名称。这个名称可以替换为其他的名称,比方说替换为thisServlet 或者thatServlet 等等。总之,在工程名TestServlet 之后紧跟虚拟目录的名称就可以了。
6.4、后缀匹配
用后缀进行匹配的方
式。在这种方式中,url-pattern 配置元素只限定了访问Servlet 的后缀名,而对于虚拟目录、名称都没有要求。比方说,我们再把刚才配置的Servlet 做一个修改,在url-pattern 中采用后缀匹配的规则进行配置。大家看这段代码:
<servlet-name>HelloServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
在这个配置当中,我们限定了访问这个Servlet 的后缀名是”.do”。也就是说,当我们的URL 中的服务器地址,端口号,工程名这些项没有错误的情况下,只要url 以”.do”结尾,就
能够访问到我们的这个Servlet。比方说,在访问我们这个别名为 HelloServlet 的Servlet的时候,URL 可以写为这样的形式:http://127.0.0.1:8080/ TestServlet/helloServ.do。大家可以看到,在这个URL 的前半部分是IP 地址、端口号和项目名称。并且这个URL 以.do 结尾,因此就可以访问到HelloServlet。或者,我们也可以把这个URL 写为这样的形式,都是可以的:http://127.0.0.1:8080/ TestServlet/theServlet.do。
6.5、注意事项
在配置 Servlet 的过程中,大家需要注意的另外一点就是一个Servlet 配置元素可以同时对应多个Servlet-mapping 元素, 比方说,我们仍然以刚才所介绍的HelloServlet 为例,大家看这段代码:
<servlet-mapping> <servlet-name> HelloServlet </servlet-name> <url-pattern>/helloServ</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name> HelloServlet </servlet-name> <url-pattern>/helloServ/* </url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name> HelloServlet </servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
在这段代码中,我们为别名为HelloServlet 的Servlet 配置了3 个servlet-mapping 元素。既然我们可以为同一个Servlet 同时配置多个servlet-mapping,那么当客户端在访问这个servlet 的时候,servlet 容器是按照一个什么样的顺序来查找servlet 的呢?当为同一个Servlet 配置了多个servlet-mapping 的时候,servlet 容器首先将按照精确
匹配的方式进行匹配查找,如果匹配完成,则结束匹配,而如果匹配不成功就按照目录匹配、后缀匹配的顺序继续进行匹配查找,如果有多个目录匹配方式的配置项,则按照最长的一个来匹配。同时,在进行匹配的时候同样要看请求的URL,如果这个URL 以斜线结尾,那么这个请求将会按照目录匹配的方式来进行处理
七、在eclipse中创建Servlet
选择需要的方法