servlet:Servlet技术简介

Servlet技术简介
本文可以说是一个使用Servlet技术的入门指导,掌握Servlet技术是掌握Jsp开发的关键,许多架构都是基于此技术的衍生。
1.Servlet的生命周期
1.1装载Servlet
这项操作一般是动态执行的。有些服务器提供相应的管理功能,可以在启动的时候就装载Servlet,并能够初始化特定的Servlet。
1.2创建一个Servlet实例。
1.3调用Servlet的init()方法。
public void init(ServletConfig config)throws ServletException;
servlet第一次被请求加载时,服务器初始化一个servlet,即创建一个servlet对象,这个对象调用init方法完成必要的初始化工作。该方法执行时,servlet引擎会把一个ServletConfig类型的对象传递给init()方法,这个对象就被保存在servlet对象中,直到servlet对象被销毁。这个ServletConfig对象负责向servlet传递服务设置信息。
当多个客户请求一个servlet时,引擎为每个客户启动一个线程,那么servlet类的成员变量会被所有的线程共享。详细介绍见章节6。
1.4服务。
如果容器接收到对此Servlet的请求,那么它调用Servlet的service()方法。
public void service(HttpServletRequest request,HttpServletResponse response)
throw ServletException,IOException;
HttpServletRequest对象可以获取用户提交的信息,HttpServletResponse对象可以响应用户的请求。和init方法不同的是,init方法只能被调用一次,而service方法可能被多次调用。每个用户每次请求servlet服务时都会导致service方法被调用执行。
1.5销毁。
实例被销毁,通过调用Servlet的destory()方法来销毁Servlet。
2.开发一个简单的Servlet
HelloWorldServlet.java
package com.zj.sample;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* a servlet
*/
public class HelloWorldServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>HelloWorld</title>");
out.println("</head>");
out.println("<body bgcolor=\"white\">");
out.println("<hr>");
out.println("HelloWorld");
out.println("你好!世界");
out.println("</body></html>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
doGet(request, response);
}
}
web.xml (注册此servlet)
<servlet>
<servlet-name>HelloWorldServlet</servlet-name>
<servlet-class>com.zj.sample.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
测试:
http://localhost:8080/Test4Jsp/hello //对应<url-pattern>/hello</url-pattern>
结果:
HelloWorld 你好!世界
3.doGet方法与doPost方法
Get调用在URL里显示正传送给Servlet的数据;Post方法可以隐藏发送给服务器的任何数据。
get和post是http协议的两种方法。这两种方法有本质的区别,get只有一个流,参数附加在url后,大小个数有严格限制且只能是字符串。post的参数是通过另外的流传递的,不通过url,所以可以很大,也可以传递二进制数据,如文件的上传。
在servlet开发中,以doGet()和doPost()分别处理get和post方法。 另外还有一个doService(), 它是一个调度方法,当一个请求发生时,首先执行doService(),不管是get还是post。在HttpServlet这个基类中实现了一个角度,首先判断是请求时get还是post,如果是get就调用doGet(), 如果是post就调用doPost()。你也可以直接重写doService()方法,这样你可以不管是get还是post。都会执行这个方法。
doService()方法
public void service(HttpServletRequest request, HttpServletResponse response) {
if (request.getMethod().equals("POST")) {
try {
doPost(request, response);
} catch (IOException e) {
e.printStackTrace();
} catch (ServletException e) {
e.printStackTrace();
}
} else if (request.getMethod().equals("GET")) {
try {
doGet(request, response);
} catch (IOException e) {
e.printStackTrace();
} catch (ServletException e) {
e.printStackTrace();
}
}
}
以下是一个表单doGet提交给Servlet的过程(doPost道理是一样的)。
DoGetTestServlet.java
package com.zj.sample;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* doGet Servlet
*/
public class DoGetTestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
out.println("name= " + request.getParameter("name"));
out.flush();
}
}
dogetForm.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" c>
<title>doGet</title>
</head>
<body>
<form action="doget" method="get">//调用web.xml中<url-pattern>为doget的servlet
<table>
<tr><td>Name:<input type="text" name="name"></td></tr>
<tr><td><input type="submit" name="submit" value="OK"></td></tr>
</table>
</form>
</body>
</html>
web.xml
<servlet>
<servlet-name>DoGetTestServlet</servlet-name>
<servlet-class>com.zj.sample.DoGetTestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DoGetTestServlet</servlet-name>
<url-pattern>/doget</url-pattern>//与dogetForm.html 中form action="doget"对应
</servlet-mapping>
4.Servlet的配置
ServletTest.java
package com.zj.sample;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet config
*/
public class ServletTest extends HttpServlet {
String msg = null;
public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException {
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
out.println("servlet message:" + msg);
}
public void init() throws ServletException {
msg = getInitParameter("message");// 提取web.xml中init-param参数
try {
System.out.println("servlet inited");
} catch (Exception e) {
e.printStackTrace();
}
}
}
web.xml
<servlet>
<servlet-name>ServletTest</servlet-name>
<servlet-class>com.zj.sample.ServletTest</servlet-class>
<init-param>
<param-name>message</param-name>
<param-value>servlet is called</param-value>
</init-param>
<load-on-startup>10</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
结果:
servlet message:servlet is called
参数说明:
①<servlet-name>指定Servlet的名称。
②<servlet-class>指定对应的Java类名。
③<init-param>指宍
Tags:  servlet

延伸阅读

最新评论

发表评论