Servlet学习(一)
一.Servlet的生命周期。
①WEB服务器首先会检查是否已经装载并创建了该servlet实例对象。如果是则直接进行第④步,否则执行第②步。
②装载并创建该Servlet的一个实例对象。
③调用Servlet实例对象的init()方法。
④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用service()方法并将请求和响应作为参数传递进去。
⑤WEB应用被停止或重启之前,Servlet引擎将卸载Servlet,在卸载之前调用Servlet的destroy()方法。
当客户端第一次向web服务器发出一个servlet请求时,web服务器将会创建一个该servlet的实例,并且调用servlet的init()方法(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>");
}
}