Servlet详解.ppt_第1页
Servlet详解.ppt_第2页
Servlet详解.ppt_第3页
Servlet详解.ppt_第4页
Servlet详解.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

1、Servlet基本概念,Servlet,服务器端的小程序,它是相对于Applet而言的,Applet是客户端小程序。 Servlet,是接受来自网络的请求(form表单,以及其他的请求),并对不同请求作出不同的响应 Servlet,是基于Http协议的,是运行在web服务器中的程序。 servlet是运行在web容器中,这个web容器可以控制Servlet对象的生命周期,控制请求由Servlet对象处理。 web服务器,这里的服务器不是硬件概念,而是软件,常用的web服务器有 Tomcat,Jboss等,我们所用到的Tomcat是一个开源的服务器,Tomcat是一个用java语言编写的web服

2、务器,所以需要有相应的java运行环境,也就是JVM,还要配置tomcat的具体路径。,Servlet环境配置,JAVA_HOME=/XXX/XXX/(JDK路径,bin的上一层目录) CATALINA_HOME=/XXXX/XXX(tomcat的绝对路径 windows中 X:xxxxxx),Tomcat使用,在启动Tomcat时,是运行Tomcat的bin目录下的startup.sh(windows中使用startup.bat) Linux中要显示后台的具体信息,则不能使用startup.sh而要使用catalina.sh run 判断Tomcat是否启动成功,可以在浏览器的地址栏中使用h

3、ttp:/localhost:8080/或:8080/可以访问到tomcat的主页就是启动成功了。要想停止tomcat服务器要使用shutdown.sh(windows中使用shutdown.bat),如果直接关闭启动窗口,就会造成8080端口占用错误,这时可以在使用shutdown.sh关闭一下服务器。,Servlet开发步骤,编写servlet源代码,注意servlet的结构 编译servlet,需要servlet-api.jar文件(位于$Tomcatcommonlib目录下;配classpath环境变量中) 部署servlet 编写配置文件web.xml:

