• 1. JSP高级编程
  • 2. 第一讲 简介
  • 3. 1.1 动态网站技术 动态网站的需求 传统的CGI ASP技术
  • 4. 1.2 Sun 的企业级解决方案 Servlet技术 Servlet的优势 -- 运行效率高 -- 可移植 -- 廉价 -- 安全 -- 主流
  • 5. JSP技术 (JavaServer Pages) 关于容器 系统文件servlet容器浏览器
  • 6. 容器种类 Standalone默认管理者Servlet管理者JSP管理者
  • 7. In-process Out-of-process
  • 8. 1.3准备运行环境安装配置JDK 安装配置Tomcat
  • 9. 1.4编写运行第一个Servlet/JSP程序 创建HelloWorld Servlet 创建目录结构 -- /WEB-INF/web.xml -- /WEB-INF/classes -- /WEB-INF/lib/package com.edu_a.example import java.io.*; import javax.servlet.*; import javax.servlet.http.*;   public class HelloWorld extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {   response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(""); out.println("Hello, World!"); out.println(""); out.println("

    Hello, World !

    "); out.println(""); out.println("") out.close(); } }
  • 10. 1.5 Web应用程序的构成 JSP/Servlet的规范 配置文件 静态文件和JSP/Servlet 类文件和包
  • 11. 本章总结: 本章主要对Servlet和JSP作了较为简单的介绍.同时以Tomcat为例配置了相应的Web应用环境 本章重点: 了解运行环境Tomcat
  • 12. 第二讲 Servlet基础
  • 13. 什么是servlet? Servlet的优点是什么?Servlet是针对CGI的问题而设计的,用于创建高性能的、健壮 的服务器端程序。 Servlet有自己的生命周期,使用多线程而不是昂贵的进程处理 客户请求,因而大大提高了性能
  • 14. 2.1 javax.servlet包javax.servlet包中的接口 javax.servlet包中的类 javax.servlet包中的异常
  • 15. 2.2 servlet生命周期
  • 16. Servlet的生命周期是由Servlet 服务器负责管理的 方法 Init() Destroy() getServletConfig() getServletInfo() Service()
  • 17. Package com.edu_a.example; Import javax.servlet.*; Import java.io.IOException; Public class ServletLife implements Serclet { puvlic void init(ServletConfig config) throws ServletException { System.out.println(“调用init()…….”); } public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException { System.out.println(“调用service()…….”); } public void destroy(){ System.out.println(“调用destroy()…….”); } public String getServletInfo(){ return null; } public ServletConfig getServletConfig(){ return null; } }
  • 18. 2.3 ServletRequest/ServletResponse接口ServletRequest接口 声明方法 getParameterNames() 取得参数名称 getParameter() 取得特定参数的参数值 getRemoteAddress() 取得远程主机的地址 getRemotedHost() 取得远程主机名称
  • 19. ServletResponse接口 主要方法 getWrite()
  • 20. 2.4 GenericServlet包装类包装类(Wrapper)– GenericServlet实现的接口 Servlet ServletConfig java.io.Serializable
  • 21. 2.5 Servlet配置信息获取Servlet的配置信息 方法及用途 getInitParameter() 取得Servlet起始参数值(String) getInitParameterNames() 取得Servlet起始参数名(Enumeration) getServletContext() 取得ServletContext对象(ServletContext) getServletName() 取得Servlet的名称(String) 保留Servlet的配置信息
  • 22. 2.6 ServletContext 接口初始化Web应用参数 获取容器的信息 使用绑定在Servlet间共享信息
  • 23. 本章总结 介绍Servlet的基础,以及接口与类. 本章重点 ServletRequest接口 ServletResponse接口 ServletContext接口
  • 24. 第三讲 HttpServlet
  • 25. 3.1 Http协议Http ---- Hypertext Transfer Protocol 生活类比: 人与人交流大多靠语言:中国人用中文交流,美国人用英文交流;而如果你只会中文,而你想交流的美国人不会中文,你们就无法交流,因为你们的语言不通!语言是有一定的结构、语义等,这些规则就是协议 请求 . 响应和头信息 例如: GET/index.html HTTP/1.0 GET 是HTTP已经定义的方法 /index.html 是资源的名称 HTTP/1.0 是客户端使用HTTP协议的版本号
  • 26. 3.2 HttpServlet 包HttpServlet类 该类继承GenericServlet类,并增加了7个方法: doGet() doPost() doPut() doHead() doOptions() doDelete() doTrace()
  • 27. doGet方法 doPost方法当客户端发送HTTP请求使用GET方法时就调用doGet()方法。 HTTP的缺省方法就是GET。 当客户端发送HTTP请求使用POST方法时就调用doPost()方法。
  • 28. 3.3 HttpServletReponse 接口控制HTTP响应报头 addHeader() containsHeader() setHeader() setIntHeader() setDateHeader() addIntHeader() addDateHeader()
  • 29. 响应报头 含义 响应报头 含义 Allow 指定服务器所支持的请求类 Catch-Control 告诉浏览器或其它客户在什么环境下可以安全地缓存文档 Content-Encoding 指明页面在传输过程中所使用的编码方式 Content-Length 指明响应中的字节数 Content-Type 给出响应文档的MIME(多用因特网邮件扩展)类型。 Expires 这个报头规定内容的过期时间,从而不需继续缓存 Refresh 指明浏览器应该多长时间之后请求最新的页面 WWW-Authenticate 它告诉浏览器,客户应该在Authorization报头中提供哪种验证类型(BASIC或DIGEST)和域  
  • 30. 响应重定向 自动刷新/等待 特殊字符处理
  • 31. 3.4 HttpServletRequest 接口HttpServletRequest接口定义的方法: String getAuthType() String getContextPath() Cookie[] getCookies() long getDateHeader(java.lang.String name) String getHeader(java.lang.String name) Enumeration getHeaderNames() Enumeration getHeaders(java.lang.String name) getIntHeader(java.lang.String name) String getMethod() String getPathInfo() String getPathTranslated() String getQueryString() String getRemoteUser() String getRequestedSessionId() String getRequestURI() StringBuffer getRequestURL() String getServletPath() HttpSession getSession() HttpSession getSession(boolean create) java.security.Principal getUserPrincipal() boolean isRequestedSessionIdFromCookie() boolean isRequestedSessionIdFromUrl() boolean isRequestedSessionIdFromURL() boolean isRequestedSessionIdValid() boolean isUserInRole(java.lang.String role)
  • 32. 请求报头信息 表单数据和参数 getHeader() getHeaders() getHeaderNames() getIntHeader() getDateHeader() getParameter() getParameters() getParameterNames()
  • 33. 请求报头 含义 请求报头 含义 Accept 指定浏览器或其它客户程序可以处理的MIME类型:如img/png If-Modified-Since 这个报头表明,仅当页面在制定的日期之后发生更改的情况下,客户程序才希望获取该页面。如果没有更新的页面,则服务器发送304报头。 Accept-Charset 表明浏览器可以使用的字符集 User-Agent 表明生成请求的浏览器和客户程序,通过它,我们可以判断用户使用的浏览器的类型。 Accept-Encoding 详细列出客户端能够处理的编码类型。 Cookie 这个报头向浏览器返回cookie。 Accept-Language 客户端能够接受的语言代码。如zh-cn Content-Length 这个报头只适用于POST请求,用来给出POST数据的大小以字节为单位 Authorization 当访问密码保护的Web页面时,客户用这个报头来标识自己的身份。 Host 给出主机名和端口
  • 34. 请求委托和请求域 使用RequestDispather对象的方法: 使用 ServletContext对象的getRequestDispatcher()方法 使用 ServletRequest对象的getRequestDispatcher()方法 使用 ServletContext对象的getNamedDispatcher()方法
  • 35. 本章总结 叙述了HTTP的相关内容 介绍了Servlet的主要接口
  • 36. 第四讲 从Servlet访问数据库
  • 37. 4.1 JDBC简介Java.sql包 访问数据库的API DriverManager类 Connection接口 Statement接口 ResultSet接口 PreparedStatement接口 ResultSetMetaData接口
  • 38. DriverManager类的主要方法 就是提供了getConnection()方法,返回了一个Connection对象 Connection接口的主要方法 Public void close() throws SQLException 立即关闭,释放Connection对象 Public boolean isClose() throws SQLException 测试Conncetion对象是否已经关闭 Public Statement createStatement() throws SQLException Public Statement createStatement(int resultSetType,int resultSetConcurrency)throws SQLException 用于创建给数据库发送SQL语句的Statement对象 Public PreparedStatement PreparedStatement()throws SQL Exception 用于创建PreparedStatement对象
  • 39. Public boolean getAutoCommit() throws SQLException 如果自动提交置为enable,该方法返回ture,否则返回false Public void setAutoCommit(Boolean autocommit)throws SQL Exception 设置是否允许Connection对象自动提交事务 Public void commit() throws SQLException 用于提交事务 Public roolback() throws SQLException 用于回滚事务
  • 40. Statement接口的主要方法 Public ResultSet excuteQuery(String sql) throws SQLException 在数据库上执行一个查询SQL语句,并返回一个ResultSet对象(结果集) Public int excuteUpdate(String sql) throws SQLException 在数据库上执行insert,update,delete SQL语句和DDL
  • 41. ResultSet接口 Public Boolean isFirst() throws SQLException Public Boolean isLast() throws SQLException Public Boolean next() throws SQLException Public ResultSetMetaData getMetaData() throws SQLException Public XXX getXXX(int columnlndex) throws SQLException PreparedStatement接口 Public int getColumnCount() throws SQLException Public String getColumnName(int columnIndex) throws SQLException
  • 42. 4.2 访问数据库五步曲访问数据库分以下几步: 加载JDBC驱动程序 指定数据库连接URL 创建Connection对象 创建statement对象 创建resultset对象
  • 43. 加载JDBC驱动程序 JDBC-ODBC桥
  • 44. 本机API Java驱动程序
  • 45. 网络协议Java驱动程序
  • 46. 数据库协议纯Java驱动程序
  • 47. 定义数据库连接的URL Oracle数据库 jdbc:oracle:thin:@SERVER:PORT:INSTANCE_NAME MySQL jdbc:mysql//SERVER_NAME SQL Server jdbc:microsoft:sqlserver://SERVER:port;DatabaseName Ms Access Jdbc:odbc:dbName
  • 48. 创建Connection对象Try { String sqlServerURL=“jdbc:microsoft:sqlserver://SERVER:port;DatabaseName”; String username=””; String password=””; Connection con=DriverManager.getConnnection(sqlServerURL,username,password); … } catch (SQLException e) { … }
  • 49. 创建Statement对象 创建结果集
  • 50. 4.4 数据库的高级操作PreparedStatement CallableStatement 事务处理
  • 51. 4.5 数据库连接池(Connection Pool)数据源(Data Source) 连接池(Connection Pool) JNDI(Java命名与目录接口) Tomcat5+SQL server 2000数据库连接池配置
  • 52. 本章总结 讨论了数据库如何与Servlet相结合 JNDI获得数据库连接的方式 本章重点 能够建立与数据库的连接,并操纵数据库。 了解数据库连接池的原理
  • 53. 第五讲 状态和会话管理
  • 54. 5.1 客户端状态管理解决方案客户端管理的3种解决方案 Cookie URL重写 隐藏域(hiddenfield) 隐藏域(hiddenfield) 优点:简单,任何浏览器都支持 缺点:总是需要一个表单(From),并且不安全
  • 55. Cookie 什么是Cookie? Cookie不是 Cookie而是 Cookie的应用范围? 在电子商务会话中标识用户 记录用户名和密码 定制站点 定向广告Cookie是 一个在HTTP请求—响应之间 往来传输的信息片断, 它最初是由Netscape公司发明的, 主要用于记录客户端信息, 并将该信息存放在客户端
  • 56. Cookie 的发送和接受 向客户程序发送cookie 创建cookie对象 设置最大时效 将cookie放入到HTTP响应报头 从客户端读取cookie 调用request.getCookies 对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止
  • 57. 会话和持久Cookie URL重写
  • 58. 5.2 会话的管理—使用HttpSession会话的实现机制 客户端保存session id的方案 采用cookie 采用URL重写 采用隐藏域 使用HttpSession对象
  • 59. 本章总结 主要介绍了状态和会话管理的方法及特点 本章重点 Cookie的使用 HttpSession的使用
  • 60. 第六讲 JSP概述
  • 61. 6.1 对JSP的需求及JSP的优点对JSP的需求 Servlet的不足 Servlet中HTML的编写和维护都比较困难 不能使用标准的HTML工具 非Java开发人员难以处理这些HTML JSP模型
  • 62. JSP的好处 JSP中HTML的编写与维护更为简单 能够使用标准的网站开发工具 可以对开发团队进行划分
  • 63. 翻译JSP页面 编译 装载 创建实例 调用jspInit()方法(只调用一次) 为每次客户请求调用_jspService(…)方法 JSP被容器销毁调用jspDestroy()方法 6.2 JSP的生命周期
  • 64. 6.3 JSP语言基础JSP2.0规范可以分成以下几个部分: JSP JavaBean 自定义标签(Custom Tags)和JSP片断(JSP Fragments) EL(Expression Language)
  • 65. JSP元素和模板数据 JSP元素分为3类: 脚本元素(scripting element) 指示符(directive) 动作(action) JSP中的脚本元素(scripting element) Scriptlet 小脚本 Expression 表达式 Declaration 声明
  • 66. Scriptlet 小脚本 expression 表达式 declaration 声明 JSP语法 <% code fragment %>或 code fragment 后者称为XML语法 JSP语法 <%= expression %> XML语法 expression; JSP语法 <%! declaration;[ declaration;] … %> XML语法 declaration;[declaration;]+…
  • 67. JSP中的指示符(directiv) Page 指示符 Taglib 指示符 Include 指示符
  • 68. Page 指示符 JSP语法 <%@page ATTRIBUTES %> XML语法
  • 69. 属性 contentType属性 pageEncoding属性 Language属性 isELIgnored属性 Import属性 Info属性 Session属性 Buffer属性 autoFlush属性 isThreadSafe属性 errorPage属性 isErrorPage属性 Extends属性
  • 70. Include指示符(静态包含) JSP语法 <%@include file=“relativeURL”%> XML语法 taglib指示符
  • 71. JSP规范动作Action 语法: 其他JSP规范动作
  • 72. 注释 客户端的注释格式 开发程序员的注释格式<%--注释内容--%> 关于引号和Escape字符
  • 73. 隐含对象和JSP文档隐含对象 类型 说明 Request javax.servlet.http.HttpServletRequest 与请求相关联 Response javax.servlet.http.HttpServletResponse 与相应相关联 PageContext javax.servlet.jsp.PageContext 与当前页面相关联 Session javax.servlet.http.HttpSession 与会话相关联 Application javax.servlet.ServletContext 为ServletContext类型 Out javax.servlet.jsp.JspWriter 数据流的标准输出 Config javax.servlet.ServletConfig 页面的ServletConifg Page java.lang.Object This的同义词 Exception java.lang.Throwable 异常处理
  • 74. Servlet相关的隐含对象 Page对象 <%@ page info="JSP 2.0隐含对象" contentType="text/html; charset=GBK" %> PageInfo

    Page隐含对象

    Page Info =<%=((javax.servlet.jsp.HttpJspPage)page).getServletInfo()%>
  • 75. Config对象 输入输出对象 Request对象 Response对象 Out对象方法 说明 void clear() 清除缓冲区的内容 void clearBuffer() 清除缓冲区的内容 void close() 关闭输出流,清除所有的内容 int getBufferSize() 取得目前缓冲区的大小(KB) int getRemaining() 取得目前使用后还剩下的缓冲区的大小(KB) boolean isAutoFlush() 如果返回为true,表示缓冲区满了,会自动清除;若为false,表示缓冲区满了,不会自动清除,而产生异常处理。
  • 76. 上下文关系对象 Session对象 Application对象 pageContext对象
  • 77. PageContext类取得其它隐含对象的方法 方法 说明 Exception getException() 返回目前页面的异常,不过此网页要为error page JspWriter getOut() 返回目前页面的输出流,如out对象 Object getPage() 返回page对象 ServletRequest getRequest() 返回目前页面的请求,如request对象 ServletResponse getResponse() 返回目前页面的响应,如response对象 ServletConfig getServletConfig() 返回目前页面的ServletConfig对象,如config对象 ServletContext getServletContext() 返回目前页面的执行环境,如application对象 HttpSession getSession() 返回目前页面有联系的会话,如session对象
  • 78. PageContext类取得属性的方法 方法 说明 ObjectgetAttribute(String name,int scope) 返回name属性,范围为scope指定 Enumeration getAttributeNamesInScope(int scope) 返回范围为scope内的所有属性名称 intgetAttributesScope(String name) 返回属性名称为name的属性范围 VoidremoveAttribute(String name) 移除属性名为name的属性 VoidremoveAttribute(String name,int scope) 移除有scope指定范围内属性名为name的属性 voidsetAttribute(String name,Object value,int scope) 指定属性对象的名称name,值Object,范围scope Object findAttribute(String name) 在所有范围中寻找属性名为name的属性值
  • 79. PageContext类提供的范围变量 常数 说明 PAGE_SCOPE 存入pageContext对象的属性范围 REQUEST_SCOPE 存入request对象的属性范围 SESSION_SCOPE 存入session对象的属性范围 APPLICATION_SCOPE 存入application对象的属性范围 PageContext.jsp <%@ page import="java.util.Enumeration" contentType="text/html; charset=GBK" %> PageConext.jsp

    当前application范围内所有的属性

    <% Enumeration enum=pageContext.getAttributeNamesInScope(PageContext.APPLICATION_SCOPE); while(enum.hasMoreElements()) { out.println("application attribute: "+enum.nextElement()+"
    "); } %> 举一个例子使大家能够更加明白
  • 80. 异常处理对象 Exception对象 <%@ page contentType="text/html; charset=GBK" isErrorPage="true" %> Exception

    exception对象

    Exception: <%=exception%>
    Message: <%=exception.getMessage()%>
    Localized Message: <%=exception.getLocalizedMessage()%>
    Stack Trace: <% exception.printStackTrace(new java.io.PrintWriter(out));%>
  • 81. 6.7 Web应用中的异常处理基于页面的解决方案 Servlet作为异常处理页面 基于web.xml配置的异常处理方案
  • 82. 本章总结 对JSP做了简单的说明,理解JSP和Servlet的区别 能够建立简单的jsp页面 本章重点 JSP的特点 JSP语言基础
  • 83. 第七讲 JavaBean和表达式语言
  • 84. 7.1 JSP组件模型
  • 85. 7.2 JavaBean基础JavaBean的规范主要包括: JavaBean是一个公有类,即使用public来修饰的类 JavaBean必须有一个无参数的构造函数 JavaBean不应该有公开的变量,所有变量都通过方法访问(读取与设置) 设置或访问JavaBean的属性必须通过setXXX和getXXX方法。这里XXX表示属性
  • 86. 7.3 在Servlet/JSP中访问JavaBean在Servlet中使用JavaBean 用于获得输入 ShowBeanPage.jsp Passing a value
    请输入一个字符串
    <%@ page contentType="text/html; charset=GBK" %> ShowBeanPage value is
  • 87. 在JSP中使用JavaBean 优势 分离HTML和Java代码 JavaBean重用
  • 88. 的用法 语法 : useBean Example The date/time is <%= date %>
  • 89. 的用法 语法 : <%@ page contentType="text/html; charset=GBK" %> useBean <% user.setName("Bob"); user.setPassword("password"); %> 你好, 欢迎访问! package com.edu_a.example; public class User { private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this. password = password; } }
  • 90. 的用法 语法 :1. 91. 实施的数据类型转换 JavaBean的范围
  • 92. 7.4 表达式语言EL支持的功能 精确的访问存储对象 Bean属性的简略记法 对集合元素的简单访问 对请求参数、cookie、和其他请求数据的简单访问 提供了一组有效的简单运算符 有条件输出 自动类型转换 空值取代错误消息
  • 93. 表达式语言的调用 格式:${expression} 访问作用域变量 访问Bean的属性 访问集合 引用隐式对象
  • 94. 表达式语言中运算符的应用 算术运算符 关系运算符 逻辑运算符 空运算符
  • 95. 本章总结 针对JavaBean技术进行了介绍 要求做到创建JavaBean并在JSP或者Servlet中灵活地调用 本章重点 JavaBean基础 在Servlet/JSP中访问JavaBean
  • 96. 第八讲 JSP标签扩展
  • 97. 8.1 一个简单的Tag Library例子Hello标签的标签处理类 Hello标签的Tag Library Descriptor File JSP网页 Tag Library & web.xml<%@ page contentType="text/html;charset=GBK" %> <%@ taglib uri="/WEB-INF/tlds/MyTaglib.tld" prefix="mytag" %>   Hello.jsp

    Hello World 标签

  • 98. 8.2 Tag Handler ClassAPI概观 Javax.servlet.jsp包 Javax.servlet.jsp.tagext包 TagSupport类 doStartTag()返回值 说明 Tag.SKIP_BODY 表示本体内容会被忽视,将控制权转移给doEndTag() Tag.EVAL_BODY_INCLUDE 表示本体内容会正常执行,但是不会对本体内容做任何的运算、处理。
  • 99. doAfterBody() doEndTag()返回值 说明 Tag.SKIP_BODY 表示本体内容会被忽视,将控制权转移给doEndTag() IterationTag.EVAL_BODY_AGAIN 表示本体内容将会重复执行,并且在度调用doAfterBody(),如此循环,直到返回SKIP_BODY为止。 返回值 说明 Tag.SKIP_PAGE 表示JSP页面的执行应该马上停止,所有在页面上的内容,包括JSP的程序和静态文件都应该马上被忽略,任何输出应该马上返回到用户的浏览器上。 Tag.EVAL_PAGE 表示JSP页面能够正常执行。
  • 100. Release() BodyTagSupport类 doStartTag()返回值 说明 Tag.SKIP_BODY 表示本体内容会被忽视,将控制权转移给doEndTag() Tag.EVAL_BODY_INCLUDE 表示本体内容会正常执行,但是不会对本体内容做任何的运算、处理。 BodyTag.EVAL_BODY_BUFFERED 表示标签的本体内容应该被处理,并且处理的结果必须存储在BodyContent类中。
  • 101. 本章总结 本章主要介绍了自定义标签的创建方法 本章重点 标签类接口 自定义标签的设计