您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 02Servlet模型
3Sept.2008第二章Servlet模型本章要点•Servlet接收HTTP请求•Servlet响应HTTP请求•Servlet生命周期•Servlet请求资源的跳转与包含•Servlet应用示例Servlet/jsp网络拓扑图IE浏览器OracleSqlservermysqltomcatWeb服务器Jsp、servlet容器*.java*.jsphttp请求返回静态页转发返回结果操作数据库返回结果涉及到的技术HtmlJavascriptflashJavabean、servlet、jspEjb、structs、hibernatespringjdbcServlet接收HTTP请求•对于请求而言客户端主要通过以下几种方式给服务器端发送请求:–用户点击HTML页面上的一个超链接–通过点击一个表单的提交按钮提交表单–用户在URL地址栏直接键入服务器端的URL地址•浏览器默认是通过GET方式发送的。当然对于第二种表单的提交我们可以改变其提交方式为POST。格式如下:formname=”loginform”method=”post”action=”请求Servlet的URL”……/formServlet处理HTTP请求的流程客户端Web服务器Web服务器后台进程Servlet/JSP容器Servlet及JSP资源HTML及其他静态资源1.请求信息26.响应信息345Servlet处理HTTP请求的流程(续)•Servlet类中将会根据不同的HTTP提交方式,执行相应的doXXX()方法,具体定义为:•比如以HTTPGET方式提交的,将会执行doGet()方法,同样POST方式将会执行doPost()方法。其中方法的参数request和response对象是由Servlet容器创建的。protectedvoiddoXXX(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException了解ServletRequest•ServletRequest是定义在java.servlet包中的一个接口类,ServletRequest类与具体的协议无关。从客户端发送的请求信息将会被封装在ServletRequest对象当中。通常我们可以通过下面的方法获取封装的数据:publicStringgetParameter(Stringname)publicString[]getParameterValues(Stringname)publicjava.util.EnumerationgetParameterNames()了解HttpServletRequest•HttpServletRequest是ServletRequst的扩展子类,它添加了一些专用于HTTP协议的方法,HttpServletRequest对象由Servlet容器为我们创建,并通过doXXX()方法传递给Servlet使用。我们可以在HttpServletRequest对象中获取大量关于HTTP请求的相关信息。了解HttpServletRequest(续)•publicStringgetMethod()通过这个方法可以获取HTTP请求类型的名字,例如GET或POST等.•publicStringgetHeader(Stringname)此方法返回指定标题名字所对应的值,例如:Stringhost=request.getHeader(host);•publicEnumerationgetHeaderNames()获取所有头信息中标题名,具体对应的值可以通过上面的方法获取。•publicEnumerationgetHeaders(Stringname)获取指定标题名的所有对应值。获取分析HTTP请求的头信息•我们现在利用HttpServletRequest中的一些针对HTTP协议的专用方法来分析一下基于HTTP协议请求的头信息。HTTP请求示例•我们综合运用一下上面学到的知识,接收并处理一个由HTML页面发送过来的请求•见例2-2Servlet响应Http请求•Servlet主要通过HttpServletResponse对象封装对用户的响应信息,再由Web服务器发送给客户端。理解ServletResponse•当Servlet接收到请求后,如果需要返回一定的数据信息给客户端。那么封装返回的数据需要使用ServletResponse对象,ServletResponse是定义在javax.servlet包中的一个接口。使用此ServletResponse对象可以获得用于发送给客户端数据的输出流,设定返回内容的类型和长度,以及设定返回文本的字符编码等。理解ServletResponse(续)•在ServletResponse类中我们可以通过setContentType()方法和setContentLength()方法设定返回内容的类型和长度,具体方法声明如下:•设定内容为“text/html;charset=GB2312”,可以使用response.setContentType(“text/html;charset=GB2312”);•返回的是一个pdf文件我们可以这样设置response.setContentType(“application/pdf”),表明返回的文件类型是PDF格式。publicvoidsetContentType(StringcontentType)publicvoidsetContentLength(intcontentLength)理解ServletResponse(续)•不管我们返回给客户端的信息是一些简单的文本还是一些复杂的流式文件,都需要获取输出流对象,在Servlet中可以通过ServletResponse的如下两种方法获取一个输出流:•返回一个pdf文件。见例2-3•返回一个文本信息。见例2-4publicServletOutputStreamgetOutputStream()throwsIOExceptionpublicPrintWritergetWriter()throwsIOException掌握HttpServletResponse•HttpServletResponse是ServletResponse的一个子接口,定义在javax.servlet.http包中,它添加了一些针对HTTP协议响应的处理方法,比如设置响应的HTTP消息头,我们可以使用setHeader方法,方法声明如下:•当然如果一个消息头名对应有多个值,我们可以通过如下方法进行添加:publicvoidsetHeader(Stringheader,Stringvalue)publicvoidaddHeader(Stringheader,Stringvalue)掌握HttpServletResponse(续)•HttpServletResponse提供了一个sendError()方法,用来向客户端发送错误信息,这对调试程序有很大帮助,调用方式有下列两种:•常见的HTTP错误代码与表示的意义如表所示:publicvoidsendError(intcode)publicvoidsendError(intcode,Stringmsg)HTTP错误状态代码在HttpServletResponse中定义的常数意义401SC_UNAUTHORIZED授权错误403SC_FORBIDDEN资源禁止访问404SC_NOT_FOUND资源不存在405SC_METHOD_NOT_ALLOWED请求方法禁止408SC_REQUEST_TIMEOUT请求超时500SC_INTERNAL_SERVER_ERROR服务器内部错误掌握HttpServletResponse(续)•如果我们需要让客户端浏览器跳转到别的网页资源,可以使用sendRedirect()方法,方法声明如下:•其中的参数url即是我们希望浏览器转向的资源地址,具体关于重定向的方法使用我们将会在后面讨论。•如果我们需要在客户端设置一个cookie,我们可以使用addCookie()方法:•具体的cookie定义与使用请参看第五章关于cookie的说明。publicvoidsendRedirect(Stringurl)publicvoidaddCookie(Cookiecookie)Servlet生命周期未装载状态销毁服务态就绪态装载到内存init()service()destroy()服务器关闭关闭服务器服务器启动Sevlet对象的生成与装载•当开发完毕具体的Servlet类,并且部署到Web服务器上以后,是由Web服务器为我们装载并创建Servlet对象的,一般来说,Servlet可以在三种情况下装载到内存并被实例化,–Web服务器启动时。–系统管理员向Web服务器部署Servlet应用时。–通过浏览器第一次访问Servlet时。•Web服务器装载一个Servlet对象时,需要明确知道Servlet的类名。比如一个名为myweb.HelloServlet的类,当服务器装载其到内存并创建对象时将会使用Class.forName(“myweb.HelloServlet”).newInstance()方法。采用这种方法创建对象需要类中有个不带参数的构建器。所以我们在开发Servlet时需要提供这样的构建器,或者干脆不写构建器,采用默认的构建器即可。Servlet的init()方法•一旦Web服务器创建完servlet对象以后,将会立即调用Servlet的init()方法,对servlet进行初始化,所以就算我们在Servlet中使用了默认的构建器,我们对Servlet的初始化仍然可以放到init()方法中,参数ServletConfig,代表的是配置信息,即在web.xml中配置的信息。init方法的具体声明如下:publicvoidinit(ServletConfigconfig)throwsServletExceptionpublicvoidinit()throwsServletExceptionServletConfig•ServletConfig对象包含了用于初始化的参数,它是在容器调用init()方法时传递的参数,我们可以通过以下ServletConfig中的以下方法获取初始化参数以及它们的值:publicjava.util.EnumerationgetInitParameterNames()publicStringgetInitPatameter(Stringname)Servlet的service()方法•当Servlet初始化完毕以后,Servlet对象就可以响应并处理用户请求了,在Servlet的生命周期中,大部分的时间是用来处理请求的,当一个请求到来时,Web服务器将会调用Servlet对象的service方法,service方法声明如下:•service()方法将会区分不同的HTTP请求类型,调用相应的doXXX()方法进行处理,比如请求的是HTTPGET方法,将会调用doGet(),而POST则会调用doPost()。publicvoidservice(ServletRequestrequest,ServletResponseresponse)Servlet的destroy()方法•当Servlet容器决定卸载一个Servlet时,比如:由于Web服务器考虑到Web应用的性能问题或者管理员发送卸载请求,或者系统将要关闭,Web服务器将会卸载容器中的Servlet对象,卸载之前将会调用Servlet的destroy()方法,一般来说,Servlet的destroy()方法是用来释放Servlet所持有的资源。Servlet请求重定向•有时候我们在程序中需要把客户的请求跳转到服务器上的另一个资源或者其他服务器上的资源,这种情况下需要使用请求重定向技术,在Servlet中我们需要使用HttpServ
本文标题:02Servlet模型
链接地址:https://www.777doc.com/doc-3708614 .html