servlet核心技术_第1页
servlet核心技术_第2页
servlet核心技术_第3页
servlet核心技术_第4页
servlet核心技术_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

2020 4 7 1 Servlet核心技术 2020 4 7 2 Servlet的生命周期 2020 4 7 3 Servlet体系结构 Servlet包含两个包 javax servlet 称为GenericServletjavax servlet http 称为HttpServlet它们之间的关系如图所示 2020 4 7 4 Servlet体系结构 续 Servlet必须实现javax servlet Servlet接口通过继承javax servlet GenericServlet类实现跨协议的Servlet通过继承javax servlet HttpServlet实现HTTPServlet 2020 4 7 5 javax servlet包 接口Servlet 定义必须实现的方法ServletConfig 配置ServletContext 与容器通讯ServletRequest 请求ServletResponse 响应RequestDispatcher 转发SingleThreadModel 单线程抽象类GenericServlet 与协议无关的ServletServletInputStream 二进制输入流ServletOutputStream 二进制输出流 2020 4 7 6 javax servlet http包 接口HttpServletRequest HTTP请求HttpServletResponse HTTP响应HttpSession 会话HttpSessionBindingListener 会话绑定监听器类HttpServlet 抽象类CookieHttpSessionBindingEvent 会话绑定事件 2020 4 7 7 JavaServletAPI概貌 2020 4 7 8 JavaServletAPI概貌 续 2020 4 7 9 Servlet接口 init方法 service方法 客户请求和响应调用该方法 释放内存 关闭Web服务器调用destroy方法 2020 4 7 10 Servlet接口 续 getServletConfig方法 getServletInfo方法 2020 4 7 11 GenericServlet和HttpServlet类 我们自己编写的servlet应该继承HttpServlet 一般要覆盖doPost或者doGet方法 HttpServlet类的doGet方法用于接收Get请求 doPost方法用于接收Post请求 2020 4 7 12 GenericServlet和HttpServlet类 续 2020 4 7 13 doGet方法 支持HttpGet请求 2020 4 7 14 doPost方法 支持HttpPost请求 2020 4 7 15 ServletConfig接口 getInitParameterNames返回初始化参数名枚举 getServletName返回servlet名字 getInitParameter返回初始化参数的值 AdminAdminservletemailadmin 2020 4 7 16 ServletConfig接口 续 ServletContext对象 getServletContext方法 2020 4 7 17 ServletConfig接口实例 将JDBC数据库连接放在Servlet中 2020 4 7 18 Servlet异常类 ServletException类包含一个获得异常原因的方法 getRootCause 返回造成这个ServletException的原因UnavailableException类该类继承于ServletException 当Servlet或Filter暂时或永久不能使用时 会抛出该异常 2020 4 7 19 属性 值 对象 setAttribute方法 设置属性的值 getAttribute方法 返回属性的值 removeAttribute方法 删除属性 ServletRequest接口 2020 4 7 20 HttpServletRequest接口 HttpServletRequest publicStringgetQueryString publicEnumerationgetHeaders publicEnumerationgetHeaderNames publicStringgetMethod 继承 interfaceServletRequest publicStringgetParameter Stringkey publicString getParameterValues Stringkey publicvoidsetAttribute Stringname Objecto 2020 4 7 21 voidsetContentType Stringtype 用于设置响应的MIME类型 如 response setContentType text html ServletOutputStreamgetOutputStream 返回一个ServletOutputStream对象 它可以用来在响应中写入二进制数据 java io PrintWritergetWriter 返回一个PrintWriter对象 它可以用来在响应中发送字符文本 比如 PrintWriterout response getWriter out println ServletResponse接口 2020 4 7 22 voidsendError intstatus 比如在servlet文件中有如下代码 response sendError 404 则当遇到该代码时 会转到一个错误页面 文件没有发现 404错误 voidsendRedirect Stringlocation 重定向到location 比如response sendRedirect abc html 遇到该行代码 会转到abc html页面 HttpServletResponse接口 2020 4 7 23 HttpSession接口 getCreationTime 1970 1 100 00 00 创建时间 毫秒数 getId 唯一标识 String型 getLastAccessedTime 1970 1 100 00 00 最近的访问时间 毫秒数 2020 4 7 24 HttpSession接口 续 setMaxInactiveInterval isNew 是新会话 不是新会话 true false invalidate getMaxInactiveInterval 2020 4 7 25 HttpSession接口 续 属性 值 对象 setAttribute方法 设置属性的值 getAttribute方法 返回属性的值 getAttributeNames方法 枚举属性的名字 removeAttribute方法 删除属性 2020 4 7 26 ServletContext接口 Tomcat Home webapps session index html page1 html 在server xml中配置 最终可以在浏览器中查看 上下文表示每个Web应用程序的环境 并且被当作是一个应用程序中所有的servlet可以访问的共享库 2020 4 7 27 RequestDispatcher接口 2020 4 7 28 Servlet的配置 Servlet的名字 类及其它杂项初始化参数启动装入优先级Servlet映射运行安全设置 2020 4 7 29 Servlet的名字 类及其它杂项 指定Servlet的名字 指定Servlet类 若Servlet是一个JSP文件 则指定JSP文件名 Servlet的描述 Servlet部署时显示的名字 2020 4 7 30 初始化参数 2020 4 7 31 启动装入优先级 数字说明 指定Web应用启动时 装载Servlet的次序 当该值为正数或零 则数字越小越先装入 若该值为负数或没有设定 则在客户第一次访问这个Servlet时才装载它 2020 4 7 32 Cookies Cookies是Netscape公司发明的 最常用的跟踪用户会话的方式 Cookies是由服务器发送给客户端的消息 保存在客户端 用来跟踪客户的状态 Cookie有3个规范 Netscape规范 RFC2019 RFC2965 Servlet2 4支持Netscape规范和RFC2109 Cookies以键 值得方式记录会话跟踪的内容 服务器利用响应报头Set Cookie来发送Cookie信息 在Servlet规范中 用于会话跟踪的Cookie的名字必须是JSESSIONID Cookie会造成一些隐私权和安全性方面的问题 当用户选择禁用Cookie 那么可以利用URL重写来跟踪用户会话 2020 4 7 33 Cookie类 主要提供如下方法 publicCookie Stringname Stringvalue publicStringgetComment voidsetComment Stringpurpose StringgetDomain voidsetDomain Stringpattern intgetMaxAge voidsetMaxAge intexpiry StringgetName StringgetValue voidsetValue StringnewValue StringgetPath voidsetPath booleangetSecure voidsetSecure booleanflag intgetVersion voidsetVersion intv 2020 4 7 34 在开发中我们通常将cookie读取 然后加载到内存中使用 Cookie实例 2020 4 7 35 Filter介绍 2020 4 7 36 过滤器概述 Filter是从Servlet2 3开始新增的功能 并在Servlet2 4得到增强 在一个Web应用中可以部署多个过滤器 多个过滤器组成一个过滤器链 过滤器可以直接发送响应给客户端 或者转发给另一个资源 浏览器 目标 过滤器1 过滤器2 过滤器3 过滤器4 2020 4 7 37 FilterAPI javax servlet Filter接口javax servlet FilterConfigjavax servlet FilterChainjavax servlet ServletRequestWrapperjavax servlet ServletResponseWrapperjavax servlet http HttpServletRequestWrapperjavax servlet http HttpServletResponseWrapper 2020 4 7 38 Filter接口 开发过滤器要实现javax servlet Filter接口 定义了3个方法 publicvoidinit FilterConfigconfig throwsServletExceptionpublicvoiddoFilter ServletRequestreq ServletReponseresp FilterChainchain throwsjava io IOException ServletException类似于Servlet接口的service方法 操作完后可以调用chain doFilter 将请求传给下一个过滤器 也可以使用forward 和include 以及sendRedirect 方法将请求转向到其他资源 publicvoiddestroy 2020 4 7 39 FilterConfig接口 类似于ServletConfig接口 FilterConfig由容器实现 将其作为参数传入过滤器对象的init 方法 有如下4种方法 publicStringgetFilterName publicStringgetInitParameter Stringname publicEnemerationgetInitParameterNames publicServletContextgetServletContext 2020 4 7 40 FilterChain接口 有容器实现 以参数形式传入doFilter方法 FileChain可以调用过滤器链中的下一个过滤器 如果为最后一个 则调用目标资源 FilterChain方法 publicvoiddoFilter ServletRequestreq ServletResponseresp throwsjava io IOException ServletException 2020 4 7 41 Filter部署 通过和部署例子 FilterDemocom nastation filter FilterDemohello WEB INF hello txtSerlvet容器只为每个过滤器创建一个实例 容器通过多线程来为多个请求服务 所以开发Filter时要注意线程安全 如果一个Filter部署了2次 那么回建立2个相同的过滤器类的实例 2020 4 7 42 过滤器的开发 Step1 编写过滤器类SimpleFilter javaStep2 编写测试页面test jspStep3 编译和部署过滤器 把SimpleFilter class放到WEB INF classes目录下Step4 配置Web应用程序Step5 运行Web应用程序 测试过滤器http localhost 8080 ServletDemo test jsp 2020 4 7 43 过滤器的工作流程 浏览器 目标 code1 code1 code2 code2 chain doFilter chain doFilter 2020 4 7 44 对请求和响应数据进行替换的过滤器 一个项目开发一个留言板程序 运行中发现2个问题 用户在留言时输入HTML代码 破坏了留言板的正常显示用户输入了不雅的文字希望使用过滤器来解决这2个问题 HttpServletRequest类没有提供对信息修改的方法 我们可以使用包装类 Wrapper 共定义了4个包装类 ServletRequestWrapperServletResponseWrapperHttpServletRequestWrapperHttpServletResponseWrapper包装类是装饰模式的运用 2020 4 7 45 一个例子 Step1 编写MyRequestWrapper javaStep2 编写ByteArrayServletOutputStream javaStep3 编写MyResponseWrapper javaStep4 编写GuestbookFilter javaStep5 准备留言板程序say html process jsp index jspStep6 配置JDBC数据源Step7 创建不雅字句与替换内容的文件Step8 编译源文件 部署过滤器Step9 运行Web应用程序 http localhost 8080 ServletDemo say html 2020 4 7 46 监听器的开发 2020 4 7 47 HttpSessionBindingListener接口 如果一个对象实现了这个接口 那么当这个对象被绑定到Sesion中或者从Session中被删除时 Servlet容器就会通知这个对象 而这个对象在接收通知后 可以做一些初始化或者清除状态的操作 例如 在网络购物应用中 可以让购物车对象实现HttpSessionBindingListener接口 当顾客选购商品时 Web应用程序创建购物车对象 保存在Session中 当顾客没有结帐就离开了站点 或者顾客在浏览商品介绍时 Session超时了 这个时候 Servlet容器就会通知购物车对象 它要从Session中被删除了 购物车对象得到通知后 可以把顾客选购的商品保存到数据库中 当顾客再次来网站购物时 Web应用程序在将购物车绑定到Session中时 servlet容器会通知购物车 此时 购物车可以从数据库中加载先前保存到数据库中的商品信息 顾客会惊奇地发现 以前预购的商品信息仍然存在 2020 4 7 48 HttpSessionBindingListener接口 接口有如下方法 publicvoidvalueBound HttpSessionBindingEventevent 当对象被绑定到Session中 Servlet容器会调用这个方法来通知该对象 publicvoidvalueUnbound HttpSessionBindingEventevent 当从Session中删除对象时 Servlet容器调用这个方法来通知该对象 2020 4 7 49 在线人数统计程序 我们利用HttpSesisonBindingListener接口 编写一个在线人数统计的程序 当一个用户登录后 显示欢迎信息 同时显示当前在线人数和用户名单 当一个用户退出登录或者Session超时发生时 从在线用户名单中删除这个用户 同时将在线人数的总数减一 Step1 编写login htmlStep2 编写UserList java User java OnlineUser java LogoutServlet javaStep3 编译上述4个Java源文件Step4 部署ServletStep5 运行在线人数统计程序http localhost 8080 peoplecount online login html 2020 4 7 50 与Session相关的监听器接口 当session被钝化或激活时 Servlet容器将通知该对象 javax servlet http HttpSessionActivationListener当Session中的属性列表发生改变时得到通知 javax servlet http HttpSessionAttributeListner在Session创建后或者在Session无效前得到通知 javax servlet http HttpSessionListener 2020 4 7 51 与上下文相关的监听器接口 在ServletContext中的属性列表发生变化时得到通知 javax servlet ServletContextAttributeListener在ServletContext初始化或者将被销毁时得到通知 javax servlet ServletContextListener 2020 4 7 52 与请求相关的监听器接口 javax servlet ServletRequestAttributeListener在Servlet请求对象中的属性发生改变时得到通知 javax servlet ServletRequestListener在请求对象初始化时或者将要被销毁时得到通知 2020 4 7 53 JSP开发模式 MVC设计模式JSP开发模式用模式一实现用户登录功能用模式二实现用户注册功能 2020 4 7 54 MVC设计模式 在开发一个软件之前 必须先设计好其架构 一个基本的架构思想是将软件分成不同的模块 问题的关键就是如何划分模块 MVC 模型 视图 控制器 是20世纪80年代为Smalltalk 80编程语言发明的一种软件设计模式 它是一种分离业务逻辑与显示界面的设计方法 MVC的模型 Model 部分负责管理程序的业务数据 视图 View 部分负责显示界面 控制器 Controller 部分则负责与用户进行交互 接受请求和选择响应视图 2020 4 7 55 MVC设计模式 图 2020 4 7 56 JSP开发模式 Model1 2020 4 7 57 JSP开发模式 Model2 2020 4 7 58 用模式一实现用户登录功能 效果 2020 4 7 59 用模式一实现用户登录功能 效果 2020 4 7 60 用模式一实现用户登录功能 效果 2020 4 7 61 用模式一实现用户登录功能 架构 logon jsp为显示登录表单和处理登录请求的页面 登录成功后跳转到logonSuccess jsp页面 登录失败时重新显示登录表单和失败的帮助信息 以便用户重新登录 如果已登录用户再次访问logon jsp login jsp将请求转发给logonSuccess jsp页面 2020 4 7 62 用模式一实现用户登录功能 架构 LogonFormBean java就是封装登录表单信息的JavaBean程序 它可以对各个属性 也就是登录表单内的各个字段中所填写的数据 进行语法格式方面的校验 2020 4 7 63 用模式一实现用户登录功能 架构 UserBean java为代表用户信息的JavaBean程序 logon jsp页面根据登录信息从DbUtil对象中检索出相应的UserBean对象 logonSuccess jsp页面从UserBean对象中提取用户信息进行显示 2020 4 7 64 用模式一实现用户登录功能 架构 DbUtil java是用于访问数据库的辅助类 它相当于一个DAO 数据访问对象 这里用DbUtil类中封装的一个HashTable对象来代替数据库 HashTable对象中的每一个元素即为一个UserBean对象 2020 4 7 65 用模式一实现用户登录功能 架构 logonSuccess jsp是用户登录成功后进入的页面 这里仅仅是显示出登录用户的信息和提供注销用户登录的功能 如果用户没有登录就直接访问logonSuccess jsp页面 logonSuccess jsp将请求转发给logon jsp页面以要求用户登录 2020 4 7 66 用模式一实现用户登录功能 实践 UserBean中仅仅是定义了三个属性 name password和email 注意 要存储在Session域中或跨JVM传输的JavaBean应实现Serializable接口DbUtil类是一个单件类 在整个Web应用程序中只能创建DbUtil类的一个实例对象 在DbUtil类内部预存储了两个用户信息来模拟数据库中的用户记录 LogonFormBean对其中的每个属性进行基本的格式验证 如果有误则将相应的错误信息保存到一个Hash

温馨提示

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

评论

0/150

提交评论