javaEE基础教程.ppt
Servlet技术,Java EE 技术架构,Day 1 大纲,Web编程模型Http协议Get请求和Post请求Servlet概述Web服务器Servlet的配置文件Servlet的调用过程Servlet的接口Web容器概述Web容器实现,B/S编程模型,B/S编程模型Browser(客户端)代理客户端发送http请求接收服务器端响应显示html文本客户端-服务器端通信协议:http服务器(Server)端处理客户端的请求发回http响应,HTTP协议,简介HTTP:HyperText Transfer Protocol,超文本传输协议,在RFC2616中定义是Web应用程序的基础,是应用层协议,基于tcp/IP版本:HTTP1.1Http的缺省端口是80Http特点是:无状态、无连接,HTTP协议,1.连接到服务器,3.发送响应,4.关闭连接,Web 服务器,客户机,2.发送请求,HTTP 通信的四个阶段,HTTP 举例,URL(Uniform Resource Locator,统一资源定位符):协议名+DNS名+请求的文件名http:/home/index.html浏览器向DNS服务器询问 的IP地址DNS的回复是浏览器与上的80端口建立一个TCP连接浏览器发送一个请求,要求获取文件/home/index.html服务器发送文件/home/index.html(服务器的响应)TCP连接被释放浏览器显示/home/index.html中所有的文本浏览器取回并显示该文件中的所有图片,Http请求,浏览器代理用户发出Http请求地址栏:http:/http:/?complete=1&hl=zh-CN&q=google&meta=表单提交,Http请求,表单提交http请求示例:,请登录 用户名 密相当于:http:/localhost:8080/myapp/loginValidator.jsp?UserName=tomloginValidator.jsp?UserName=tom&Password=1123456,Http请求,请求数据请求头等:浏览器及客户端相关信息,如:http协议版本(1.1)浏览器?支持哪些类型文档类型?支持哪些字符集?客户机地址是多少?用户数据请求文件(资源)请求参数形式:名字=值两种方法(method):Get Post,Http请求,Get方法与Post方法发送请求示例,Get方法示例:GET/myapp/loginValidator.jsp?UserName=tom&Password=123456 HTTP/1.1Host:其它请求头BODYEMPTYPost方法示例:POST/ibm-demo/loginValidator.jsp HTTP/1.1Host其它请求头BODYUserName=tom&Password=123456,Http请求,Get与Post方法的区别Get方法:用户数据作为 URL 中的查询字符串传递给服务器,而body中的数据为空Post方法:用户数据在body中传输给服务器因此:Get方法所传输的数据量有限制,Post方法则没有限制Get方法所传输的数据在url中可见,post则不可见,Http小结,http是B-S之间传输数据的协议http请求请求头相关Get/Post方法用户相关数据请求资源可以是:html,jsp,servlet输入数据Get/Post方法传输形式:name=valuehttp响应响应头相关响应数据:html文档,动态技术,动态技术web服务器只能向客户提供静态的资源,但动态处理更为重要服务器端动态处理常见技术CGI(Common Gateway Interface):公共网关接口PHP(HyperText Preprocessor):超文本处理器ASP(Active Server Page):活动服务器页面Servlet(JSP-Java Server Page):java 服务器页面,Servlet概述,Servlet是一种 Java 编程对象能够处理请求和响应的方法是一个强大的,可以替代 CGI 的技术课程内容专注于开发Servlet来解决现实世界的问题讨论Servlet开发相关的问题介绍主要的基于Servlet相关功能的Web服务,Servlet 处理请求和响应,Servlet 为实现基于Http协议的请求和响应,扩展出具体的子类HttpServletHttpServlet 类是专门用于处理基于Http协议的Servlet,Http 与 Servlet,HttpServlet示例,import java.io.*;import javax.servlet.*;import.*;public class HelloWorldServlet extends HttpServlet public void doGet(HttpServletRequest req,HttpServletResponse res)res.setContentType(text/html);try PrintWriter out=res.getWriter();out.println();out.println(Hello World);out.println();out.println(Hello World);out.println();out.close();catch(IOException ioe)getServletContext().log(ioe,Error in HelloWorld);public void doPost(HttpServletRequest req,HttpServletResponse res)doGet(req,res);,上例HelloWorldServlet继承HttpServletHttpServlet实现了接口HttpServlet 类是专门用于处理基于Http协议的ServletServlet还可以处理Http以外的其他类型的请求,HttpServlet,Servlet的配置文件,Web.xml是web应用的部署描述文件,Servlet的配置,Servlet类在web.xml中的配置容器通过这个配置获取Servlet的信息,从而管理Servlet对象,示例:WelcomeServlet WelcomeServlet helloWordServlet servlet.HelloWorldServlet helloWordServlet/WelcomeServlet注意请求url与间的关系:http:/localhost:8080/myapp/WelcomeServlet,Servlet的调用,在JSP页面的表单中,通过调用Servlet:,请登录 用户名 密相当于:http:/localhost:8080/myapp/WelcomeServlet?UserName=tom&Password=1123456,Servlet 接口,Servlet接口是Web 容器和 Servlet 之间的合约所有 Servlet 都应直接或间接实现这个接口 该接口定义了容器管理 Servlet 生命周期的 方法,public void init(ServletConfig config)throws ServletExceptionpublic void service(ServletRequest req,ServletResponse res)throws ServletException,public void destroy()public ServletConfig getServletConfig()public getServletInfo(),Servlet 的类层次结构,Generic Servlet 类,抽象类,提供 servlet 接口的基本实现public abstract class GenericServletimplements Servlet,ServletConfig,定义以下方法,public init()public void log(String)public void log(String,Throwable)public abstract void service(ServletRequest req,ServletResponse res)throws public ServletConfig getServletConfig();public ServletContext getServletContext();,HttpServlet 类,特定于 HTTP 的 Servlet 接口实现对于每种类型的 HTTP 请求方法,HttpServlet 类提供相应的 doXxx()方法service方法中调用相应的doXxx()方法程序员重写doXxx()方法一般不重写service方法,HttpServletRequest,该类是客户端http请求信息的抽象与封装请求头相关信息用户相关数据信息请求资源提交的数据其它获得session对象:request.getSession()-HttpSession获得请求分派对象request作用域request.setCharacterEncoding(“gb2312”);,HttpServletRequest,获得用户相关数据信息:,示例:http:/localhost:8080/demo/login.jsp?name=tom/demo/login.jsp request.getRequesURI()http:/localhost:8080/demo/login.jsp request.getRequestURL()name=tom&age=18 request.getQueryString(),HttpServletRequest,获得用户数据信息获得用户提交数据request.getParameter(“name”);/获得名为”name”的参数值request.getParameterValues(“name”);/获得同名name的一组参数值,返回类型是String,HttpServletRequest,获得用户提交数据,姓名:受好:听音乐 看电影 玩游戏 上网聊天 在loginAction中:request.getParameter(“name”);/获得用户输入的姓名request.getParameterValues(“favor”);/获得用户选择的所有受好,HttpServletResponse,通过HttpServletResponse设定Http响应设置响应状态设置响应头响应文本首先设置响应头response.setContentType(text/html;charset=GBK);获得输出对象文本:PrintWriter out=response.getWriter();二进制:ServletOutputStream out=response.getOutPutStream()构造输出内容:out.println(“”)提交输出:out.flush()关闭out,HttpServletResponse,构造响应示例,在doGet(doPost)方法中:response.setContentType(“text/html;charset=GBK”);/1设置响应头PrintWriter out=response.getWriter();/2.获得输出对象out.println(“”);/3.构造输出out.println(A Servlet);out.println();out.print(Hello World!);out.println(,欢迎你);out.println();out.println();out.flush();/4.向容器提交输出out.close();/5.关闭输出流,HttpServletResponse,Http状态码:用于服务器将请求的状态传送给客户机100-199:临时状态码200-299:请求成功300-399:重定向400-499:客户端错误500-599:服务器端错误设置状态码的方法:setStatus(int sc)HttpServletResponse中静态变量定义Http状态码:SC_OK 200 SC_MOVED_TEMPORARILY 302 SC_NOT_FOUND 404SC_INTERNAL_SERVER_ERROR 500,HttpServletResponse,设置状态码response.setStatus(int sc)发送错误消息response.sendError(int,String)例response.sendError(HttpServletResponse.SC_NOT_FOUND,”你所要查找的网页不存在!”),HttpServletResponse,设置响应头:setHeader(“name”,value);常见响应报头Content-Type:定义响应文档的MIME(Multipurpose Internet Mail Extension)类型,由maintype/subtype组成有专门的方法设置该响应头:setContentType示例:(p142),response.setContentType(“text/html;charset=GBK”);/最常见形式response.setContenType(“application/vnd.ms-excel”);/excel文档response.setHeader(Content-Type,application/vnd.ms-excel;charset=GBK);response.setContenType(“image/jpeg”);/图形图像,HttpServletResponse,使用servlet生成jpeg图像关键代码,response.setContentType(“image/jpeg”);/1.设定响应的文档是图像/生成JPEG图像int width=60,height=20;BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);/2.创建BufferedImage对象Graphics g=image.getGraphics();/3.获得图形对象/4.使用g上的相关方法生成图形/5.输出图象到页面 ImageIO.write(image,JPEG,response.getOutputStream();,HttpServletResponse,重定向方法一:设置状态码,如302设置响应头:location方法二:sendRedirect示例,response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);response.setHeader(Location););,HttpServletResponse,告诉浏览器不要缓存页面,response.setHeader(“Cache-control”,”no-cache”);response.setHeader(“pragma”,”no-cache”);,HttpServletResponse,页面重新刷新,response.setIntHeader(“Refresh”,10);response.setHeader(“Refresh”,”10,url=http:/”);,Web容器是Web程序运行的环境,一般由具体的服务器程序实现具体的功能Web容器功能:生成并管理相关对象,供Servlet使用管理 Servlet 生命周期,提供Servlet的运行环境充当 Web 服务器和 Servlet 之间的桥梁将请求从 Web 服务器转发到 Servlet将响应从 Servlet 转发到 Web 服务器,Web 容器概述,IBM 的 Web Sphere Application ServerBEA 的 Web LogicSun Microsystems 的 iPlanet Application ServerSun 的 J2EE Reference ImplementationJakarta TomCat ServerJboss,Web 容器实现,Servlet基础小结,Servlet基础小结Web.xml:部署描述文件配置web应用,如描述了Servlet配置容器通过它获得应用程序的配置信息容器管理servlet对象调用servlet对象上的方法Servlet必须实现Servlet接口在doGet/doPost方法中通过HttpServletRequest获取用户请求信息完成业务功能通过HttpServletResponse作出响应,Day 2 大纲,Servlet生命周期ServletRequestServletContextServletConfigServlet的资源访问概述requestDispacher详解sendRedirect详解,Servlet生命周期,容器管理Servlet依据web.xml接口Servlet中三个方法 init()、service()、destroy()管理1、加载和实例化容器启动时,且配置了:1容器接收到客户端请求2、初始化容器调用该 Servlet 对象的 init()3、请求处理 容器调用 service()方法4、服务终止,容器调用 destroy()方法,Servlet生命周期,Servlet生命周期,测试:容器启动时创建了Servlet对象(HelloWorld.java),HelloWorld servlet.HelloWorld username sa password sa 1public void init()throws ServletException System.out.println(helloWorld Servlet init!);,ServletRequest,ServletRequest接口定义了一个对象,该对象用于为Servlet提供客户端请求信息Servlet容器创建一个ServletRequest对象,并将其作为参数传递给Servlet的service()方法扩展ServletRequest的接口能够提供附加的协议相关的数据,例如,HttpServletRequest对象提供HTTP数据,ServletContext,ServletContext接口定义了一个Servlet环境对象,提供了访问Web程序背景信息Servlet容器在启动时加载Web应用,并为每个Web应用创建唯一的一个ServletContext对象,可以把该对象看做一个Web应用程序,在服务器端的共享内存Servlet对象只在Web应用被关闭的时候才销毁,不同Web应用,ServletContext各自独立存在在Servlet中,我们可以通过以下代码得到具体的对象,等价于 JSP 中的 application 隐式对象 ServletContext application=this.getServletContext();,ServletContext,ServletContext对象能够访问Web项目的 1、初始化参数2、存储在ServletContext中的对象3、Web项目中的资源文件4、日志总结:ServletContext即Servlet容器,提供的方法可以再同一个Web应用下的所有Servlet中使用,ServletConfig,ServletConfig接口提供了让一个Servlet访问Web应用中配置信息的方法一个ServletConfig对象只能在一个Servlet中使用可以使用下面方法读取一个Servlet在web.xml中的初始化参数 config.getInitParameter(paramName);,Servlet的资源访问,Servlet配置信息配置信息在web.xml中完成配置信息抽象为接口ServletConfig容器在 Servlet 的初始化过程中将创建 ServletConfig 对象,并传递给 Servlet,ServletConfig接口:public String getInitParameter(String);Enumeration getInitParameterNames();public ServletContext getServletContext();public getServletName();,Servlet配置信息,在程序中使用ServletConfig对象获得ServletConfig对象:一般在init方法中获取,并将之作为一个成员变量获得Servlet初始化参数,public void init()throws ServletException/Put your code here ServletConfig sc=this.getServletConfig();在doGet方法或doPost方法中:String username=sc.getInitParameter(username);String password=sc.getInitParameter(password);,RequestDispatcher详解,RequestDispatcher接口,include(ServletRequest,ServletResponse)forward(ServletRequest,ServletResponse),RequestDispatcher,include示例,在ServletA中包含HeaderServlet与FooterServlet,在ServletA的doGet(doPost)方法中:ServletContext context=getServletContext();RequestDispatcher rd=context.getRequestDispatcher(/servlet/HeaderServlet);/包含头部rd.include(request,response);out.println(“in servletA”);/包含尾部RequestDispatcher rd1=context.getRequestDispatcher(/servlet/FooterServlet);rd1.include(request,response);,RequestDispatcher,forward示例:在ServletAction中根据处理结果将请求转发至成功页面或失败页面,在ServletAction的doGet(doPost)方法中:ServletContext context=getServletContext();RequestDispatcher rd=null;/进行处理If(ok)rd=context.getRequestDispatcher(/success.jsp);else rd=context.getRequestDispatcher(/fail.jsp);rd.forward(request,response);,Day 3 大纲,Cookie概述Cookie使用的三个步骤Cookie的机制Cookie的安全问题Session概述Session使用的四个步骤Session跟踪机制Session与Cookie的对比,Cookie概述,cookie 是 Web 服务器发送给客户机的一段文本信息,它存储在客户机的硬盘上,对于发送给同一服务器的后续请求,由客户机返回服务器通过cookie的响应头将cookie发送给客户机,其形式为名称=值客户机则以文件的形式将cookie存放在本地硬盘上,具体存储位置与浏览器相关,HTTP/1.1 200OKSet-Cookie:CustomerID=1234;domain=;path=/salesExpires=True,29-Apr-2009 07:42:12 GMT,Cookie使用的三个步骤,使用Cookie创建cookie对象,并设置存活时间:Cookie cooker=new Cookie(“color”,”red”);Cooker.setMaxAge(30*60);在响应中加入cookie:response.addCookie(cooker);通过request取回cookieCookie cookie=request.getCookies();,Cookie示例,Cookie使用示例:,示例:记录用户访问次数Cookie c=request.getCookies();int count=1;if(c!=null)for(int i=0;ic.length;i+)Cookie accountCookie=ci;if(accountCookie.getName().equals(accountCount)count=Integer.parseInt(accountCookie.getValue()+1;break;response.addCookie(new Cookie(accountCount,String.valueOf(count);,Cookie的机制,Cookie是在Servlet代码中手动创建,并在响应对象中发送给浏览器浏览器会将Cookie的key/value保持在某目录下的文本文件内,下次请求同一个页面的时候,就发送该Cookie给服务器。Cookie包含在请求和响应对象的头信息中,Cookie的安全问题,有人认为Cookie是不安全的,理由如下:识别不准确 用户登陆信息保存在本机的文本文件中,会暴露用户隐私信息(如用户名、计算机名、浏览器、曾经访问的网站等)用户可以通过浏览器中设置,禁用Cookie,使在后台Servlet中的Cookie相关的代码失效,Session概述,HTTP 协议特点:无状态协议每个客户端请求,对服务器而言都是新的服务器不记住客户端的任何信息这样的协议适用于在web上快速获取信息,同时,HTTP协议不支持维护客户机状态在线购物特点:服务器应能识别出每个客户的不同的购物车会话:会话是在指定阶段来自同一客户的一系列的HTTP请求会话跟踪:将一个请求与会话关联的过程会话管理:对容器要求识别来自同一客户的请求维护每个客户的状态,一般原理会话唯一标识:sessionID常用技术Cookie隐藏表单域url重写http:/localhost:8080/myapp/ServletA?sessionID=.使用session进行会话管理,会话管理技术,Session使用的四个步骤,获得获取属性设置属性销毁,获得Session对象,通过request对象获取Session对象,HttpSession session=request.getSession();容器:1、Servlet通知容器,它需要Session对象;2、容器创建sessionID,它是客户这次会话的唯一标识;3、容器创建HttpSession对象,Servlet获得这个对象,Session跟踪机制,通过request对象获取Session对象,HttpSession session=request.getSession();容器:1、Servlet通知容器,它需要Session对象;2、容器创建sessionID,它是客户这次会话的唯一标识;3、容器创建HttpSession对象,Servlet获得这个对象,会话超时阶段,定义:来自参与会话的客户机的两个连续请求之间的最长允许空闲时间称为会话超时阶段,10session.setMaxInactiveInterval(10);,HttpSession 接口,Session接口,setAttribute(String,Object)/往session中保存数据getAttribute(String)/得到保存在session 中的数据getID();/得到 Session idgetMaxInactiveInterval()/得到 session 对象有效时间setMaxInactiveInterval(int)/设置 session 对象有效时间isNew()/判定一个 session 是否是新的 session 对象invalidate()/禁用sessionremoveAttribute(String name)/删除保存在session中的数据,Session示例,登录Index Servlet及LoginAction Servlet,/在LoginAction中:/根据用户名与密码,查找用户是否合法if(合法)User user=;HttpSession session=request.getSession();session.setAttribute(“user”,user);else/让用户重新登录/在index中HttpSession session=request.getSession();User user=(User)session.getAttribute(“user”);if(user!=null)/用户已登录成功/转向显示用户信息页面else/转向用户登录页面,Session与Cookie的对比,Session和Cookie都可以在可控的时间内,保存用户提交的数据Cookie在客户端保存数据,不安全Session在服务器端保存数据,不受客户端影响在Cookie中保存的数据量有限,不超过4kb。Session没有限制建议多使用 Session,总结,会话跟踪是Web处理的重要组成可以使用四种方法,分别是:Cookie、隐藏表单域、URL重写、Session跟踪Cookie由于安全性不高,要慎重使用Session在使用的时候,保存数据注意不要重名,取出数据,要注意类型转换,Day 4 大纲,过滤器(Filter)概述Filter的基本思想Filter的配置Filter开发的步骤监听器概述ServletContext监听器详解HttpSession监听器详解ServletRequest监听器详解监听器的作用监听器的开发步骤,Filtering概述,Filtering是Servlet2.3以上版本的特性主要内容:Filtering的基本思想Filtering APIFiltering的实现,基本思想,Filtering的基本思想:将jsp,servlet,html看作资源,容器用来处理这些资源,并为资源提供服务因此,可以在处理这些资源之前或之后,通过过滤器增加一些通用功能;比如:拦截请求头:安全认证,日志数据转换:加密,解密抢占特殊资源的服务:缓存而且这些过滤器可以形成一个链,基本思想,将jsp,servlet,html看作资源,基本思想,Filtering构成处理链,filtering API,接口:接口:接口:,filtering API,Filter接口,public void init(FilterConfig config)throws ServletExceptionpublic void doFilter(ServletRequest req,ServletResponse res,FilterChain chain)throws IOException,ServletExceptionpublic void destroy(),filtering API,FilterChain接口,public void doFilter(ServletRequest request,ServletResponse response)throws,ServletException,FilterConfig,public getFilterName()public ServletContext getServletContext()public getInitParametername)public getInitParameterNames(),filtering API,创建filter第一步:创建一个类,实现接口第二步:配置web.xml文件,filtering API,Filtering配置,Web.xml中文件的配置Filter定义:名字,Filter类Filter映射:要处理哪类资源,charencode servlet.CharEncodingFilter charencode/*,Filtering示例,CharEncodingFilter,public class CharEncodingFilter implements Filter private FilterConfig filterConfig;public void init(FilterConfig filterConfig)throws ServletException this.filterConfig=filterConfig;public void doFilter(ServletRequest request,ServletResponse response,FilterChain filterChain)throws IOException,ServletException System.out.println(in filter);request.setCharacterEncoding(gb2312);response.setCharacterEncoding(gb2312);response.setLocale(Locale.SIMPLIFIED_CHINESE);filterChain.doFilter(request,response);System.out.println(in filter);public void destroy()this.filterConfig=null;,Filtering示例,URL模式,Filtering工作时序图,client,HelloFilter,CharRespnseWrapper,resources,1.get,2.New wrapper,3.doFilter,4.service,5.toString,6.html,事件模型,事件:getSource()-Object事件侦听程序:(标志)接口:实现listener接口事件源:注册侦听程序触发事件侦听程序生成事件对象调用已注册的侦听程序,处理事件,HttpSessionListener,事件(类):HttpSessionEventgetSession侦听器(接口):HttpSessionListenersessionCreated(HttpSessionEventse)sessionDestroyed(HttpSessionEventse),HttpSessionListener,示例实现接口HttpSessionListener注册侦听,在web.xml中注册侦听程序 servlet.OnlineCounterListener,HttpSessionListener,示例:利用HttpSessionListener实现网站在线人数统计功能,public class OnlineCounter private static long online=0;public static long getOnline()return online;public static void raise()online+;public static void reduce()online-;public class OnlineCounterListener implements HttpSessionListener public void