第6章 JAVA Servlet 基础

目录

6.1 servlet 的部署、创建与运行

6.1.1 源文件及字节码文件

6.1.2 编写部署文件 web.xml

6.1.3 servlet 的创建与运行

6.1.4 向 servlet 传递参数的值

6.2 servlet 的工作原理

6.2.1 servlet 对象的生命周期

6.2.2 init 方法

6.2.3 service 方法

6.2.4 destroy 方法

6.3 通过 JSP 页面访问 servlet

6.4 共享变量

6.5 doGet 和 doPost 方法

6.6 重定向与转发

6.7 使用 session


6.1 servlet 的部署、创建与运行

    JAVA Servlet 的核心思想是在 Tomcat 服务器端创建响应用户请求的 servlet 对象,简称 servlet。因此,学习 JAVA Servlet 的首要任务是掌握怎样编写创建 servlet 的类,怎样在 Tomcat 服务器上保存这个类所得到的字节码文件,怎样编写 web.xml 部署文件,怎样请求 Tomcat 服务器创建一个 servlet。有关 servlet 的工作原理以及使用细节将在后续内容中讲述。

6.1.1 源文件及字节码文件

1、Servlet 类

    写一个创建 servlet 的类就是编写一个特殊类的子类,这个特殊的类就是 javax.servlet.http 包中的 HttpServlet 类。HttpServlet 实现了 Servlet 接口,实现了响应用户的方法。HttpServlet 的子类被习惯性地称作一个 Servlet 类,这样的类创建的对象习惯性的被称作一个 servlet。例如:

package moon.sun;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Example6_1 extends HttpServlet{
    public void init(ServletConfig config)throws ServletException{
        super.init(config);
}
    public void service(HttpServletRequest request,HttpServletResponse response)throws IOException{
    response.setContentType("text/html;charset = utf-8");
    printWriter out = response.getWriter();
    out.println("<html><body bgcolor = #ffccff>");
    out.println("<h1>hello servlet,你好 servlet</h1>");
    out.println("</body></html>");
}
}

2、字节码文件的保存

    为了能让 Tomcat 服务器使用上述类创建一个 servlet,需要将上面的 Java 源文件产生的字节码文件按照类的包名对应的目录路径保存到 Web 服务目录中特定子目录中。包名 moon.sun 对应的目录路径是 moon\sun,因此,需要把上述保存到\ch6\WEB-INF\classes\moon\sun 中。注:需要将文件的“保存类型”选择为“所有文件”,将“编码”选择为“ANSI”。

6.1.2 编写部署文件 web.xml

    Servlet 类的字节码文件保存到指定的目录后,必须为 Tomcat 服务器编写一个部署文件,只有这样 Tomcat 服务器才会用 Servlet 类创建 servlet 对象。

    编写的 web.xml 文件必须保存到 Web 服务目录的 WEB-INF子目录中,例如:

<?xml version = "1.0" encoding = "utf-8">
<web-app>
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>moon.sun.Example6_1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/lookHello</url-pattern>
    </servlet-mapping>
</web-app>

    一个 XML 文件应当以 XML 声明作为文件的第一行,在其前面不能有空白、其他的处理指令或注释。XML 生命以"<? xml"标识开始、以"?>"标识结束。如果在 XML 声明中没有显式地指定 encoding属性的值,那么该属性的默认值为 UTF-8 编码。

    下面是 web.xml 文件中标记的具体内容及其作用:

(1)根标记

        xml 文件必须有一个根标记,web.xml 文件的根标记时 web-app,根标记 web-app 的开始标签是<web-app>,结束标签是</web-app>,开始标签和结束标签之间的内容称作根标记的内容。

(2)servlet 标记及其子标记

        web-app 跟标记里可以由诺干个 servlet 标记,在开始标签和结束标签之间是 servlet 标记的内容。servlet 标记需要有两个子标记:servlet-name 和 servlet-class,其中servlet-name 标记的内容是 Tomcat 服务器创建的 servlet 的名字,servlet-class 标记的内容告知 Tomcat 服务器用哪个 Servlet 类来创建 servlet。

