目录
前言
本章导读
主要内容
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)来处理用户请求。一旦业务逻辑组件处理结束后,控制器会根据处理结果,调用不同的表现层页面向浏览器呈现处理结果。