一、问题引入
在之前做的新闻管理系统中,jsp页面一方面显示数据,比如newsDetailVies页面;另一方面也接受请求,调用javaBean(后台的Service)去处理请求,比如doAdd界面。而JSP其实是一种负责显示的技术,那如何只专注于显示呢?相当于把接受请求、处理请求的功能模块给外包出去,外包给谁呢?就是今天要学的Servlet。把这一部分功能外包出去之后,显示与接受请求、处理请求的工作就分开了。显示JSP来做,接受请求、处理请求Servlet来做。
二、初识Servlet
2.1Servlet做了什么
Servlet本身不做任何业务处理,只是接受请求,并决定调用哪个Service去解决这个问题,然后决定用哪个界面来显示返回的数据。这会的问题是Servlet的载体是什么?
2.2Servlet是什么
Servlet是java程序,但是是运行在服务器端的java程序。(Servlet是由Server+Applet合成的。)服务器端的java程序太多了,后台src包里面的都是,但是只有当一个服务器端的程序使用了servlet API的时候,这个服务器端的程序才能称之为Servlet。
2.3Servlet小结
2.4ServletAPI
2.5Servlet创建方式
1、创建一个类,实现Servlet接口。
示例代码:
package cn.kgc.web.Servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyServlet1 implements Servlet {
public void destroy() {
// TODO Auto-generated method stub
}
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
2、继承GenericServlet类
示例代码:
package cn.kgc.web.Servlet;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyServlet2 extends GenericServlet {
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
GenericServlet类对Servlet接口中的除了service方法的其他四个方法进行了默认实现,所以继承GenericServlet类之后不需要管其他的方法了,只需要在service方法中写代码就行了。
3、在包里面new一个Servlet(最简单也最常用)
此时会默认继承javax.servlet.http.HttpServlet父类,并实现一些方法,同时会在web.xml中保存初始设置。
在上面这个图中,有两个数据:Servlet Name和Servlet Mapping URL,这两个数据的作用是在web.xml中保存数据。
web.xml数据:
示例代码:
package cn.kgc.web.Servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet3 extends HttpServlet {
public MyServlet3() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("");
out.println("");
out.println(" A Servlet ");
out.println(" ");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the GET method");
out.println(" ");
out.println("");
out.flush();
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("");
out.println("");
out.println(" A Servlet ");
out.println(" ");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the POST method");
out.println(" ");
out.println("");
out.flush();
out.close();
}
public void init() throws ServletException {
// Put your code here
}
}
一般在开发的时候会把构造方法,destroy方法和init方法都去掉,只留下doGet和doPost。这两种方式分别对应表单的get和post方法。
注:要使用一个Servlet,只创建是不行的,还需要在web.xml中写配置文件,前两种方式需要用手写,但是容易出错。最后一种方式直接会生成配置文件,配置文件主要如下:
This is the description of my J2EE component
This is the display name of my J2EE component
MyServlet3
cn.kgc.web.Servlet.MyServlet3
MyServlet3
/servlet/MyServlet3
配置文件分析:
1、servlet标签和servlet-mapping标签成对出现。
2、servlet标签标签中的description标签和display-name标签没什么用,可以删除掉。
3、servlet-name标签里面的数据两个都一样,只要这个标签里面数据一样的,都是一对。
4、在servlet标签中,servlet-name的意思是内部映射名,servlet-class是内部映射类:cn.kgc.web.Servlet.MyServlet3
5、在servlet-mapping标签中,servlet-name的也是名字,其作用是根据servlet标签中的名字来找servlet-mapping标签中相对应的名字;url-pattern是servlet映射,用户通过里面的数据就可以访问MyServlet3了。
6、也就是说在servlet标签中存放的是servlet名和这个名对应的servlet类;在servlet-mapping标签中存放的是servlet名和这个名所对应的类所在的url地址。
三、运行Servlet
观察通过第三种方式创建的Servlet里面的各个方法的实现时机。
3.1示例代码
package cn.kgc.web.Servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet3 extends HttpServlet {
public MyServlet3() {
super();
}
public void destroy() {
System.out.println("销毁Servlet");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("进入doGet()");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("进入doPost()");
}
public void init() throws ServletException {
System.out.println("初始化Servlet");
}
}
3.2开启方式
因为Servlet需要web容器的支持,所以部署在Tomcat上。
将创建的Servlet项目部署到Tomcat上,然后访问该项目下面的MyServlet3 。
访问网址如下:http://localhost:8080/ServletDemo1/servlet/MyServlet3
3.3运行结果
最开始访问的时候会出现初始化和进入doGet(),之后每刷新一次就出现一次doGet()。
3.4销毁
停止服务器,不要通过console界面的红按钮去停止,通过开启的那个按钮去停止服务器,就会看到servlet的销毁。原因是Servlet的运行需要依赖外部容器,所以外部容器消失的时候Servlet就销毁了。从初始化到销毁就是servlet的一个生命周期。