(3)servlet-mapping 标记及其子标记

        web.xml 文件中出现一个 servlet 标记就会对应的出现一个或多个 servlet-mapping 标记,该标记和 servlet 标记都是根标记的直接子标记。不同的是,servlet-mapping 标记需要有两个子标记。servlet-mapping 标记需要有两个子标记:servlet-name 和 url-pattern,其中,servlet-name 标记的内容是 Tomcat 服务器创建的 servlet 的名字。url-pattern 标记用来指定用户用怎样的 URL格式来请求 servlet,例如,url-pattern 标记的内容是 /lookHello,那么用户必须在浏览器的地址栏输入:

http://127.0.0.1:8080/ch6/lookHello

来请求名字是 hello 的 servlet。

        Web 服务目录的 WEB-INF 子目录下的 web.xml 文件负责管理当前 Web 服务目录下的全部 servlet,当该 Web 服务目录需要提供更多的 servlet 时,只要在 web.xml 文件中增加 servlet 和 servlet-mapping 子标记即可。

6.1.3 servlet 的创建与运行

        servlet 由 Tomcat 服务器负责创建,Web 设计者只需为了 Tomcat 服务器预备好 Servlet 类,编写好相应的配置文件 web.xml,用户就可以根据 web.xml 部署文件来请求 Tomcat 服务器创建并运行一个 servlet。如果 Tomcat 服务器没有名字为 hello 的 servlet,就会根据 web.xml 文件中 servlet 标记的子标记 servlet-class 指定的 Servlet 类创建一个名字为 hello 的 servlet。

        当用户请求 Tomcat 服务器运行一个 servlet 时,必须根据 web.xml 文件中标记 url-pattern 指定的格式输入请求。

        用户可以请求上例中给出的 Servlet 类创建的名字是 hello 的 servlet,在浏览器中输入:

http://127.0.0.1:8080/ch6/lookHello

请求 Tomcat 服务器运行名字是 hello 的 servlet。

6.1.4 向 servlet 传递参数的值

        在请求一个 servlet 时,可以在请求的 url-pattern 中额外加入参数及其值,格式是:

url-pattern?参数1=值&参数2=值...参数n=值

那么被请求的 servlet 就可以使用 request 对象获取参数的值,例如:

request.getParameter(参数 n)

6.2 servlet 的工作原理

        servlet 由 Tomcat 服务器负责管理,Tomcat 服务器通过读取 web.xml,然后创建并运行 servlet。

6.2.1 servlet 对象的生命周期

        servlet 是 javax.servlet 包中 HttpServlet 类的子类的一个实例,由 Tomcat 服务器负责创建并完成初始化工作。当多个用户请求同一个 servlet 时,服务器为每个用户分别启动一个线程而不是共用一个进程,这些线程由 Tomcat 服务器来管理,与传统的 CGI 为每个用户启动一个进程相比较,效率要高的多。

        一个 servlet 的生命周期主要有下列三个过程组成:

(1)初始化 servlet。servlet 第一次被请求加载时,服务器初始化这个 servlet,即创建一个 servlet,这个 servlet 调用 init 方法完成必要的初始化工作。

(2)新诞生的 servlet 在调用 service 方法响应用户的请求。

(3)当服务器关闭是,调用 destroy 方法销毁 servlet。

        init 方法之被调用一次,即在 servlet 第一次被请求加载时调用该方法。当后续的用户请求 servlet 服务时,Tomat 服务器将启动一个新的线程,在该线程中,servlet 调用 service 方法响应用户的请求。也就是说每个用户的每次请求都导致 service 方法被调用执行,其执行进程分别运行在不同的线程中。

6.2.2 init 方法

        该方法是 HttpServlet 类中的方法,可以在子类中重写这个方法。init 方法的声明格式是:

public void init(ServletConfig config) throws ServletException

        servlet 第一次被请求加载时,服务器创建一个 servlet,这个对象调用 init 方法完成必须的初始化工作。该方法在执行时,服务器会把一个 ServletConfig 类型的对象传递给 init 方法,这个对象就被保存在 servlet 中,直到 servlet 被销毁。这个 ServletConfig 对象负责向 servlet 传递服务设置信息,如果传递失败就会发生 ServletException,servlet 就不能正常工作。

