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包
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。
- 将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;
@Override
public void init(ServletConfig config) throws ServletException {
this.servletConfig = config;
}
@Override
public 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>"
);
}
@Override
public void destroy() {
}
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
@Override
public 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)。返回指定参数的值。
- 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主流框架整合开发》