Java Servlet基础

文章详细介绍了Servlet的部署过程,包括源文件、字节码文件的保存,以及web.xml的编写。接着讲解了Servlet的生命周期,包括init、service和destroy方法。此外,还阐述了如何通过JSP页面访问servlet,以及重定向和转发的区别和使用场景。最后提到了session在Web应用中的作用,用于在HTTP无状态协议下跟踪用户信息。
摘要由CSDN通过智能技术生成

目录

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

1、源文件及字节码文件

①Servlet类

②字节码文件的保存

2、编写部署文件web.xml

①根标记

②servlet标记及子标记

③servlet-mapping标记及子标记

3、servlet的创建与运行

4、向servlet传递参数的值

二、servlet的工作原理

1、servlet对象的生命周期

2、init方法

3、service方法

4、destroy方法

三、通过JSP页面访问servlet

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

2、通过超链接访问servlet

四、共享变量

五、doGet和doPost方法

六、重定向与转发

1、sendRedirect方法

2、forward方法

3、二者的区别

4、使用转发的好处

七、使用session

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

1、源文件及字节码文件

①Servlet类

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

②字节码文件的保存

        Java源文件产生的字节码文件按照类的包名对应的目录路径保存到Web目录中特定的子目录中,为了方便调试代码,可以事先将创建servlet的Servlet类的Java源文件,按照其包名,保存到、WEB-INF\classes\中。注意,保存Java源文件时,“保存类型”选择为“所有文件”,将“编码”选择为“ANSI”。

        然后进入classes目录进行编译:

classes>javac -cp servlet-api.jar \example

         注意,编译时不要忘记使用-cp参数,该参数指定使用非核心类库中的库,例如servlet-api.jar文档中给出的类,-cp参数值只要给出jar文档的位置即可(如果jar文档在当前目录,就直接输入jar文档的名字即可)。java.servlet和java.servlet.http包中的类不在JDK提供的核心类库中,均在servlet-api.jar文档中,因此可以将Tomcat安装目录lib子目录中的servlet-api.jar文件复制(不要剪贴)到WEB-INF\classes中。否则,-cp参数必须显式给出servlet-api.jar的位置。

2、编写部署文件web.xml

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

        该部署文件是一个XML文件,名字必须是web.xml。web.xml由Tomcat服务器负责管理。

        XML文件是由标记(也称元素)组成的文本文件。使用该XML文件的系统应用程序(例如Tomcat服务器)配有内置的解析器,可以解析XML文件的标记中的数据。 可以在Tomcat服务器的webapps目录中的root目录中找到一个web.xml文件,参照它编写自己的web.xml文件。

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

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

①根标记

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

②servlet标记及子标记

        web-app根标记里可以有若干个servlet标记(称作根标记的子标记,该标记的开始标签是<servlet>,结束标签是</servlet>,开始标签和结束标签之间是servlet标记的内容。servlet标记需要有两个子标记:servlet-name和servlet-class,其中servlet-name标记的内容是Tomcat服务器创建的servlet的名字,servlet-class标记的内容告知Tomcat服务器用哪个Servlet类来创建servlet。web.xml文件可以有若干个servlet标记(一个servlet标记部署一个servlet对象),但要求它们的<servlet-name>子标记的内容互不相同,即服务器可以创建多个servlet,它们的名字必须互不相同。

③servlet-mapping标记及子标记

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

        servlet-name和url-pattern,其中,servlet-name标记的内容是Tomcat服务器创建的servlet的名字(该名字必须和对应的servlet标记的子标记的servlet-name的内容相同)。url-pattern标记用来指定用户用怎样的URL格式来请求servlet。

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

        对于webapps下的Web服务目录,如果修改并重新保存web.xml文件,Tomcat服务器就会立刻重新读取web.xml文件,因此,修改web.xml文件不必重新启动Tomcat服务器。但是如果修改导致web.xml文件出现错误,Tomcat服务器就会关闭当前Web服务目录下的所有servlet的使用权限。所以必须保证web.xml文件正确无误,才能成功启动Tomcat服务器。但是对于不是webapps 下的Web服务目录,如果新建或修改了相应的web.xml文件,要重新启动Tomcat服务器。每当Web服务目录增加新的servlet时,都需要为web.xml文件添加servlet和servlet-mapping标记。

3、servlet的创建与运行

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

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

4、向servlet传递参数的值

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

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

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

request.getparameter(参数n)

二、servlet的工作原理

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

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服务时,Tomcat服务器将启动一个新的线程,在该线程中,servlet调用service方法响应用户的请求。也就是说,每个用户的每次请求都导致service方法被调用执行,其执行过程分别运行在不同的线程中。

2、init方法

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

public void init(ServletConfig config)throws ServletException

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

3、service方法

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

public void service(HttpServletRequest requse,HttpServletResponse response)throws ServletException,IOException

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

4、destroy方法

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

public destroy()

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

三、通过JSP页面访问servlet

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

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

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

<form action="computerBill">     </form>

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

<form action="computerBill?sideA=10.66&sideB=23.9&sideC==897">    </form>

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

2、通过超链接访问servlet

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

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

四、共享变量

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

五、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类中重写doGet或doPost方法来响应用户的请求。如果不论用户请求类型是post还是get,Tomcat服务器的处理过程完全相同,那么可以只在doPost方法中编写处理过程,而在doGet方法中再调用doPost方法即可,或只在doGet方法中编写处理过程,而在doPost方法中再调用doGet方法。如果根据请求的类型进行不同的处理,就要在两个方法中编写不同的处理过程(这一点比service方法更为灵活。

六、重定向与转发

        重定向的功能是将用户从当前页面或servlet定向到另一个JSP页面或servlet。转发的功能是将用户对当前JSP页面或servlet的请求转发给另一个JSP页面或servlet。

1、sendRedirect方法

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

2、forward方法

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

        ①得到RequestDispatcher对象,用户所请求的当前JSP或servlet可以让HttpServletRequest对象request调用。

public RequsetDispatcher getRequestDispatcher(String path)

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

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

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

        ②转发。在步骤①中获取到RequsetDispatcher对象调用

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、二者的区别

         转发(forward)和重定向方法(sendRedirect)不同的是,用户可以看到转发到的JSP页面或servlet的运行效果,但是,在浏览器的地址栏中不能看到forward方法转发到的JSP页面的地址或servlet的地址,用户在浏览器的地址栏中所看到的仍然是当前JSP页面的URL或servlet的url-pattern。如果此时刷新浏览器,那么请求将是当前的JSP页面或servlet。另外,当servlet中执行forward方法实施转发操作时,Tomcat服务器会立刻结束当前servlet的执行。而servlet中执行sendRedirect方法(重定向)时Tomcat服务器还是要把当前的servlet代码执行完毕后才实施重定向(跳转)操作,但Tomcat服务器不再给用户看当前的servlet代码的执行效。如果在执行senRedirect(URL url)方法后,servlet紧接着执行了return返回语句,那么Tomcat服务器会立刻结束当前servlet的执行。

4、使用转发的好处

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

七、使用session

        HTTP通信协议是用户与服务器之间的一种请求与响应(request/response)的通信协议,属于无状态协议。所谓无状态协议是指,当用户(浏览器)发送请求给服务器,Tomcat服务器做出响应后,如果同一个用户再发送请求给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、付费专栏及课程。

余额充值