6.2.3 service 方法

        该方法是 HttpServlet 类中的方法,可以在子类中直接继承该方法或重写这个方法。service方法的声明格式是:

public void service(HttpServletRequest request HttpServletResponse response)throw ServletException,IOException

        当 servlet 成功创建和初始化之后,调用 service 方法来处理用户的请求并返回响应。Tomcat服务器将两个参数传递给该方法。和 init 犯法不同的是,init 方法只被调用一次,而 service 方法可能被多次的调用。当后续的用户请求该 servlet 时,Tomcat 服务器将启动一个新的线程,在该线程中 servlet 调用 service 方法响应用户的请求,即每个用户的请求都导致 service 方法被调用执行,调用过程运行在不同的线程中,互不干扰。因此在不同线程的 service 方法中的局部变量互不干扰,一个线程改变了自己的 service 方法中局部变量的值不会影响其他线程的 service 方法中的局部变量。

6.2.4 destroy 方法

        该方法是 HttpServlet 类中的方法,子类可直接继承这个方法,一般不需要重写。destroy 方法的声明格式是:

public destroy()

        当 Tomcat 服务器终止服务时,例如关闭 Tomcat 服务器等,destroy() 方法会被执行,销毁servlet。

6.3 通过 JSP 页面访问 servlet

        按照部署文件 web.xml 给出的 servlet 的 url-pattern ,用户除了可以在浏览器输入 url-pattern 请求运行一个 servlet 外,也可以通过 JSP 页面来请求一个 servlet。       

        需要注意的是,如果 web.xml 文件中给出的 servlet 的 url-pattern 是 /lookHello,那么 JSP 页面请求 servlet 时,必须要写成 lookHello,不可以写成 /lookHello,否则将变成请求 root 服务目录下的某个 servlet。

1、通过表单向 servlet 提交数据

        Web 服务目录下的 JSP 页面都可以通过 form 表单请求该 Web 服务目录下的某个 servlet。如果 web.xml 文件中给出的 servlt 的 url-pattern,那么 form 表单中 action 给出的值就是 computerBill,如下所示:

<form action = "computerBill">

</form>

当请求一个 servlet 时,也可以在请求的 url-pattern 中额外加入参数及其值,格式是:

url-pattern?参数1=值&参数2=值···参数n=值

        例如:

<form action = "computeBill?sideA = 10.66&sideB = 23.9&sidec = 897">

</form>

        通过 JSP 页面访问 servlet 的好处是,JSP 页面可以负责页面的信息显示,信息的有关处理交给 servlet 去完成。

2、通过超链接访问 servlet

        JSP 页面可以通过超链接去请求某个 servlet。如果 web.xml 文件中给出的请求 servlet 的url-pattern 是 /circle,那么超链接标记中 herf 的值是 circle:

<a herf = "circle"></a>

6.4 共享变量

        Servlet 类是 HttpServlet 的一个子类,在编写子类时就可以声明某些成员变量,那么请求 servlet 的用户将共享该 servlet 的成员变量。

6.5 doGet 和 doPost 方法

        HttpServlet 类除了 init、service、destroy 方法外,该类还有两个很重要的方法:deGet 和 doPost,用来处理用户的请求并做出回应。当 Tomcat 服务器创建 servlet 后,该 servlet 会调用 init 方法初始化自己,以后每当 Tomcat 服务器在接受一个对该 servlet 请求时,就会产生一个新线程,并在这个线程中让该 servlet 调用 service 方法。实际上 HttpServlet 类所给出的 service 方法的功能是检查 HTTP 请求类型,并在 service 方法中根据用户的请求方式,在 service 方法中对应地再调用 deGet 或 doPost 方法。因此在编写的 Servlet 类时,也可以补充些 service 方法来响应用户,直接继承 service 方法即可。

        如果不重写 service 方法,就需要在 Servlet 类中重写 doPost 或 doGet 方法来响应用户的请求。如果不论用户请求类型是 post 还是 get,Tomcat 服务器的处理过程完全相同,那么可以只在 doPost 方法中编写处理过程,而在 doGet 方法中再调用 dePost 方法即可,或只在 doGet 方法中编写处理过程,而在 doPost 方法中再调用 doGet 方法。如果根据请求的类型进行不同的处理,就要在两个方法中编写不同的处理过程。

