Microsoft Word - 第4章 Filter(过滤器)—样章.doc

Size: px
Start display at page:

Download "Microsoft Word - 第4章 Filter(过滤器)—样章.doc"

Transcription

1 第 4 章 Filter( 过滤器 ) 学习目标 u 了解什么是 Filter u 能够用 Filter 实现用户自动登录的案例 u 了解什么是装饰设计模式, 学会用 Filter 实现统一全站编码和页面静态化技术在 Web 开发过程中, 为了实现某些特殊的功能, 经常需要对请求和响应消息进行处理 例如记录用户访问信息, 统计页面访问次数, 验证用户身份等 Filter 作为 Servlet2.3 中新增的技术, 可以实现用户在访问某个目标资源之前, 对访问的请求和响应进行相关处理 接下来, 本章将针对 Filter 进行详细地讲解 4.1 Filter 入门 什么是 Filter Filter 被称作过滤器或者拦截器, 其基本功能就是对 Servlet 容器调用 Servlet 的过程进行拦截, 从而在 Servlet 进行响应处理前后实现一些特殊功能 这就好比现实中的污水净化设备, 它可以看做一个过滤器, 专门用于过滤污水杂质 图 4-1 描述了 Filter 在 Web 应用中的拦截过程, 具体如下 : 服务器 请求 Web 资源 浏览器 响应 过滤器 Filter Jsp Servlet Html 图 4-1 Filter 拦截过程在图 4-1 中, 当浏览器访问服务器中的目标资源时, 会被 Filter 拦截, 在 Filter 中进行预处理操作, 然后再将请求转发给目标资源 当服务器接收到这个请求后会对其进行响应, 在服务器处理响应的过程中, 也需要先将响应结果发送给拦截器, 在拦截器中对响应结果进行处理后, 才会发送给客户端 其实,Filter 过滤器就是一个实现了 javax.servlet.filter 接口的类, 在 javax.servlet.filter 接口中定义了三个方法, 具体如表 4-1 所示 表 4-1 Filter 接口中的方法方法声明功能描述 init(filterconfig filterconfig) init() 方法用来初始化过滤器, 开发人员可以在 init() 方法中完成与构造方法类似的初始化功能, 如果初始化代码中要使用到 FilterConfig 对象, 那么, 这些初始化代码就只能在 Filter 的 init() 方法中编写, 而不能

2 在构造方法中编写 dofilter(servletrequest request,servletresponse dofilter() 方法有多个参数, 其中, 参数 request 和 response,filterchain chain) response 为 Web 服务器或 Filter 链中的上一个 Filter 传递过来的请求和响应对象 ; 参数 chain 代表当前 Filter 链的对象, 在当前 Filter 对象中的 dofilter() 方法内部需要调用 FilterChain 对象的 dofilter() 方法, 才能把请求交付给 Filter 链中的下一个 Filter 或者目标程序去处理 destroy() destroy() 方法在 Web 服务器卸载 Filter 对象之前被调用, 该方法用于释放被 Filter 对象打开的资源, 例如关闭数据库和 IO 流 表 4-1 中的这三个方法都是 Filter 的生命周期方法, 其中 init() 方法在 Web 应用程序加载的时候调用, destroy() 方法在 Web 应用程序卸载的时候调用, 这两个方法都只会被调用一次, 而 dofilter() 方法只要有客户端请求时就会被调用, 并且 Filter 所有的工作集中在 dofilter() 方法中 实现第一个 Filter 程序 为了帮助大家快速了解 Filter 的开发过程, 接下来, 分步骤带大家实现第一个 Filter 程序, 具体如下 : (1) 在 Eclipse 中创建一个名为 chapter04 的 Web 工程, 然后在该工程的 Java Resources/src 目录下创建 cn.itcast.chapter04.filter 包, 并在该包下创建一个 MyServlet.java 程序, 如例 4-1 所示 例 4-1 MyServlet.java 1 package cn.itcast.chapter04.filter; 2 import java.io.*; 3 import javax.servlet.*; 4 import javax.servlet.http.*; 5 public class MyServlet extends HttpServlet { 6 public void doget(httpservletrequest request, HttpServletResponse response) 7 throws ServletException, IOException { 8 response.getwriter().write("hello MyServlet "); 9 } 10 public void dopost(httpservletrequest request, HttpServletResponse response) 11 throws ServletException, IOException { 12 doget(request, response); 13 } 14 } (2) 在 web.xml 文件中对 servlet 进行如下配置 <servlet> <servlet-name>myservlet</servlet-name> <servlet-class>cn.itcast.chapter04.filter.myservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myservlet</servlet-name> <url-pattern>/myservlet</url-pattern> </servlet-mapping>

