java servlet2.docx
- 文档编号:3646900
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:18
- 大小:42.50KB
java servlet2.docx
《java servlet2.docx》由会员分享,可在线阅读,更多相关《java servlet2.docx(18页珍藏版)》请在冰豆网上搜索。
javaservlet2
[在此处输入文章标题]
Servlet是一些遵从JavaServletAPI的Java类,这些Java类可以响应请求。
尽管Servlet可以响应任意类型的请求,但是它们使用最广泛的是响应web方面的请求。
Servlet必须部署在Javaservlet容器才能使用。
虽然很多开发者都使用JavaServerPages(JSP)和JavaServerFaces(JSF)等Servlet框架,但是这些技术都要在幕后通过Servlet容器把页面编译为JavaServlet。
也就是说,了解JavaServlet技术的基础知识对任何Javaweb开发者来说是很有用的。
在这个教程里,我们将会通过下面的专题来全面了解JavaServlet技术。
目录
∙编写你的第一个Servlet
∙Servlet生命周期方法
∙使用@WebServlet注解开发Servlet
∙打包和部署Servlet到Tomcat服务器
∙编写动态的Servlet响应内容
∙处理Servlet请求和响应
∙监听Servlet容器事件
∙传递Servlet初始化参数
∙为特定的URL请求添加Servlet过滤器
∙使用Servlet下载二进制文件
∙使用RequestDispatcher.forward()转发请求到另一个Servlet
∙使用HttpServletResponse.sendRedirect()重定向请求到另一个Servlet
∙使用Servlets读写Cookie
让我们一起来一步步地学习Servlet。
编写你的第一个Servlet
我们的第一个Servlet是一个只拥有少量代码的简单Servlet,目的是让你只需关注它的行为。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
packagecom.howtodoinjava.servlets;
importjava.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
publicclassMyFirstServletextendsHttpServlet{
privatestaticfinallongserialVersionUID=-1915463532411657451L;
@Override
protectedvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)throwsServletException,IOException
{
response.setContentType("text/html;charset=UTF-8");
PrintWriterout=response.getWriter();
try{
//Writesomecontent
out.println("");
out.println("
");out.println("
out.println("");
out.println("
");out.println("
ServletMyFirstServletat"+request.getContextPath()+"
");out.println("");
out.println("");
}finally{
out.close();
}
}
@Override
protectedvoiddoPost(HttpServletRequestrequest,
HttpServletResponseresponse)throwsServletException,IOException{
//Dosomeotherwork
}
@Override
publicStringgetServletInfo(){
return"MyFirstServlet";
}
}
为了在web容器里注册上面的Servlet,你要为你的应用建一个web.xml入口文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
xmlversion="1.0"?
>
//xmlns.jcp.org/xml/ns/javaee" xmlns: xsi="http: //www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation="http: //xmlns.jcp.org/xml/ns/javaee http: //xmlns.jcp.org/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
上面的Servlet做了一些重要的事情,你可能想了解的。
1.MyFirstServlet类继承了HttpServlet。
这个继承是必须的,因为所有的Servlet必须是要么继承了 javax.servlet.GenericServlet 的普通Servlet,要么是继承了 javax.servlet.http.HttpServlet 的HTTPServlet。
2.重新doGet() 和doPost() 方法。
这两个方法都已在HttpServlet类里定义了。
当一个GET或POST请求到来时,它就会被映射到相应的方法里。
例如,如果你向这个servlet发送一个HTTPGET请求,doGet()方法就会被调用。
3.这里也有一些其他有用的方法。
你可以重写它们来在运行时控制应用。
例如getServletInfo()。
4.HttpServletRequest和HttpServletResponse是所有doXXX()方法的默认参数。
我们会在后面的章节里详细学习这些对象。
以上所有关于简单Servlet的内容就是你需要知道的内容。
Servlet生命周期方法
在你的应用加载并使用一个Servlet时,从初始化到销毁这个Servlet期间会发生一系列的事件。
这些事件叫做Servlet的生命周期事件(或方法)。
让我们一起来进一步了解它们。
Servlet生命周期的三个核心方法分别是init(),service()和destroy()。
每个Servlet都会实现这些方法,并且在特定的运行时间调用它们。
1)在Servlet生命周期的初始化阶段,web容器通过调用init()方法来初始化Servlet实例,并且可以传递一个实现 javax.servlet.ServletConfig接口的对象给它。
这个配置对象(configurationobject)使Servlet能够读取在web应用的web.xml文件里定义的名值(name-value)初始参数。
这个方法在Servlet实例的生命周期里只调用一次。
init方法定义与这类似:
1
2
3
publicvoid init()throwsServletException{
//custominitializationcode
}
2)初始化后,Servlet实例就可以处理客户端请求了。
web容器调用Servlet的service()方法来处理每一个请求。
service()方法定义了能够处理的请求类型并且调用适当方法来处理这些请求。
编写Servlet的开发者必须为这些方法提供实现。
如果发出一个Servlet没实现的请求,那么父类的方法就会被调用并且通常会给请求方(requester)返回一个错误信息。
通常,我们不需要重写(override)这个方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException
{
Stringmethod=req.getMethod();
if(method.equals(METHOD_GET)){
longlastModified=getLastModified(req);
if(lastModified==-1){
//servletdoesn'tsupportif-modified-since,noreason
//togothroughfurtherexpensivelogic
doGet(req,resp);
}else{
longifModifiedSince=req.getDateHeader(HEADER_IFMODSINCE);
if(ifModifiedSince<(lastModified/1000*1000)){
//Iftheservletmodtimeislater,calldoGet()
//Rounddowntothenearestsecondforapropercompare
//AifModifiedSinceof-1willalwaysbeless
maybeSetLastModified(resp,lastModified);
doGet(req,resp);
}else{
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
}
}elseif(method.equals(METHOD_HEAD)){
longlastModified=getLastModified(req);
maybeSetLastModified(resp,lastModified);
doHead(req,resp);
}elseif(method.equals(METHOD_POST)){
doPost(req,resp);
}elseif(method.equals(METHOD_PUT)){
doPut(req,resp);
}elseif(method.equals(METHOD_DELETE)){
doDelete(req,resp);
}elseif(method.equals(METHOD_OPTIONS)){
doOptions(req,resp);
}elseif(method.equals(METHOD_TRACE)){
doTrace(req,resp);
}else{
//
//NotethatthismeansNOservletsupportswhatever
//methodwasrequested,anywhereonthisserver.
//
StringerrMsg=lStrings.getString("http.method_not_implemented");
Object[]errArgs=newObject[1];
errArgs[0]=method;
errMsg=MessageFormat.format(errMsg,errArgs);
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED,errMsg);
}
}
3)最后,web容器调用destroy()方法来终结Servlet。
如果你想在Servlet的生命周期内关闭或者销毁一些文件系统或者网络资源,你可以调用这个方法来实现。
destroy() 方法和init()方法一样,在Servlet的生命周期里只能调用一次。
1
2
3
publicvoiddestroy(){
//
}
在大多数情况下,你通常不需要在你的Servlet里重写这些方法。
扩展阅读:
web服务器是如何运作的?
使用@WebServlet注解来开发Servlet
如果你不喜欢使用xml配置而喜欢注解的话,没关系,ServletsAPI同样提供了一些注解接口给你。
你可以像下面的例子一样使用 @WebServlet 注解并且不需要在web.xml里为Servlet注册任何信息。
容器会自动注册你的Servlet到运行环境,并且像往常一样处理它。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
packagecom.howtodoinjava.servlets;
importjava.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.ServletException;
importjavax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
@WebServlet(name="MyFirstServlet",urlPatterns={"/MyFirstServlet"})
publicclassMyFirstServletextendsHttpServlet{
privatestaticfinallongserialVersionUID=-1915463532411657451L;
@Override
protectedvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)throwsServletException,IOException
{
//Dosomework
}
@Override
protectedvoiddoPost(HttpServletRequestrequest,
HttpServletResponseresponse)throwsServletException,IOException{
//Dosomeotherwork
}
}
打包和部署Servlet到Tomcat服务器
如果你在使用IDE(例如Eclipse),那么打包和部署你的应用只需要一个简单的步骤。
右击项目>RunAs>RunAsServer。
如果还没配置服务器先配置好服务器,然后就可以准备开干了。
如果你没在使用IDE,那么你需要做一些额外的工作。
比如,使用命令提示符编译应用,使用ANT去生成war文件等等。
但我相信,现在的开发者都在使用IDE来开发。
所以我就不在这方面浪费时间了。
当你把我们的第一个Servlet部署到tomcat上并在浏览器输入“http:
//localhost:
8080/servletexamples/MyFirstServlet”,你会得到下面的响应。
编写动态的Servlet响应内容
JavaServlets如此有用的原因之一是Servlet能动态显示网页内容。
这些内容可以从服务器本身、另外一个网站、或者许多其他网络可以访问的资源里获取。
Servlet不是静态网页,它们是动态的。
可以说这是它们最大的优势。
让我们来举个Servlet例子,这个Servlet会显示当前日期和时间给用户并且会显示用户名和一些自定义的信息。
让我们来为这个功能编写代码吧。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
packagecom.howtodoinjava.servlets;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.util.Date;
importjava.util.HashMap;
importjava.util.Map;
importjavax.servlet.ServletException;
importjavax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
@WebServlet(name="CalendarServlet",urlPatterns={"/CalendarServlet"})
publicclassCalendarServletextendsHttpServlet{
privatestaticfinallongserialVersionUID=-1915463532411657451L;
@Override
protectedvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)throwsServletException,IOException
{
Map
response.setContentType("text/html;charset=UTF-8");
PrintWriterout=response.getWriter();
try{
//Writesomecontent
out.println("");
out.println("
");out.println("
out.println("");
out.println("
");out.println("
Hello"+data.get("username")+","+data.get("message")+"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java servlet2