一个Servlet教程 经典

一、Servlet的基本结构。

//Servlet de 基本结构

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SomeServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {


// 用 "request" 可以读取输入的值 (e.g. cookies)
// 和表单提交的数据
// 用 "response" 返回输出的内容

PrintWriter out = response.getWriter();

// 用 "out" 向浏览器写内容。

}
}


Servlet都是有HttpServlet继承下来的。基本结构如上面的代码所示:
下面就举几个Servlet的小例子。

//生成一般文本的例子 下载本例

package test;
//用这条语句编译 javac -encoding iso8859_1 filename.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloServlet extends HttpServlet {
public void doGet( HttpServletRequest requset,
HttpServletResponse response)
throws IOException, ServletException {
PrintWriter out = response.getWriter();
out.println("Hello,world!");
out.println("你好,万维网");
}
}


//生成HTML内容的例子。下载本程序

package test;
//javac -encoding iso8859_1 HelloWWW.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloWWW extends HttpServlet {
public void doGet( HttpServletRequest requset,
HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.0 Transitional//EN/">"+
"<HTML>"+
"<HEAD>"+
"<TITLE>"+"Hello WWW by LoveJSP.site"+"</TITLE>"+
"<BODY>"+
"<H1>Hello WWW</H1>"+
"<H1>你好,万维网</H1>"+
"<h2><A HREF=/"HTTP://LOVEJSP.COM/">welcom to LoveJSP.site</A></h2>"+
"</BODY>"+
"<HTML>");
}
}
处理表单提交的数据 Pely Gan

在Web程序设计中,处理表单提交的数据是获取Web数据的主要方法,今天,我们来看一看Servlet中是怎样处理来自表单的数据的。

表单数据的提交方法有两种Post方法和Get方法,当使用Post方法时,数据由标准的输入设备读入,当使用Get方法时,数据由CGI变量QUERY_STRING传递给表单数据处理程序。

Servlet会自动将以上两种方法得到的数据进行处理,从而使用户只要简单的调用HttpServletRequest的getParameter方法,给出变量名称即可取得该变量的值。需要注意的是,变量的名称是大小写敏感的。对于Post方法或Get方法提交的数据,Servlet的处理方法是一样的。当请求的变量不存在时,将会返回一个空字符串。如果变量有多个值,你应该调用getParameterValues,这个方法将会返回一个字符串数组。使用getParameterNames可以取得所有变量的名称,该方法返回一个Emumeration方法。

下面让我们来看一个简单的例子,下面这个Servlet读取表单中指定名称的五个字段的值。下载这个例子

//Html file----> postdata.htm 下载本文件
<html>
<head>
<title>getFormData Servlet Example form LoveJSP.com</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body bgcolor="#FFFFFF">
<h1 align="center"> <i><b>Demo Page</b></i></h1>
<form action="/try/servlet/lovejsp.getFormData">
<p> </p>
<table width="41%" border="2" align="center">
<tr bgcolor="#6633CC" align="center">
<td colspan="2" align="center"><font color='white'>getFormData Servlet Demo
Page</font></td>
</tr>
<tr bgcolor="#FFFFCC">
<td align="center" width="43%">
<div align="right">username:</div>
</td>
<td width="57%">
<div align="left">
<input type="text" name="username">
</div>
</td>
</tr>
<tr bgcolor="#CCFF99">
<td align="center" width="43%">
<div align="right">password:</div>
</td>
<td width="57%">
<div align="left">
<input type="password" name="password">
</div>
</td>
</tr>
<tr bgcolor="#FFFFCC">
<td align="center" width="43%">
<div align="right">Email:</div>
</td>
<td width="57%">
<div align="left">
<input type="text" name="email">
</div>
</td>
</tr>
<tr bgcolor="#CCFF99">
<td align="center" width="43%">
<div align="right">Homepage:</div>
</td>
<td width="57%">
<div align="left">
<input type="text" name="Homepage">
</div>
</td>
</tr>
</table>
<p align="center">
<input type="reset" name="Reset" value="clear">
<input type="submit" name="Submit2" value="Let's Go">
</p>
</form>
</body>
</html>

//Servlet File getFormData.java 下载本文件

package lovejsp;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** Servlet getParameter Ex from Lovejsp.site(http://www.lovejsp.com)
*/

public class getFormData extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "读取表单数据";
out.println(LovejspTools.headTitle(title) + //a tools method to show the html code with title
"<BODY BGCOLOR=/"#FDF5E6/">/n" +
"<H1 ALIGN=CENTER>" + title + "</H1>/n" +
"<UL>/n" +
" <LI><B>username</B>: "
+ request.getParameter("username") + "/n" +
" <LI><B>password</B>: "
+ request.getParameter("password") + "/n" +
" <LI><B>Email</B>: "
+ request.getParameter("Email") + "/n" +
" <LI><B>Homepage</B>: "
+ request.getParameter("Homepage") + "/n" +
"</UL>/n" +
"</BODY></HTML>");
}
}


