Servlet学习(一)----Servlet的生命周期以及开发Servlet的三种方法

Servlet学习(一)

一.Servlet的生命周期。



①WEB服务器首先会检查是否已经装载并创建了该servlet实例对象。如果是则直接进行第④步,否则执行第②步。

②装载并创建该Servlet的一个实例对象。

③调用Servlet实例对象的init()方法。

④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用service()方法并将请求和响应作为参数传递进去。

⑤WEB应用被停止或重启之前,Servlet引擎将卸载Servlet,在卸载之前调用Servletdestroy()方法。


当客户端第一次向web服务器发出一个servlet请求时,web服务器将会创建一个该servlet的实例,并且调用servletinit()方法(init函数只会被调用一次,该函数会servlet实例装载到内存);如果当服务器已经存在了一个servlet实例,那么,将直接使用此实例;然后再调用service()方法,service()方法将根据客户端的请求方式来决定调用对应的doXXX()方法;当 web应用 reload 或者 关闭 tomcat 或者 关机web服务器将调用destroy()方法,将该servlet从服务器内存中删除。




例1:(Servlet的生命周期的例子)
package com.servlet.main;
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;

/**
 * 使用注解来声明一个Servlet,name和urlPatterns属性都是可选的,但注解时一般都会用到urlPatterns属性,
 * urlPatterns告诉容器,/my调用这个Servlet
 */
@WebServlet(name = "MyFirstServlet", urlPatterns = { "/my" })
public class MyFirstServlet implements Servlet {
	/**
	 * Java语言的关键字,用来表示一个域不是该对象串行化的一部分。 当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,
	 * 然而非transient型的变量是被包括进去的
	 */
	private transient ServletConfig servletConfig;

	public void destroy() {
		// TODO Auto-generated method stub
		System.out
				.println("destory:Servlet生命周期方法,要销毁Servlet(卸载应用程序或者关闭Servlet容器时会调用这个方法)");
	}

	/** 非生命周期方法,返回由Servlet容器传递给init方法的ServletConfig或null */
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return servletConfig;
	}

	/** 非生命周期方法,返回Servlet的描述 */
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}

	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		/**
		 * Servlet容器会传递一个ServletConfig.可以将ServletConfig赋给一个类级变量,
		 * 以便Servlet类中的其它方法也可以使用这个对象
		 */
		System.out
				.println("init:Servlet生命周期方法,第一次请求Servlet时,Servlet容器会调用这个方法.");
		this.servletConfig = config;

	}

	public void service(ServletRequest req, ServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out
				.println("service:Servlet生命周期方法,每次请求Servlet时,Servlet容器都会调用这个方法.");
		/** 从ServletConfig里面获取Servlet的名字 */
		String servletName = servletConfig.getServletName();
		response.setContentType("text/html");
		/** 设置在页面显示的字符的编码 */
		response.setCharacterEncoding("utf-8");
		PrintWriter writer = response.getWriter();
		writer.print("<html><head></head>" + "<body>来自:" + servletName
				+ "</body></html>");

	}

}

二:开发servlet有三种方法 

(1) 实现 Servlet接口

(2) 通过继承 GenericServlet

(3) 通过继承 HttpServlet



(1).ServletConfig.

package com.servlet.main;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

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.annotation.WebInitParam;

/*** 通过@WebServlet的@WebInitParam属性给Servlet传递两个参数 */
@WebServlet(name = "ServletConfigDemoServlet", urlPatterns = { "/servletConfigDemo" }, initParams = {
		@WebInitParam(name = "admin", value = "张飞"),
		@WebInitParam(name = "email", value = "admin@zhangfei.com") })
	public class ServletConfigDemoServlet implements Servlet {
	private transient ServletConfig servletConfig;

	public ServletConfig getServletConfig() {
		return servletConfig;
	}

	/** 在Servlet容器初始化Servlet时,Servlet容器将ServletConfig传给Servlet的init方法 */
	public void init(ServletConfig servletConfig) throws ServletException {
		this.servletConfig = servletConfig;
	}

	public void service(ServletRequest request, ServletResponse response)
			throws ServletException, IOException {
		/*** 获取Servlet容器传递过来的ServletConfig */
		ServletConfig servletConfig = getServletConfig();
		/***返回含有所有初始化参数名称的Enumation*/
		Enumeration<String> enumeration = servletConfig.getInitParameterNames();
		while (enumeration.hasMoreElements()) {
			System.out.println("初始化参数的名称为:"+enumeration.nextElement());
		}
		/***根据初始化参数的名称获取初始化参数的值*/
		String admin = servletConfig.getInitParameter("admin");
		String email = servletConfig.getInitParameter("email");
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		PrintWriter writer = response.getWriter();
		writer.print("<html><head></head><body>" + "Admin:" + admin
				+ "<br/>Email:" + email + "</body></html>");
	}

	public String getServletInfo() {
		return "ServletConfig demo";
	}

	public void destroy() {
	}
}

(2)GenericServlet.

package com.servlet.main;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.annotation.WebInitParam;

