你的位置:首页 > Java教程

[Java教程]Servlet和JSP读书笔记(一)


Java Servlet 技术,简称Servlet,是Java中用于开发web应用程序的基本技术。

Servlet实际上也就是一个Java程序。一个Servlet应用程序通常包含很多Servlet。而我们熟知的JSP页面最终也是要被编译为Servlet。

Servlet应用程序是不能像一个普通类直接运行的,它必须运行在Servlet容器中。

Servlet容器的作用就是将一个客户端的请求传给Servlet,并将Servlet应用程序的响应回传给客户端。  

一. Servlet API 概述

Servlet API 中有4个Java包:

  javax.servlet.*;  javax.servlet.http.*;  javax.servlet.annotation.*;  javax.servlet.descriptor.*;

 

二.  关于第一个包 javax.servlet.*  的主要类型(没有全部列出)     

  public interface javax.servlet.Servlet  public interface javax.servlet.ServletRequest  public interface javax.servlet.ServletResponse  public interface javax.servlet.ServletContext  public interface javax.servlet.ServletConfig  public interface javax.servlet.RequestDispatcher  public interface javax.servlet.Filter  public abstract class GenericServlet extends java.lang.Object implements Servlet, ServletConfig, java.io.Serializable

  

三 .  public interface javax.servlet.Servlet 接口

    1.该接口中声明的方法如下: 

    public void init(ServletConfig config)  throws ServletException

    public void service(ServletRequest req, ServletResponse res)  throws ServletException,java.io.IOException

    public ServletConfig getServletConfig()

    public java.lang.String getServletInfo()

    public void destroy()


    2. Servlet技术的核心就是这个Servlet接口。这是所有Servlet类都必须直接或者间接实现的一个类。(直接实现就是一个Servlet类直接implements Servlet,间接实现

就是继承一个实现了Servlet的类)。 

      Servelt接口定义了Servlet应用程序和Servlet之间的规则。这个规则就是:Servlet容器负责把Servlet类加载到内存中,并在Servlet实例中调用特定的方法(特别注

意:在一个Servlet应用程序中,每个Servlet只有一个实例。)。客户端用户的请求会触发Servlet容器调用一个Servelt实例的service 方法,并传递给这个方法一个

ServletRequest实例和一个ServletResponse实例。ServletRequest实例封装当前HTTP请求,它的作用是便于开发者解析和操作原始的HTTP数据;ServletResponse封装当前

用户的HTTP响应,它的作用是可以将响应回传给客户端。Servlet容器还为每个应用程序创建一个ServeltContext实例,其主要作用就是封装了应用程序(Context)的环境细节。

每一个应用程序(Context)只有一个ServletContext实例。同时,Servlet容器还为每个应用程序创建一个ServeltConfig实例,它的主要作用就是封装一些Servlet的配置信息。

      关于ServletContext和ServletConfig后面会给出详细的解说。

 

    3.  public void init(ServletConfig config) throws  ServletException

    第一次请求Servlet时,Servlet容器就会调用这个方法且只调用一次。

    可在此方法中编写一些于应用程序相关的初始化代码。

    Servlet容器会向该方法传递一个ServletConfig实例,一般会在init方法中将这个实例对象赋值给一个ServletCofig类型的成员变量。便于其他方法使用。

  

    4. public void service(ServletRequest req, ServletResponse res)  throws ServletException,  java.io.IOException

      每次请求Servelt时都会调用这个方法。

      在此方法中编写实现程序功能和逻辑的代码。

 

    5. public void destroy()

      卸载应用程序或者关闭应用程序时会调用destory()方法。

      在此方法中编写与资源清理相关的代码。

 

    6. public ServletConfig getServletConfig()

     返回Servlet容器传给init方法的ServletConfig。

     为了让这个方法不返回null,你需要将Servlet容器传给init方法的ServletConfig对象赋值给一个类成员变量。

  

    7. public java.lang.String getServletInfo()

      返回任意有用的一个字符串或者null。

 

    

     8.在演示实例之前必须知道我们在浏览器中输入的url和我们编写的servlet如何才能对应起来,换句话说就是在浏览器中输入怎样的url就可以调用相应的servlet

     类。servlet中实现此功能有两个技术:web.

      

      ①web.