这个程序的运行结果如下图所示:





大家可能注意到了,上面的结果中Email的值是null,这是因为在表单中没有这个字段,表单的email的名称是email。

下面这个程序是getParameterNames的示例,也是调试程序的很好的工具,它的功能是显示所有的表单数据。

//Servlet File ShowAllFormData.java 下载本文件

package lovejsp;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

public class ShowAllFormData extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "显示所有的Form变量的值";
out.println("<HTML><HEAD><TITLE>"+title+"</TITLE></HEAD>"+
"<BODY BGCOLOR=/"#FDF5E6/">/n" +
"<H1 ALIGN=CENTER>" + title + "</H1>/n" +
"<TABLE BORDER=1 ALIGN=CENTER>/n" +
"<TR BGCOLOR=/"#FFAD00/">/n" +
"<TH>变量名称<TH>变量值");
Enumeration paramNames = request.getParameterNames();
while(paramNames.hasMoreElements()) {
String paramName = (String)paramNames.nextElement();
out.println("<TR><TD>" + paramName + "/n<TD>");
String[] paramValues = request.getParameterValues(paramName);
if (paramValues.length == 1) {
String paramValue = paramValues[0];
if (paramValue.length() == 0)
out.print("<I>No Value</I>");
else
out.print(paramValue);
} else {
out.println("<UL>");
for(int i=0; i<paramValues.length; i++) {
out.println("<LI>" + paramValues[i]);
}
out.println("</UL>");
}
}
out.println("</TABLE>/n</BODY></HTML>");
}

public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

运行结果:


好了,that's all for today,thank you all. see you next time
在Servlet中使用请求头(Request Header) LoveJSP.site

Request Header简介
当一个客户端(通常是浏览器)向Web服务器发送一个请求是,它要发送一个请求的命令行,一般是GET或POST命令,当发送POST命令时,它还必须向服务器发送一个叫"Content-Length”的请求头(Request Header) 用以指明请求数据的长度,除了Content-Length之外,它还可以向服务器发送其它一些Headers,如:

Accept 浏览器可接受的MIME类型
Accept-Charset 浏览器支持的字符编码
Accept-Encoding 浏览器知道如何解码的数据编码类型(如 gzip)。Servlets 可以预先检查浏览器是否支持gzip并可以对支持gzip的浏览器返回gzipped的HTML页面,并设置Content-Encoding回应头(response header)来指出发送的内容是已经gzipped的。在大多数情况下,这样做可以加快网页下载的速度。
Accept-Language 浏览器指定的语言,当Server支持多语种时起作用。
Authorization 认证信息,一般是对服务器发出的WWW-Authenticate头的回应。
Connection 是否使用持续连接。如果servlet发现这个字段的值是Keep-Alive,或者由发出请求的命令行发现浏览器支持 HTTP 1.1 (持续连接是它的默认选项),使用持续连接可以使保护很多小文件的页面的下载时间减少。
Content-Length (使用POST方法提交时,传递数据的字节数)
Cookie (很重要的一个Header,用来进行和Cookie有关的操作,详细的信息将在后面的教程中介绍)
Host (主机和端口)
If-Modified-Since (只返回比指定日期新的文档,如果没有,将会反回304 "Not Modified")
Referer (URL)
User-Agent (客户端的类型,一般用来区分不同的浏览器)
如果你想更多的了解Request Header的内容,你可以访问W3C的网站。

在Servlet中读取Request Header的内容

在Servlet中读取Request Header的值是很简单的,只要调用HttpServletRequest的getHeader方法就可以了,当你指定要返回的Header的名称,该方法就会返回String类型的Header的内容,如果指定的Header不存在,就返回null。调用getHeaderNames可以返回包含所有Header名字的Enumeration.

读取所有Request Header值的Servlet程序

下面是Tomcat中所带的Servlet例子中关于Request Header的例子,下载该程序。

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class RequestHeaderExample extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
Enumeration e = request.getHeaderNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = request.getHeader(name);
out.println(name + " = " + value);
}
}
}
访问标准CGI变量
LoveJSP.site
1. CGI变量简介
如果你在以前使用过传统的CGI,你应该对"CGI变量”的概念很熟悉。 由这些变量可以取得一些和请求(Request)有关的信息。其中一些来自于 HTTP 请求命令行(request line) 和headers (例如:在URI中问号后面的部分或者Content-Length header),一些来自于 Socket本身(例如:被请求主机的IP和名称),还有一些来自于服务器的配置信息(例如:被映射为URL目录的实际 路径)。