@WebServlet(name = "GenericServletDemoServlet", urlPatterns = { "/generic" }, initParams = {
		@WebInitParam(name = "admin", value = "刘备_GenericServlet"),
		@WebInitParam(name = "email", value = "admin@liubei_GenericServlet.com") })
public class GenericServletDemoServlet extends GenericServlet {

	private static final long serialVersionUID = 62500890L;

	@Override
	public void service(ServletRequest request, ServletResponse response)
			throws ServletException, IOException {
		ServletConfig servletConfig = getServletConfig();
		String admin = servletConfig.getInitParameter("admin");
		String email = servletConfig.getInitParameter("email");
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		PrintWriter writer = response.getWriter();
		writer.print("<html><head></head><body>" + "Admin:" + admin
				+ "<br/>Email:" + email + "</body></html>");
	}
}

(3)HttpServlet处理表单.

package com.servlet.main;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "FormServlet", urlPatterns = { "/form" })
public class FormServlet extends HttpServlet {
    private static final long serialVersionUID = 54L;
    private static final String TITLE = "Order Form";
    /***doGet方法发送一个表单到浏览器,表单的action属性缺失,表示表单会提交给发出请求的那个url*/
    @Override
    public void doGet(HttpServletRequest request,
            HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");
        PrintWriter writer = response.getWriter();
        writer.println("<html>");
        writer.println("<head>");
        writer.println("<title>" + TITLE + "</title></head>");
        writer.println("<body><h1>" + TITLE + "</h1>");
        writer.println("<form method='post'>");
        writer.println("<table>");
        writer.println("<tr>");
        writer.println("<td>Name:</td>");
        writer.println("<td><input name='name'/></td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Address:</td>");
        writer.println("<td><textarea name='address' "
                + "cols='40' rows='5'></textarea></td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Country:</td>");
        writer.println("<td><select name='country'>");
        writer.println("<option>中国</option>");
        writer.println("<option>United States</option>");
        writer.println("<option>Canada</option>");
        
        writer.println("</select></td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Delivery Method交付方法:</td>");
        writer.println("<td><input type='radio' " +
                "name='deliveryMethod'"
                + " value='First Class'/>First Class");
        writer.println("<input type='radio' " +
                "name='deliveryMethod' "
                + "value='Second Class'/>Second Class</td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Shipping Instructions装运说明:</td>");
        writer.println("<td><textarea name='instruction' "
                + "cols='40' rows='5'></textarea></td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td> </td>");
        writer.println("<td><textarea name='instruction' "
                + "cols='40' rows='5'></textarea></td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Please send me the latest " +
                "product catalog产品目录:</td>");
        writer.println("<td><input type='checkbox' " +
                "name='catalogRequest'/></td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td> </td>");
        writer.println("<td><input type='reset'/>" +
                "<input type='submit'/></td>");
        writer.println("</tr>");
        writer.println("</table>");
        writer.println("</form>");
        writer.println("</body>");
        writer.println("</html>");
    }
    /**doPost方法获得在表单里输入的值并在页面显示*/
    @Override
    public void doPost(HttpServletRequest request,
            HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");
        request.setCharacterEncoding("utf-8");
        PrintWriter writer = response.getWriter();
        writer.println("<html>");
        writer.println("<head>");
        writer.println("<title>" + TITLE + "</title></head>");
        writer.println("</head>");
        writer.println("<body><h1>" + TITLE + "</h1>");
        writer.println("<table>");
        writer.println("<tr>");
        writer.println("<td>Name:</td>");
        /***request对象根据html元素的name的值获取相应元素的内容,而不是根据id的值*/
        writer.println("<td>" + request.getParameter("name")
                + "</td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Address:</td>");
        writer.println("<td>" + request.getParameter("address")
                + "</td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Country:</td>");
        writer.println("<td>" + request.getParameter("country")
                + "</td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Shipping Instructions装运说明:</td>");
        writer.println("<td>");
        String[] instructions = request
                .getParameterValues("instruction");
        if (instructions != null) {
            for (String instruction : instructions) {
                writer.println(instruction + "<br/>");
            }
        }
        writer.println("</td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Delivery Method交付方式:</td>");
        writer.println("<td>"
                + request.getParameter("deliveryMethod")
                + "</td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Catalog Request要求目录:</td>");
        writer.println("<td>");
        if (request.getParameter("catalogRequest") == null) {
            writer.println("No");
        } else {
            writer.println("Yes");
        }
        writer.println("</td>");
        writer.println("</tr>");
        writer.println("</table>");
        writer.println("<div style='border:1px solid #ddd;" +
        		"margin-top:40px;font-size:90%'>");

        writer.println("Debug Info<br/>");
        Enumeration<String> parameterNames = request
                .getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String paramName = parameterNames.nextElement();
            writer.println(paramName + ": ");
            String[] paramValues = request
                    .getParameterValues(paramName);
            for (String paramValue : paramValues) {
                writer.println(paramValue + "<br/>");
            }
        }
        writer.println("</div>");
        writer.println("</body>");
        writer.println("</html>");
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值