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.5 doGet和doPost方法 

6.6   重定向与转发

6.7        使用session

 总结


前言

本章导读

        主要内容

        servlet的部署、创建、与运行

        servlet的工作原理

        通过JSP页面访问servlet

        共享变量

        doPost和doGet方法

        重定向与转发

        使用session

        难点

        servlet的工作原理

        重定向与转发

6.1 servlet的部署、创建、与运行

                Java Servlet的核心思想是在Tomcat服务器端创建响应用户请求的servlet对象,简称servlet

6.1.1   源文件及字节码文件

      ①Servlet类

写一个创建servlet的类就是编写一个特殊类的子类,这个特殊的类就是javax.servlet.http包中的HttpServlet类。HttpServlet实现了Servlet的接口,实现了响应客户的方法。

❀HttpServlet的子类被习惯地称作一个Servlet类,这样的类创建的对象习惯地被称为一个servlet。

6.1.2   编写部署文件web.xml

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

该部署文件必须是XML文件,文件名必须为web.xml。有Tomcat服务器负责管理。

一个XML文件应当以XML声明作为文件的第一行,其前面不能有空白,其他的处理指令或注释。

<?xml version="1.0" encoding="utf-8"  ?>

①根标记

xml文件必须有一个根标记,web.xml文件的根标记为web-app

②servlet标记及子标记

web-app 根标记里可以有若干个servlet标记,开始标签为<servlet>,结束标签为</servlet>,开始标签和结束标签里面的内容就是servlet标记的内容

③servlet-mapping标记及子标记

web.xml文件中出现一个servlet标记就会对应出现一个或多个servlet-mapping标记,该标记和servlet标记都是根标记的直接子标记。

6.1.3   servlet的创建与运行

servlet由Tomcat服务器负责创建,Web设计者只需为Tomcat服务器预备好Servlet类,编写好相应的配置文件web.xml,用户就可以根据web.xml部署文件来请求Tomcat服务器创建并运行一个servlet。

6.1.4   向servlet传递参数的值

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

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

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

request.getParameter(参数n)

在以下例子宏,用户请求一个servlet绘制一个椭圆,请求时将椭圆的宽和高通过参数width和height传递给servlet。

import java.awt.geom.*; 
import javax.imageio.ImageIO;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Example6_2 extends HttpServlet{
    public void init(ServletConfig config) throws ServletException{
       super.init(config);
    }
    public void service(HttpServletRequest request,HttpServletResponse response) throws IOException{
        request.setCharacterEncoding("utf-8");
        double width  = Double.parseDouble(request.getParameter("width"));
        double height = Double.parseDouble(request.getParameter("height"));
        response.setContentType("image/jpeg");
        Ellipse2D ellipse=new Ellipse2D.Double(400-width/2,300-height/2,width,height);
        BufferedImage image = getImage(ellipse);
        try {
            OutputStream outClient= response.getOutputStream();//指向用户端的输出流。
            boolean boo =ImageIO.write(image,"jpeg",outClient);
        }
        catch(Exception exp){}
    } 
    BufferedImage getImage(Shape shape){ //得到图形的图像
        int width=800, height=600;
        BufferedImage image = 
        new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        g.fillRect(0, 0, width, height);
        Graphics2D g_2d=(Graphics2D)g; 
        g_2d.setColor(Color.blue);
        g_2d.fill(shape); 
        return image;
    }
}

6.2 、servlet的工作原理

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

6.2.1 servlet对象的生命周期

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

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

②新诞生的servlet再调用service方法响应用户的请求

③当服务器关闭时,调用destroy方法销毁servlet。

init方法只被调用一次,即在service第一次被请求加载时调用该方法。当后续的用户请求servlet服务时,Tomcat服务器将启动一个新的线程,在该线程中,servlet调用service方法响应用户的请求。

6.2.2 init 方法

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

public void init(ServletConfig config) throws ServletException

6.2.3 service 方法

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

public void service(HttpServletRequest request HttpServletRespose  respose) throw

ServletException, IOException

6.2.4   destroy方法

该方法是HttpServlet类中的方法,可以在子类中直接继承该方法

声明格式是

public destroy()

6.3  通过JSP页面访问servlet

        按照部署文件 web.xml 给出的 servlet的 url-pattern,用户除了可以在浏览器输人 url-pattern请求运行一个servlet外,也可以通过JSP页面来请求一个servlet。
        需要特别注意的是,如果web.xml文件中给出的 servlet的url-pattcrn是/lookHello,那么JSP页面请求servlet时,必须要写成lookHello,不可以写成/lookHello,否则将变成请求root 服务目录下的某个servlet。