2. Servlet和标准CGI变量之间的对应关系
下面的表格中给出了Servlet和标准CGI变量之间的对应关系,对以前使用CGI变量进行编程的朋友会有很大的帮助。 在下表中我们假设request是HttpServletRequest类型的对象。
CGI变量 含义 在 doGet 或 doPost 访问的办法
AUTH_TYPE 如果在请求中有 Authorization header ,则这个变量将会被赋值 (basic 或 digest) request.getAuthType()
CONTENT_LENGTH 只有当请求的方法是 POST 时这个变量才会有意义,它表示传送的数据的字节数。 String.valueOf(request.getContentLength()) (返回String) 或者 request.getContentLength(),返回一个整数(int)。
CONTENT_TYPE 如果被赋值,就表示数据的MIME类型。 request.getContentType()
DOCUMENT_ROOT 和网站根目录对应的实际路径 getServletContext().getRealPath("/") 注意:在以前的Servlet标准中,这条语句是这样写的request.getRealPath("/") 。
HTTP_XXX_YYY 访问任意的HTTP headers request.getHeader("Xxx-Yyy")
PATH_INFO URL 指向的路径的信息。由于Servlet可以和服务器直接通讯,所以这个变量对Servlet没什么作用。 request.getPathInfo()
PATH_TRANSLATED 在Server上被映射为web目录的目录的真实路径的信息。和上一个变量一样,对Servlet用处不大。 request.getPathTranslated()
QUERY_STRING 如果用 GET 方法发出请求(requests),这个变量中将会存放请求的数据,其 形式为经过URL编码的一个大字符串。在servlet中,你很少会用到这个原始的字符串。而是 用 request.getParameter 方法来访问某个特定的请求数据。 request.getQueryString()
REMOTE_ADDR 客户端的IP地址,是String类型的。其形式类似于 "192.9.48.9"。 request.getRemoteAddr()
REMOTE_HOST 发出请求的客户端的域名(例如. "java.sun.com") 如果不能检测到域名,就用客户端的IP地址代替。 request.getRemoteHost()
REMOTE_USER 如果 Authorization header 被赋值,则这个变量中放有用户名。 request.getRemoteUser()
REQUEST_METHOD 请求的类型。通常为 GET 或 POST,但也可能是 HEAD, PUT, DELETE, OPTIONS, 或者 TRACE。 request.getMethod()
SCRIPT_NAME srvlet的路径 request.getServletPath()
SERVER_NAME 服务器的名称 request.getServerName()
SERVER_PORT 服务器的端口 String.valueOf(request.getServerPort())(返回String类型) request.getServerPort()(返回int类型)
SERVER_PROTOCOL 在请求命令行中用的协议的版本号。(例如. HTTP/1.0 或 HTTP/1.1)。 request.getProtocol()
SERVER_SOFTWARE 所用 Web Server 软件的名称 getServletContext().getServerInfo()


3. 例子:读取CGI变量。
下面是一个显示除去 HTTP_XXX_YYY 外所有CGI变量的的servlet。他显示了在上面的表格中列出的所有CGI变量的值。
3.1 ShowCGIVariables.java
Download Here

//! ####### Start ShowCGIVariables.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;


public class ShowCGIVariables extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String[][] variables =
{ { "AUTH_TYPE", request.getAuthType() },
{ "CONTENT_LENGTH", String.valueOf(request.getContentLength()) },
{ "CONTENT_TYPE", request.getContentType() },
{ "DOCUMENT_ROOT", getServletContext().getRealPath("/") },
{ "PATH_INFO", request.getPathInfo() },
{ "PATH_TRANSLATED", request.getPathTranslated() },
{ "QUERY_STRING", request.getQueryString() },
{ "REMOTE_ADDR", request.getRemoteAddr() },
{ "REMOTE_HOST", request.getRemoteHost() },
{ "REMOTE_USER", request.getRemoteUser() },
{ "REQUEST_METHOD", request.getMethod() },
{ "SCRIPT_NAME", request.getServletPath() },
{ "SERVER_NAME", request.getServerName() },
{ "SERVER_PORT", String.valueOf(request.getServerPort()) },
{ "SERVER_PROTOCOL", request.getProtocol() },
{ "SERVER_SOFTWARE", getServletContext().getServerInfo() }
};
String title = "Servlet Example: 显示CGI变量";
out.println("<HTML><HEAD><TITLE>"+title +"</TITLE></HEAD>"+
"<BODY BGCOLOR=/"#FDF5E6/">/n" +
"<H1 ALIGN=CENTER>" + title + "</H1>/n" +
"<TABLE BORDER=1 ALIGN=CENTER>/n" +
"<TR BGCOLOR=/"#FFAD00/">/n" +
"<TH>CGI Variable Name<TH>Value");
for(int i=0; i<variables.length; i++) {
String varName = variables[i][0];
String varValue = variables[i][1];
if (varValue == null)
varValue = "<I>没有被赋值</I>";
out.println("<TR><TD>" + varName + "<TD>" + varValue);
}
out.println("</TABLE></BODY></HTML>");
}

public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

//! ####### End ShowCGIVariables.java 
 
阅读更多
换一批

没有更多推荐了,返回首页