此为是我接触Java web的第一篇博客,希望能坚持下来。本文主要是解释Struts框架中的Servlet技术,希望能让大家对Servlet有更好的理解。
在JSP应用中,Servlet是一种独立于平台和协议的服务器端的Java应用程序,能够生成动态的Java web页面,采用“请求----响应”模式提供web服务。Servlet担当了web浏览器或其他HTTP客户程序请求和HTTP服务器上的数据库或应用程序之间的中间层。与传统的从命令行启动的Java应用程序不同,Servlet是由web服务器加载的,而web服务器必须包含支持Servlet的JVM。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
一、Servlet的优点(主要针对CGI)
(1)高效。在Servlet中,每个请求由一个轻量级的java线程处理(而不是重量级的OS进程)。
(2)方便。它提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头,处理Cookie、跟踪会话状态等,这样方便coder的工作。
(3)功能强大。例如Servlet能够直接与web服务器交互,而普通的CGI程序则不能。Servlet还能够在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现。
(4)可移植性好。
(5)节省投资
Servlet的持久性主要分为初始化、请求处理、终止这几个阶段,JSP的本质是Servlet,coder编写的JSP页面由Web容器编译成对应的Servlet。当Servlet在容器中运行时,Servlet实例的创建及销毁等都不是由coder决定的,而是由web容器进行控制。
二、Servlet的生命周期分为四个阶段
(1)创建Servlet对象,通过服务器反射机制创建Servlet对象,第一次请求时才会创建。(默认)
(2)调用Servlet对象的init()方法,初始化Servlet的信息,init()方法只会在创建后被调用一次
(3)响应请求,调用service()或者是doGet(),doPost()方法来处理请求,这些方法是运行的在多线程状态下的。
(4)在长时间没有被调用或者是服务器关闭时,会调用destroy()方法来销毁Servlet对象。
三、Servlet创建时机:
(1)第一个请求到来的时候创建
(2)在web.xml中<servlet>标签下添加<load-on-startup>2</load-on-startup>,则在服务器启动的时候就创建 标签体是正数的时候,启动服务器,即创建servlet 并且当多个<servlet>标签都定义了这个时,数字小的先加载
四、Servlet与Applet的异同
Applet与Servlet的相同之处在于它们不是独立的应用程序,没有main()方法。它们不是由coder调用,而是由另外一个应用程序(容器)调用,它们都有一个生存周期,包含init()和destroy()方法;不同之处在于Applet具有好的用户界面(AWT),与浏览器一起,在客户端运行,Servlet则没有图形界面,运行在服务器端。
五、Servlet开发体验
Servlet通常被称为服务器端小程序,是运行在服务器端的程序,功能是处理并响应客户端的请求。Servlet是一个特殊的Java类,此Java类必须继承于HttpServlet,每一个Servlet可以响应客户端的请求。
Servlet为我们提供下列方法以响应客户端的请求:
- doGet:用于响应客户端的GET请求
- doPost:用于......................POST请求
- doPut:................................PUT请求
- doDelete:..........................DELETE请求
- init(Servlet config):创建Servlet实例时,调用该方法初始化Servlet资源。
- destory():销毁Servlet实例时,自动调用该方法回收资源
初次练习:
package jweb;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class HelloServlet extends HttpServlet{
public void init(ServletConfig config) throws ServletException
{
super.init(config);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/html; charset=GB2312");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>Hello - Servlet</title></head>");
out.println("<body>");
out.println(" Hello World <br>");
out.println("</body>");
out.println("</html>");
out.close();
}
public String getServletInfo()
{
return "com.sdc.www.HelloServlet Infomation.";
}
public void destory()
{
}
}
目录结构
webapps
|-------my_example
|-------WEB-INF
| |-----------classes
| |-----------web.xml
|-------index.html
其中classes文件就是放刚刚生成HelloServlet.class文件,由于上面的代码是包含在包jweb中,所以是放在classes/jweb/HelloServlet.class
配置web.xml,是Servlet对外可见
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<description>Examples</description>
<display-name>Examples</display-name>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>jweb.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
</web-app>
这样我们就可以通过http://localhost:8080/my_example/HelloServlet来访问了.