①通过表单向servlct 提交数据
        Web 服务目录下的JSP页面都可以通过[orm表单请求该 Web服务日录下的某个servlet。如果web.xml文件中给出的servlet 的url-pattern 是/computeBill,那么form表单中action给出的值就是computeBill,如下所示:

< form action = "computeBill" >

</form>

②通过超链接访问servlet

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

<a href ="circle"></a>

6.4   共享变量

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

jsp文件

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<HTML><body bgcolor=#ffccff>
<p style="font-family:宋体;font-size:36;color:blue">
<a href="computePI" >参与计算PI的值</a>
</p></body></HTML>

package moon.sun;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Example6_5_Servlet extends HttpServlet{
    double sum=0,i=1,j=1; //被所有用户共享
    int number=0;         //被所有用户共享
    public void init(ServletConfig config) throws ServletException{
        super.init(config);
    }
    public synchronized void service(HttpServletRequest request,
              HttpServletResponse response) throws IOException { 
       response.setContentType("text/html;charset=utf-8");
       PrintWriter out=response.getWriter();
       out.println("<html><body bgcolor=cyan>");
       number++;
       sum=sum+i/j;
       j=j+2;
       i = -i;  
       out.println("<h1>servlet:"+getServletName()+
                    "已经被请求了"+number+"次");
       out.println("<br>现在PI的值是:");
       out.println(4*sum);
       out.println("</h1></body></html>");
  } 
}

6.5 doGet和doPost方法 

HttpServlet 类除了init、service、destroy方法外,该类还有两个很重要的方法:doGet 和doPost,用来处理用户的请求并作出响应。当Tomcat 服务器创建servlet 后,该 servlet会调用init方法初始化自己,以后每当Tomcat 服务器再接受一个对该servlet请求时,就会产生一个新线程,并在这个线程中让该servlet调用service方法。实际上HttpServlet类所给出的service方法的功能是检查HTTP请求类型(get、post等),并在service方法中根据用户的请求方式,在service方法中对应地再调用doGet或doPost方法。因此,在编写的Servlet 类(HttpServlet类的一个子类)时,也可以不重写service方法来响应用户,直接继承service方法即可。
如果不重写service方法,就需要在Servlet类中重写doPost或doGet方法来响应用户的请求。如果不论用户请求类型是post 还是get,Tomcat 服务器的处理过程完全相同,那么可以只在doPost方法中编写处理过程,而在doGet方法中再调用doPost方法即可,或只在doGet 方法中编写处理过程,而在doPost方法中再调用doGet方法。如果根据请求的类型进行不同的处理,就要在两个方法中编写不同的处理过程(这一点比service方法更为灵活)。

6.6   重定向与转发

重定向的功能是将用户从当前页面或servlet定向到另一个JSP页面或servlet。转发的功能是将用户对当前JSP页面或 servlet的请求转发给另一个
视频讲解
JSP页面或servlet。本节学习在Servlet 类中使用HttpServletResponse 类的sendRedirect重
定向方法,以及RequestDispatcher 类的forward转发方法,并指出二者的区别。
① sendRedirect方法
重定向方法 void sendRedirect(String location)是HttpServletResponse类中的方法。当用户请求一个servlet时,该servlet 在处理数据后,可以使用重定向方法将用户重新定向到另一个JSP 页面或 servlet。重定向方法仅仅是将用户从当前页面或servlet定向到另一个JSP页面或servlet,但不能将用户对当前页面或servlet 的请求(HttpServletRequest 对象)转发给所定向的资源。即重定向的目标页面或servlet 无法使用request获取用户提交的数据。
②forward方法
RequestDispatcher 对象可以把用户对当前JSP页面或 servlet的请求转发给另一个JSP页面或servlet,而且将用户对当前JSP 页面或servlet 的请求传递给转发到的JSP页面或servlet。也就是说,当前页面所转发到的JSP页面或servlet 可以使用request获取用户提交的数据

③二者的区别

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

④使用转发的好处
使用转发技术可以让JSP页面和处理数据的servlet 解耦,JSP页面只需和处理转发的servlet 打交道。例如,在实际问题中,对数据的处理可能有多种需求,那么可以把这些需求分别指派给几个servlet来完成,然后编写一个servlet 负责接收用户的请求,并根据用户的请求信息将用户的请求转发给这些servlet中的某个servlet。当更新某个需求时,只需重新编译相应的Servlet类,这有利于Web应用程序的维护。

6.7        使用session

用户在访问一个 Web服务目录期间,Tomcat 服务器为该用户分配一个 session对象(称为用户的会话),Tomcat 服务器可以在各个页面以及servlet 中使用这个session记录用户的有关信息,而且Tomcat 服务器保证不同用户的session对象互不相同。有关session对象的原理、常用方法可参见4.3节。本节学习怎样在servlet中使用session对象记录有关信息。HttpServletRequest 对象request 调用getSession方法获取用户的session对象:

HttpSession session= request.getSession(true);

6.5 doGet和doPost方法 

HttpServlet 类除了init、service、destroy方法外,该类还有两个很重要的方法:doGet 和doPost,用来处理用户的请求并作出响应。当Tomcat 服务器创建servlet 后,该 servlet会调用init方法初始化自己,以后每当Tomcat 服务器再接受一个对该servlet请求时,就会产生一个新线程,并在这个线程中让该servlet调用service方法。实际上HttpServlet类所给出的service方法的功能是检查HTTP请求类型(get、post等),并在service方法中根据用户的请求方式,在service方法中对应地再调用doGet或doPost方法。因此,在编写的Servlet 类(HttpServlet类的一个子类)时,也可以不重写service方法来响应用户,直接继承service方法即可。
如果不重写service方法,就需要在Servlet类中重写doPost或doGet方法来响应用户的请求。如果不论用户请求类型是post 还是get,Tomcat 服务器的处理过程完全相同,那么可以只在doPost方法中编写处理过程,而在doGet方法中再调用doPost方法即可,或只在doGet 方法中编写处理过程,而在doPost方法中再调用doGet方法。如果根据请求的类型进行不同的处理,就要在两个方法中编写不同的处理过程(这一点比service方法更为灵活)。

6.6   重定向与转发

重定向的功能是将用户从当前页面或servlet定向到另一个JSP页面或servlet。转发的功能是将用户对当前JSP页面或 servlet的请求转发给另一个
视频讲解
JSP页面或servlet。本节学习在Servlet 类中使用HttpServletResponse 类的sendRedirect重
定向方法,以及RequestDispatcher 类的forward转发方法,并指出二者的区别。
① sendRedirect方法
重定向方法 void sendRedirect(String location)是HttpServletResponse类中的方法。当用户请求一个servlet时,该servlet 在处理数据后,可以使用重定向方法将用户重新定向到另一个JSP 页面或 servlet。重定向方法仅仅是将用户从当前页面或servlet定向到另一个JSP页面或servlet,但不能将用户对当前页面或servlet 的请求(HttpServletRequest 对象)转发给所定向的资源。即重定向的目标页面或servlet 无法使用request获取用户提交的数据。
②forward方法
RequestDispatcher 对象可以把用户对当前JSP页面或 servlet的请求转发给另一个JSP页面或servlet,而且将用户对当前JSP 页面或servlet 的请求传递给转发到的JSP页面或servlet。也就是说,当前页面所转发到的JSP页面或servlet 可以使用request获取用户提交的数据

③二者的区别

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

④使用转发的好处
使用转发技术可以让JSP页面和处理数据的servlet 解耦,JSP页面只需和处理转发的servlet 打交道。例如,在实际问题中,对数据的处理可能有多种需求,那么可以把这些需求分别指派给几个servlet来完成,然后编写一个servlet 负责接收用户的请求,并根据用户的请求信息将用户的请求转发给这些servlet中的某个servlet。当更新某个需求时,只需重新编译相应的Servlet类,这有利于Web应用程序的维护。

6.7        使用session

用户在访问一个 Web服务目录期间,Tomcat 服务器为该用户分配一个 session对象(称为用户的会话),Tomcat 服务器可以在各个页面以及servlet 中使用这个session记录用户的有关信息,而且Tomcat 服务器保证不同用户的session对象互不相同。有关session对象的原理、常用方法可参见4.3节。本节学习怎样在servlet中使用session对象记录有关信息。HttpServletRequest 对象request 调用getSession方法获取用户的session对象:

HttpSession session= request.getSession(true);

 总结

在标准的MVC模式中,Servlet 仅作为控制器使用,而控制器角色的作用是:负责接收客户端的请求,它既不直接对客户端输出响应,也不处理用户请求,只是调用业务逻辑组件(JavaBean)来处理用户请求。一旦业务逻辑组件处理结束后,控制器会根据处理结果,调用不同的表现层页面向浏览器呈现处理结果。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值