6.6 重定向与转发

        重定向是浏览器发送请求到servlet1之后,servlet1需要访问servlet2,但并未在服务器内直接访问,而是由服务器自动向浏览器发送一个响应,浏览器再自动提交一个新的请求,这个请求就是对servlet2 的请求。
对于servlet2的访问,是先由服务器响应客户端浏览器,再由客户端浏览器向服务器发送对servlet2的请求,所以重定向有时又称为服务器外跳转。
整个过程中,浏览器共提交了两次请求,服务器共发送了两次响应。只不过,第一次响
应与第二次请求,对于用户来说是透明的,是感知不到的。用户认为,自己只提交了一次请
求,且只收到了一次响应。
这样的话,就会有一个问题:servlet2中是无法获取到用户手动提交请求中的数据的,它只能获取到第二次请求中所携带的数据。
1、sendRedirect 方法

        重定向方法 void sendRedirect(String location)是 HttpServletResponse 类中的方法。当用户请求一个 servlet 时,该 servlet 在处理数据后,可以使用重定向方法将用户重新定向到另一个 JSP页面或 servlet。重定向方法仅仅是将用户从当前页面或 servlet 定向到另一个 JSP 页面或 servlet,但不能将用户对当前页面或 servlet 的请求转发给所定向的资源。即重定向的目标页面或 servlet 无法使用 request 获取用户提交的数据。

2、forward 方法

        RequestDispatcher 对象可以把用户对当前 JSP 页面或 servlet 的请求转发给另一个 JSP 页面或 servlet,而且将用户对当前 JSP 页面或 servlet 的请求传递给转发到的 JSP 页面或 servlet。也就是说,当前页面所转发到的 JSP 页面或 servlet 可以使用 request 获取用户提交的数据。下面介绍实现转发的步骤。

(1)的到 RequestDispatcher 对象。用户所请求的当前 JSP 或 servlet 可以让 HttpServletRequest 对象 request 调用

public RequestDispatcher getRequestDispatcher(String path)

 方法返回一个 RequestDispatcher 对象,其中参数 path 是准备要转发到的 JSP 页面的 URL 或 servlet 的url-pattern。例如:

RequestDispatcher dispatcher = request.getRequestDispatcher("target.jsp");

RequestDispatcher dispatcher = request.getRequestDispatcher("targetServlet");

(2)转发。在(1)中获取的 RequestDispatcher 对象调用

void forward(ServletRequest request,ServletResponse response)

throws ServletException,ava.io.IOException

方法可以将用户对当前 JSP 页面或 servlet 的请求转发给 RequestDispatcher 对象所指定的 JSP 页面或 servlet,例如:

dispatcher.forward(request,response);

把用户对当前 JSP 页面或 servlet 的请求转变为对转发到的 JSP 页面或 servlet 的请求。

3、二者的区别

        转发和重定向方法不同的是,用户可以看到转发到的 JSP 页面或 servlet 的运行效果,在浏览器的地址栏不能看到 forward 方法转发到的 JSP 页面的地址或 servlet 的地址,用户在浏览器的地址栏中所看到的仍然是当前 JSP 页面的 URL 或 servlet 的url-pattern。如果此时刷新浏览器,那么请求将是当前的 JSP 页面或 servlet。

6.7 使用 session

        HTTP 通信协议是用户与服务器之间一种请求与响应的通信协议,属于无状态协议。所谓无状态是指,当用户发送请求给服务器,Tomcat 服务器做出响应后,如果同一个用户在发送请求给 Tomcat 服务器使,Tomcat 服务器并不知道就是刚才的那个用户。

        用户在访问一个 Web 服务目录期间,Tomcat 服务器为该用户分配一个 session 对象,Tomcat 服务器可以在各个页面以及 servlet 中使用这个 session 记录用户的有关信息,而且 Tomcat 服务器保证不同用户的 session 对象互不相同。

        HttpServletRequest 对象 request 调用 getSession 方法获取用户的 session 对象:

HttpSession session = request.getSession(true);

        访问某个 Web 服务目录的用户,在不同的 servlet 中获取的 session 对象是完全相同的,不同的用户的 session 对象互不相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值