JPS学习-09-Servlet基础编程_第1页
JPS学习-09-Servlet基础编程_第2页
JPS学习-09-Servlet基础编程_第3页
JPS学习-09-Servlet基础编程_第4页
JPS学习-09-Servlet基础编程_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

09Servlet根底编程内容提要认识Servlet编写第一个ServletServlet方法Servlet与JSP隐含对象认识Servlet什么是Servlet在学习JSP时,有读者可能会发问:Java是面向对象的语言,任何Java代码都必须放到类中,但是在JSP中,似乎没有看到类的定义,这是怎么回事?实际上,在运行JSP时,效劳器底层将JSP会编译成一个Java类,这个类就是Servlet。虽然上面看起来Servlet的很特别,但Servlet与其他的Java程序相同,它最大的特色只是Servlet编写的时候必须遵守一定的标准。认识Servlet什么是ServletServlet是一种运行在效劳器端(一般指的是Web效劳器)的Java应用程序,可以生成动态的Web页面,它是属于客户与效劳器响应的中间层。如:认识ServletServlet与JSP的关系从前面的表达可以看出,Servlet与JSP,一个是Java应用程序,一个是网页脚本语言,二者似乎风马牛不相及。但是,可以说,JSP就是Servlet!下面看程序演示,建立Web工程Prj08,首先编写一个JSP。testPage.jsp<%@pagelanguage="java"pageEncoding="gb2312"%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head>

鲜花订购系统

</head><body><br>欢迎来到鲜花订购系统<br></body></html>认识ServletServlet与JSP的关系问答:问:即然这样,Servlet还有什么学习的价值?答:Servlet属于JSP的底层,学习它有助于了解底层细节;另外,Servlet毕竟是一个Java类,适合纯编程,如果是纯编程的话,比将Java代码混合在HTML中的JSP要好得多。编写第一个Servlet建立Servlet上节中创立了工程Prj08,现在首先在Prj08中建立Servlet。该Servlet的作用是,访问这个Servlet,显示一句欢送信息。直接访问一个JSP,属于是属于GET类型。在工程中,首先建立一个包用来存放Servlet,名字可以自己取,此处为servlets,如:

编写第一个Servlet建立Servlet由于Servlet本质上是一个Java类,因此,可以直接建立一个类:WelcomeServlet,放到servlets包中,如:编写第一个Servlet编写Servlet一个普通的类,不可能成为Servlet,要想成为Servlet,还需要进行以下步骤。步骤一,让这个类继承HttpServlet:

