• 1. 第十三章 Servlet编程基础卓越时代
  • 2. 如何编写简单的Servlet程序? doGet()和doPost()有什么区别? JSP程序的基本架构包括哪些内容? servlet中,如何获得对应的HTTP请求报头? JSP和servlet有什么区别?预习检查
  • 3. 为什么需要Servlet使用JSP技术如何编写服务器动态网页?请求 响应JSP 页面 运行执行Java代码 HTML代码 生成JSP 使用 Java 生成动态内容
  • 4. 什么是ServletServlet 是一个 Java程序,是在服务器上运行以处理客户端请求并做出响应的程序请求 响应Servlet 运行于服务器端
  • 5. 什么是Servletimport java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServletTest extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=GBK"); PrintWriter out = response.getWriter(); out.println(""); out.println(" Servlet"); out.println(" "); out.println("你好,欢迎来到Servlet世界"); out.println(" "); out.println(""); out.close(); } }继承HttpServlet类Servlet输出HTML标签和内容导入所 需的包处理请 求的方法将数据 发送给 客户端
  • 6. 请求 响应Java代码 HTML代码 生成运行Servlet 程序servlet的运行机制
  • 7. HttpServlet中的方法HttpServlet继承于GenericServlet 处理HTTP协议的请求和响应 HttpServlet的方法方法名称 功能描述void doGet(HttpServletRequest request,HttpServletRresponse response)以Get请求服务时调用void doPost(HttpServletRequest request,HttpServletRresponse response)以Post请求服务时调用
  • 8. HttpServlet中的方法使用doXxx()接收用户请求 doGet():用户使用get方式提交请求时调用 doPost():用户使用post方式提交请求是调用 import java.io.IOException; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //doGet方法体内容 } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //doPost方法体内容 } }使用Get方法提交,触发doGet()方法使用Post方法提交,触发doPost()方法由service()方法根据表单提交方法自动调用doXxx()方法
  • 9. servlet生命周期生命周期的各个阶段实例化 Servlet 容器创建 Servlet 的实例初始化 该容器调用 init() 方法 请求处理 如果请求 Servlet,则容器调用 service() 方法销毁实例之前调用 destroy() 方法 服务终止
  • 10. servlet生命周期HTTP请求容器12解析请求 345响应6创建Servlet实例 调用init()方法 Servlet调用service()方法 调用destroy()方法 输出响应信息 78
  • 11. Servlet读取HTML表单数据从客户端(浏览器)往Web服务器传递数据,通常可以使用两种方式:表单数据附在URL后HttpServletRequest类常用方法 方法名称 功能描述String getParameter(String param) 获取客户端请求数据void setCharacterEncoding(String encoding)设置输入字符集
  • 12. Servlet读取HTML表单数据 网页表单HTML文件
    姓名:
    密码:
    public class GetPersonData extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { String personName,personPwd; //读取“姓名” personName = request.getParameter("PersonName"); //读取“密码” personPwd = request.getParameter("PersonPwd"); PrintWriter out = response.getWriter(); out.println("User Name:"+personName); out.println("
    "); out.println("Password:"+personPwd); } public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ doGet(request,response); } }创建servlet继承HttpServlet获取客户端请求数据创建out输出对象
  • 13. HTTP报头HTTP报头 浏览器请求和相应数据的时候自动附加的信息附加在请求信息后面的称为HTTP请求报头附加在相应后的信息称为HTTP响应报头通过HttpServletRequest的getHeader()方法来获得对应的HTTP请求报头,只需要给这个方法传递一个HTTP报头的String参数就可以。
  • 14. HTTP报头常用HTTP请求报头请求报头名称 功能描述Accept浏览器可接受的MIME类型Accept-Charset浏览器可接受的字符集;Accept-Encoding浏览器能够进行解码的数据编码方式Accept-Language浏览器所希望的语言种类Authorization授权信息Connection表示是否需要持久连接Content-Length表示请求消息正文的长度Cookie向服务器返回服务器之前设置的cookie信息请求报头名称 功能描述Host初始URL中的主机和端口,可以通过这个信息获得提出请求的机器主机名称和端口号Referer包含一个URL,用户从该URL代表的页面出发访问当前请求的页面User-Agent包含一个URL,用户从该URL代表的页面出发访问当前请求的页面User-Agent浏览器相关信息If-Modified-Since只有当所请求的内容在指定的日期之后又经过修改才返回它Pragma指定“no-cache”值表示不使用浏览器的缓存,即使它是代理服务器而且已经有了页面的本地拷贝
  • 15. getHeader()方法外,HttpServletRequest中还有一些方法用于获得请求头信息 getHeaderNames():使用这个方法可以得到一个包含了所有的请求头名称的Enumeration类型的值; getHeaders():这个方法用于在一个请求头对应多个值的情况。 getDateHeader()和getIntHeader():使用这两个方法,可以将读取出来的请求头的信息转换成Date或者int值。HTTP报头
  • 16. servlet中设置HTTP响应头setHeader(String headerName,String headerValue);指定响应报头的名称指定响应报头的值设置HTTP响应报头setDateHeader(String headerName, long ms)setIntHeader(String headerName, int headerValue)用于设置日期用于设置整形数据格式
  • 17. servlet中设置HTTP响应头setContentType(String mime)这个方法用于设置Content-Type报头。我们通常使用这个方法来设置servlet的MIME类型,甚至字符编码(Encoding)。setContentLength(int length)设置Content-Length报头。addCookie(Cookie c)设置Set-Cookie报头。addCookie(Cookie c)设置Location报头,让servlet跳转到指定的url。
  • 18. 利用servlet动态生成图片 ...... response.setContentType("image/jpeg"); response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires",0); OutputStream out = response.getOutputStream(); int width=80, height=20; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); Random random = new Random(); g.fillRect(0, 0, width, height); g.setFont(new Font("Times New Roman",Font.ITALIC,18)); String sRand = ""; ...... 设置Content-Type响应头 指定宽、高BufferedImage对象 生成随机类 ...... for (int i=0;i<4;i++){ String rand = String.valueOf(random.nextInt(10)); sRand += rand; g.setColor(new Color(20 + random.nextInt(110),20 + random.nextInt(110),20 + random.nextInt(110))); g.drawString(rand,20*i + 6,16); } g.dispose(); mageIO.write(image, "JPEG", out); ......设置字体 设置随机颜色 输出图象到页面绘制
  • 19. servlet中跳转到其他的页面用户登录跳转到B页面或者返回到登录页面跳转到A页面是否是合法用户否是即从一个servlet“切换”到另一个页面跳转 HttpServletResponse的sendRedirect()
  • 20. 1345浏览器请求一个servlet2servlet执行执行到sendRedirect()方法时,通知浏览器请求新的URL浏览器提出新的请求服务器再根据浏览器端的新的请求做出响应servlet中跳转到其他的页面
  • 21. servlet中跳转到其他的页面public class Redirect extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if(request.getParameter("Dir").equals("login")) response.sendRedirect("/S12JAVAANJOYO/Login.htm"); else response.sendRedirect("Img"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
  • 22. servlet中跳转到其他的页面RequestDispatcher类 作用:实现请求转发 使用步骤 获取RequestDispatcher类 实现转发 RequestDispatcher dispatcher = request.getRequestDispatcher(url); //参数url是欲转发的页面或者Servlet的URL地址dispatcher.forward(request, response);这个方式不需要在服务器端和浏览器端进行通信,在浏览器地址栏里也无法反映实际的URL
  • 23. ...... public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher rd; if(request.getParameter("Dir").equals("image")) { rd = request.getRequestDispatcher("Img"); rd.forward(request,response); }else{ rd = request.getRequestDispatcher("Test"); rd.forward(request,response); } } ......servlet中跳转到其他的页面
  • 24. HTTP报头解决中文问题public class ChineseHelloWorld extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{ response.setContentType("text/html;charset=GBK"); PrintWriter out = response.getWriter(); out.println("你好!"); } public void doPost(HttpServletRequest request, HttpServletResponse response) hrows ServletException,IOException{ doGet(request,response); } }
  • 25. HTTP报头解决中文问题
    public class ChineseHelloWorld extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{ request.setCharacterEncoding("GBK"); response.setContentType("text/html;charset=GBK"); PrintWriter out = response.getWriter(); out.println(request.getParameter("cn")); out.println("你好!"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{ doGet(request,response); } }读取表单数据之前编码设置成“GBK”设置客户端输出中文的编码
  • 26. 生活中的Cookie浏览购物网站查看不同商品时,系统会自动记录已经浏览过的商品
  • 27. 什么是CookieCookie是Web服务器保存在客户端的一系列文本信息 Cookie的作用 对特定对象的追踪 统计网页浏览次数 简化登录 安全性能 容易信息泄露
  • 28. Cookie语法导入包 创建Cookie parameter:用于代表cookie的名称(key) value:用于表示当前key名称所对应的值 写入Cookie Cookie newCookie=new Cookie("parameter", "value");response.addCookie(newCookie)import="javax.servlet.http.Cookie"
  • 29. servlet中处理cookie方法名称说 明getMaxAge()/setMaxAge()读取/设置cookie的过期时间。如果使用setMaxAge()方法设置了一个负值,表示这个cookie在用户退出浏览器后马上过期,如果setMaxAge()指定一个0值,表示删除此cookiegetValue()/setValue()读取/设置cookie属性值 getComment()/setComment()读取/设置注释addCookie()接收一个Cookie类型的值,并将这个Cookie发送到客户端getCookies()从客户端获得这个网站的所有的CookiesetMaxAge()修改它的生命周期,这个方法接收一个以秒为单位的整数,表示这个cookie可以在客户端的保存时间
  • 30. servlet中处理cookie有一个表单用于接收用户的登录,用户可以选择保存用户名和密码,这样用户下次就可以不用输入用户名和密码而直接登录了。12
  • 31. servlet中处理cookie String cookieName = "userName"; String cookiePwd = "pwd"; Cookie[] cookies = request.getCookies(); String userName = ""; String pwd = ""; String isChecked = ""; if(cookies!=null){ isChecked = "checked"; for(int i = 0;i
  • 32. servlet中跟踪会话状态session(会话)给每个客户端分配一个不重复的ID用来区分不同的客户端,而将对应各个客户需要保存的数据保存在服务器的内存中。 servlet中,session是封装在javax.servlet.http.HttpSession这个接口中的。 HttpSession的实例,可以通过HttpServletRequest的getSession()方法来获得 getSession()getSession(true)getSession(false)如果对应的客户端已经有对应的session,那么返回这个旧的session,否则,不会产生新的session。如果对应的客户端已经产生过一个session,那么就会返回这个旧的session,否则,这个方法将产生一个session ID并且和对应的客户端绑定在一起。
  • 33. servlet中跟踪会话状态方法说 明Object getAttribute(String name)从session中返回指定name的属性的值,如果指定的name属性不存在,则返回nullvoid setAttribute(String name,Object value)在session中设置名称为name的属性,属性值为一个对象 valuevoid removeAttribute(String name)从session中删除指定名称name的属性void invalidate()废除整个session,并且释放session关联的对象boolean isNew()用于检测此session是否为新创建的long getLastAccessedTime()返回绘画最后被客户端程序访问的时间getComment()/setComment()读取/设置注释HttpSession中的方法
  • 34. servlet中跟踪会话状态用户通过一个登录表单登录,然后,如果用户通过验证,则产生一个session,将用户的一些信息保存到HttpSession对象中。然后,再用一个servlet将保存到session中的信息取出来,如果能够取得对应的session信息,那么,说明用户已经登录了,否则,说明没有登录,就跳转到登录表单的页面让用户登录。
  • 35. servlet中跟踪会话状态 //验证登录者身份, //如果合法用户就产生一个session来放置其登录名 //验证过程此处省略 //如果用户输入了用户名,则将其放在session中 if(request.getParameter("userName")!=null){ HttpSession session = request.getSession(); session.setAttribute("userName", request.getParameter("userName")); } response.setContentType("text/html;charset=GBK"); PrintWriter out = response.getWriter(); out.println("Session已经创建"); out.println("
    "); out.println("转到其他页面"); 获得session会话对象session中设置名称为userName的属性 response.setContentType("text/html;charset=GBK"); PrintWriter out = response.getWriter(); String user = ""; HttpSession session = request.getSession(false); if(session!=null) { user = (String)session.getAttribute("userName"); out.println("获得创建的Session"); out.println("
    "); out.println("登录名:"+user); } else{ response.sendRedirect("../SessionLogin.htm"); } 获取已经创建的session若session能够取到,说明用户已经登录 否则跳转到登录页面让用户登录
  • 36. ServeltConText接口 获取Servlet上下文,指的是servlet的运行容器(运行环境) ServeltConText接口的常用方法 方法名称 功能描述String getRealPath(String path)这个方法将会把虚拟路径path转换成物理路径void removeAttribute(String name)从servlet上下文中删除对应“name”的属性ServletContext getContext(String path)返回服务器上与指定URL相对应的ServletContext对象void setAttribute(String name,Object obj)设置Servlet中的共享属性Object getAttribute(String name)获取Servlet中设置的共享属性ServletContext接口
  • 37. ServletContext接口统计访问某网站的人数?分析:我们假设有一个FirstServlet的程序,是所有客户端访问这个应用一定会首先访问的。每当有客户访问这个程序的时候,我们在这个程序中将访问数加上1,然后保存到servlet上下文中,这样,在这个应用中的任何程序都可以访问到这个计数器。
  • 38. ServletContext接口 ServletContext ctx = this.getServletContext(); synchronized(this) { Integer counter = (Integer)ctx.getAttribute("UserNumber"); int tmp = 0; if(counter == null) { counter = new Integer(1); }else { //取出原来计数器的值加上1 tmp = counter.intValue()+1; counter = new Integer(tmp); } ctx.setAttribute("UserNumber",counter); }判断此次访问是否为第一次访问获得ServletContext对象设置Servlet中的共享属性 ServletContext ctx = this.getServletContext(); Integer counter = (Integer)ctx.getAttribute("UserNumber"); response.setContentType("text/html;charset=GBK"); PrintWriter out = response.getWriter(); out.println(""); out.println("访问人数统计"); out.println(""); if(counter != null) { out.println("已经有"+counter.intValue()+"人次访问本网站!"); } else{ out.println("你是第一个访问本网站的!"); } out.println(""); } 获取Servlet中设置的共享属性
  • 39. JSP和Servlet的关系 以后对JSP的访问都会直接去执行对应的编译好的Servlet文件,而不是再次转换和编译它,除非你修改了原来的JSP文件或者改动了它的修改日期这个属性。应用 服务器IEIE从服务器端检索到的信息返回响应客户端的请求信息发送请求访问数据库返回结果 JSP转换成servlet文件1JSP执行 234JSP被编译后
  • 40. 总结如何编写简单的Servlet程序? doGet()和doPost()有什么区别? JSP程序的基本架构包括哪些内容? servlet中,如何获得对应的HTTP请求报头? JSP和servlet有什么区别?
  • 41. 谢谢浏览