《最新servletsic方案(共50张ppt课件).pptx》由会员分享,可在线阅读,更多相关《最新servletsic方案(共50张ppt课件).pptx(50页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 Servlets项目部 卢剑宇第一页,共五十页。Servlet基本概念vServlet,服务器端的小程序(chngx),它是相对于Applet而言的,Applet是客户端小程序(chngx)。Servlet和CGI都是运行在Web服务器上,用来生成Web页面。vServlet,是接受来自网络的请求(form表单,以及其他的请求),并对不同请求作出不同的响应。vServlet,是基于Http协议的,是运行在web服务器中的程序。第二页,共五十页。vServlet是运行(ynxng)在web容器中,这个web容器可以控制Servlet对象的生命周期,控制请求由Servlet对象处理。vweb服务
2、器,这里的服务器不是硬件概念,而是软件,常用的web服务器有 Tomcat,Jboss等,我们所用到的Tomcat是一个开源的服务器,Tomcat是一个用java语言编写的web服务器,所以需要有相应的java运行环境,也就是JVM,还要配置tomcat的具体路径。第三页,共五十页。Servlet环境(hunjng)配置vJAVA_HOME=/XXX/XXX/(JDK路径(ljng),bin的上一层目录)vCATALINA_HOME=/XXXX/XXX(tomcat的绝对路径 windows中 X:xxxxxx)第四页,共五十页。Tomcat使用(shyng)v在启动Tomcat时,是运行To
3、mcat的bin目录下的startup.sh(windows中使用startup.bat)vLinux中要显示后台的具体信息, 则用catalina.sh run 代替startup.sh命令。v判断(pndun)Tomcat是否启动成功,可以在浏览器的地址栏中使用http:/localhost:8080/或http:/127.0.0.1:8080/可以访问到tomcat的主页就表示启动成功。要想停止tomcat服务器,可使用shutdown.sh(windows中使用shutdown.bat),如果直接关闭启动窗口,就会造成8080端口占用错误,这时可以再使用shutdown.sh关闭一下服
4、务器。第五页,共五十页。Servlet开发(kif)步骤v编写servlet源代码,注意servlet的结构。v编译servlet,需要servlet-api.jar文件(位于(wiy)$Tomcatcommonlib目录下;加入classpath环境变量中)v部署servlet编写配置文件web.xml:其中包括servlet burl与servlet name的映射,以及servlet name 与servlet class name的映射。第六页,共五十页。构造web应用程序目录结构(jigu)如下:MyWebApp 应用程序名应用程序名WEB-INFclasseslib*.html/*
5、.jsp配置文件web.xml放在WEB-INF目录下servlet类文件放在classes目录下将整个应用程序目录拷贝到$Tomcatwebapps目录下第七页,共五十页。第八页,共五十页。使用此结构(jigu)的优点v一个一个Web容器中可以共存多个容器中可以共存多个Web应用程序。应用程序。 vWeb容器知道容器知道(zh do)该到何处寻找装入该到何处寻找装入Web应应用程序所需的类。用程序所需的类。 第九页,共五十页。web.xml文件(wnjin)的写法 IpLogServlet tarena.servlet.lc.IpLogServlet filename /getServlet
6、Config().getInitParameter(); c:/iplog.txt2 /在服务器启动的时候就创建该在服务器启动的时候就创建该servlet实例,实例, 必须是正数,小的数先创建必须是正数,小的数先创建 IpLogServlet /要和servlet标签中的相同 /lc/iplog /指定servlet相对于应用目录的虚拟(xn)路径 /xxx/xxx(绝对路径),xxx(相对路径)第十页,共五十页。测试(csh)应用v在tomcat服务器中,访问应用下的资源可以在端口号后加上web应用文件夹得名字就可以看到资源http:/localhost:8080/应用文件夹名应用文件夹名/
7、url-pattern,静态(jngti)页面只能放在web应用的文件夹下,不能够放在WEB-INF文件夹下,WEB-INF文件夹中的资源是受保护的,不能够通过网络访问到。第十一页,共五十页。Servlet的调用(dioyng)过程v用户通过浏览器向web服务器发送请求http:/serverip:port/appnamev服务器为用户定位资源静态资源静态资源:/a.html /a/b.html (这里的路径是针对web应用文件夹目录)读文件并把内容发送到客户端。动态资源动态资源:解析(ji x)web.xml定位Servlet类的名字。装载类(WEB-INF/classes | WEB-IN
8、F/lib/*.jar)创建该对象的实例Servlet ser=(Servlet)(Class.forName(“servle的类名).newInstance();/我们写的Servlet一定要实现Servlet接口或者继承实现了Servlet接口的类ser.service(request,response);第十二页,共五十页。用Servlet处理(chl)表单数据 vFORM元素的属性 action: 用来指定要处理(chl)FORM数据的Servlet的URL method: 指定数据传送给HTTP服务器的方法v 解析请求 getParameterNames:可以获得一个迭代器Enume
9、ration,通过这个迭代器,来获得form表单中参数的名字。getParameter: 返回表单中参数名(区分大小写)对应的值(没有这样的参数,返回null; 没有任何值,返回空String);多参数同名时,只取一个。getParametervalues: 返回表单中参数名(区分大小写)对应的字符串数组(没有这样的参数,返回null;只有一个值,返回值为单一元素组); 第十三页,共五十页。get & postv在浏览器的地址栏操作按回车键,或者是热连接,都是get请求,form的method属性如果不指定,默认为get请求(传的数据不能太大,且表现为明文)。vget请求请求,会将参数显示在浏
10、览器的地址栏上,其显示格式,在地址之后会以?开始,以&分隔参数,可以通过HttpServletRequest对象的getQueryString()方法来获得get请求的参数值。vpost请求请求:ServletRequest对象的getInputStream()方法可以获得一个由Socket得来的输入流,可以使用这个(zh ge)流来实现文件的上传。getReader()方法可以直接获取post请求的参数。第十四页,共五十页。Servlet的生命周期 v创建Servlet对象,通过服务器反射机制创建Servlet实例,默认第一次请求时才会创建。v调用Servlet对象的init()方法,初始化
11、Servlet的信息,init()方法只会在创建后被调用一次。v响应请求,调用service()或者是doGet(),doPost()方法来处理(chl)请求,这些方法是运行的在多线程状态下的。v在长时间没有被调用或者是服务器关闭时,会调用destroy()方法来销毁Servlet对象。第十五页,共五十页。Servlet对客户端提供(tgng)服务的时序图 第十六页,共五十页。Servlet生命周期状态图生命周期状态图第十七页,共五十页。init方法(fngf) v当首次创建Servlet时就会调用init方法(fngf), 而不是每个用户请求都会调用该方法(fngf)。 v 我们可以在ini
12、t方法中完成类似于构造方法的初始化功能。v init方法一结束,servlet即可接受客户端请求; 第十八页,共五十页。init方法(fngf)实例 v覆盖init(ServletConfig conf)方法时,应该总是在首行调用super.init(); 或者直接覆盖init();vinit方法接受ServletConfig作为参数, 用以下方法获得参数值: getInitParameter: 返回(fnhu)指定参数名称对应的值,如果参数不存在,返回(fnhu)null; getInitParameterNames: 返回所有初始化参数的名字 ; 第十九页,共五十页。service方法(f
13、ngf) v每当服务器接收到对Servlet的请求时,服务器就会产生一个新线程, 并调用service。service方法检查(jinch)HTTP请求类型,并相应地调用doGet、doPost、doPut、doDelete。 v被container调用去响应(ServletResponse)来自客户端的请求(ServletRequest); 第二十页,共五十页。Servlets的多线程安全(nqun)v 多线程占用资源少,处理速度快,提高了效率。 v一些编码(bin m)建议: 对变量和方法定义适当的访问方式, 例如单纯取值操作不会有多线程安全问题; 同步化所有访问重要数据的实例变量; 多线
14、程下,如果操作的是一个变量,且兼有读写操作,就要考虑加上同步,但同步不能乱加,否则会造成死锁问题。第二十一页,共五十页。并发需要(xyo)注意的v并发的环境:资源处于一个并发的环境v共享资源:多个线程共享一个临界资源v全面同步:如有n个变量(binling)访问同一个资源,这n个变量(binling)都得同步。即多个锁一把钥匙,钥匙放在一个共享区域内vsychronized(this):粗粒度的锁。是将所有的路都加锁;sychronized(object o1):细粒度的锁。只对对象中的变量加锁。效率较前面的高,但是较难控制。v读写需要互斥。vsychronized(this):this不能是
15、基本数据类型,必须是Object.不锁对象的引用,而是对象的内存空间。vservlet中需要同步的:成员变量、文件、静态变量、数据库连接成员变量、文件、静态变量、数据库连接第二十二页,共五十页。 destroy方法(fngf)v服务器决定(judng)删除已经加载的Servlet实例之前将调用Servlet的destroy方法; v该方法允许Servlet: 关闭数据库连接;中止后台线程;将Cookie程序清单或访问计数写到磁盘以及执行其他类似的收尾工作。第二十三页,共五十页。 在Servlet终止(zhngzh)时处理Service线程 v在destroy()方法中:如有服务(通过一个同步化
16、的实例方法取得当前线程数大于0),则置关闭(gunb)状态为false(通过一个同步化的实例方法实现)。然后循环等待服务线程数为0,则置关闭(gunb)状态为true.v在Service()方法中: 如见关闭状态为true,便不执行具体逻辑方法,直接退出。第二十四页,共五十页。 HTTP servlet类的基本(jbn)结构 v继承HttpServletv实现(shxin)至少一个service方法,如:doGet(.)和doPost(.) vservice方法有两个参数,HttpServletRequest 和 HttpServletResponse:HttpServletRequest代表
17、经过容器加工的用户的请求HttpServletResponse代表需要容器进一步加工的对用户的响应v我们写的servlet需要引入javax.servlet.* 和 javax.servlet.http.* 两个命名空间第二十五页,共五十页。servlet继承(jchng)关系vservlet主要数据结构: Servlet 接口:主要定义了servlet的生命周期方法 ServletConfig接口:为servlet提供了使用容器服务的若干重要对象和方法。 ServletContext接口:是Servlet的上下文对象,这个对象是在服务器启动时创建的,为servlet提供了使用容器服务的若干重
18、要方法。 GenericServlet抽象类:为servlet提供了一般的实现(包括实现了servlet和ServletConfig两个接口),保存了容器通过init方法传递给servlet的一个ServletConfig类型的重要对象。 HttpServlet抽象类:为处理(chl)http请求的servlet提供了一般实现,主要是定义和实现了若干service方法。 继承关系:GenericServlet继承了Servlet和ServletConfig接口;HttpServlet继承了GenericServlet;我们写的servlet继承了HttpServlet 第二十六页,共五十页。S
19、ervlet访问DB(一个(y )servlet完成整个功能)v获取client端信息(xnx)v调用相应的处理方法连接数据库,操作信息数据v返回给client端相应的结果页面utilbizentityviewcontrollermodel第二十七页,共五十页。将一个(y )servlet按功能细分v将一个完成所有(suyu)功能的servlet分解成多个,分别完成自己的功能,即形成了mvc。第二十八页,共五十页。MVC框架 (组件(z jin)的各司其职)vModel,模型层(封装数据 ),这一层一般是进行数据库访问,并且封装对象,这一层中也存放在访问数据库取出信息封装成对象的类,也就是实体
20、类的信息,可以使用JDBC或者Hibernate实现这一层的功能。vCtrl,控制层(改变数据,改变模型的状态 ),用来相应请求和调用写好的相应的访问数据库的方法,这一层是用来控制请求的响应的,现在我们是使用Servlet来实现这一层,不过一般是会用开源的MVC框架来实现这层,例如struts,或者是Spring的MVC框架。vView,表现层(显示数据和收集数据),收集数据的一般是form表单,不过要保证数据的正确性要是用JavaScript验证(ynzhng)信息,以后我们会学到的JSP(java server page)就是用来表现、显示数据的。第二十九页,共五十页。第三十页,共五十页。
21、Servlet之间的怎么(zn me)互相调用v在上述(shngsh)基础上需要解决servlet之间的调用:可以利用servletContext解决每一个servlet都可能和上下文交互,则每个servlet中都应该保存一个servletContext对象,去访问整个应用的上下文, 步骤如下:vgetServletContext():application application.getRequestDispatcher(“/res/students/list”):dispatcher dispatcher.forward(request,response)v每个JVM中的每一个应用程序里都
22、存在一个上下文 vservletContext在servletConfig的对象中; vServletContext.getRequestDispatcher(String path):返回一个RequestDispatcherv通过RequestDispatcher的forward()或include()方法传送请求。 第三十一页,共五十页。如何在一个(y )servlet中调用另外一个(y )servlet: vServletContext类的getRequestDispatcher(String path)方法获得(hud)一个RequestDispatcher对象,并且跳转到指定的Se
23、rvlet,getRequestDispatcher(String path)方法中的参数就是path,就是指定跳转的Servlet的url-pattern。vRequestDispatcher类的forward(ServletRequest request, ServletResponse response) 方法,可以把请求对象转发给其他的Servlet。第三十二页,共五十页。在多个(du )servlet中传递信息:vHttpServletRequest对象中的方法setAttribute(String name,Object o),可以使用(shyng)HttpServletReque
24、st对象来携带信息,并且可以通过getAttribute(String name)方法来获得携带的信息,这两个方法类似于map中的存取方法,setAttribute方法给数据加上标识,getAttribute方法则是通过这个标识来获取数据,可以使用(shyng)这一对方法的前提就是要保证是同一个请求对象(HttpServletRequest)第三十三页,共五十页。转发请求(qngqi)至新的资源vrequest dispatcher的二种传送请求方式 Forward: 将请求从一个servlet传到服务器上的其他资源(servlet、JSP、HTML); Include: 将静态或动态内容包含
25、(bohn)在当前servlet中; v获得获得request dispatcher的二种方式:的二种方式:ServletRequest.getRequestDispatcher() / 相对路径相对路径ServletContext.getRequestDispatcher() / 绝对路径绝对路径vResponse.sendRedirect(/servapp/state/login);/要写绝对路径,产生新的请求,vForward(req,resp);/在当前路径基础上跳转两个页面之间跳转的时侯如果需要数据传递,则只能用forward();因为sendRedirect()会产生一个新的请求。
26、第三十四页,共五十页。servlet中使用(shyng)数据源访问数据库 v在服务器中配置数据源(使用admin管理界面) v再servlet中使用JNDI语法获取数据源Context context = new InitalContext();DataSource ds =(DataSource) context.lookup(java:comp/env/+dsName); Connection con = ds.getConnection();v新建一个配置文件myapp.xml(假设web应用程序名称为:myapp),将xml文件的头部和一对标签(bioqin)写入该文件,将server
27、.xml中有关数据源配置的标签(bioqin)内容拷贝到myapp.xml中的标签(bioqin)之间。server.xml位于$tomcatconf文件夹下,myapp.xml放在$tomcatconfcatalinalocalhost文件夹下。 第三十五页,共五十页。数据源配置(pizh)Server.xmlv第三十六页,共五十页。会话(huhu)管理v为什么要使用session?一般来讲,从同一客户打开浏览器连接到服务再到客户关闭浏览器可称为一次会话(中间浏览器可以打开多个(du )窗口) 通信协议分为有状态和无状态两种。Http协议是一种无状态协议。一个客户向服务器发出请求然后服务器返
28、回响应,连接就被关闭了。在服务器端不保留连接的有关信息因此当下一次连接建立时,服务器已没有以前连接的信息了,无法判断这一次连接和以前的连接是不是属于同一客户发出的。在实际应用中,客户进行一个事务性的操作可能需要对服务器进行好几次连接,这时维护前几次连接的状态就非常重要。 服务器必须能够区分不同的客户,而且还要有为每一个客户存储数据的方法。第三十七页,共五十页。session实现的三种(sn zhn)方法vCookievURL Rewriting v隐藏(yncng)表单域 第三十八页,共五十页。使用(shyng)java servlet API进行会话管理(session)vjava serv
29、let API 主要提供(tgng)了两个与会话相关的类和接口:Cookie和HttpSession第三十九页,共五十页。Cookie v控制机制: Browser-request- Web server Web server-request+info- Browser Browser-request+info- Web server(客户端带信息来再次访问其标志(biozh)的资源)第四十页,共五十页。v详细解释Cookie是一小块可以嵌入到Http请求和相应中的数据。它在服务器端产生,并作为响应(xingyng)头域的一部分返回用户。浏览器收到包含Cookie的响应(xingyng)后,会
30、把Cookie的内容用key-value对的形式写入到一个客户端专门存放Cookie的文本文件中(c:/documents and setting/$user/Cookies)。浏览器会把Cookie及随后产生的请求发给相同的服务器,服务器可以再次读取Cookie中存放的数据。Cookie可以进行有效期的设置,过期的Cookie不会发送给服务器。第四十一页,共五十页。vCookie的用法:获取Cookies:Cookie all = request.getCookies();获取Cookies名字(mng zi):Cookiei.getName();获取Cookies的值:Cookiei.ge
31、tValue();();为为Cookies设置新值:设置新值:Cookiei.setValue();设置设置Cookie保存的最大期限:保存的最大期限:Cookiei.setMaxAge (int expiry);毫秒毫秒第四十二页,共五十页。以cookie实现(shxin)的session的流程: vBrowser访问 Web server- Web server分给用户一个jsessionId并返回(fnhu)给用户保存在本地,同时将jsessionId保存在session中-用户再次访问本Web server时带着jsessionId来访问- Web server根据用户传过来的jses
32、sionId跟session中的jsessionId比较,如果有相同的,就将这个jsessionId对应的session返回给用户,这样用户可以看到上一次的访问信息。第四十三页,共五十页。HttpSession vjavax.servlet.http.HttpSession接口(ji ku)封装了HTTP会话的细节,该会话与一段时间内特定的web客户对web服务器的多个请求相关。它由Servlet容器环境实现。对Servlet的开发者隐藏实现的细节。 v在Servlet中进行会话管理时,首先要获得会话对象。HttpServletRequest.getSession()对象返回与请求相关的当前H
33、ttpSession对象,并且该对象不存在时就创建一个新的对象。vHttpServletRequest.getSession(true)具有相同的功能。如果参数是false,当不存在会话对象的时候就不创建新的,而是返回一个Null值。第四十四页,共五十页。容器(rngq)做的事情 v产生不重复的jsessionId;v 将jsessionId和session对象映射成表;v 将jsessionId返回(fnhu)给用户(cookie/urlRewriting);v 再次访问时,先在表中查jsessionId对应的session;v 将查到的session对象的引用放入request给用户。第四
34、十五页,共五十页。用户(yngh)做的事情 vrequest.getSession();v request.setAttribute();v request.getAttribute();第四十六页,共五十页。servlet的会话机制(jzh)(servlet将cookie/urlRewriting封装而成) v底层的cookie和url之间的过程被封装;v urlRewriting的细节被屏蔽,即jsessionId由容器生成,jsessionId列表由容器维护;v状态(zhungti)对象由容器维护;v容器提供了在状态对象中存取数据的方法;v会话状态会被自动持久化。第四十七页,共五十页。U
35、RL RewritingvCookies可以用来跟踪某一用户向站点发出的每一个请求,有人认为web站点管理员能都收集到用户所浏览网页的足够信息。这侵犯了用户的个人(grn)隐私权,所以某些用户会关闭浏览器的Cookie功能。这样的话就要求程序员事先在实现Cookie的同时也实现重写URL,那当Cookie失效的时候重写URL就会替代Cookie发挥作用。 第四十八页,共五十页。Servlet中的数据可见(kjin)范围和生命周期: v一个应用(yngyng)只有一个上下文对象。第四十九页,共五十页。内容(nirng)总结Servlets。必须是正数,小的数先创建。service方法检查HTTP请求类型,并相应地调用doGet、doPost、doPut、doDelete。全面同步:如有n个变量访问同一个资源,这n个变量都得同步。Http协议是一种无状态协议。Servlet中的数据可见(kjin)范围和生命周期:第五十页,共五十页。