本帖最后由 hydee 于 2019-1-17 18:40 编辑
一、Servlet简介
1.什么是ServletServlet 运行在服务端的Java小程序,是sun公司提供一套规范,用来处理客户端请求、并生成响应结果给浏览器。servlet的实质就是java代码,通过java的API动态的向客户端输出内容。 2.Servlet的作用在BS架构中,早期的Web服务器只能处理静态资源的请求。为了补充Web服务器的这个缺陷,于是有了CGI技术。CGI(Common Gateway Interface通用网关接口)也是一种规范,可以使用不同的语言来开发,如Perl,C,Java等都可以。当客户端请求静态资源时,Web服务器会自己处理并返回,当客户端请求动态资源时,Web服务器会把请求转交给扩展程序来处理,并将处理结果返回给客户端。但是CGI技术开发复杂,性能较差,只要有一个请求到达,Web服务器就会单独分配一个进程来进行处理,可移植性不好,所以慢慢就由后来的Servlet技术所取代。 Servlet不像CGI技术那样需要分配单独的进程来处理请求,而是单独分配一个线程来处理,于是大大提升了处理效率。并且Java语言是跨平台的语言,也提升了Web服务器扩展程序的可移植性,已经取代了CGI技术,成为BS架构中的主流技术。
二、Servlet的开发方式
1.实现Servlet接口实现步骤: 1)创建自定义类实现Servlet接口 2)实现接口中的方法(着重关注service方法) 3)在web.xml进行servlet的配置
2.继承抽象类GenericServletGenericServlet原理: 直接通过实现Servlet接口来编写一个Servlet类,就需要实现Servlet接口中定义的5种方法,为了简化Servlet的编写,在javax.servlet包中,给我们提供了一个抽象的类GenericServlet,它提供了除service()方法外的其他4种方法的简单实现。GenericServlet类定义了一个通用的,不依赖具体协议的Servlet。 GenericServlet类实现了Servlet接口、ServletConfig接口和Serializable接口。 实现步骤: 1)创建类继承GenericServlet类 2)只需要实现service方法 3)在web.xml进行servlet的配置
3.继承抽象类HttpServlet(重点)实际开发中,我们不会直接去实现Servlet接口,因为那样需要覆盖的方法太多。而且大多数网络应用中,都是使用浏览器和HTTP协议去访问服务器资源,为了快速开发应用于HTTP协议的Servlet,Sun公司在javax.servlet.http包中给我们提供了一个抽象的类HttpServlet,他继承自GenericServlet类。在javaWeb的servlet开发中,一般都扩展HttpServlet进行开发。 实现步骤: 1)创建类继承HttpServlet类 2)覆盖doGet和doPost 3)在web.xml中进行servlet的配置
4.Servlet开发案例1、实现Servlet接口的开发 [Java] 纯文本查看 复制代码 public class MyServlet implements Servlet{
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
//处理用户请求,并响应结果给浏览器的
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("service被调用");
res.getWriter().write("Hello Servlet");
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
} 2、继承GenericServlet类的开发 [Java] 纯文本查看 复制代码 public class MyGenericServlet extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("MyGenericServlet对象的service方法被调用了");
res.getWriter().write("Hello MyGenericServlet");
}
} 3、继承HttpServlet的开发 [Java] 纯文本查看 复制代码 public class MyHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet方法被调用");
resp.getWriter().write("Hello MyHttpServlet");
}
} 三、Servlet的生命周期
1.Servlet API介绍(1)Servlet接口中的方法1)init(ServletConfig config) 负责初始化Servlet对象。容器在创建好Servlet对象后,会调用该方法。 2)service(ServletRequest request,ServletResponse response) 负责处理客户发出的请求,并响应结果给客户。 3)destroy() 负责释放Servlet对象占用的资源,当Servlet对象结束生命周期时,会调用此方法。
(2)GenericServlet抽象类用于初始化GenericServlet内部的ServletConfig类型的私有变量config,并调用无参的init()方法。 3)service(ServletRequest request,ServletResponse response)
(3)HttpServlet类的方法1)init() 2)doGet(HttpServletRequest request,HttpServletResponse response) 处理HTTP协议中的GET请求,service()方法会判断请求方式,如果为GET,会调用该方法;开发中会根据需要重写该方法。 3)doPost(HttpServletRequest request,HttpServletResponse response) 处理HTTP协议中的POST请求,service()方法会判断请求方式,如果为POST,会调用该方法;开发中会根据需要重写该方法。 4)destroy()
2.Servlet的生命周期介绍
(1)初始化阶段1)Servlet容器加载Servlet类,把它的.class文件读取到内存中 2)Servlet容器创建ServletConfig对象,并将ServletConfig对象与 ServletContext对象关联 3)Servlet容器创建Servlet对象 4)Servlet容器调用Servlet对象的init(ServletConfig config)方法,完成初始化。 注意:init()方法只会被调用一次 问题:servlet何时创建? 1)默认在第一次访问该servlet时创建。 2)当在web.xml中为一个servlet配置了<load-on-startup>元素,那么在servlet 容器启动该应用时,就会创建该servlet。
(2)运行时阶段这是servlet生命周期中最重要的阶段。当Servlet容器接收到请求时,会创建ServletRequest对象和ServletResponse对象,然后调用相应的service()方法处理请求并生成响应结果。如果是继承HttpServlet开发,service()方法会根据客户端请求类型调用相应的方法,如doGet()、doPost()等方法。 注意:客户端每访问一次servlet,service()方法就会执行一次。
(3)销毁阶段当应用正常停止时,Servlet容器会先调用Servlet对象的destroy()方法,用以处理资源释放等操作,然后再销毁Servlet对象。 注意:除非在代码中手动调用,否则只有当应用正常停止方法时才会执行destroy()方法,并且只调用一次。
|