步骤二,由于直接访问Servlet,是属于get方法请求,因此,重写HttpServlet的doGet()方法,在doGet方法中进行输出。importjavax.servlet.http.HttpServlet;publicclassWelcomeServletextendsHttpServlet{}编写第一个Servlet编写Servlet特别提醒1.重写父类的方法,MyEclipse提供了较为方便的做法,右击代码界面,选择Source—Override/ImplementMethods…,如:编写第一个Servlet编写Servlet特别提醒点击,在如下的界面中给doGet函数打勾即可,如:编写第一个Servlet编写Servlet特别提醒2.建立Servlet,还有一种比较简便的方法。右击包,选择new—Servlet,如:编写第一个Servlet编写Servlet在弹出的界面中,配置相应信息,也能得到类似代码。编写第一个Servlet配置Servlet编写完一个Servlet后,还不能直接访问,必须要配置Servlet其才能通过URL映射到与之对应的Servlet中来,用户才能对它进行访问。Servlet的配置是通过一个叫做web.xml的文件来实现的,如:编写第一个Servlet配置Servlet可以清晰的看到web.xml文件时位于WebRoot/WEB-INF下面。首先来看web.xml的结构,以便有个大概的了解:<?xmlversion="1.0"encoding="UTF-8"?><web-appversion=“2.5”…<servlet><servlet-name>WelcomeServlet</servlet-name><servlet-class>servlets.WelcomeServlet</servlet-class></servlet><servlet-mapping><servlet-name>WelcomeServlet</servlet-name><url-pattern>/servlets/WelcomeServlet</url-pattern></servlet-mapping></web-app>编写第一个Servlet配置Servlet以上配置表示,给servlets.WelcomeServlet起名为WelcomeServlet,在访问时,以:://效劳器:端口/工程虚拟目录名//servlets/WelcomeServlet来访问。如://localhost:8080/Prj08//servlets/WelcomeServlet可以自己命名,不一定要与原文件名字一样。但是2个servlet-name名字必须要相同。此url-pattern也不一定是Servlet的包路径,只是为了方便,一般用的都是包路径来表示。编写第一个Servlet部署ServletServlet的部署和前面讲过的JSP的部署是相同的,只要部署整个工程就行。不过,需要指出的是,Servlet部署之后,Servlet的class文件在效劳器Tomcat相应工程目录的的WEB-INF/classes下面,实际上,src目录下的所有源文件经过部署,都会放在Tomcat相应工程目录的的WEB-INF/classes下面。也包括前面的JavaBean。如:编写第一个Servlet测试Servlet下面开始测试Servlet,部署过后在浏览器上输入:://localhost:8080/Prj08//servlets/WelcomeServlet运行结果如下:编写第一个Servlet测试Servlet不过如果将web.xml中的url-patter改成如下形式:<url-pattern>/WelcomeServlet</url-pattern>重新部署后在浏览器中输入:://localhost:8080/Prj08/WelcomeServlet效果一样。如果路径输入错误,如:://localhost:8080/Prj08/servlets/WelcomeSerlet,那么会报错,如下:编写第一个ServletServlet运行机制Servlet是如何运行?将前面的Servlet进行修改,代码如下:WelcomeServlet.javapackageservlets;importjava.io.IOException;…publicclassWelcomeServletextendsHttpServlet{ publicWelcomeServlet(){ System.out.println("WelcomeServlet构造函数"); } protectedvoiddoGet(HttpServletRequestrequest, HttpServletResponseresponse)throwsServletException,IOException{ System.out.println("WelcomeServlet.doGet函数"); response.setContentType("text/html;charset=gb2312"); PrintWriterout=response.getWriter(); out.println("欢迎来到鲜花订购系统!"); } }编写第一个ServletServlet运行机制给这个Servlet增加了一个构造函数,并打印一个标记,在doGet函数中也打印一个标记。重新部署,运行这个Servlet,控制台打印,如:编写第一个ServletServlet运行机制说明初次运行,系统会实例化Servlet。在不关闭效劳器的情况下,如果再次访问这个Servlet,控制台会打印,如:编写第一个ServletServlet运行机制可以看出第一次访问运行了构造函数和doGet函数,而第二次访问仅仅运行了doGet,这说明2此访问总共只创立了一个对象。编写第一个Servlet思考既然只创立了一个对象那么很多个用户同时访问的时候会不会造成等待?编写第一个Servlet答复不会。因为Servlet采用的是多线程机制,每一次请求,系统就分配一个线程来运行doGet函数。但是这样会带来平安问题,关于其解决方法,后面的篇幅会详细讲解。Servlet方法doGet()/doPost()方法Servlet有2种处理方法1.doGet()。doGet()在以get方式请求Servlet时运行。常见的get请求方式有:1.链接。2.get方式表单提交。3.直接访问Servlet。2.doPost()。doPost()在以post方式请求Servlet时运行。常见的post请求为post方式表单提交Servlet方法doGet()/doPost()方法问:如果不知道提交的方式,应该如何处理才能防止doGet()与doPost()方法不用重复编写?答:可以采用以下方法:publicclassWelcomeServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ System.out.println("doGet函数"); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ this.doGet(request,response); }}Servlet方法init()方法从前面可以看出,一个Servlet在效劳器上最多只会驻留一个实例。所以说第一次调用Servlet时,将会创立一个实例。在实例化的过程中,HttpServlet中的init()方法会被调用。下面可以通过在init()增加一些初始化操作来观察:publicclassWelcomeServletextendsHttpServlet{ publicvoidinit()throwsServletException{ System.out.println("初始化函数:鲜花订购系统初始化了!"); }}Servlet方法init()方法如果运行该Servlet,控制台上出现,如:运行时可能会发现浏览器报405错误,那是因为没有重写doGet()方法Servlet方法service()方法在上面已经讲解doGet()与doPost()方法的时候遇到一个问题:“不清楚请求方式时应该如何处理?”。其实,除了前面提过的转嫁方法外,还可以通过service()方法来完成。publicclassFirstServletextendsHttpServlet{ protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp) throwsServletException,IOException{ System.out.println("service()方法:鲜花系统开始处理业务了"); }}Servlet方法service()方法可以做一个表单来测试(读者自己可以去写表单),不管是get请求还是post请求,控制台都输入:Servlet方法service()方法事实上,客户端对servlet发送一个请求过来,效劳器端将会起一个线程,该线程会调用service()方法,servic()方法会根据收到的客户端的请求类型来决定是调用doGet()还是doPost()。但是,一般情况下不用覆盖service()方法来到达doGet()与doPost()方法处理一样的目的。Servlet方法destroy()方法在运行Web效劳器运行servlet实例时会出现一些这样或者是那样的原因,此时需要删除某个servlet。但是在删除此servlet之前,还必须要进行某些操作,比方释放数据库连接等以节省资源,这个时候就需要使用destroy()方法了。Servlet方法destroy()方法publicclassWelcomeServletextendsHttpServlet{ publicvoidinit()throwsServletException{ System.out.println("初始化函数");} protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp){//0不能作为除数,此时servlet调用消亡函数 inta=20/0; System.out.println("service()方法"); } publicvoiddestroy(){ System.out.println("消亡函数:鲜花订购系统结束"); }}Servlet方法destroy()方法在浏览器中访问此servlet,首先会报错,然后当重新部署servlet的时候控制台将出现:此时开始调用了消亡函数destroy()。Servlet方法Servlet生命周期从前面的例子已经大概了Servlet的生命周期了,下面是Servlet的生命周期,如下:Servlet方法Servlet生命周期从图中可以看出:当客户端向Web效劳器提出第一次Servlet请求时,Web效劳器会实例化一个Servlet,并且调用init()方法;如果Web效劳器中已经存在了一个Servlet实例的话,将直接使用此实例;然后调用service()方法,service()方法将根据客户端的请求方式来决定调用对应得doXXX()方法;当Servlet从Web效劳器中删除的时候,Web效劳器删除的时候,Web效劳器将会调用Servlet的destroy()方法。Servlet与JSP隐含对象为什么要在Servlet中使用隐含对象在讲解这个问题之前,考虑下面的问题,既然Servlet这么难写,什么情况下写Servlet?(1)以下情况,适合写成Servlet:(2)处理请求,调用DAO;(3)某些纯编程的场合。相反,如果是一些和显示有关的内容,可以考虑写成JSP。Servlet与JSP隐含对象为什么要在Servlet中使用隐含对象上图是以后经常要使用的一种模式,前面已经提到过了。其中中间的处理模块经常需要使用隐含对象以拿到JSP1的数据,或者向JSP2传送数据。虽然图中的处理模块也可以用JSP页面充当,但为了是页面和代码别离,一般都是用Servlet充当处理模块,所以Servlet中也同样需要能够获取隐含对象。Servlet与JSP隐含对象获得out对象首先来用Servlet获得out对象。在前面已经提到过JSP中的out对象对应于Servlet中的:

