Java Web学习笔记——Servlet

来源:互联网 发布:金思维软件 经营范围 编辑:程序博客网 时间:2024/05/07 10:35

Servlet学习笔记(一)

摘要:今天开始正式学习Java Web的相关知识了,Servlet作为Java中用于开发Web应用程序的技术,是重点学习的对象。今天主要了解了Servlet/JSP应用程序架构,Servlet API中的Java包,并详细学习了javax.servlet包。

Servlet/JSP应用程序架构

Servlet是一个Java程序,运行于服务器端,不过它不同于传统的Java应用程序,Servlet由Web服务器来加载并运行,所以Web服务器必须包含Servlet容器。Servlet容器将用户的请求传给Servlet应用程序,并将Servlet用用程序的相应回传给用户。而且大多数Sservlet应用程序至少都包含几个JSP页面,因此,Java的Web应程序称为“Servlet/JSP应用程序”。

Servlet API

Servlet API中有四个Java包,包括:

  • javax.servlet。包含定义Servlet与Servlet容器之间契约的类和接口。
  • javax.servlet.http。包含定义HTTP Servlet与Servlet容器之间的契约类和接口。
  • javax.servlet.annotation。包含对Servlet,Filter和Listener进行标注的注解。还为标注原件指定元数据。
  • javax.servlet.descriptor。包含为Web应用程序的配置信息提供编程式访问的类型。
今天主要学习javax.servlet包。

javax.servlet包

Servlet技术的核心是Servlet接口,这是所有Servlet类都必须直接或间接实现的一个接口。当编写Servlet接口的Servlet类时,直接实现它;当扩展一个实现这个接口的类时,则间接实现它。
Servlet接口定义了Servlet与Servlet容器之间的契约。这个契约归结起来是说,Servlet容器会把Servlet类加载到内存中,并在Servlet实例中调用特定的方法。
Servlet接口定义了以下5个方法:
  • void init(ServletConfig config)。第一次请求Servlet时,Servlet容器就会调用这个方法。而在后续的请求中,不再调用该方法。利用该方法来编写一些应用程序初始化相关代码。在调用该方法时,Servelt容器会传递一个ServletConfig。
  • void service(ServletRequest request,ServletResponse response)。每次请求Servlet时,Servlet容器都会调用这个方法。必须在这里编写要Servlet完成的相应代码。第一次请求Servlet时,Servlet会调用init()方法和service()方法。对于后续的请求,则只调用service()方法。
  • void destroy()。要销毁servlet时,Servlet容器就会调用这个方法,通常发生在卸载应用程序,或者关闭Servlet容器的时候。通常,在此=编写一些资源清理的相关代码。
  • String getServletInfo()。该方法返回Servlet的描述。
  • ServletConfig getServletConfig()。该方法返回由Servlet容器传递给init()方法的ServletConfig。
在以上5个放方法中,init(),service(),destroy()这三个方法属于Servlet生命周期方法。而getServletInfo()与getServletConfig()属于非生命周期方法。Servle的生命周期,从生成到销毁可以分成如下几个步骤:
  • 将Servlet加载到Servlet引擎中。
  • 创建一个Servlet实例,并调用其init()方法(如上所诉,init()方法只在第一次调用时创建,以后不再调用)。
  • 一个客户端请求到达serve,serve创建一个请求对象与一个响应对象。
  • serve激活Servlet的service()方法,并传递请求和响应对象作为参数。
  • service()通过提供的响应方法来处理客户端请求。
  • 调用destroy()方法进行销毁操作,并通过垃圾收集器进行收集清理。

一个简单的Servlet应用程序

在这里,我写了一个简单的Servlet程序。它只包含一个Servlet;:MyServlet,其作用是给用户发送一条问候信息。

import java.io.IOException;import java.io.PrintWriter;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//Servlet注解@WebServlet(name = "MyFirstServlet",urlPatterns={"/my"})public class MyServlet implements Servlet {private transient ServletConfig servletConfig;@Overridepublic void init(ServletConfig config) throws ServletException {this.servletConfig = config;}@Overridepublic void service(ServletRequest req, ServletResponse res)throws ServletException, IOException {String servletName = servletConfig.getServletName();res.setContentType("text/html");PrintWriter writer = res.getWriter();writer.print("<html><head></head>" +"<body>Hello from " + servletName +"</body></html>");}@Overridepublic void destroy() {}@Overridepublic ServletConfig getServletConfig() {return servletConfig;}@Overridepublic String getServletInfo() {return "MY FIRST SERVLET APP";}}
在这个程序中,包含以下几个知识点:

  • Servlet注解:@WebServlet(name = "MyFirstServlet",urlPatterns={"/my"})

@WebServlet用于将一个类声明为Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为 Servlet。同时还可以告诉容器是哪个URL调用这个Servlet。name属性是可选的,一般用来提供Servlet类名称。而urlPatterns虽然也是可选的,但大部分会用到它,urlPatterns告诉容器。/my模式应该调用这个Servlet。有关Servlet的注解知识可以参考:Servlet注解知识详解

  • ServletRequest对象

ServletRequest代表一个HTTP请求,请求在内存中是一个对象,这个对象是一个容器,可以存放请求参数和属性。对于每一个HTTP请求,Servlet容器都会创建一个Servlet实例,并将它传递给Servlet的service方法。ServletRequest对象自动封装了请求中get和post方式提交的参数,以及请求容器中的属性值,还有http头等等。当Servlet得到这个请求对象的时候,就知道这个请求时从哪里发出的,请求什么资源,带什么参数等等。ServletRequest接口包含以下常用方法:
  • public int getContentLength()。返回请求主体中的字节数,如果不知道字节长度,返回-1。
  • public String getContentType()。返回请求主体的MIME类型,如果不知道返回null。
  • public String getProtocol()。返回该HTTP请求的协议名称与版本号。
  • public Stirng getParameter(String name)。返回指定参数的值。
getParameter()方法通常用来返回HTML表单域的值,同时也可以用来获取查询字符串的值。

  • ServletResponse对象

ServlerResponse是Servlet对客户端请求的响应,响应的内容一般是HTML也是由容器自动创建的,代表Servlet对客户端请求的响应,响应的内容一般是HTML。在ServletResponse对象中有一个getWriter()方法,它可以将文本传给客户端的java.io.PrintWriter。注意,默认情况下PrintWriter对象采用ISO-8859-1编码。通常在返回HTML信息之前,通过先调用setContentType()方法设置响应内容的格式。

  • ServletConfig对象

 Servlet容器初始化Servlet时,将ServletConfig传给Servlet的init()方法,ServletConfig封装了通过@WebServlet或者部署描述符传递给一个Servlet的配置信息。对于ServletConfig,从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet有效,一个servlet的ServletConfig对象不能被另一个servlet访问。

  • ServletContext

 ServletContext:对任何servlet,任何人在任何时间都有效,是真正全局的对象。可以把ServletContext看成是一个Web应用的服务器端组件的共享内存,在ServletContext中可以存放共享数据。

参考资料

  • 《Servlet和JSP学习指南》
  • 《Java Web程序设计与项目实践》
  • 《Java Web主流框架整合开发》