4、其中包括servlet burl与servlet name的映射,以及servlet name 与servlet class name的映射,构造web应用程序目录结构如下: MyWebApp WEB-INF classes lib *.html/*.jsp 配置文件web.xml放在WEB-INF目录下 servlet类文件放在classes目录下 将整个应用程序目录拷贝到$Tomcatwebapps目录下,web.xml文件的写法, IpLogServlet alan.servlet.lc.IpLogServlet filename /getServletConfig().getInitP

5、arameter(); c:/iplog.txt 2 /在服务器启动的时候就创建该servlet实例, 必须是正数,小的数先创建 IpLogServlet /要和servlet标签中的相同 /lc/iplog /指定servlet相对于应用目录的虚拟路径 /xxx/xxx(绝对路径),xxx(相对路径) ,测试应用,在tomcat服务器中,访问应用下的资源可以在端口号后加上web应用文件夹得名字就可以看到资源 http:/localhost:8080/应用文件夹名/url-pattern,静态页面只能放在web应用的文件夹下,不能够放在WEB-INF文件夹下,WEB-INF文件夹中的资源是受保

6、护的,不能够通过网络访问到。,Servlet的调用过程,用户通过浏览器向web服务器发送请求http:/serverip:port/appname 服务器为用户定位资源 静态资源:/a.html /a/b.html (这里的路径是针对web应用文件夹目录)读文件并把内容发送到客户端 动态资源:解析web.xml定位Servlet类的名字 装载类(WEB-INF/classes|WEB-INF/lib/*.jar) 创建该对象的实例 Servlet ser=(Servlet)(Class.forName(“servle的类名).newInstance(); /我们写的Servlet一定要实现Se

7、rvlet接口或者继承实现了Servlet接口的类 ser.service(request,response);,用Servlet处理表单数据,FORM元素的属性 action: 用来指定要处理FORM数据的Servlet的URL method: 指定数据传送给HTTP服务器的方法 解析请求 getParameterNames:可以获得一个迭代器Enumeration,通过这个迭代器,来获得form表单中参数的名字。 getParameter: 返回表单中参数名(区分大小写)对应的值(没有这样的参数,返回null;没有任何值,返回空String);多参数同名时,只取一个。 getParamet

8、ervalues: 返回表单中参数名(区分大小写)对应的字符串数组(没有这样的参数,返回null;只有一个值,返回值为单一元素组);,get init方法一结束,servlet即可接受客户端请求;,init方法实例,覆盖init(ServletConfig conf)方法时,应该总是在首行调用super.init(); 或者直接覆盖init(); init方法接受ServletConfig作为参数, 用以下方法获得参数值: getInitParameter: 返回指定参数名称对应的值,如果参数不存在,返回null; getInitParameter: 返回指定参数名称对应的值,如果参数不存在,

9、返回null;,service方法,每当服务器接收到对Servlet的请求时,服务器就会产生一个新线程, 并调用service。service方法检查HTTP请求类型,请相应地调用doGet、doPost、doPut、doDelete。 被container调用去响应(ServletResponse)来自客户端的请求(ServletRequest);,Servlets的多线程安全,多线程占用资源少,处理速度快,提高了效率。 一些编码建议: 对变量和方法定义适当的访问方式, 例如单纯取值操作不会有多线程安全问题; 同步化所有访问重要数据的实例变量;多线程下所操作的变量,如果操作的是一个变量,且兼

10、有读写操作,就要考虑加上同步,但同步不能乱加,否则会造成死锁问题。,并发需要注意的,并发的环境:资源处于一个并发的环境 共享资源:多个线程共享一个临界资源 全面同步:如有n个变量访问同一个资源,这n个变量都得同步。即多个锁一把钥匙,钥匙放在一个共享区域内 sychronized(this):粗粒度的锁。是将所有的路都加锁; sychronized(object o1):细粒度的锁。只对对象中的变量加锁。效率较前面的高,但是较难控制。 读写需要互斥 sychronized(this):this不能是基本数据类型,必须是Object.不锁对象的引用,而是对象的内存空间 servlet中需要同步的:

11、成员变量、文件、静态变量、数据库连接,destroy方法,服务器决定删除已经加载的Servlet实例之前将调用Servlet的destroy方法; 该方法允许Servlet: 关闭数据库连接; 中止后台线程; 将Cookie程序清单或访问计数写到磁盘以及执行其他类似的收尾工作。,*在Servlet终止时处理Service线程,在destroy()方法中:如有服务(通过一个同步化的实例方法取得当前线程数大于0),则置关闭状态为false(通过一个同步化的实例方法实现)。然后循环等待服务线程数为0,则置关闭状态为true. 在Service()方法中: 如见关闭状态为true,便不执行具体逻辑方法

12、,直接退出。,HTTP servlet类的基本结构,继承HttpServlet 实现至少一个service方法,如:doGet(.)和doPost(.) service方法有两个参数,HttpServletRequest 和 HttpServletResponse: HttpServletRequest代表经过容器加工的用户的请求 HttpServletResponse代表需要容器进一步加工的对用户的响应 我们写的servlet需要引入javax.servlet.* 和 javax.servlet.http.* 两个命名空间,servlet继承关系,servlet主要数据结构: Servlet

13、 接口:主要定义了servlet的生命周期方法 ServletConfig接口:为servlet提供了使用容器服务的若干重要对象和方法。 ServletContext接口:是Servlet的上下文对象,这个对象是在服务器启动时创建的,为servlet提供了使用容器服务的若干重要方法。 GenericServlet抽象类:为servlet提供了一般的实现(包括实现了servlet和ServletConfig两个接口),保存了容器通过init方法传递给servlet的一个ServletConfig类型的重要对象。 HttpServlet抽象类:为处理http请求的servlet提供了一般实现,主要

14、是定义和实现了若干service方法。 继承关系:GenericServlet继承了Servlet和ServletConfig接口;HttpServlet继承了GenericServlet;我们写的servlet继承了HttpServlet,Servlet访问DB(一个servlet完成整个功能),获取client端信息 调用相应的处理方法 连接数据库,操作信息数据 返回给client端相应的结果页面,util,biz,entity,view,controller,model,将一个servlet按功能细分,将一个完成所有功能的servlet分解成多个,分别完成自己的功能,即形成了mvc。,M

15、VC框架,Model,模型层,这一层一般是进行数据库访问,并且封装对象,这一层中也存放在访问数据库取出信息封装成对象的类,也就是实体类的信息,可以使用JDBC或者Hibernate实现这一层的功能。 Ctrl,控制层,用来相应请求和调用写好的相应的访问数据库的方法,这一层是用来控制请求的响应的,现在我们是使用Servlet来实现这一层,不过一般是会用开源的MVC框架来实现这层,例如struts,或者是Spring的MVC框架。 View,表现层,他只用来显示数据和收集必要数据,收集数据的一般是form表单,不过要保证数据的正确性要是用JavaScript验证信息,以后我们会学到的JSP(jav

16、a server page)就是用来表现、显示数据的。,Servlet之间的怎么互相调用,在上述基础上需要解决servlet之间的调用:可以利用servletContext解决每一个servlet都可能和上下文交互,则每个servlet中都应该保存一个servletContext对象,去访问整个应用的上下文, 步骤如下: getServletContext():application application.getRequestDispatcher(“/res/students/list”):dispatcher dispatcher.forward(request,response) 每个J

17、VM中的每一个应用程序里都存在一个上下文 servletContext在servletConfig的对象中; ServletContext.getRequestDispatcher(String path):返回一个RequestDispatcher 通过RequestDispatcher的forward()或include()方法传送请求。,如何在一个servlet中调用另外一个servlet:,ServletContext类的getRequestDispatcher(String path)方法获得一个RequestDispatcher对象,并且跳转到指定的Servlet,getReque

18、stDispatcher(String path)方法中的参数就是path,就是指定跳转的Servlet的url-pattern。 RequestDispatcher类的forward(ServletRequest request, ServletResponse response) 方法,可以把请求对象转发给其他的Servlet。,在多个servlet中传递信息:,HttpServletRequest对象中的方法setAttribute(String name,Object o),可以使用HttpServletRequest对象来携带信息,并且可以通过getAttribute(String

19、name)方法来获得携带的信息,这两个方法类似于map中的存取方法,setAttribute方法给数据加上标识,getAttribute方法则是通过这个标识来获取数据,可以使用这一对方法的前提就是要保证是同一个请求对象(HttpServletRequest),转发请求至新的资源,request dispatcher的二种传送请求方式 Forward: 将请求从一个servlet传到服务器上的其他资源(servlet、JSP、HTML); Include: 将静态或动态内容包含在当前servlet中; 获得request dispatcher的二种方式: ServletRequest.getRe

20、questDispatcher() / 相对路径 ServletContext.getRequestDispatcher() / 绝对路径 Response.sendRedirect(/servapp/state/login);/要写绝对路径,产生新的请求, Forward(req,resp);/在当前路径基础上跳转 两个页面之间跳转的时侯如果需要数据传递,则只能用forward();因为sendRedirect()会产生一个新的请求。,servlet中使用数据源访问数据库,在服务器中配置数据源(使用admin管理界面) 再servlet中使用JNDI语法获取数据源 Context conte

21、xt = new InitalContext(); DataSource ds =(DataSource) context.lookup(java:comp/env/+dsName); Connection con = ds.getConnection(); 新建一个配置文件myapp.xml(假设web应用程序名称为:myapp),将xml文件的头部和一对标签写入该文件,将server.xml中有关数据源配置的标签内容拷贝到myapp.xml中的标签之间。server.xml位于$tomcatconf文件夹下,myapp.xml放在$tomcatconfcatalinalocalhost文件

22、夹下。,数据源配置Server.xml,会话管理,为什么要使用session? 一般来讲,从同一客户打开浏览器连接到服务再到客户关闭浏览器可称为一次会话(中间浏览器可以打开多个窗口) 通信协议分为有状态和无状态两种。Http协议是一种无状态协议。一个客户向服务器发出请求然后服务器返回响应,连接就被关闭了。在服务器端不保留连接的有关信息因此当下一次连接建立时,服务器已没有以前连接的信息了,无法判断这一次连接和以前的连接是不是属于同一客户发出的。在实际应用中,客户进行一个事务性的操作可能需要对服务器进行好几次连接,这时维护前几次连接的状态就非常重要。 服务器必须能够区分不同的客户,而且还要有为每一

23、个客户存储数据的方法。,session实现的三种方法,Cookie URL Rewriting 隐藏表单域,使用java servlet API进行会话管理(session),java servlet API 主要提供了两个与会话相关的类和接口:Cookie和HttpSession,Cookie,控制机制: Browser-request- Web server Web server-request+info- Browser Browser-request+info- Web server(客户端带信息来再次访问其标志的资源),详细解释 Cookie是一小块可以嵌入到Http请求和相应中的数

24、据。它在服务器端产生,并作为响应头域的一部分返回用户。浏览器收到包含Cookie的响应后,会把Cookie的内容用key-value对的形式写入到一个客户端专门存放Cookie的文本文件中(c:/documents and setting/$user/Cookies)。浏览器会把Cookie及随后产生的请求发给相同的服务器,服务器可以再次读取Cookie中存放的数据。 Cookie可以进行有效期的设置,过期的Cookie不会发送给服务器。,Cookie的用法: 获取Cookies:Cookie all = request.getCookies(); 获取Cookies名字:Cookiei.ge

25、tName(); 获取Cookies的值:Cookiei.getValue(); 为Cookies设置新值:Cookiei.setValue(); 设置Cookie保存的最大期限:Cookiei.setMaxAge (intexpiry);毫秒,以cookie实现的session的流程:,Browser访问 Web server- Web server分给用户一个jsessionId并返回给用户保存在本地,同时将jsessionId保存在session中-用户再次访问本Web server时带着jsessionId来访问- Web server根据用户传过来的jsessionId跟session中的jsessionId比较,如果有相同的,就将这个jsessionId对应的session返回给用户,这样用户可以看到上一次的访问信息。,HttpSession,javax.servlet.http.HttpSession接口封装了HTTP会话的细节,该会话与一段时间内特定的web客户对we

温馨提示

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

评论

0/150

提交评论