3 部署 chapter04 工程到 Tomcat 服务器, 启动 Tomcat 服务器, 在浏览器的地址栏中输入 URL 地址 此时, 可以看到浏览器成功访问到了 MyServlet 程序, 具体如图 4-2 所示 图 4-2 运行结果 (3) 拦截 MyServlet 程序 在 cn.itcast.chapter04.filter 包中创建过滤器 MyFilter, 该类用于拦截 MyServlet 程序,MyFilter 的实现代码如例 4-2 所示 例 4-2 MyFilter.java 1 package cn.itcast.chapter04.filter; 2 import java.io.*; 3 import javax.servlet.filter; 4 import javax.servlet.*; 5 public class MyFilter implements Filter { 6 public void destroy() { 7 // 过滤器对象在销毁时自动调用, 释放资源 8 } 9 public void dofilter(servletrequest request, ServletResponse response, 10 FilterChain chain) throws IOException, ServletException { 11 // 用于拦截用户的请求, 如果和当前过滤器的拦截路径匹配, 该方法会被调用 12 PrintWriter out=response.getwriter(); 13 out.write("hello MyFilter"); 14 } 15 public void init(filterconfig fconfig) throws ServletException { 16 // 过滤器对象在初始化时调用, 可以配置一些初始化参数 17 } 18 } 过滤器程序与 Servlet 程序类似, 同样需要在 web.xml 文件中进行配置, 从而设置它所能拦截的资源, 具体代码如下 : <filter> <filter-name>myfilter</filter-name> <filter-class>cn.itcast.chapter04.filter.myfilter</filter-class> </filter> <filter-mapping> <filter-name>myfilter</filter-name> <url-pattern>/myservlet</url-pattern> </filter-mapping> 在上述代码中, 包含多个元素, 这些元素分别具有不同的作用, 具体如下 :

4 l <filter> 根元素用于注册一个 Filter l <filter-name> 子元素用于设置 Filter 名称 l <filter-class> 子元素用于设置 Filter 类的完整名称 l <filter-mapping> 根元素用于设置一个过滤器所拦截的资源 l <filter-name> 子元素必须与 <filter> 中的 <filter-name> 子元素相同 l <url-pattern> 子元素用于匹配用户请求的 URL, 例如 /MyServlet, 这个 URL 还可以使用通配符 * 来表示, 例如 *.do 适用于所有以.do 开头结尾的 Servlet 路径 重新启动 Tomcat 服务器, 在浏览器的地址栏中输入 URL 地址 访问 MyServlet, 此时, 浏览器窗口显示的结果如图 4-3 所示 图 4-3 MyServlet.java 从图 4-3 可以看出, 在使用浏览器访问 MyServlet 时, 浏览器窗口中只显示了 MyFilter 的输出信息, 并没有显示 MyServlet 的输出信息, 说明 MyFilter 成功拦截了 MyServlet 程序 Filter 映射 通过 小节的学习, 了解到 Filter 拦截的资源需要在 web.xml 文件中进行配置, 即 Filter 映射 Filter 的映射方式可分为两种, 具体如下 : 1 使用通配符 * 拦截用户所有请求 Filter 的 <filter-mapping> 元素可以配置过滤器所有拦截的资源, 如果想让过滤器拦截所有的请求访问, 那么需要使用通配符 * 来实现, 具体示例如下 : <filter> <filter-name>filter1</filter-name> <filter-class>cn.itcast.chapter04.filter.myfilter </filter-class> </filter> <filter-mapping> <filter-name>filter1</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 2 拦截不同方式的访问请求在 web.xml 文件中, 一个 <filter-mapping> 元素用于配置一个 Filter 所负责拦截的资源 <filter-mapping> 元素中有一个特殊的子元素 <dispatcher>, 该元素用于指定过滤器所拦截的资源被 Servlet 容器调用的方式, <dispatcher> 元素的值共有四个, 具体如下 : l REQUEST 当用户直接访问页面时,Web 容器将会调用过滤器 如果目标资源是通过 RequestDispatcher 的 include() 或 forward() 方法访问时, 那么该过滤器将不会被调用

5 l INCLUDE 如果目标资源是通过 RequestDispatcher 的 include() 方法访问时, 那么该过滤器将被调用 除此之外, 该过滤器不会被调用 l FORWARD 如果目标资源是通过 RequestDispatcher 的 forward() 方法访问时, 那么该过滤器将被调用 除此之外, 该过滤器不会被调用 l ERROR 如果目标资源是通过声明式异常处理机制调用时, 那么该过滤器将被调用 除此之外, 过滤器不会被调用 为了大家更好地理解上述四个值的作用, 接下来以 FORWARD 为例, 分步骤演示 Filter 对转发请求的拦截效果, 具体如下 : (1) 在 chapter04 工程的 cn.itcast.chapter04. filter 包中, 创建一个 ServletTest.java 程序, 该程序用于将请求转发给 first.jsp 页面, 如例 4-3 所示 例 4-3 ServletTest.java 1 package cn.itcast.chapter04.filter; 2 import java.io.*; 3 import javax.servlet.*; 4 import javax.servlet.http.*; 5 public class ServletTest extends HttpServlet { 6 public void doget(httpservletrequest request, HttpServletResponse response) 7 throws ServletException, IOException { 8 request.getrequestdispatcher("/first.jsp").forward(request, response); 9 } 10 public void dopost(httpservletrequest request, HttpServletResponse response) 11 throws ServletException, IOException { 12 doget(request, response); 13 } 14 } (2) 在 chapter04 工程的 WebContent 目录中创建一个 first.jsp 页面, 该页面用于输出内容, 如例 4-4 所示 例 4-4 first.jsp 1 <%@ page language="java" contenttype="text/html; charset=utf-8" 2 pageencoding="utf-8"%> 3 <html> 4 <head></head> 5 <body> 6 first.jsp 7 </body> 8 </html> (3) 在 chapter04 工程的 cn.itcast.chapter04.filter 包中, 创建一个 FilterTest.java 程序, 专门用于拦截 first.jsp 页面, 如例 4-5 所示 例 4-5 FilterTest.java 1 package cn.itcast.chapter04.filter; 2 import java.io.*;

6 3 import javax.servlet.*; 4 public class FilterTest implements Filter { 5 public void destroy() { 6 // 过滤器对象在销毁时自动调用, 释放资源 7 } 8 public void dofilter(servletrequest request, ServletResponse response, 9 FilterChain chain) throws IOException, ServletException { 10 // 用于拦截用户的请求, 如果和当前过滤器的拦截路径匹配, 该方法会被调用 11 PrintWriter out=response.getwriter(); 12 out.write("hello FilterTest"); 13 } 14 public void init(filterconfig fconfig) throws ServletException { 15 // 过滤器对象在初始化时调用, 可以配置一些初始化参数 16 } 17 } (4) 在 web.xml 文件中, 配置 Filter 过滤器, 拦截 first.jsp 页面, 具体代码如下 : <filter> <filter-name>filtertest</filter-name> <filter-class>cn.itcast.chapter04.filter.filtertest</filter-class> </filter> <filter-mapping> <filter-name>filtertest</filter-name> <url-pattern>/first.jsp</url-pattern> </filter-mapping> (5) 启动 Tomcat 服务器, 在浏览器中输入 URL 地址 访问 ServletTest, 浏览器显示的结果如图 4-4 所示 图 4-4 运行结果从图 4-4 中可以看出, 浏览器可以正常访问 JSP 页面, 说明 FilterTest 没有拦截到 ServletTest 转发的 first.jsp 页面 (6) 为了拦截 ServletTest 通过 forward() 方法转发的 first.jsp 页面, 需要在 web.xml 文件中的增加一个 <dispatcher> 元素, 将该元素的值设置为 FORWARD, 修改后的 FilterTest 的映射如下所示 : <filter> <filter-name>filtertest</filter-name> <filter-class>cn.itcast.chapter04.filter.filtertest</filter-class> </filter> <filter-mapping>

7 <filter-name>filtertest</filter-name> <url-pattern>/first.jsp</url-pattern> <dispatcher>forward</dispatcher> </filter-mapping> (7) 启动 Tomcat 服务器, 在浏览器的地址拦输入 URL 地址 访问 ServletTest, 浏览器显示的结果如图 4-5 所示 图 4-5 运行结果 从图 4-5 中可以看出, 浏览器窗口显示的是 FilterTest 中的内容, 而 first.jsp 页面的输出内容没有显示 由此可见,ServletTest 中通过 forward() 方法转发的 first.jsp 页面被成功拦截了 Filter 链 在一个 Web 应用程序中可以注册多个 Filter 程序, 每个 Filter 程序都可以针对某一个 URL 进行拦截 如果多个 Filter 程序都对同一个 URL 进行拦截, 那么这些 Filter 就会组成一个 Filter 链 ( 也叫过滤器链 ) Filter 链用 FilterChain 对象来表示,FilterChain 对象中有一个 dofilter() 方法, 该方法作用就是让 Filter 链上的当前过滤器放行, 请求进入下一个 Filter, 接下来通过一个图例来描述 Filter 链的拦截过程, 如图 4-6 所示 Web 服务器 请求 Filter1 Filter2 Web 资源 浏览器 响应 dofilter() 中调用 FilterChain.doFilter() dofilter() 中调用 FilterChain.doFilter() Jsp Servlet Html 图 4-6 Filter 链在图 4-6 中, 当浏览器访问 Web 服务器中的资源时需要经过两个过滤器 Filter1 和 Filter2, 首先 Filter1 会对这个请求进行拦截, 在 Filter1 过滤器中处理好请求后, 通过调用 Filter1 的 dofilter() 方法将请求传递给 Filter2,Filter2 将用户请求处理后同样调用 dofilter() 方法, 最终将请求发送给目标资源 当 Web 服务器对这个请求做出响应时, 也会被过滤器拦截, 这个拦截顺序与之前相反, 最终将响应结果发送给客户端 为了让读者更好的学习 Filter 链, 接下来, 通过一个案例, 分步骤演示如何使用 Filter 链拦截 MyServlet 的同一个请求, 具体如下 : (1) 在 chapter04 工程的 cn.itcast.chapter04.filter 包中新建 MyFilter01 和 MyFilter02, 如例 4-6 和 4-7 所示 例 4-6 MyFilter01.java 1 package cn.itcast.chapter04.filter; 2 import java.io.*;

8 3 import javax.servlet.*; 4 public class MyFilter01 implements Filter { 5 public void destroy() { 6 // 过滤器对象在销毁时自动调用, 释放资源 7 } 8 public void dofilter(servletrequest request, ServletResponse response, 9 FilterChain chain) throws IOException, ServletException { 10 // 用于拦截用户的请求, 如果和当前过滤器的拦截路径匹配, 该方法会被调用 11 PrintWriter out=response.getwriter(); 12 out.write("hello MyFilter01</br>"); 13 chain.dofilter(request, response); 14 } 15 public void init(filterconfig fconfig) throws ServletException { 16 // 过滤器对象在初始化时调用, 可以配置一些初始化参数 17 } 18 } 例 4-7 MyFilter02.java 1 package cn.itcast.chapter04.filter; 2 import java.io.*; 3 import javax.servlet.filter; 4 import javax.servlet.*; 5 public class MyFilter02 implements Filter { 6 public void destroy() { 7 // 过滤器对象在销毁时自动调用, 释放资源 8 } 9 public void dofilter(servletrequest request, ServletResponse response, 10 FilterChain chain) throws IOException, ServletException { 11 // 用于拦截用户的请求, 如果和当前过滤器的拦截路径匹配, 该方法会被调用 12 PrintWriter out=response.getwriter(); 13 out.write("myfilter02 Before</br>"); 14 chain.dofilter(request, response); 15 out.write("</br>myfilter02 After</br>"); 16 } 17 public void init(filterconfig fconfig) throws ServletException { 18 // 过滤器对象在初始化时调用, 可以配置一些初始化参数 19 } 20 } (2) 在 web.xml 文件中将 MyFilter01 和 MyFilter02 注册在 MyServlet 前面, 具体如下所示 : <filter> <filter-name>myfilter01</filter-name> <filter-class>cn.itcast.chapter04.filter.myfilter01</filter-class> </filter> <filter-mapping> <filter-name>myfilter01</filter-name>

9 <url-pattern>/myservlet</url-pattern> </filter-mapping> <filter> <filter-name>myfilter02</filter-name> <filter-class>cn.itcast.chapter04.filter.myfilter02</filter-class> </filter> <filter-mapping> <filter-name>myfilter02</filter-name> <url-pattern>/myservlet</url-pattern> </filter-mapping> <servlet> <servlet-name>myservlet</servlet-name> <servlet-class>cn.itcast.chapter04.filter.myservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myservlet</servlet-name> <url-pattern>/myservlet</url-pattern> </servlet-mapping> (3) 重新启动 Tomcat 服务器, 在浏览器地址栏中输入 此时, 浏览器窗口中的显示结果如图 4-7 所示 图 4-7 运行结果从图 4-7 中可以看出,MyServlet 首先被 MyFilter01 拦截了, 打印出 MyFilter01 中的内容, 然后被 MyFilter02 拦截, 直到 MyServlet 被 MyFilter02 放行后, 浏览器才显示出 MySerlvet 中的输出内容 需要注意的是,Filter 链中各个 Filter 的拦截顺序与它们在 web.xml 文件中 <filter-mapping> 元素的映射顺序一致, 由于 MyFilter01 的 <filter-mapping> 元素位于 MyFilter02 的 <filter-mapping> 元素前面, 因此用户的访问请求首先会被 MyFilter01 拦截, 然后再被 MyFilter02 拦截 FilterConfig 接口 为了获取 Filter 程序在 web.xml 文件中的配置信息,Servlet API 提供了一个 FilterConfig 接口, 该接口封装了 Filter 程序在 web.xml 中的所有注册信息, 并且提供了一系列获取这些配置信息的方法, 具体如表 4-2 所示 表 4-2 FilterConfig 接口中的方法方法声明功能描述 String getfiltername () getfiltername() 方法用于返回在 web.xml 文件中为 Filter 所设置

10 的名称, 也就是返回 <filter-name> 元素的设置值 getservletcontext() 方法用于返回 FilterConfig 对象中所包装的 ServletContext getservletcontext() ServletContext 对象的引用 getinitparameter(string name) 方法用于返回在 web.xml 文件中为 String getinitparameter(string name) Filter 所设置的某个名称的初始化参数值, 如果指定名称的初始化参数不存在, 则返回 null getinitparameternames() 方法用于返回一个 Enumeration 集合对 Enumeration getinitparameternames() 象, 该集合对象中包含在 web.xml 文件中为当前 Filter 设置的所有初始化参数的名称 表 4-2 列举了 FilterConfig 接口中的一系列方法, 为了让读者更好的掌握这些方法, 接下来, 以 getinitparameter(string name) 方法为例, 通过一个案例来演示 FilterConfig 接口的作用, 具体如例 4-8 所示 例 4-8 MyFilter03.java 1 package cn.itcast.chapter04.filter; 2 import java.io.*; 3 import javax.servlet.*; 4 public class MyFilter03 implements Filter { 5 private String characterencoding; 6 FilterConfig fc; 7 public void destroy() { 8 } 9 public void dofilter(servletrequest request, ServletResponse response, 10 FilterChain chain) throws IOException, ServletException { 11 // 输出参数信息 12 characterencoding=fc.getinitparameter("encoding"); 13 System.out.println("encoding 初始化参数的值为 :"+characterencoding); 14 chain.dofilter(request, response); 15 } 16 public void init(filterconfig fconfig) throws ServletException { 17 // 获取 FilterConfig 对象 18 this.fc = fconfig; 19 } 20 } 接下来在 web.xml 文件中部署过滤器 由于 Filter 链中各个 Filter 的拦截顺序与它们在 web.xml 文件中 <filter-mapping> 元素的映射顺序一致, 因此, 为了防止其他 Filter 影响 MyFilter03 的拦截效果, 我们将 MyFilter03 注册在 web.xml 文件最前端, 具体注册代码如下 : <filter> <filter-name>myfilter03</filter-name> <filter-class>cn.itcast.chapter04.filter.myfilter03</filter-class> <init-param> <param-name>encoding</param-name> <param-value>gbk</param-value> </init-param> </filter> <filter-mapping>

11 <filter-name>myfilter03</filter-name> <url-pattern>/myservlet</url-pattern> </filter-mapping> 重新启动 Tomcat 服务器, 在浏览器地址栏中输入 访问 MyServlet, 控制台窗口中显示的结果如图 4-8 所示 图 4-8 控制台窗口从图 4-8 中可以看出, 使用 Filter 获取到了配置文件中的初始化参数 当 Tomcat 服务器启动时, 会加载所有的 Web 应用, 当加载到 chapter04 这个 Web 应用时,FirstFilter 就会被初始化调用 init() 方法, 从而可以得到 FilterConfig 对象, 然后在 dofilter() 方法中通过调用 FilterConfig 对象的 getinitparameter() 方法便可以获取在 web.xml 文件中配置的参数信息 4.2 应用案例 Filter 实现用户自动登录 通过前面的学习, 了解到 Cookie 可以实现用户自动登录的功能 当用户第一次访问服务器时, 服务器 会发送一个包含用户信息的 Cookie 之后, 当客户端再次访问服务器时, 都会向服务器回送 Cookie, 这样, 服务器就可以从 Cookie 中获取用户信息, 从而实现用户的自动登录功能, 具体如图 4-9 所示 Servlet1 Set-Cookie:name=value value 包含用户信息 Set-Cookie:name=value value 包含用户信息 浏览器 Cookie:name=value value 包含用户信息 服务器 Cookie:name=value value 包含用户信息 Cookie:name=value value 包含用户信息 Servlet2 Servlet3 图 4-9 Cookie 实现用户登录从图 4-9 中可以看出, 使用 Cookie 实现用户自动登录后, 当客户端访问服务器的 Servlet 时, 所有的 Servlet 都需要对用户的 Cookie 信息进行校验, 这样势必会导致在 Serlvet 程序中书写大量重复的代码 为了解决上面的问题, 可以在 Filter 程序中实现 Cookie 的校验 由于 Filter 是可以对服务器的所有请求进行拦截, 因此, 一旦请求通过 Filter 程序, 就相当于用户信息校验通过,Servlet 程序根据获取到的用户信息, 就可以实现自动登录了 接下来, 通过一个案例来演示如何使用 Filter 实现用户的自动登录功能, 具体步骤如下 : (1) 编写 User.java 程序在 chapter04 工程创建 cn.itcast.chapter04.entity 包, 在该包中编写 User.java 程序, 该程序用于封装用户的信息, 如例 4-9 所示 例 4-9 User.java 1 package cn.itcast.chapter04.entity;

12 2 public class User { 3 private String username; 4 private String password; 5 public String getusername() { 6 return username; 7 } 8 public void setusername(string username) { 9 this.username = username; 10 } 11 public String getpassword() { 12 return password; 13 } 14 public void setpassword(string password) { 15 this.password = password; 16 } 17 } (2) 编写 login.jsp 页面 在 chapter04 工程的 WebContent 根目录中, 编写 login.jsp 页面, 该页面用于创建一个用户登录的表单, 这个表单需要填写用户名和密码, 以及用户自动登录的时间, 如例 4-10 所示 例 4-10 login.jsp 1 <%@ page language="java" contenttype="text/html; charset=utf-8" 2 pageencoding="utf-8" import="java.util.*" 3 %> 4 <html> 5 <head></head> 6 <center><h3> 用户登录 </h3></center> 7 <body style="text-align: center;"> 8 <form action="${pagecontext.request.contextpath }/LoginServlet" method="post"> 9 <table border="1" width="600px" cellpadding="0" cellspacing="0" align="center" > 10 <tr> 11 <td height="30" align="center"> 用户名 :</td> 12 <td> <input type="text" name="username" />${errermsg }</td> 13 </tr> 14 <tr> 15 <td height="30" align="center"> 密 码 :</td> 16 <td> <input type="password" name="password" /></td> 17 </tr> 18 <tr> 19 <td height="35" align="center"> 自动登录时间 </td> 20 <td><input type="radio" name="autologin" value="${60*60*24*31 }" /> 一个月 21 <input type="radio" name="autologin" value="${60*60*24*31*3 }" /> 三个月 22 <input type="radio" name="autologin" value="${60*60*24*31*6 }" /> 半年 23 <input type="radio" name="autologin" value="${60*60*24*31*12 }" /> 一年 24 </td>

13 25 </tr> 26 <tr> 27 <td height="30" colspan="2" align="center"> 28 <input type="submit" value=" 登录 " /> 29 <input type="reset" value=" 重置 " /> 30 </td> 31 </tr> 32 </table> 33 </form> 34 </body> 35 <html> (3) 编写 index.jsp 页面在 chapter04 工程的 WebContent 根目录中, 编写 index.jsp 页面, 该页面用于显示用户的登录信息, 如果没有用户登录, 在 index.jsp 页面中就显示一个用户登录的超链接, 如果用户已经登录, 在 index.jsp 页面中显示登录的用户名, 以及一个注销的超链接, 如例 4-11 所示 例 4-11 index.jsp 1 <%@ page language="java" contenttype="text/html; charset=utf-8" 2 pageencoding="utf-8" import="java.util.*" 3 %> 4 <%@ taglib prefix="c" uri=" 5 <html> 6 <head> 7 <title> 显示登录的用户信息 </title> 8 </head> 9 <body> 10 <br> 11 <center> 12 <h3> 欢迎光临 </h3> 13 </center> 14 <br> 15 <br> 16 <c:choose> 17 <c:when test="${sessionscope.user==null }"> 18 <a href="${pagecontext.request.contextpath }/login.jsp"> 用户登录 </a> 19 </c:when> 20 <c:otherwise> 21 欢迎你,${sessionScope.user.username }! 22 <a href="${pagecontext.request.contextpath }/LogoutServlet"> 注销 </a> 23 </c:otherwise> 24 </c:choose> 25 <hr> 26 </body> 27 </html> (4) 编写 LoginServlet.java 程序

14 在 chapter04 工程的 cn.itcast.chapter04.servlet 包中, 编写 LoginServlet.java 程序, 该程序用于处理用户 的登录请求, 如果输入的用户名和密码正确, 则发送一个用户自动登录的 Cookie, 并跳转到首页, 否则会 提示输入的用户名或密码错误, 并跳转至登录页面 login.jsp 让用户重新登录, 如例 4-12 所示 例 4-12 LoginServlet.java 1 package cn.itcast.chapter04.servlet; 2 import java.io.ioexception; 3 import javax.servlet.*; 4 import javax.servlet.http.*; 5 import cn.itcast.chapter04.entity.user; 6 public class LoginServlet extends HttpServlet { 7 public void doget(httpservletrequest request, HttpServletResponse response) 8 throws ServletException, IOException { 9 // 获得用户名和密码 10 String username = request.getparameter("username"); 11 String password = request.getparameter("password"); 12 // 检查用户名和密码 13 if ("itcast".equals(username) && "123456".equals(password)) { 14 // 登录成功 15 // 将用户状态 user 对象存入 session 域 16 User user = new User(); 17 user.setusername(username); 18 user.setpassword(password); 19 request.getsession().setattribute("user", user); 20 // 发送自动登录的 cookie 21 String autologin = request.getparameter("autologin"); 22 if (autologin!= null) { 23 // 注意 cookie 中的密码要加密 24 Cookie cookie = new Cookie("autologin", username + "-" 25 + password); 26 cookie.setmaxage(integer.parseint(autologin)); 27 cookie.setpath(request.getcontextpath()); 28 response.addcookie(cookie); 29 } 30 // 跳转至首页 31 response.sendredirect(request.getcontextpath()+"/index.jsp"); 32 } else { 33 request.setattribute("errermsg", " 用户名或密码错 "); 34 request.getrequestdispatcher("/login.jsp").forward(request, 35 response); 36 } 37 } 38 public void dopost(httpservletrequest request, HttpServletResponse response) 39 throws ServletException, IOException { 40 doget(request, response);

15 41 } 42 } (5) 编写 LogoutServlet.java 程序在 chapter04 工程的 cn.itcast.chapter04.servlet 包中, 编写 LogoutServlet.java 程序, 该程序用于注销用户登录的信息, 在这个程序中首先会将 Session 会话中保存的 User 对象删除, 然后将自动登录的 Cookie 删除, 最后跳转到 index.jsp, 如例 4-13 所示 例 4-13 LogoutServlet.java 1 package cn.itcast.chapter04.servlet; 2 import java.io.ioexception; 3 import javax.servlet.*; 4 import javax.servlet.http.*; 5 public class LogoutServlet extends HttpServlet { 6 public void doget(httpservletrequest request, HttpServletResponse response) 7 throws ServletException, IOException { 8 // 用户注销 9 request.getsession().removeattribute("user");// 从 session 中移除 user 10 // 从客户端删除自动登录的 cookie 11 Cookie cookie = new Cookie("autologin", "msg"); 12 cookie.setpath(request.getcontextpath()); 13 cookie.setmaxage(0); 14 response.addcookie(cookie); 15 response.sendredirect(request.getcontextpath()+"/index.jsp"); 16 } 17 public void dopost(httpservletrequest request, HttpServletResponse response) 18 throws ServletException, IOException { 19 doget(request, response); 20 } 21 } (6) 编写 AutoLoginFilter.java 过滤器程序在 chapter04 工程的 cn.itcast.chapter04.filter 包中, 编写 AutoLoginFilter.java 程序, 该程序用于拦截用户登录的访问请求, 判断请求中是否包含用户自动登录的 Cookie, 如果包含则获取 Cookie 中的用户名和密码, 并验证用户名和密码是否正确, 如果正确, 则将用户的登录信息封装到 User 对象存入 Session 域中, 完成用户自动登录, 如例 4-14 所示 例 4-14 AutoLoginFilter.java 1 package cn.itcast.chapter04.filter; 2 import java.io.ioexception; 3 import javax.servlet.*; 4 import javax.servlet.http.*; 5 import cn.itcast.chapter04.entity.user; 6 public class AutoLoginFilter implements Filter { 7 public void init(filterconfig filterconfig) throws ServletException { 8 } 9 public void dofilter(servletrequest req, ServletResponse response, 10 FilterChain chain) throws IOException, ServletException {

16 11 HttpServletRequest request = (HttpServletRequest) req; 12 // 获得一个名为 autologin 的 cookie 13 Cookie[] cookies = request.getcookies(); 14 String autologin = null; 15 for (int i = 0; cookies!= null && i < cookies.length; i++) { 16 if ("autologin".equals(cookies[i].getname())) { 17 // 找到了指定的 cookie 18 autologin = cookies[i].getvalue(); 19 break; 20 } 21 } 22 if (autologin!= null) { 23 // 做自动登录 24 String[] parts = autologin.split("-"); 25 String username = parts[0]; 26 String password = parts[1]; 27 // 检查用户名和密码 28 if ("itcast".equals(username)&& ("123456").equals(password)) { 29 // 登录成功, 将用户状态 user 对象存入 session 域 30 User user = new User(); 31 user.setusername(username); 32 user.setpassword(password); 33 request.getsession().setattribute("user", user); 34 } 35 } 36 // 放行 37 chain.dofilter(request, response); 38 } 39 public void destroy() { 40 } 41 } 在 web.xml 文件中, 配置 AutoLoginFilter 过滤器, 由于要拦截用户访问资源的所有请求, 因此将 <filter-mapping> 元素拦截的路径设置为 /*, 具体代码如下 : <filter> <filter-name>autologinfilter</filter-name> <filter-class> cn.itcast.chapter04.filter.autologinfilter</filter-class> </filter> <filter-mapping> <filter-name>autologinfilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> (7) 访问 login.jsp 页面 重新启动 Web 服务, 打开 IE 浏览器, 在地址栏中输入

17 此时, 浏览器窗口中会显示一个用户登录的表单, 在这个表单中输入用户名 itcast 密码 , 并选择 用户自动登录的时间, 如图 4-10 所示 图 4-10 运行结果 (8) 实现用户登录点击图 4-10 中的登录按钮, 便可完成用户自动登录, 此时, 在浏览器窗口中会显示登录的用户名, 如图 4-11 所示 图 4-11 运行结果从图 4-11 可以看出, 用户已经登录成功了, 此时再开启一个 IE 浏览器, 在地址栏中直接输 仍可以看到用户的登录信息, 因此可以说明完成了用户自动登录的功能 (9) 注销用户 点击图 4-11 中的注销超链接, 就可以注销当前的用户, 然后显示 index.jsp 页面, 如图 4-12 所示 图 4-12 运行结果

18 4.3 Filter 高级应用 通过前面的学习, 了解到 Filter 过滤器可以获取到代表用户请求和响应的 request response 对象 可是如果想对 request 和 response 对象中的任何信息进行修改, 则需要通过包装类来实现 在 Servlet API 中, 提供了 HttpServletRequestWrapper 和 HttpServletResponseWrapper 两个类, 它们分别是 request 和 response 对象的包装类 接下来, 本节将围绕 Filter 程序中包装类的使用进行详细地讲解 装饰设计模式 HttpServletRequestWrapper 和 HttpServletResponseWrapper 作为 request 和 response 对象的包装类, 它们都采用了装饰设计模式 所谓装饰设计模式, 指的是通过包装类的方式, 动态增强某个类的功能 为了大家更好的理解装饰设计模式, 接下来, 先来简单介绍一下装饰设计模式的特点, 具体如下 : l 包装类要和被包装对象实现同样的接口 l 包装类持有一个被包装对象, 例如在 HttpServletRequestWrapper 定义的构造方法中, 需要传递一个 HttpServletRequest 类型的参数 l 包装类在实现接口的过程中, 对于不需要包装的方法原封不动地调用被包装对象的方法来实现, 对于需要包装的方法自己实现 了解了装饰设计模式的特点, 接下来, 通过一个案例来演示如何实现装饰设计模式, 在 chapter04 工程的 cn.itcast.chapter04. decorator 包中, 编写 PhoneDemo.java 程序, 具体如例 4-15 所示 例 4-15 PhoneDemo.java 1 package cn.itcast.chapter04.decorator; 2 /** 3 * 手机 4 */ 5 interface Phone{ 6 // 手机的功能 7 void action(); 8 } 9 /** 10 * 非智能手机 11 */ 12 class Non_SmartPhone implements Phone{ 13 // 非智能机具有打电话的功能 14 public void action() { 15 System.out.println(" 可以打电话 "); 16 } 17 } 18 /** 19 * 智能手机 20 */ 21 class SmartPhone implements Phone{ 22 private Phone nonsmartphone; 23 public SmartPhone(Phone nonsmartphone){

19 24 this.nonsmartphone = nonsmartphone; 25 } 26 // 智能机拥有打电话和玩愤怒的小鸟的功能 27 public void action() { 28 nonsmartphone.action(); 29 System.out.println(" 可以玩愤怒的小鸟 "); // 在非智能机的基础上, 实现功能的增强 30 } 31 } 32 public class PhoneDemo { 33 public static void main(string[] args) { 34 Phone nphone = new Non_SmartPhone(); 35 System.out.println(" 手机装饰前 "); 36 nphone.action(); 37 Phone smartphone = new SmartPhone(nPhone); 38 System.out.println(" 手机装饰后 "); 39 smartphone.action(); 40 } 41 } 在例 4-15 中,Non_SmartPhone 类表示非智能手机, 它是属于被包装类,SmartPhone 类表示智能手机, 它是 Non_SmartPhone 类的包装类,Non_SmartPhone 类和 SmartPhone 类实现了相同的接口 Phone 第 22 行代码用于在 SmartPhone 类中持有被包装类 Non_SmartPhone 的对象, 第 29 行代码用于在被包装类的基 础上, 实现功能的增强 程序的运行结果如图 4-13 所示 图 4-13 运行结果从图 4-13 中可以看出,SmartPhone 对 Non_SmartPhone 类进行包装后,SmartPhone 类型的对象不仅具有了 打电话 功能, 还具有了 玩游戏 的功能 Filter 实现统一全站编码 在 Web 开发中, 经常会遇到中文乱码问题, 按照前面所学的知识, 解决乱码的通常做法都是在 Servlet 程序中设置编码方式, 但是, 如果多个 Servlet 程序都需要设置编码方式, 势必会书写大量重复的代码 为了解决上面的问题, 我们可以在 Filter 中对获取到的请求和响应消息进行编码, 从而统一全站的编码方式 接下来, 分步骤讲解如何使用 Filter 实现统一全站的编码, 具体如下 : (1) 编写 form.jsp 页面在 chapter04 工程的 WebContent 根目录中, 编写一个 form.jsp 页面, 用于提交用户登录的表单信息, 如例 4-16 所示 例 4-16 form.jsp

20 1 page language="java" contenttype="text/html; charset=utf-8" 2 pageencoding="utf-8" import="java.util.*" 3 %> 4 5 <html> 6 <head></head> 7 <center> 8 <h3> 用户登录 </h3> 9 </center> 10 <body style="text-align: center;"> 11 <a href="<%=request.getcontextpath()%>/characterservlet?name= 12 传智播客 &password=123456"> 点击超链接登录 </a> 13 <form action="<%=request.getcontextpath()%>/characterservlet" 14 method="post"> 15 <table border="1" width="600px" cellpadding="0" cellspacing="0" 16 align="center"> 17 <tr> 18 <td height="30" align="center"> 用户名 :</td> 19 <td> <input type="text" name="name" /></td> 20 </tr> 21 <tr> 22 <td height="30" align="center"> 密 码 :</td> 23 <td> <input type="password" name="password" /></td> 24 </tr> 25 <tr> 26 <td height="30" colspan="2" align="center"><input type="submit" 27 value=" 登录 " /> <input type="reset" 28 value=" 重置 " /></td> 29 </tr> 30 </table> 31 </form> 32 </body> 33 <html> (2) 编写 CharacterServlet.java 程序在 chapter04 工程的 cn.itcast.chapter04.servlet 包中, 编写一个 CharacterServlet.java 程序, 该程序用于获取用户输入的请求参数, 并将参数输出到控制台, 如例 4-17 所示 例 4-17 CharacterServlet.java 1 package cn.itcast.chapter04.servlet; 2 import java.io.ioexception; 3 import javax.servlet.*; 4 import javax.servlet.http.*; 5 public class CharacterServlet extends HttpServlet { 6 public void doget(httpservletrequest request, HttpServletResponse response) 7 throws ServletException, IOException {

21 8 System.out.println(request.getParameter("name")); 9 System.out.println(request.getParameter("password")); 10 } 11 public void dopost(httpservletrequest request, HttpServletResponse response) 12 throws ServletException, IOException { 13 doget(request, response); 14 } 15 } (3) 编写 CharacterFilter.java 过滤器 CharacterFilter 类用于拦截用户的请求访问, 实现统一全站编码的功能 但是, 由于请求方式 post 和 get 解决乱码方式的不同,post 方式的请求参数存放在消息体中, 可以通过 setcharacterencoding() 方法进行设置, 而 get 方式的请求参数存放在消息头中, 必须得通过获取 URI 参数才能进行设置 如果每次单独对 get 请求方式进行处理, 势必会很麻烦, 为此, 可以通过 HttpServletRequestWrapper 类对 HttpServletRequest 进行包装, 通过重写 getparameter() 的方式来设置 get 方式提交参数的编码,CharacterFilter 类的实现代码如例 4-18 所示 例 4-18 CharacterFilter.java 1 package cn.itcast.chapter04.filter; 2 import java.io.*; 3 import javax.servlet.*; 4 import javax.servlet.http.*; 5 public class CharacterFilter implements Filter { 6 public void init(filterconfig filterconfig) throws ServletException { 7 } 8 public void dofilter(servletrequest req, ServletResponse resp, 9 FilterChain chain) throws IOException, ServletException { 10 HttpServletRequest request = (HttpServletRequest) req; 11 HttpServletResponse response = (HttpServletResponse) resp; 12 // 拦截所有的请求解决全站中文乱码 13 // 指定 request 和 response 的编码 14 request.setcharacterencoding("utf-8"); // 只对消息体有效 15 response.setcontenttype("text/html;charset=utf-8"); 16 // 在放行时应该给目标资源一个 request 对象让目标资源调用 17 // getparameter 时调到我们写的 getparameter 18 // 对 request 进行包装 19 CharacterRequest characterrequest = new CharacterRequest(request); 20 chain.dofilter(characterrequest, response); 21 } 22 public void destroy() { 23 } 24 } 25 // 针对 request 对象进行包装 26 // 继承默认包装类 HttpServletRequestWrapper 27 class CharacterRequest extends HttpServletRequestWrapper { 28 public CharacterRequest(HttpServletRequest request) {

22 29 super(request); 30 } 31 // 子类继承父类一定会覆写一些方法, 此处用于重写 getparamter() 方法 32 public String getparameter(string name) { 33 // 调用被包装对象的 getparameter() 方法获得请求参数 34 String value = super.getparameter(name); 35 if (value == null) 36 return null; 37 // 判断请求方式 38 String method = super.getmethod(); 39 if ("get".equalsignorecase(method)) { 40 try { 41 value = new String(value.getBytes("iso "), "utf-8"); 42 } catch (UnsupportedEncodingException e) { 43 throw new RuntimeException(e); 44 } 45 } 46 // 解决乱码后返回结果 47 return value; 48 } 49 } 在 web.xml 文件中, 配置 CharacterFilter 过滤器, 由于要拦截用户访问资源的所有请求, 因此将 <filter-mapping> 元素拦截的路径设置为 /*, 具体代码如下 : <filter> <filter-name>characterfilter</filter-name> <filter-class>cn.itcast.chapter04.filter.characterfilter</filter-class> </filter> <filter-mapping> <filter-name>characterfilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> (4) 访问 form.jsp 页面重新启动 Web 服务器, 打开 IE 浏览器, 在地址栏中输入 此时, 浏览器窗口中会显示一个用户登录的表单, 在这个表单中输入用户名传智播客 密码 , 如图 4-14 所示

23 图 4-14 运行结果 点击图 4-14 界面中的登录按钮来提交表单, 此时, 控制台窗口显示的结果如图 4-15 所示 图 4-15 控制台窗口从图 4-15 可以看出, 在 form.jsp 表单中输入的用户名和密码都正确的显示在控制台窗口, 而且中文的用户名也没有出现乱码问题 需要注意的是,form.jsp 表单的提交方式是 post, 因此可以说明使用 post 提交表单可以解决中文乱码问题, 表单的提交方式还有一种是 get, 接下来就验证 get 方式提交表单的乱码问题能否解决 (5) 使用超连接访问 form.jsp 页面点击图 4-14 界面中的 点击超链接登录 提交表单, 这种提交方式相当于 get 方式提交表单, 此时, 控制台窗口显示的结果如图 4-16 所示 图 4-16 控制台窗口从图 4-16 可以看出,get 方式提交表单与 post 方式提交表单的效果是一样的, 同样不会出现乱码问题 因此, 可以说明使用 Filter 过滤器可以方便的完成统一全站编码的功能 需要注意的是, 针对 response 对象,Servlet API 也提供了对应的包装类 HttpServletResponseWrapper, 它的用法与 HttpServletRequestWrapper 类似, 在此不再进行举例介绍了 Filter 实现页面静态化 在实际开发中, 有时为了提高程序性能 减轻数据库访问压力以及对搜索引擎的优化, 可以使用 Filter 实现动态页面静态化 页面静态化就是先于用户获取资源或数据库数据进而通过静态化处理, 生成静态页

24 面, 所有人都访问这一个静态页面, 而静态化处理的页面的访问速度要比动态页面快的多, 因此程序性能 会有大大的提升 接下来通过一张图来简单描述页面静态化的过程, 如图 4-17 所示 首次访问 客户端 Filter Servlet 数据库 二次访问 静态页面 图 4-17 页面静态化图 4-17 中, 当客户端首次访问页面时,Filter 会自定义 response 输出缓存 HTML 源码 当客户端第二次访问页面时, 就会直接访问静态页面, 这样避免访问数据库 接下来通过一个显示图书分类的案例, 分步骤讲解如何使用 Filter 实现页面静态化, 具体如下 : (1) 首先写一个完整的查询图书的功能, 测试成功后, 再通过编写过滤器将动态的图书信息页面静态化 在 MySQL 中创建一个数据库 chapter04, 在该数据库中创建数据表 t_book 并插入数据, 其中,bname 为图书名称 price 为图书价格 category 为图书分类, 具体 SQL 语句如下 : CREATE DATABASE chapter04; USE chapter04; CREATE TABLE t_book( bid CHAR(32) PRIMARY KEY, bname VARCHAR(100), price NUMERIC(10,2), category INT ); INSERT INTO t_book VALUES('b1', 'JavaSE_1', 10, 1); INSERT INTO t_book VALUES('b2', 'JavaSE_2', 15, 1); INSERT INTO t_book VALUES('b3', 'JavaSE_3', 20, 1); INSERT INTO t_book VALUES('b4', 'JavaSE_4', 25, 1); INSERT INTO t_book VALUES('b5', 'JavaEE_1', 30, 2); INSERT INTO t_book VALUES('b6', 'JavaEE_2', 35, 2); INSERT INTO t_book VALUES('b7', 'JavaEE_3', 40, 2); INSERT INTO t_book VALUES('b8', 'Java_framework_1', 45, 3); INSERT INTO t_book VALUES('b9', 'Java_framework_2', 50, 3); 查询 t_book 表中的数据, 查询结果如下 : mysql> SELECT * FROM t_book; bid bname price category b1 JavaSE_ b2 JavaSE_

25 b3 JavaSE_ b4 JavaSE_ b5 JavaEE_ b6 JavaEE_ b7 JavaEE_ b8 Java_framework_ b9 Java_framework_ rows in set (0.04 sec) (2) 将所需的连接数据库包导入到 chapter04 项目中的 lib 文件夹下, 创建包 cn.itcast.domain 并在包中编写一个 Book 类, 具体代码如例 4-19 所示 例 4-19 Book.java 1 package cn.itcast.domain; 2 public class Book { 3 private String bid; 4 private String bname; 5 private double price; 6 private int category; 7 public String getbid() { 8 return bid; 9 } 10 public void setbid(string bid) { 11 this.bid = bid; 12 } 13 public String getbname() { 14 return bname; 15 } 16 public void setbname(string bname) { 17 this.bname = bname; 18 } 19 public double getprice() { 20 return price; 21 } 22 public void setprice(double price) { 23 this.price = price; 24 } 25 public int getcategory() { 26 return category; 27 } 28 public void setcategory(int category) { 29 this.category = category; 30 } 32 public String tostring() {

26 33 return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price 34 + ", category=" + category + "]"; 35 } 36 } (3) 创建包 cn.itcast.dao 并在包中编写 BookDao 类, 在本案例中会涉及到两个查询方法, 一个是查询所有图书, 一个按分类查询图书,, 具体代码如例 4-20 所示 例 4-20 BookDao.java 1 package cn.itcast.dao; 2 import java.sql.sqlexception; 3 import java.util.list; 4 import org.apache.commons.dbutils.queryrunner; 5 import org.apache.commons.dbutils.handlers.beanlisthandler; 6 import cn.itcast.domain.book; 7 import cn.itcast.jdbc.utils.jdbcutils;// 这个 JDBCUtils 与 chapter03 中的一样 8 public class BookDao { 9 private QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource()); 10 // 查询所有 11 public List<Book> findall() { 12 try { 13 String sql = "select * from t_book"; 14 return qr.query(sql, new BeanListHandler<Book>(Book.class)); 15 } catch (SQLException e) { 16 throw new RuntimeException(e); 17 } 18 } 19 // 按分类查询 20 public List<Book> findbycategory(int category) { 21 try { 22 String sql = "select * from t_book where category=?"; 23 return qr.query(sql, new BeanListHandler<Book>(Book.class), category); 24 } catch (SQLException e) { 25 throw new RuntimeException(e); 26 } 27 } 28 } (4) 在包 cn.itcast.chapter04.serrvlet 下创建一个 BookServlet 该 Servlet 要获取 category 参数, 如果这个参数存在, 说明是按分类查询, 如果不存在, 表示查询所有 然后将查询出的数据存成 List 并保存到 request 中转发到页面, 具体代码如例 4-21 所示 例 4-21 BookServlet.java 1 package cn.itcast.chapter04.servlet; 2 import java.io.ioexception; 3 import java.util.list; 4 import javax.servlet.servletexception; 5 import javax.servlet.http.httpservlet;

27 6 import javax.servlet.http.httpservletrequest; 7 import javax.servlet.http.httpservletresponse; 8 import cn.itcast.dao.bookdao; 9 import cn.itcast.domain.book; 10 public class BookServlet extends HttpServlet { 11 public void doget(httpservletrequest request, HttpServletResponse response) 12 throws ServletException, IOException { 13 String param = request.getparameter("category");// 获取 category 参数 14 BookDao dao = new BookDao(); 15 List<Book> booklist = null; 16 // 如果 category 参数不存在, 表示查询所有 17 if(param == null param.trim().isempty()) { 18 booklist = dao.findall(); 19 } else { 20 int category = Integer.parseInt(param); // 把参数转换成 int 类型 21 // 按分类查询图书 22 booklist = dao.findbycategory(category); 23 } 24 // 把图书保存到 request 中 25 request.setattribute("booklist", booklist); 26 request.getrequestdispatcher("/show.jsp").forward(request, response); 27 } 28 } (5) 在 WebContent 根目录中, 编写 index_book.jsp 页面, 用于显示图书分类, 具体如例 4-22 所示 例 4-22 index_book.jsp 1 <%@ page language="java" import="java.util.*" pageencoding="utf-8"%> 2 <% 3 String path = request.getcontextpath(); 4 String basepath = request.getscheme()+"://"+request.getservername()+ 5 ":"+request.getserverport()+path+"/"; 6 %> 7 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 9 <html> 10 <head> 11 <base href="<%=basepath%>"> <title>my JSP 'index_book.jsp' starting page</title> 14 <meta http-equiv="pragma" content="no-cache"> 15 <meta http-equiv="cache-control" content="no-cache"> 16 <meta http-equiv="expires" content="0"> 17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 18 <meta http-equiv="description" content="this is my page"> 19 </head>

28 20 <body> 21 <a href="<%=request.getcontextpath()%>/bookservlet"> 全部图书 </a><br/> 22 <a href="<%=request.getcontextpath()%>/bookservlet?category=1">javase 分类 </a><br/> 23 <a href="<%=request.getcontextpath()%>/bookservlet?category=2">javaee 分类 </a><br/> 24 <a href="<%=request.getcontextpath()%>/bookservlet?category=3">java 框架分类 </a><br/> 25 </body> 26 </html> (6) 在 WebContent 根目录中, 编写一个 show.jsp 页面, 用于显示每类图书信息, 具体代码如例 4-23 所示 例 4-23 show.jsp 1 <%@page import="cn.itcast.domain.book"%> 2 <%@ page language="java" import="java.util.*" pageencoding="utf-8"%> 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 4 <html> 5 <head> 6 <title>my JSP 'show.jsp' starting page</title> 7 <meta http-equiv="pragma" content="no-cache"> 8 <meta http-equiv="cache-control" content="no-cache"> 9 <meta http-equiv="expires" content="0"> 10 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 11 <meta http-equiv="description" content="this is my page"> 12 <meta http-equiv="content-type" content="text/html; charset=utf-8"> 13 <!-- 14 <link rel="stylesheet" type="text/css" href="styles.css"> 15 --> 16 </head> 17 <body> 18 <table border="1" align="center" width="50%"> 19 <tr> 20 <th> 图书名称 </th> 21 <th> 图书单价 </th> 22 <th> 图书分类 </th> 23 </tr> 24 <% 25 List<Book> list = (List) request.getattribute("booklist"); 26 for (Book b : list) { 27 %> 28 <tr> 29 <td><%=b.getbname()%></td> 30 <td><%=b.getprice()%></td> 31 <td> 32 <% if (b.getcategory() == 1) {%> 33 <p style="color: red;">javase 分类 </p> 34 <%} else if (b.getcategory() == 2) {%>

29 35 <p style="color: blue;">javaee 分类 </p> 36 <%} else {%> 37 <p style="color: green;">java 框架分类 </p> 38 <%}%> 39 </td> 40 </tr> 41 <%}%> 42 </table> 43 </body> 44 </html> 页面完成后, 先验证查看图书分类的功能是否完成, 重新启动 Web 服务器, 打开 IE 浏览器, 在地址 栏中输入 查询结果如图 4-18 点击查看 JavaSE 分类, 查询结果如图 4-19 图 4-18 查询结果 图 4-19 查询结果从图 4-19 中的 URL 地址可以看出, 本次查询是通过 BookServlet 查询数据库所得结果 接下来, 将编写过滤器来实现页面静态化 (7) 在包 cn.itcast.chapter04.filter 下编写 StaticResponse 类, 该类为自定义的 Response, 重写了 Writer() 方法, 使其向指定的文件输出 具体代码如例 4-24 所示 例 4-24 StaticResponse.java 1 package cn.itcast.chapter04.filter; 1 import java.io.filenotfoundexception; 2 import java.io.ioexception; 3 import java.io.printwriter; 4 import java.io.unsupportedencodingexception; 5 import javax.servlet.http.httpservletresponse;

30 6 import javax.servlet.http.httpservletresponsewrapper; 7 public class StaticResponse extends HttpServletResponseWrapper { 8 private HttpServletResponse response; 9 private PrintWriter pw; 10 // 其中 staticpath 为静态页面的路径 11 public StaticResponse(HttpServletResponse response, String staticpath) 12 throws FileNotFoundException, UnsupportedEncodingException { 13 super(response); 14 this.response = response; 15 // pw 与指定文件绑定在一起, 当使用 pw 输出时, 就是向指定的文件输出 16 pw = new PrintWriter(staticPath, "utf-8"); 17 } 18 // 当 show.jsp 输出页面中的内容时, 使用的就是 getwriter() 获取的流对象 19 public PrintWriter getwriter() throws IOException { 20 return pw; 21 } 22 // 关闭方法在过滤器中调用, 可以刷新缓冲区 23 public void close() { 24 pw.close(); 25 } 26 } (8) 在 cn.itcast.chapter04.filter 包下编写过滤器 StaticFilter 类, 该类实现了判断是否存在静态页面, 如果存在静态页面, 则重定向到静态页面, 如果静态页面不存在, 那么生成静态页面, 其具体代码如例 4-25 所示 例 4-25 StaticFilter.java 1 package cn.itcast.chapter04.filter; 2 import java.io.ioexception; 3 import java.util.hashmap; 4 import java.util.map; 5 import javax.servlet.filter; 6 import javax.servlet.filterchain; 7 import javax.servlet.filterconfig; 8 import javax.servlet.servletcontext; 9 import javax.servlet.servletexception; 10 import javax.servlet.servletrequest; 11 import javax.servlet.servletresponse; 12 import javax.servlet.http.httpservletrequest; 13 import javax.servlet.http.httpservletresponse; 14 public class StaticFilter implements Filter { 15 private FilterConfig config; 16 public void destroy() { 17 } 18 public void dofilter(servletrequest request, ServletResponse response, 19 FilterChain chain) throws IOException, ServletException {

31 20 // 把 request 和 response 都强转成 http 的 21 HttpServletRequest req = (HttpServletRequest) request; 22 HttpServletResponse res = (HttpServletResponse) response; 23 // 1. 获取 Map 24 // 获取 ServletContext 25 ServletContext sc = config.getservletcontext(); 26 Map<String, String> staticmap = (Map<String, String>) sc 27.getAttribute("static_map"); 28 if (staticmap == null) { 29 staticmap = new HashMap<String, String>(); 30 sc.setattribute("static_map", staticmap); 31 } 32 // 2. 通过访问路径获取对应的静态页面 33 // 生成 key:book_ 前缀, 后缀为 category 的值 34 String category = request.getparameter("category"); 35 String key = "book_" + category;// 可能有 :book_null book_1 book_2 book_3 36 // 查看这个路径对应的静态页面是否存在 37 if (staticmap.containskey(key)) {// 如果静态页面已经存在 38 String staticpath = staticmap.get(key);// 获取静态页面路径 39 // 重定向到静态页面 40 res.sendredirect(req.getcontextpath() + "/html/" + staticpath); 41 return; 42 } 43 // 如果静态页面不存在 44 // 3. 生成静态页面 45 // 创建静态页面的路径 46 String staticpath = key + ".html"; 47 // 获取真实路径 48 String realpath = sc.getrealpath("/html/" + staticpath); 49 // 创建自定义 Response 50 StaticResponse sr = new StaticResponse(res, realpath); 51 // 放行 52 chain.dofilter(request, sr); 53 // 保存静态页面到 map 中 54 staticmap.put(key, staticpath); 55 // 4. 重定向到静态页面 56 res.sendredirect(req.getcontextpath() + "/html/" + staticpath); 57 } 58 public void init(filterconfig fconfig) throws ServletException { 59 this.config = fconfig; 60 } 61 } 编写完 Filter 后, 要在 web.xml 中配置 StaticFilter, 配置如下 : <filter>

32 <filter-name>staticfilter</filter-name> <filter-class>cn.itcast.chapter04.filter.staticfilter</filter-class> </filter> <filter-mapping> <filter-name>staticfilter</filter-name> <servlet-name>bookservlet</servlet-name> </filter-mapping> 需要注意的是, 在运行程序前, 要在 WebContent 根目录下创建 html 文件夹, 以便存放生成的静态页面 重新启动 Web 服务器, 打开 IE 浏览器, 在地址栏中输入 查询结果如图 4-20 所示 这时查看 JavaSE 分类, 查询结果如图 4-21 所示 图 4-20 查询结果 图 4-21 查询结果在图 4-21 中, 可以看到浏览器的 URL 路径变为访问静态页面了, 说明完成了动态页面静态化的功能 需要注意的是, 页面静态化虽然可以提高程序的性能, 但是却脱离了查询数据库, 当数据库发生变化时, 用户无法获得最新的数据 这时可以在对数据库进行操作时添加一个标记, 告诉程序什么时候需要查询数据库, 此功能在这里就不详细讲解了, 有兴趣的同学可以自行研究 4.4 本章小结 本章主要讲解了过滤器的开发与应用, 首先讲解了什么是 Filter, 然后讲解了如何开发一个 Filter 程序 以及开发 Filter 程序时需要注意的细节, 最后讲解了 Filter 在实际开发中的具体应用 通过本章的学习, 读 者能够掌握 Filter 的概念以及创建和部署的过程, 并且能够掌握 Filter 的具体应用

D getinitparameternames() 9 下 列 选 项 中, 属 于 Servlet API 中 提 供 的 request 对 象 的 包 装 类 的 是 ( ) A HttpServletRequestWrapper B HttpServletRequest C HttpServ

D getinitparameternames() 9 下 列 选 项 中, 属 于 Servlet API 中 提 供 的 request 对 象 的 包 装 类 的 是 ( ) A HttpServletRequestWrapper B HttpServletRequest C HttpServ 第 四 章 Filter( 过 滤 器 ) 样 题 A 卷 一 选 择 题 ( 每 小 题 2 分, 共 20 分 ) 1 下 面 选 项 中, 用 于 实 现 初 始 化 过 滤 器 的 方 法 是 ( ) A init(filterconfig filterconfig) B dofilter(servletrequest req,servletresponse resp,filterchain

More information

09 (File Processes) (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises)

09 (File Processes) (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises) 09 (File Processes) 9-1 9-2 (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises) Java Servlet 9-1 Servlet (File Processes) Client Servlet Servlet Java Java (Stream)

More information

resp.getwriter().print(j + "*" + i + "=" + j * i+" "); resp.getwriter().print("<br/>"); protected void dopost(httpservletrequest req, HttpServletRespo

resp.getwriter().print(j + * + i + = + j * i+ ); resp.getwriter().print(<br/>); protected void dopost(httpservletrequest req, HttpServletRespo 第三章补充案例 案例 3-1 HttpServlet 一 案例描述 1 考核知识点名称 :HttpServlet 编号 : 2 练习目标 掌握 HttpServlet 的 doget() 方法和 dopost() 方法 3 需求分析由于大多数 Web 应用都是通过 HTTP 协议和客户端进行交互, 因此, 在 Servlet 接口中, 提供了 一个抽象类 javax.servlet.http.httpservlet,

More information

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit Tomcat Web JUnit Cactus JUnit Java Cactus JUnit 26.1 JUnit Java JUnit JUnit Java JSP Servlet JUnit Java Erich Gamma Kent Beck xunit JUnit boolean JUnit Java JUnit Java JUnit Java 26.1.1 JUnit JUnit How

More information

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6 www.brainysoft.net 1.JasperReport ireport...4 1.1 JasperReport...4 1.2 ireport...4 2....4 2.1 JDK...4 2.1.1 JDK...4 2.1.2 JDK...5 2.1.3 JDK...5 2.2 ant...6 2.2.1 ant...6 2.2.2 ant...6 2.3 JasperReport...7

More information

JAR 包 : doget 方法 : 1. import java.io.ioexception; 2. import java.io.printwriter; 3. import javax.servlet.servletexception; 4. import javax.servlet.htt

JAR 包 : doget 方法 : 1. import java.io.ioexception; 2. import java.io.printwriter; 3. import javax.servlet.servletexception; 4. import javax.servlet.htt Java Servlet 技术的实现原理 程天任 摘要 : Server Applet 全称 Java Servlet, 是用 Java 编写的服务器端程序 其主要功能在于交互式地浏览和修改数据, 生成动态 Web 内容 狭义的 Servlet 是指 Java 语言实现的一个接口, 广义的 Servlet 是指任何实现了这个 Servlet 接口的类, 一般情况下, 人们将 Servlet 理解为后者

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 本章学习目标 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 配置视图解析器 @RequestMapping 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 和 Struts2 都属于表现层的框架, 它是 Spring 框架的一部分, 我们可 以从 Spring 的整体结构中看得出来 :

More information

Microsoft PowerPoint - 05-Status-Codes-Chinese.ppt

Microsoft PowerPoint - 05-Status-Codes-Chinese.ppt 2004 Marty Hall 服务器响应的生成 : HTTP 状态代码 JSP, Servlet, & Struts Training Courses: http://courses.coreservlets.com Available in US, China, Taiwan, HK, and Worldwide 2 JSP and Servlet Books from Sun Press: http://www.coreservlets.com

More information

Servlet

Servlet Servlet Allen Long Email: allen@huihoo.com http://www.huihoo.com 2004-04 Huihoo - Enterprise Open Source http://www.huihoo.com 1 Huihoo - Enterprise Open Source http://www.huihoo.com 2 GET POST Huihoo

More information

在所有的项目开发中, 一定是多人协作的团队开发, 但是使用框架就会出现一个问题, 我们所 有的 Action 以及相关的路径都要求在我们的 struts.xml 文件中配置, 如果所有的人去修改一个 文件, 那么就会变得混乱, 而且有可能出现冲突, 那么在 struts.xml 文件中为了解决这个问

在所有的项目开发中, 一定是多人协作的团队开发, 但是使用框架就会出现一个问题, 我们所 有的 Action 以及相关的路径都要求在我们的 struts.xml 文件中配置, 如果所有的人去修改一个 文件, 那么就会变得混乱, 而且有可能出现冲突, 那么在 struts.xml 文件中为了解决这个问 内置对象的取得和多人开发 一 内置对象的取得 在使用的 servlet 的时候可以通过 HttpServletResquest 获取到一些内置对象, 但是在 struts2 中为了方便取得内置对象, 专门提供了一个 ServletActionContext 这个类取得取得内置对象, 观察如下方法 public static javax.servlet.jsp.pagecontext() 取得 pagecontext

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

新・解きながら学ぶJava

新・解きながら学ぶJava 481! 41, 74!= 40, 270 " 4 % 23, 25 %% 121 %c 425 %d 121 %o 121 %x 121 & 199 && 48 ' 81, 425 ( ) 14, 17 ( ) 128 ( ) 183 * 23 */ 3, 390 ++ 79 ++ 80 += 93 + 22 + 23 + 279 + 14 + 124 + 7, 148, 16 -- 79 --

More information

Microsoft PowerPoint - 02-Servlet-Basics-Chinese.ppt

Microsoft PowerPoint - 02-Servlet-Basics-Chinese.ppt 2004 Marty Hall servlet 基础 JSP, Servlet, & Struts Training Courses: http://courses.coreservlets.com Available in US, China, Taiwan, HK, and Worldwide 2 JSP and Servlet Books from Sun Press: http://www.coreservlets.com

More information

Microsoft Word - 第4章 Servlet开发—教学设计.doc

Microsoft Word - 第4章 Servlet开发—教学设计.doc 传智播客 JavaWeb 程序开发入门 教学设计 课程名称 : JavaWeb 程序开发入门 授课年级 : 2014 年级 授课学期 : 2014 学年第一学期 教师姓名 : 某某老师 2014 年 09 月 09 日 课题名称内容分析教学目标及基本要求重点及措施 计划第 4 章 Servlet 技术 6 课时学时随着 Web 应用业务需求的增多, 动态 Web 资源的开发变得越来越重要, 为此 Sun

More information

基于CDIO一体化理念的课程教学大纲设计

基于CDIO一体化理念的课程教学大纲设计 Java 语 言 程 序 设 计 课 程 教 学 大 纲 Java 语 言 程 序 设 计 课 程 教 学 大 纲 一 课 程 基 本 信 息 1. 课 程 代 码 :52001CC022 2. 课 程 名 称 :Java 语 言 程 序 设 计 3. 课 程 英 文 名 称 :Java Programming 4. 课 程 类 别 : 理 论 课 ( 含 实 验 上 机 或 实 践 ) 5. 授

More information

使用 Eclipse 开发 Java EE 应用 (Web 应用 ) 这里以开发一个简单的 Web 应用为例, 介绍使用 Eclipse 开发 Java EE 应用的一般步 骤 此处使用的 Eclipse 是 Eclipse IDE for Java EE Developers; 如果是使用的其他

使用 Eclipse 开发 Java EE 应用 (Web 应用 ) 这里以开发一个简单的 Web 应用为例, 介绍使用 Eclipse 开发 Java EE 应用的一般步 骤 此处使用的 Eclipse 是 Eclipse IDE for Java EE Developers; 如果是使用的其他 使用 Eclipse 开发 Java EE 应用 (Web 应用 ) 这里以开发一个简单的 Web 应用为例, 介绍使用 Eclipse 开发 Java EE 应用的一般步 骤 此处使用的 Eclipse 是 Eclipse IDE for Java EE Developers; 如果是使用的其他 Eclipse 插件 ( 比如 MyEclipse 插件 ), 其开发方式和步骤可能略有差异和不同 在该例中,

More information

RUN_PC連載_10_.doc

RUN_PC連載_10_.doc PowerBuilder 8 (10) Jaguar CTS ASP Jaguar CTS PowerDynamo Jaguar CTS Microsoft ASP (Active Server Pages) ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar Server ASP

More information

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc 1.1 组合 Hibernate 与 Spring 1. 在 Eclipse 中, 新建一个 Web project 2. 给该项目增加 Hibernate 开发能力, 增加 Hibernate 相关类库到当前项目的 Build Path, 同时也提供了 hibernate.cfg.xml 这个配置文件 3. 给该项目增加 Spring 开发能力, 增加 spring 相关类库到当前项目的 Build

More information

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6: Chapter 15. Suppressed Exception CH14 Finally Block Java SE 7 try-with-resources JVM cleanup try-with-resources JVM cleanup cleanup Java SE 7 Throwable getsuppressed Throwable[] getsuppressed() Suppressed

More information

设计模式 Design Patterns

设计模式 Design Patterns 丁勇 Email:18442056@QQ.com 学习目标 掌握 Model I 体系结构 掌握 Model II 体系结构 掌握 MVC 应用程序 Model I 体系结构 6 1 Model I 体系结构结合使用 JSP 页面和 Bean 来开发 Web 应用程序 应用服务器 请求 JSP 页面 响应 Bean 数据库服务器 Model I 体系结构 6 2 Model I 体系结构用于开发简单的应用程序

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

untitled

untitled PowerBuilder Tips 利 PB11 Web Service 年度 2 PB Tips PB9 EAServer 5 web service PB9 EAServer 5 了 便 web service 來說 PB9 web service 力 9 PB11 release PB11 web service 力更 令.NET web service PB NVO 論 不 PB 來說 說

More information

5-1 nav css 5-2

5-1 nav css 5-2 5 HTML CSS HTML CSS Ê Ê Ê Ê 5-1 nav css 5-2 5-1 5 5-1-1 5-01 css images 01 index.html 02 5-3 style.css css 03 CH5/5-01/images 04 images index.html style.css 05

More information

EJB-Programming-4-cn.doc

EJB-Programming-4-cn.doc EJB (4) : (Entity Bean Value Object ) JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Session Bean J2EE Session Façade Design Pattern Session Bean Session

More information

Microsoft Word - json入门.doc

Microsoft Word - json入门.doc Json 入门 送给亲爱的女朋友, 祝她天天快乐 作者 :hlz QQ:81452743 MSN/Email:hulizhong2008@163.com json 入门 (1) json 是 JavaScript Object Notation 的简称 ; 在 web 系统开发中与 AJAX 相结合用的比较多 在 ajax 中数据传输有 2 中方式 : 文本类型, 常用 responsetext 属性类获取

More information

Microsoft Word - 01.DOC

Microsoft Word - 01.DOC 第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的

More information

拦截器(Interceptor)的学习

拦截器(Interceptor)的学习 二 拦截器 (Interceptor) 的学习 拦截器可以监听程序的一个或所有方法 拦截器对方法调用流提供了细粒度控制 可以在无状态会话 bean 有状态会话 bean 和消息驱动 bean 上使用它们 拦截器可以是同一 bean 类中的方法或是一个外部类 下面介绍如何在 Session Bean 类中使用外部拦截器类 @Interceptors 注释指定一个或多个在外部类中定义的拦截器 下面拦截器

More information

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 310-065Big5 Title : Sun Certified Programmer for the Java 2 Platform, SE 6.0 Version : Demo 1 / 14 1. 35. String #name = "Jane Doe"; 36. int

More information

Microsoft Word - 第4章 Servlet技术—样章.doc

Microsoft Word - 第4章 Servlet技术—样章.doc 第 4 章 Servlet 技术 学习目标 u 熟悉 Servlet 在生命周期中调用的方法 u 掌握 HttpServlet 类的作用及其使用 u 掌握 Servlet 虚拟路径的映射 u 掌握 ServletConfig 和 ServletContext 接口的使用 随着 Web 应用业务需求的增多, 动态 Web 资源的开发变得越来越重要 目前, 很多公司都提供了开发动态 Web 资源的相关技术,

More information

Microsoft Word - JavaWeb程序开发入门—教学大纲.doc

Microsoft Word - JavaWeb程序开发入门—教学大纲.doc JavaWeb 程序开发入门 课程教学大纲 ( 课程英文名称 ) 课程编号 : 201409210011 学分 : 5 学分学时 : 54 学时 ( 其中 : 讲课学时 :38 上机学时 :16) 先修课程 :Java 基础入门 MySQL 数据库入门后续课程 :JavaWeb 程序开发进阶教程适用专业 : 信息及其计算机相关专业开课部门 : 计算机系 一 课程的性质与目标 JavaWeb 程序开发入门

More information

Microsoft Word - PHP7Ch01.docx

Microsoft Word - PHP7Ch01.docx PHP 01 1-6 PHP PHP HTML HTML PHP CSSJavaScript PHP PHP 1-6-1 PHP HTML PHP HTML 1. Notepad++ \ch01\hello.php 01: 02: 03: 04: 05: PHP 06:

More information

JavaIO.PDF

JavaIO.PDF O u t p u t S t ream j a v a. i o. O u t p u t S t r e a m w r i t e () f l u s h () c l o s e () public abstract void write(int b) throws IOException public void write(byte[] data) throws IOException

More information

spc

spc 网站的静态页面生成方案 yanrong79@gmail.com 提升网站性能的方式有很多, 例如有效的使用缓存, 生成静态页面等等 今天要说的就是生成静态页面的方式 什么叫生成静态页面呢? 很简单, 例如我们如果访问一个链接 http://xyz.com/index.do, 那么服务器就会解析这个请求, 让特定的 Action 去处理 这其中的缺点是显而易见的 : 如果访问的人, 那么就会加重应用服务器的压力,

More information

没 有 多 余 的 Contruol 或 Action 了 原 来 Domain 层 被 服 务 层 Service layer 遮 挡, 在 右 边 图 中, 则 Domain 层 直 接 暴 露 给 前 台 了, 没 有 被 遮 挡, 裸 露 了 这 样 一 步 到 位 实 现 领 域 模 型

没 有 多 余 的 Contruol 或 Action 了 原 来 Domain 层 被 服 务 层 Service layer 遮 挡, 在 右 边 图 中, 则 Domain 层 直 接 暴 露 给 前 台 了, 没 有 被 遮 挡, 裸 露 了 这 样 一 步 到 位 实 现 领 域 模 型 文 章 编 号 :1007-757X(2012)1-0036-04 领 域 驱 动 模 型 的 WEB 软 件 系 统 设 计 研 究 摘 要 : J2EE 3 JDK1.7 Tomcat WEB 关 键 词 : 中 图 分 类 号 :TP311 文 献 标 志 码 :A 0 引 言 Web 软 件 系 统 的 分 层 结 构 典 型 的 J2EE 软 件 系 统 开 发 方 法 分 为 三 层 结

More information

教案模板4-2

教案模板4-2 传智播客 Java Web 程序设计任务教程 教学设计 课程名称 :Java Web 程序设计任务教程 授课年级 : 2016 年级 授课学期 : 2016 学年第二学期 教师姓名 : 某某老师 2016 年 9 月 1 日 课题 名称 第 3 章 Servlet 基础 计划 学时 6 课时 内容分析教学目标及基本要求教学重点教学难点教学方式 随着 Web 应用业务需求的增多, 动态 Web 资源的开发变得越来越重要,

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

服务器将响应传输给客户端 Servlet 技术具有如下特点 : 方便 :Servlet 提供了大量的实用工具例程, 如处理很难完成的 HTML 表单数据 读取和设置 HTTP 头, 以及处理 Cookie 和跟踪会话等 跨平台 :Servlet 用 Java 类编写, 可以在不同操作系统平台和不同应

服务器将响应传输给客户端 Servlet 技术具有如下特点 : 方便 :Servlet 提供了大量的实用工具例程, 如处理很难完成的 HTML 表单数据 读取和设置 HTTP 头, 以及处理 Cookie 和跟踪会话等 跨平台 :Servlet 用 Java 类编写, 可以在不同操作系统平台和不同应 第 3 章 Servlet 基础 学习目标 掌握 Servlet 接口及其实现类的使用 了解 Servlet 的生命周期 熟练使用 Eclipse 工具开发 Servlet 掌握 Servlet 虚拟路径映射的配置 随着 Web 应用业务需求的增多, 动态 Web 资源的开发变得越来越重要 目前, 很多公司都提供了开发动态 Web 资源的相关技术, 其中比较常见的有 ASP PHP JSP 和 Servlet

More information

Stateless Session Beans(无状态bean)的学习

Stateless Session Beans(无状态bean)的学习 一 Stateless Session Beans( 无状态 bean) 的学习 第一步 : 要定义一个会话 Bean, 首先需要定义一个包含他所有业务方法的接口 这个接口不需要任何注释, 就像普通的 java 接口那样定义 调用 EJB 的客户端通过使用这个接口引用从 EJB 容器得到的会话 Bean 对象 stub 接口的定义如下: HelloWorld.java package com.foshanshop.ejb3;

More information

1.1 Filter 的特性 请求映射 filter-mapping 和 servlet-mapping 都是将对应的 filter 或 servlet 映射到某 个 url-pattern 上, 当客户发起某一请求时, 服务器先将此请求与 web.xml 中定 义的所有 url-pat

1.1 Filter 的特性 请求映射 filter-mapping 和 servlet-mapping 都是将对应的 filter 或 servlet 映射到某 个 url-pattern 上, 当客户发起某一请求时, 服务器先将此请求与 web.xml 中定 义的所有 url-pat 1.1 Filter 的特性 1.1.1 请求映射 filter-mapping 和 servlet-mapping 都是将对应的 filter 或 servlet 映射到某 个 url-pattern 上, 当客户发起某一请求时, 服务器先将此请求与 web.xml 中定 义的所有 url-pattern 进行匹配, 然后执行匹配通过的 filter 和 servlet 你可以使用三种方式定义 url-pattern

More information

chp6.ppt

chp6.ppt Java 软 件 设 计 基 础 6. 异 常 处 理 编 程 时 会 遇 到 如 下 三 种 错 误 : 语 法 错 误 (syntax error) 没 有 遵 循 语 言 的 规 则, 出 现 语 法 格 式 上 的 错 误, 可 被 编 译 器 发 现 并 易 于 纠 正 ; 逻 辑 错 误 (logic error) 即 我 们 常 说 的 bug, 意 指 编 写 的 代 码 在 执 行

More information

1.1 举例 : 在线用户 我们做一个新手级的在线用户列表, 原理是这样 : 1. 用户登录, 并把登录使用的用户名保存到 session 中, 通过 session 中 是否存在用户名判断用户是否已登录 session 可以在整个会话过程中保存用户信息, 不必每次刷新页面都重新 登录 2. 用户登

1.1 举例 : 在线用户 我们做一个新手级的在线用户列表, 原理是这样 : 1. 用户登录, 并把登录使用的用户名保存到 session 中, 通过 session 中 是否存在用户名判断用户是否已登录 session 可以在整个会话过程中保存用户信息, 不必每次刷新页面都重新 登录 2. 用户登 1.1 举例 : 在线用户 我们做一个新手级的在线用户列表, 原理是这样 : 1. 用户登录, 并把登录使用的用户名保存到 session 中, 通过 session 中 是否存在用户名判断用户是否已登录 session 可以在整个会话过程中保存用户信息, 不必每次刷新页面都重新 登录 2. 用户登录后, 将用户名添加到 application 中的在线用户列表 用 户注销时, 讲用户名从 application

More information

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 复习 Java 包 创建包 : package 语句, 包结构与目录结构一致 使用包 : import restaurant/ - people/ - Cook.class - Waiter.class - tools/ - Fork.class

More information

在Spring中使用Kafka:Producer篇

在Spring中使用Kafka:Producer篇 在某些情况下, 我们可能会在 Spring 中将一些 WEB 上的信息发送到 Kafka 中, 这时候我们就需要在 Spring 中编写 Producer 相关的代码了 ; 不过高兴的是,Spring 本身提供了操作 Kafka 的相关类库, 我们可以直接通过 xml 文件配置然后直接在后端的代码中使用 Kafka, 非常地方便 本文将介绍如果在 Spring 中将消息发送到 Kafka 在这之前,

More information

untitled

untitled JavaEE+Android - 6 1.5-2 JavaEE web MIS OA ERP BOSS Android Android Google Map office HTML CSS,java Android + SQL Sever JavaWeb JavaScript/AJAX jquery Java Oracle SSH SSH EJB+JBOSS Android + 1. 2. IDE

More information

设计模式 Design Patterns

设计模式 Design Patterns 丁勇 Email:18442056@QQ.com 学习目标 与客户端交互 客户端跟踪 与客户端交互客户端跟踪 1 与客户端交互 HTTP servlet 与客户端的交互 通过 service 方法处理客户端的请求 service 方法根据请求 (request) 类型的不同, 调用不同的方法 对于 GET 请求, 调用 doget( ) 方法进行处理 对于 POST 请求, 调用 dopost( )

More information

EJB-Programming-3.PDF

EJB-Programming-3.PDF :, JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Value Object Design Pattern J2EE Design Patterns Value Object Value Object Factory J2EE EJB Test Client

More information

停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址 access_token=access_token (http

停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址   access_token=access_token (http 停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址 https://webapi.zego.im/cgi/stop-mix? access_token=access_token (https://webapi.zego.im/cgi/stop-mix? access_token=access_token)

More information

使用MapReduce读取XML文件

使用MapReduce读取XML文件 使用 MapReduce 读取 XML 文件 XML( 可扩展标记语言, 英语 :extensible Markup Language, 简称 : XML) 是一种标记语言, 也是行业标准数据交换交换格式, 它很适合在系统之间进行数据存储和交换 ( 话说 Hadoop H ive 等的配置文件就是 XML 格式的 ) 本文将介绍如何使用 MapReduce 来读取 XML 文件 但是 Had oop

More information

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取将导致上次获取的 access_token 失效 接入方可以使用 AppID 和 AppSecret

More information

软件工程文档编制

软件工程文档编制 实训抽象类 一 实训目标 掌握抽象类的定义 使用 掌握运行时多态 二 知识点 抽象类的语法格式如下 : public abstract class ClassName abstract void 方法名称 ( 参数 ); // 非抽象方法的实现代码 在使用抽象类时需要注意如下几点 : 1 抽象类不能被实例化, 实例化的工作应该交由它的子类来完成 2 抽象方法必须由子类来进行重写 3 只要包含一个抽象方法的抽象类,

More information

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入 100 年 特 種 考 試 地 方 政 府 公 務 人 員 考 試 試 題 等 別 : 三 等 考 試 類 科 : 資 訊 處 理 科 目 : 系 統 分 析 與 設 計 一 請 參 考 下 列 旅 館 管 理 系 統 的 使 用 案 例 圖 (Use Case Diagram) 撰 寫 預 約 房 間 的 使 用 案 例 規 格 書 (Use Case Specification), 繪 出 入

More information

中 国 矿 业 大 学

中 国 矿 业 大 学 实验一动态网页设计基础 实验目的 : 1 掌握 HTML 的常用标签 2 掌握 HTML 设计基本网页 3 掌握 HTML 设计网络中常用的表单 4 了解 JavaScript 的简单应用, 实验环境 : 操作系统 Windows XP 或更高版本实验内容 : 1 编写一个简单的学生信息注册页面, 包括学号 姓名 密码 专业, 其中学号 姓名用单行文本框 密码使用密码框 专业使用下拉菜单 ; 2 使用框架将一个页面均分为四个区域,

More information

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票 复习 创建对象 构造函数 函数重载 : 函数 = 函数名 + 参数列表 public class MyType { int i; double d; char c; void set(double x)

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc Java C++ Pascal C# C# if if if for while do while foreach while do while C# 3.1.1 ; 3-1 ischeck Test() While ischeck while static bool ischeck = true; public static void Test() while (ischeck) ; ischeck

More information

untitled

untitled 653 JAVA 2008 11 Institution of Software Engineer... 2... 4... 4... 5... 5... 8... 8... 8... 8... 8... 9... 9... 9... 11... 13... 13... 13... 13... 15... 15... 15... 15... 16... 16... 17... 17... 17...

More information

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

07-form

07-form PHP 的输 入 表单与 文件上传杨亮 Web 基本流程 请求 页 面 对应 文件 获取数据 PC Mobile HTTP 请求 html css javascript 服务器 (Apache) (IIS) html css javascript 后端脚本 (PHP) (JSP) (ASP) 数据库 (MySQL) (Oracle) (Access) 返回 页 面 返回 页 面 返回数据 客户端 服务器端

More information

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 310-055Big5 Title : Sun Certified Programmer for the Java 2 Platform.SE 5.0 Version : Demo 1 / 22 1. 11. public static void parse(string str)

More information

PrintWriter s = new PrintWriter(writer); ex.printstacktrace(s); mv.addobject("exception", writer.tostring()); mv.setviewname("error"); return

PrintWriter s = new PrintWriter(writer); ex.printstacktrace(s); mv.addobject(exception, writer.tostring()); mv.setviewname(error); return 本章学习目标 小风 Java 实战系列教程 SpringMVC 异常处理 SpringMVC 文件上传 SpringMVC 处理 JSON 格式数据 SpringMVC 拦截器 SpringMVC 对 restful 风格的支持 1. SpringMVC 异常处理 1.1. @ExceptionHandler 注解处理异常 @ExceptionHandler 该注解使用在异常处理方法上面 1.1.1.

More information

Chapter 9: Objects and Classes

Chapter 9: Objects and Classes Java application Java main applet Web applet Runnable Thread CPU Thread 1 Thread 2 Thread 3 CUP Thread 1 Thread 2 Thread 3 ,,. (new) Thread (runnable) start( ) CPU (running) run ( ) blocked CPU sleep(

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

WebSphere 的基本配置

WebSphere 的基本配置 WebSphere 的基本配置 WAS 是 WebSphere Application Server 的简称 WSAD 是 WebSphere Studio Application Develop 一 用 WSAD 中生成 war 文件 新建一 WSAD 工程目录 新建企业应用程序项目 输入项目名称为 :TestProject > 下一步 新建模块 > 新建 web 模块 :> 完成 此时界面如下

More information

A-1 HTML A-1-1 HTML 1 HTML JSP HTML HTML HTML JSP A HTML HTML HTML HTML HTML HTML HTML HTML.htm.html HTML Windows NotePad HTML IE [ / ] NotePad A-2

A-1 HTML A-1-1 HTML 1 HTML JSP HTML HTML HTML JSP A HTML HTML HTML HTML HTML HTML HTML HTML.htm.html HTML Windows NotePad HTML IE [ / ] NotePad A-2 HTML A-1 HTML A-2 A-2 HTML A-8 A-3 A-14 A-4 A-26 A-5 A-30 A-6 A-42 A-1 HTML A-1-1 HTML 1 HTML JSP HTML HTML HTML JSP A HTML HTML HTML HTML HTML HTML HTML HTML.htm.html HTML Windows NotePad HTML IE [ /

More information

XXXXXXXX http://cdls.nstl.gov.cn 2 26

XXXXXXXX http://cdls.nstl.gov.cn 2 26 [ ] [ ] 2003-7-18 1 26 XXXXXXXX http://cdls.nstl.gov.cn 2 26 (2003-7-18) 1...5 1.1...5 1.2...5 1.3...5 2...6 2.1...6 2.2...6 2.3...6 3...7 3.1...7 3.1.1...7 3.1.2...7 3.1.2.1...7 3.1.2.1.1...8 3.1.2.1.2...10

More information

优迈科技教学大纲2009版本

优迈科技教学大纲2009版本 java 软 件 工 程 师 培 训 教 学 大 纲 1 JAVA 软 件 工 程 师 培 训 教 学 大 纲 深 圳 软 件 园 人 才 实 训 基 地 2009 年 3 月 目 录 java 软 件 工 程 师 培 训 教 学 大 纲 2 教 学 阶 段...3 第 一 章 JAVA 起 步...3 第 二 章 面 向 对 象 的 编 程...4 第 三 章 数 据 结 构 IO 线 程 网 络...5

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

《大话设计模式》第一章

《大话设计模式》第一章 第 1 章 代 码 无 错 就 是 优? 简 单 工 厂 模 式 1.1 面 试 受 挫 小 菜 今 年 计 算 机 专 业 大 四 了, 学 了 不 少 软 件 开 发 方 面 的 东 西, 也 学 着 编 了 些 小 程 序, 踌 躇 满 志, 一 心 要 找 一 个 好 单 位 当 投 递 了 无 数 份 简 历 后, 终 于 收 到 了 一 个 单 位 的 面 试 通 知, 小 菜 欣 喜

More information

WebEx 一键集成 1 文档目的 Web 集成 URL API 语法 启会 加会 调用 移动集成 wbx schema 调用 取得 sessionticket...4

WebEx 一键集成 1 文档目的 Web 集成 URL API 语法 启会 加会 调用 移动集成 wbx schema 调用 取得 sessionticket...4 WebEx 一键集成 1 文档目的...1 2 Web 集成...1 2.1 URL API 语法...1 2.2 启会...2 2.3 加会...3 2.4 调用...3 3 移动集成...3 3.1 wbx schema...3 3.2 调用...4 4 取得 sessionticket...4 1 文档目的 本文档目的是, 让用户了解如何在 Web 端和移动端, 一键调用 WebEx app,

More information

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款 JAVA 程 序 设 计 ( 肆 ) 徐 东 / 数 学 系 使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款 使 用 Java class 代 表 保 险 箱 public class SaveBox 类 名 类 类 体 实 现 封 装 性 使 用 class SaveBox 代 表 保

More information

CSS 介绍 CSS 样式的引用方式 CSS 选择器和常用属性 DOM 相关知识 JavaScript 概述 JavaScript 的使用 [ 任务 1-1] 传智书城首页设计 [ 任务 1-2] 传智书城注册页面设计 HTML 的常用标记 CSS 选择器和常用属性 JavaScript 的使用 传

CSS 介绍 CSS 样式的引用方式 CSS 选择器和常用属性 DOM 相关知识 JavaScript 概述 JavaScript 的使用 [ 任务 1-1] 传智书城首页设计 [ 任务 1-2] 传智书城注册页面设计 HTML 的常用标记 CSS 选择器和常用属性 JavaScript 的使用 传 Java Web 程序设计任务教程 课程教学大纲 ( 课程英文名称 ) 课程编号 : XXXX 学 分 : 5 学分 学时 : 95 学时 ( 其中 : 讲课学时 :63 上机学时 :32) 先修课程 :Java 基础案例教程 MySQL 数据库入门后续课程 :SSH 框架整合实战教程适用专业 : 信息及其计算机相关专业开课部门 : 计算机系 一 课程的性质与目标 Java Web 程序设计任务教程

More information

p.2 1 <HTML> 2 3 <HEAD> 4 <TITLE> </TITLE> 5 </HEAD> 6 7 <BODY> 8 <H3><B> </B></H3> 9 <H4><I> </I></H4> 10 </BODY> </HTML> 1. HTML 1. 2.

p.2 1 <HTML> 2 3 <HEAD> 4 <TITLE> </TITLE> 5 </HEAD> 6 7 <BODY> 8 <H3><B> </B></H3> 9 <H4><I> </I></H4> 10 </BODY> </HTML> 1. HTML 1. 2. 2005-06 p.1 HTML HyperText Mark-up Language 1. HTML Logo, Pascal, C++, Java HTML 2. HTML (tag) 3. HTML 4. HTML 1. HTML 2. 3. FTP HTML HTML html 1. html html html cutehtmleasyhtml 2. wyswyg (What you see

More information

TopTest_Adminstrator.doc

TopTest_Adminstrator.doc 壹 前 言... 3 貳 系 統 簡 介... 4 一 TKB multimedia Top-Test 系 統 架 構...4 1. 使 用 者 介 面 層 (Presentation tier)...5 2. 商 業 邏 輯 層 (business logic tier)...5 3. 資 料 服 務 層 (data services tier)...5 二 TKB Multimedia Top-Test

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

设计模式 Design Patterns

设计模式 Design Patterns 丁勇 Email:18442056@QQ.com 学习目标 描述 JSP 表达式语言的语法 认识使用 JSP 表达式的优点 在 JSP 中使用表达式语言 表达式语言简介 5 1 EL 为表达式语言 由两个组开发 JSP 标准标签库专家组 JSP 2.0 专家组 JSP 表达式语言的语法 ${EL Expression} JSP EL 表达式用于以下情形 静态文本 标准标签和自定义标签 表达式语言简介

More information

05 01 accordion UI containers 03 Accordion accordion UI accordion 54

05 01 accordion UI containers 03 Accordion accordion UI accordion 54 jquery UI plugin Accordion 05 01 accordion UI containers 03 Accordion accordion UI accordion 54 05 jquery UI plugin 3-1

More information

What Servlet

What Servlet 7 JSTL 1.1 JSTL JavaServer Pages Standard Tag Library 1.1 JSTL JCP(Java Community Process) Java Web Web JSTL EL Web Java (Scripting) JSTL URL U18N XML SQL JSTL JSTL 6 7-1 JSTL 1.1 简介 7-2 核心标签库 (Core tag

More information

2 Java 语 言 程 序 设 计 教 程 1.2.1 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难

2 Java 语 言 程 序 设 计 教 程 1.2.1 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难 第 1 章 Java 概 述 Java 的 诞 生 Java 的 特 点 Java 开 发 环 境 安 装 与 配 置 创 建 并 运 行 一 个 简 单 的 Java 程 序 Java 语 言 是 当 今 计 算 机 软 件 行 业 中 最 热 门 的 网 络 编 程 语 言, 以 Java 为 核 心 的 芯 片 技 术 编 译 技 术 数 据 库 连 接 技 术, 以 及 基 于 企 业 级

More information

FileMaker 16 ODBC 和 JDBC 指南

FileMaker 16 ODBC 和 JDBC 指南 FileMaker 16 ODBC JDBC 2004-2017 FileMaker, Inc. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, California 95054 FileMaker FileMaker Go FileMaker, Inc. FileMaker WebDirect FileMaker Cloud FileMaker,

More information

(CIP) Web /,. :,2005. 1 ISBN 7 81058 782 X.W............T P393.4 CIP (2004) 118797 Web ( 99 200436) ( http:/ / www.shangdapress.com 66135110) : * 787

(CIP) Web /,. :,2005. 1 ISBN 7 81058 782 X.W............T P393.4 CIP (2004) 118797 Web ( 99 200436) ( http:/ / www.shangdapress.com 66135110) : * 787 Web (CIP) Web /,. :,2005. 1 ISBN 7 81058 782 X.W............T P393.4 CIP (2004) 118797 Web ( 99 200436) ( http:/ / www.shangdapress.com 66135110) : * 787 1092 1/ 16 30.75 748 2005 1 1 2005 1 1 : 1 3 100

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =

More information

<4D F736F F D204A B1E0B3CCBCBCCAF5A3A8B5DA33B0E6A3A9CCE2BDE2D3EBCAB5D1E9D6B8B5BC20B5DA33D5C22E646F63>

<4D F736F F D204A B1E0B3CCBCBCCAF5A3A8B5DA33B0E6A3A9CCE2BDE2D3EBCAB5D1E9D6B8B5BC20B5DA33D5C22E646F63> 第 3 章 JSP 技术基础 本章学习 JSP 各种元素的使用, 其中包括脚本元素 隐含变量 指令, 还将学习作用域变量 JavaBeans MVC 设计模式和错误处理方法 3.1 知识点总结 (1)JSP 脚本有三种 :JSP 声明 () 小脚本() 和 JSP 表达式 () (2) 在 JSP 的脚本中可以使用 9 个隐含变量,

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 Dalian MinZu University 实训单元 2 JSP 基础语法 李腾 信息与通信工程学院 目录 一 实训目的二 实训设备三 实训内容 一 实训目的 学习如何建立 JSP 页面, 实践 JSP 声明 表达式和注释 JSP 指令 JSP 动作等知识, 结合实际案例, 让学生进行知识的巩固 实训时长 : 2 课时 二 实训设备 PC 机 :Intel Core i3 CPU ; 4G 内存

More information

FileMaker 15 ODBC 和 JDBC 指南

FileMaker 15 ODBC 和 JDBC 指南 FileMaker 15 ODBC JDBC 2004-2016 FileMaker, Inc. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, California 95054 FileMaker FileMaker Go FileMaker, Inc. / FileMaker WebDirect FileMaker, Inc. FileMaker

More information

untitled

untitled How to using M-Power Report API M-Power Report API 力 了 M-Power Report -- Java (Library) M-Power Report API 行 Java M-Power Report M-Power Report API ( 30 ) PDF/HTML/CSV/XLS JPEG/PNG/SVG 料 料 OutputStream

More information

互動網頁技術系列課程 HTML與CSS網站基礎設計 [12pt]

互動網頁技術系列課程 HTML與CSS網站基礎設計 [12pt] HTML CSS / 2011 HTML CSS 1/ 47 1 2 HTML 3 4 HTML 5 5 : CSS 6 CSS 7 HTML CSS 2/ 47 HTML CSS 3/ 47 ( BOM) UTF-8 Notepad++ (Winodws), Fraise/Smultron (Mac), VIM ( ) HTML CSS 4/ 47 UTF-8? UTF-8 (unicode),

More information

<4D6963726F736F667420576F7264202D20BBF9D3DA416E64726F6964C6BDCCA8B5C4B5E7D7D3C5C4C2F4CFB5CDB32E646F63>

<4D6963726F736F667420576F7264202D20BBF9D3DA416E64726F6964C6BDCCA8B5C4B5E7D7D3C5C4C2F4CFB5CDB32E646F63> 基 于 Android 平 台 的 电 子 拍 卖 系 统 摘 要 本 电 子 拍 卖 系 统 其 实 就 是 一 个 电 子 商 务 平 台, 只 要 将 该 系 统 部 署 到 互 联 网 上, 客 户 都 可 以 在 该 系 统 上 发 布 想 出 售 的 商 品, 也 可 以 对 拍 卖 中 的 商 品 参 与 竞 价 整 个 过 程 无 须 人 工 干 预, 由 系 统 自 动 完 成 本

More information

ChinaBI企业会员服务- BI企业

ChinaBI企业会员服务- BI企业 商业智能 (BI) 开源工具 Pentaho BisDemo 介绍及操作说明 联系人 : 杜号权苏州百咨信息技术有限公司电话 : 0512-62861389 手机 :18616571230 QQ:37971343 E-mail:du.haoquan@bizintelsolutions.com 权限控制管理 : 权限控制管理包括 : 浏览权限和数据权限 ( 权限部分两个角色 :ceo,usa; 两个用户

More information

untitled

untitled 1 .NET sln csproj dll cs aspx 說 料 料 利 來 料 ( 來 ) 利 [] [] 來 說 切 切 理 [] [ ] 來 說 拉 類 類 [] [ ] 列 連 Web 行流 來 了 不 不 不 流 立 行 Page 類 Load 理 Click 滑 料 Response 列 料 Response HttpResponse 類 Write 料 Redirect URL Response.Write("!!

More information

steven

steven 知识点列表 编号 名称 描述 级别 1 jstl 是什么? 理解 jstl 技术 * 2 标签是什么? 理解标签技术 * 3 el 表达式是什么? 理解 el 表达式技术 * 4 el 表达式的基本语法 重点掌握 el 表达式的用法 ** 5 核心标签的使用 通过案例掌握一些核心标签的使用 ** 6 课堂练习 将雇员的增删改查案例使用标签重构 ** 注 : "*" 理解级别 "**" 掌握级别 "***"

More information

Mac Java import com.apple.mrj.*;... public class MyFirstApp extends JFrame implements ActionListener, MRJAboutHandler, MRJQuitHandler {... public MyFirstApp() {... MRJApplicationUtils.registerAboutHandler(this);

More information

關於本書 Part 3 CSS XHTML Ajax Part 4 HTML 5 API JavaScript HTML 5 API Canvas API ( ) Video/Audio API ( ) Drag and Drop API ( ) Geolocation API ( ) Part 5

關於本書 Part 3 CSS XHTML Ajax Part 4 HTML 5 API JavaScript HTML 5 API Canvas API ( ) Video/Audio API ( ) Drag and Drop API ( ) Geolocation API ( ) Part 5 網頁程式設計 HTML JavaScript CSS HTML JavaScript CSS HTML 5 JavaScript JavaScript HTML 5 API CSS CSS Part 1 HTML HTML 5 API HTML 5 Apple QuickTime Adobe Flash RealPlayer Ajax XMLHttpRequest HTML 4.01 HTML 5

More information

Microsoft Word - ShkZw3.doc

Microsoft Word - ShkZw3.doc 第 3 章 Struts2 的高级组件 本章将介绍 Struts2 中比较常用的高级组件 通过对这些高级组件的学习, 将有助于进一步了解和使用 Struts2 框架 本章主要内容 : (1)Struts2 对国际化的支持 (2)Struts2 常用拦截器的使用 (3)Struts2 的数据验证功能 (4)Struts2 对文件上传和下载的支持 3.1 Struts2 的国际化 国际化 是指一个应用程序在运行时能够根据客户端请求所来自国家或地区语言的不同而显示不同的用户界面

More information

ebook4-12

ebook4-12 12 CGI C G I (Common Gateway Interface) We b P H P C G I H T M L H T T P H T M L We b H T T P We We b I n t e r n e t R F C h t t p : / / w w w. i e t f. o rg / P H P C G I C G A p a c h e C G I P H P

More information

導讀 ASP.NET HTML ASP 第一篇 基礎篇第 1 章 認識 ASP.NET ASP.NET ASP.NET ASP.NET ASP.NET 第 2 章 認識 Visual Studio 20 開發環境 Visual Studio 20 Visual Studio 20 第二篇 C# 程式

導讀 ASP.NET HTML ASP 第一篇 基礎篇第 1 章 認識 ASP.NET ASP.NET ASP.NET ASP.NET ASP.NET 第 2 章 認識 Visual Studio 20 開發環境 Visual Studio 20 Visual Studio 20 第二篇 C# 程式 導讀 ASP.NET HTML ASP 第一篇 基礎篇第 1 章 認識 ASP.NET ASP.NET ASP.NET ASP.NET ASP.NET 第 2 章 認識 Visual Studio 20 開發環境 Visual Studio 20 Visual Studio 20 第二篇 C# 程式語言篇第 3 章 C# 程式語言基礎 C# C# 3.0 var 第 4 章 基本資料處理 C# x

More information

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0, http://debut.cis.nctu.edu.tw/~chi Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0, : POSITIVE_INFINITY NEGATIVE_INFINITY

More information

实验六 JSP/Servlet

实验六   JSP/Servlet Web Lab 5 JSP/Servlet 实验目的 1) 复习和掌握 TOMCAT 配置 2) 掌握 JSP 基本语法 3) 掌握使用 JSP,JavaBean,Servlet 进行编程 4) 掌握使用 Session 进行数据传递的方法 实验任务 通过设计 JSP Servlet JavaBean 使用 MVC 模式实现用户登录验证 注销, 购物车的添加 移除以及清除商品, 页面之间使用 session

More information

2.4 Selenium Python Selenium Selenium Selenium Selenium pip install selenium Chrome WebDriver Google Chrome (Linux, Mac, Windows) Chrome WebDriv

2.4 Selenium Python Selenium Selenium Selenium Selenium pip install selenium Chrome WebDriver Google Chrome (Linux, Mac, Windows) Chrome WebDriv Chapter 02 大數據資料爬取與分析 Python Python Requests BeautifulSoup Regular Expression Selenium Pandas Python 2.4 Selenium Python 2.4.1 Selenium Selenium Selenium Selenium pip install selenium Chrome WebDriver

More information