Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2505726
  • 博文数量: 709
  • 博客积分: 12251
  • 博客等级: 上将
  • 技术积分: 7905
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-17 00:00
个人简介

实现有价值的IT服务

文章存档

2012年(7)

2011年(147)

2009年(3)

2008年(5)

2007年(74)

2006年(431)

2005年(42)

分类: Java

2006-10-12 22:15:12

Servlets 执行 javax.servlet.Servlet interface. 当servlet编写者可以通过直接implement interface开发servlet, 但这样通常没有必要. 因为大多数servlet是针对用HTTP协议的web服务器, 这样最通用开发servlet办法是用 javax.servlet.http.HttpServlet 内.   HttpServlet 类通过extend GenericServlet基类执行 Servlet interface, 提供了处理HTTP协议的功能. 他的service方法支持标准HTTP/1.1请求.   一般地, 用HttpServlet指定的类编写的servlets可以多线程地并发运行 service方法. 与客户端的交互性   Servlet编写者注意HttpServlet类有几个欠缺的方法,你可以自己定义方法中内容,但是必须使用这些方法名称以使servlet知道你想做什么, doGet, 用于处理 GET、有条件的GET 和头部 HEAD请求 doPost, 用户处理 POST 请求 doPut, 用于处理 PUT 请求 doDelete, 用于处理 DELETE请求   HttpServlet的service方法, 一般地, 当它接收到一个OPTIONS请求时,会调用doOptions 方法, 当接收一个TRACE请求是调用doTrace . doOptions缺省执行方式是自动决定什么样的HTTP被选择并且返回哪个信息.   在你使用这些方法时,必须带两个阐述. 第一个包含来自客户端的数据 HttpServletRequest. 第二个参数包含客户端的响应HttpServletResponse. 在下例中是这样的情况.   一个HttpServletRequest对象提供到达HTTP 头部数据, 也允许你获取客户端的数据. 怎样获取这些数据取决于HTTP端请求方法.   不管任何HTTP方式, 你可以用 getParameterValues 方法, 这个用来返回特定名称的参数值. 对于用 HTTP GET 请求的方式, 这个 getQueryString 方法将会返回一个可以用来解剖分析的.   对于用HTTP POST, PUT, 和 DELETE请求的方式, 你有两种方法可以选择. 如果是文本数据,你能通过getReader方法用BufferedReader获取 ; 如果是二进制数据, 能通过getReader 方法用 ServletInputStream获取.   为了响应客户端, 一个HttpServletResponse对象提供返回数据给用户的两个方法. 你可以用getWriter 方法返回,或者 getOutputStream 方法以输出流返回. 你应该用getWriter返回文本数据,而用getOutputStream返回二进制数据.   在使用Writer 或 OutputStream之前, HTTP 头部应该先被设置. HttpServletResponse内提供这样一个方法,之后可以用writer 或 outputstream 将响应主体部分发回用户. 完成后要关闭 writer 或 output stream以便让服务器知道响应已经完毕. 一个HTTP Servlet处理GET和HEAD方法的例子
public class SimpleServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
   {
   // 首先设置头部
   res.setContentType("text/html");
   // 用 writer方法返回响应数据
   PrintWriter out = res.getWriter();
   out.println(" SimpleServlet Output");
   out.println("

SimpleServlet Output

");
   out.println("

This is output is from SimpleServlet.");
  out.println(" ");
  out.close();
  }

  public String getServletInfo() {
  return "A simple servlet";
  }

}
这个例子完整地现实了一个servlet. 一个HTTP Servlet处理POST方式的例子 这里是个用HTML带POST表单的例子:

JdcSurvey






How Many Employees in your Company?


1-100

100-200

200-300

300-400

500-more



General Comments?






What IDEs do you use?


JavaWorkShop

J++

Cafe'








这里的servlet将表单数据写入一个文件,并且用一个thank you信息响应用户. 这里servlet的方法,如下例:

public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
// 首先设置响应的 "content type" 头部
res.setContentType("text/html");

//得到响应的 PrintWriter以返回文本给客户端.
PrintWriter toClient = res.getWriter();

try {
//打开一个文件写入Survey的结果.
String surveyName = req.getParameterValues("survey")[0];
FileWriter resultsFile = new FileWriter(resultsDir
+ System.getProperty("file.separator")
+ surveyName + ".txt", true);
PrintWriter toFile = new PrintWriter(resultsFile);

// 从客户端得到表单数据 & 存贮在这个文件中
toFile.println("");
Enumeration values = req.getParameterNames();
while(values.hasMoreElements()) {
String name = (String)values.nextElement();
String value = req.getParameterValues(name)[0];
if(name.compareTo("submit") != 0) {
toFile.println(name + ": " + value);
}
}
toFile.println("");

//关闭文件.
resultsFile.close();

// 用一个thank you返回客户端
toClient.println("");
toClient.println("");
toClient.println("Thank you for participating");
toClient.println("");

} catch(IOException e) {
e.printStackTrace();
toClient.println(
"A problem occured while recording your answers. "
+ "Please try again.");
}

// 关闭writer; 响应完成.
toClient.close();
}
  这个doPost方法是用getParameterNames和getParameterValues方法来从表单中获取数据的. 因为它返回文本给客户端, doPost 将调用 getWriter 方法. 在写入响应主体部分之前,它设置了响应头部字段的设置, 但响应完成后,关闭.
阅读(1839) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~