一、First Servlet

1、建立JavaWeb应用的目录

HelloServlet-----应用名称
    WEB-INF--------
        classes:Servlet编译后就放在此处
        lib
        web.xml

2、在classes目录中建立Servlet类

一个Servlet必须直接或间接地实现javax.servlet.Servlet接口
一般我们选择继承javax.servlet.GenericServlet或者javax.servlet.http.HttpServlet

3、编写Servlet类

My First Servlet - HelloServlet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package net.yrom;
import java.io.*;
import javax.servlet.*;
//第一个Servlet,继承GenericServlet
public class HelloServlet extends GenericServlet{
public void service(ServletRequest req,
ServletResponse res)
throws ServletException,
java.io.IOException{
//向客户端输出数据
String data = "Hello Heima";
OutputStream out = res.getOutputStream();
out.write(data.getBytes());
}
}

4、编译Servlet类

编译需要用到servlet-api.jar(在Tomcat的lib目录中)

  • 首先设置classpath:set classpath=%classpath%;C:\apache-tomcat-6.0.32\lib\servlet-api.jar
  • 其次,因为带包名,进入classes目录,使用以下命令进行编译
    javac -d . HelloServlet.java

    5、配置Servlet的访问路径映射

    对于JavaWeb应用的配置都在web.xml中,在web.xml中增加以下配置
    1
    2
    3
    4
    <servlet>
    <servlet-name>HelloServlet</servlet-name><!--制定一个Servlet名称-->
    <servlet-class>net.yrom.HelloServlet</servlet-class><!--制定对应的Servlet类,用类的全名-->
    </servlet>
    1
    2
    3
    4
    <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/Hello</url-pattern><!--用户访问的映射路径-->
    </servlet-mapping>

    6、访问

    通过url:http://localhost:8080/HelloServlet/Hello

    二、两个Servlet接口的默认实现

    1、GenericServlet:

    通用的(默认的)的跟协议无关的实现

    2、HttpServlet:

    跟HTTP协议有关的Servlet默认实现。我们编写的Servlet一般只需要继承该类即可。

注意:
1、不要覆盖service方法,默认实现中提供了一些标准的内容
2、应该覆盖掉doXXX方法,因为默认实现方法是给了一个错误的提示而已

三、利用MyEclipse创建Servlet

直接创建的Servlet套用的是默认的模板,应该做一些修改。修改方法如下:

  • MyEclipse6.6-:打开MyEclipse的安装目录,搜索Servlet.java的文件,该文件即为模板文件。
  • MyEclipse8.5+:打开MyEclipse的安装目录,搜索com.genuitec.eclipse.wizards_*.jar
    找到后,打开其中的templates找到Servlet.java文件
  • 修改Servlet.java模板文件(需要关掉MyEclipse,并注意备份

    四、Servlet的映射

    是指在web.xml中的配置<url-pattern>(Servlet的映射URL)</url-pattern>

可以使用通配符*
两种格式:
*.扩展名(注意*前面没有其他内容)
/abc/*(注意以*结尾,以/开头)

注意:

  • 1、Tomcat会以与客户端访问的请求URL最匹配的一项来响应
  • 2、如果请求的资源在应用的web.xml中找不到对应的url-pattern映射,会交由缺省的Servlet处理。

缺省的Servlet的url-pattern的值为/
在Tomcat的web.xml中已经配好了一个缺省的Servlet。
当请求HTML或其他静态资源时,实际上都是有缺省的Servlet进行处理的。

五、Servlet的生命周期

1、Servlet在默认情况下,第一访问时才会创建它的实例,并调用其init方法,驻留内存;
访问过程中触发其service方法;
只有在web容器关闭/重启或web应用重部署(redeploy)时会调用其destroy方法,即销毁内存中的servlet实例。
2、要想在容器启动时就实例化Servlet对象,可以做以下配置

1
2
3
4
5
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>net.yrom.HelloServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>

<load-on-startup>的取值说明了启动顺序

六、ServletConfig对象

1、作用:

获取为Servlet配置的初始化信息。
可以在web.xml的<servlet>元素中通过<init-param>为Servlet制定初始化的参数(initParam)

2、获取initparam

ServletConfig对象在实例化Servlet对象时由容器传递给Servlet。
通过ServletConfig对象的getInitParameter(String paramName)就可以获得web.xml中针对该Servlet的配置参数的值。或者使用getInitParameterNames()获取所有的初始化参数。

七、ServletContext对象

1、作用:

JavaWeb应用的一个全局对象,一个应用只有一个ServletContext对象。
在应用启动时,容器就会创建该对象,可以将该对象看做是整个web应用的总管家

2、获得ServletContext对象:

通过ServletConfig对象的getServletContext()获取;
从HttpServlet类中继承的方法getServletContext()也可以直接获得。

3、应用

  • 实现多个Servlet之间的数据共享
  • 配置web应用的全局参数
  • 实现Servlet的转发

转发的特点:
1、请求的地址栏的地址不变
2、两者共享request和response对象
3、转发前和转发后页面上的内容都不会输出

  • ServletContext读取资源配置文件

1、getRealPath(String path):获取指定相对路径资源的绝对路径。相对路径path必须以/开头
2、读取classes目录中的配置文件:

  • 利用ClassLoader.getResourceAsStream(path):不适合加载很大的配置文件
  • 利用ServletContext.getRealpath(“path”)
    path是classes目录中的相对路径,以/开头。
    3、读取非classes目录中的配置文件:利用ServletContext.getRealpath(“/相对路径”)