。下面举个简单的例子:GetOutServlet.javapublicclassGetOutServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ PrintWriterout=response.getWriter(); out.println("已经从Servlet中拿到了out隐含对象"); }}Servlet与JSP隐含对象获得out对象在浏览器中输入GetOutServlet在web.xml中相对应的url即可获得打印,如以下图:不过请注意,怎么会乱码?那是因为out输出流中有中文却没有设置编码。解决这个问题可以将doGet代码改为:response.setContentType("text/html;charset=gb2312");PrintWriterout=response.getWriter();out.println("已经从Servlet中获取了out隐含对象");Servlet与JSP隐含对象获得out对象此时在浏览器中输入GetOutServlet在web.xml中相对应的url即可获得如图:中文在浏览器中此时不会成为乱码了。Servlet与JSP隐含对象获得out对象问:response.setContentType("text/html;charset=gb2312");这段代码可以随便放吗?答:不可以。response.setContentType在这里要求一定要放在response.getWriter()之前才可以。如果把它放在response.getWriter()的之后的话,因为此时输出流已经获得了,显然已经无法改变编码格式了,那时还是会输出乱码的。Servlet与JSP隐含对象获得out对象一般response.setContentType()都是与response.setCharacterEncoding()一起使用,放在Servlet处理方法的最上面以解决乱码问题:response.setContentType("text/html;charset=gb2312");response.setCharacterEncoding("gb2312");Servlet与JSP隐含对象获得request对象Servlet中获得JSP页面中的request对象非常容易,因为它已经作为了参数传给了doXXX()方法中了。此代码中的request参数即使JSP页面中传过来的request隐含对象。可以发现,它是一个HttpServletRequest对象。…PreparedStatementstatement=conn.prepareStatement("deletefromUserInfowhereuserID=?");statement.setString(1,"Happy");intresult=statement.executeUpdate();…

Servlet与JSP隐含对象获得response对象response与request对象的获得是一样的,在方法参数中都已经存在。上面代码中的response对象即使JSP页面中传过来的response隐含对象。它是一个HttpServletResponse对象。Servlet与JSP隐含对象获得session对象session对象对应的是HttpSession,在Servlet中它可以通过下面代码获得:importjavax.servlet.http.HttpSession; ……publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{//得到sessionHttpSessionsession=request.getSession();}Servlet与JSP隐含对象获得application对象application对象对应的是ServletContext,在Servlet中它可以通过下面代码获得:importjavax.servlet.ServletContext; ……publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{//得到applicationServletContextapplication=this.getServletContext();}……Servlet与JSP隐含对象获得其他对象exception对象对应的是Throwable,一般情况下直接使用异常即可。page就可以直接用this来使用。pageContext可以用以下代码获得:importjavax.servlet.jsp.JspFactory;……publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{//得到pageContextJspFactoryfac=JspF

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论