<??><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app>   <servlet>       <!--  <servlet-name>由你自己定,但是必须和 <servlet-mapping>中的<servlet-name>一致 -->    <servlet-name>  servletName </servlet-name>         <!-- <servlet-class> 为你想要调用的servlet的全类名 -->    <servlet-class> fullClassName </servlet-class>     

     <!-- 传给servlet 的初始化参数,可以有多个 init-param 初始化参数这部分可以先忽略不看 直接看 <servlet-mapping> --> <init-param>
        
       <!-- 参数名 --> <param-name> name </param-name>
        
       <!-- 参数值 --> <param-value> value </param-value> </init-param> <init-param> <param-name>name</param-name> <param-value>admin</param-value> </init-param> </servlet>

<servlet-mapping> <servlet-name> servletName </servlet-name> <!-- 上面 <servlet-class> 类所匹配到浏览器输入的url --> <url-pattern>/url</url-pattern> </servlet-mapping> </web-app>

      

    ② @WebServlet注解方式

/*

  name 对应 web.
  urlPatterns   对应 web. 
  initParams={@WebInitParam(name="name",value="value")}  对应web.                                              <param-name> name </param-name>
                                              <param-value> value </param-value>
                                          </init-param>



*/
@WebServlet(name="servletName",urlPatterns="/url", initParams={ @WebInitParam(name="name",value="value"), @WebInitParam(name="name1",value="value1") })public class MyFirstServlet implements Servlet { // .......}

     

      ③ 任意选择上面的一种去配置。例如,采用注解方式配置如下:

 

@WebServlet(name="myFirstServlet",urlPatterns="/my",      })public class MyFirstServlet implements Servlet {   //......}

      则浏览器输入 http://localhost:8080/项目名称/my 就可执行MyFirstServlet 这个servlet类,并调用init()方法和service()方法。

     

 

    9. 关于前面知识的一个Servlet应用程序小实例。

package com.hjj.servlet.one;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebServlet;/*  采用@WebServlet注解的方式配置该servlet访问路径,此时就不需要在web.*/@WebServlet(name="MyFirstServlet",urlPatterns="/myFirstServlet")public class MyFirstServlet implements Servlet {    private ServletConfig servletConfig = null;  @Override  public void destroy() {    System.out.println("我是Detstroy方法,我被调用了 ^_^");    System.out.println("-----------------------servlet结束-------------------------");      }  @Override  public ServletConfig getServletConfig() {    return this.servletConfig;  }  @Override  public String getServletInfo() {        return "myFirstServlet";  }  @Override  public void init(ServletConfig arg0) throws ServletException {    System.out.println("----------------------servlet开始--------------------------");    this.servletConfig = arg0; //    System.out.println("我是init方法,我被调用了 ^_^");      }  @Override  public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {        System.out.println("我是service方法,我被调用了 ^_^");    String servletName = this.servletConfig.getServletName();    System.out.println("servletName = "+servletName);            response.setContentType("text/html");    response.setCharacterEncoding("UTF-8");    PrintWriter pw = response.getWriter();    pw.print("<html><head><head><title>我的第一个servlet app</title><body> hello "+servletName+"</body></html>");    System.out.println("---------------------------");          }}          

     ① 在浏览器中首次输入:http://localhost:8080/one/myFirstServlet

    页面显示如下:

      

    控制台:

      

    ②再次刷新页面:html页面依然不变

    控制台:证明service方法会被调用多次,而init只被调用一次。

    

     ③此时在关闭服务器,控制台输出:可见destory方法在关闭容器后执行了

    

 

 

四. 关于init方法中传递的两个参数ServletRequest和ServletResponse

  1. ServletRequest

    ① 客户端的每一次请求,Servlet容器都会创建一个ServletRequest实例,并将它传递给service方法。

    Servlet封装客户端请求的相关信息。

    ② ServeltRequest接口的主要方法如下:

public int getContentType() //返回请求主体的MIME类型public java.lang.String getParameter(java.lang.String name) //根据String类型的参数返回对应的值public int getContentLength() //返回请求主体中的字节数

    我们平时最常用的就是上面红色标注的方法。

    例如使用如下url调用一个Servlet:

      http://localhost:8080/myapp/myservelt?id=10

      则在Servelt类中的service方法中使用ServletRequest就可以拿到这个值:ServletRequest.getParameter("id");

    此外,如果传递给此方法的的字符不存在,该方法返回null。

  2. ServletResponse

    ①ServletResponse接口表示一个Servlet响应。

     在调用Servlet之前,Servlet容器都会创建一个ServletResponse并将其传递给service方法。

    ②ServletResponse接口常用方法

public java.io.PrintWriter getWriter() throws java.io.IOException //返回可以将文本传给客户端的java.io.PrintWriter实例public void setContentType(java.lang.String type) //在给客户端发送响应之前设置响应内容类型,例如 text/html,即发送的响应的类型为html。另外如果不进行设置,有些浏览器默认以html格式显示,有些浏览器默认以文本格式显示

    该对象的应用在前面3.8的小实例中已经演示过,就不在演示了。

 

五. ServletContext

  1. ServletContext表示Servlet应用程序。且每一个web应用程序只有一个ServletContext。

  2. 同一个web应用的所有servlet对象共享一个ServletContext。Servlet对象可以通过它来访问容器中的各种资源。

  3. ServletContext 接口常用方法    

public void setAttribute(java.lang.String name,java.lang.Object object) //把一个java对象和一个属性名绑定,并存放到ServletContext中,参数name指定属性名,参数Object表示共享数据。 

public java.lang.Object getAttribute(java.lang.String name) //根据参数给定的属性名,返回一个Object类型的对象。 和setAttribute方法是对应的

public java.util.Enumeration getAttributeNames() //返回一个Enumeration对象,该对象包含了所有存放在ServletContext中的属性名。


public void removeAttribute(java.lang.String name) //根据参数指定的属性名,从servletContext对象中删除匹配的属性。
public java.lang.String getServletContextName() //返回当前web应用的URL入口。

public java.lang.String getInitParameter(java.lang.String name) //返回web应用方位内的匹配的初始化参数值。在web.

public java.util.Enumeration getInitParameterNames() //返回一个Enumeration对象。


public java.lang.String getServletContextName() //返回web应用的名字。即<web-app>元素中<display-name>元素的值。

 

 

六. ServletConfig

  1. Servlet封装了@WebServlet 或者 web.

  2. 这样的信息叫做初始参数。初始参数由两部分组成:键和值。

  3. 那么如何去获取初始参数的值呢? ServletConfig提供了两个方法:

public java.lang.String getInitParameter(java.lang.String name) //传递String类型的键,获取键对应的值public java.util.Enumeration getInitParameterNames() //返回所有初始参数名称(也就是键)的一个Enmueration

 

 4. ServletConfig还封装了对ServletContext的操作。

public ServletContext getServletContext) //返回当前web应用的ServletContext实例

 

 5. ServletConfig小实例演示。

    

package com.hjj.servlet.one;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebInitParam;import javax.servlet.annotation.WebServlet;@WebServlet(name="testServiceConfig",urlPatterns="/testServiceConfig",      initParams={          @WebInitParam(name="email",value="test@qq.com"),          @WebInitParam(name="name",value="test")      })public class TestServiceConfig implements Servlet {  private ServletConfig servletConfig = null;  @Override  public void destroy() {    }  @Override  public ServletConfig getServletConfig() {    return this.servletConfig;  }  @Override  public String getServletInfo() {    return "myFirstServlet";  }  @Override  public void init(ServletConfig arg0) throws ServletException {    this.servletConfig = arg0;  }  @Override  public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {    System.out.println("service被调用了");    String name = this.servletConfig.getInitParameter("name");    String email = this.servletConfig.getInitParameter("email");    System.out.println();    response.setContentType("text/html");    response.setCharacterEncoding("UTF-8");    PrintWriter pw = response.getWriter();    pw.print("<html><head><head><title>testServletConfig</title><body>我的姓名 name:"+name+"<br>我的邮箱email:"+email+"</body></html>");      }}

 

      浏览器输入:http://localhost:8080/one/testServiceConfig

      页面显示: