MVC
来源:互联网 发布:淘宝用户信息查询 编辑:程序博客网 时间:2024/05/22 15:56
l 什么是Servlet:
Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面。
作为服务器端的组件,处理用户不同的请求处理,Servlet具有功能强大,运行速度快,跨平台,强扩展性的多项优点。
Servlet API 由两个程序包组成
n javax.servlet包
n javax.servlet.http包
l JSP与Servlet关系
JSP是一种建立在Servlet规范提供的功能之上的动态网页技术,JSP文件在用户第一次请求时,会被编译成Servlet,然后由这个Servlet处理用户的请求,所以JSP可以看成是运行时的Servlet
l Servlet 能够执行哪些功能
Servlet功能包括以下几个方面:
Ø 能够根椐客户的请求创建并响应整个 HTML Web 页面,根据客户请求的性质而具有动态内容。
Ø 能够创建 HTML Web 页面的动态部分,并嵌入到现有静态 HTML 页面中。
Ø 可以与服务器上的其他资源进行通信,包括数据库、其他 Java 应用程序、以及用其他语言编写的应用程序。
Ø 能够处理与多个 Web 客户端的连接,接收来自多个 Web 客户端的输入信息,并将结果广播到多个 Web 客户端。
能够打开对 Web 客户机上 applet 的个别连接,并保持连接处于打开状态,允许在这个单一连接上进行多种数据传递。这种效能使客户机和服务器能够容易地进行会话
l Servlet优势
Servlet有下列的好处,超越了其他服务器的扩展机制。
Ø 通常都比CGI脚本快许多,因为Servlet使用了一个不同的处理模型。
Ø Servlet使用标准的API,被更多的Web服务器所支持。
Ø Servlet拥有Java程序语言的所有优点,包括易开发性和平台独立性。
Servlet可以访问Java平台下的大量的API集
l Servlet容器
根据Servlet容器工作模式的不同,可以将Servlet容器分为以下3类。
(1)独立的Servlet容器
(2)进程内的Servlet容器
(3)进程外的Servlet容器
1.1. Servlet体系结构与层次结构: javax.servlet 包
Ø 类:
ServletInputStream类:从客户端读取二进制数据;
ServletOutputStream类:向客户端发送二进制数据;
GenericServlet类:抽象类,定义了一个通用的,独立于底层协议的Servlet。
Ø 接口:
Servlet接口:管理Sevlet。定义实现Servlet的必须方法。一个Servlet必须实现Servlet接口或Servlet接口的扩展。
ServletConfig接口:Servlet初始化时,向Servlet传递配置信息。
ServletContext接口:Servlet上下文,使Servlet与其他的Servlet容器进行交互通信。
ServletRequest接口:向Servlet客户端提供请求信息
ServletResponse接口:Servlet向客户端提供响应信息
l javax.servlet.http包
Ø 类:
Cookie类
HttpServlet类:抽象类,继承自GenericServlet。应用于HTTP协议的请求和响应的Servlet。
Ø 接口:
HttpSession接口:
HttpAttributeListener接口:会话的属性监听接口;
HttpServletRequest接口;扩展ServletRequest接口,向Servlet客户端提供HTTP请求信息。
HttpServletResponse接口;扩展ServletResponse接口,Servlet向客户端提供HTTP响应信息。
总体可以分为:
Servlet类: 实现具体协议的业务类,其目的是一个业务实现的WEB组件类;
Servlet接口: 该接口独立于协议实现,其目的是为了定义服务器的组件标准;
GenericServlet抽象类: 该类提供了一个独立于协议的实现,其目的是为了满足服务器;
HttpServlet: 该类实现了HTTP协议,其目的是为了让客户程序扩展
l Servlet工作体系结构及生命周期
Servlet的生命周期由下面四个阶段组成:
1. 加载和实例化。
2. 初始化
3. 请求处理
4. 销毁
服务器加载Servlet 服务器创建 Servlet类的实例 调用Servlet实例 的init方法 收到客户端请求 调用service方法 service方法处理请求 并将结果输出到客户端 Servlet等待下一个请求 或由服务器销毁 Servlet在服务器调用 destroy方法后被销毁
l Servlet接口:
要编写一个Servlet,需要实现javax.servlet.Servlet接口,该接口定义了如下5个方法
Ø public void init(ServletConfig config) throws ServletException:
Ø public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException:
Ø public void destroy():
Ø public ServletConfig getServletConfig():
Ø public java.lang.String getServletInfo():
l ServletRequest接口中的常用方法
Ø public java.lang.Object getAttribute(java.lang.String name)
返回以name为名字的属性的值。如果该属性不存在,这个方法将返回null。
Ø public java.util.Enumeration getAttributeNames()
返回请求中所有可用的属性的名字。如果在请求中没有属性,这个方法将返回一个空的枚举集合。
Ø public void removeAttribute(java.lang.String name)
移除请求中名字为name的属性。
Ø public void setAttribute(java.lang.String name, java.lang.Object o)
在请求中保存名字为name的属性。如果第二个参数o为null,那么相当于调用removeAttribute(name)。
Ø public java.lang.String getCharacterEncoding()
返回请求正文使用的字符编码的名字。如果请求没有指定字符编码,这个方法将返回null。
Ø public java.lang.String getContentType()
返回请求正文的MIME类型。如果类型不可知,这个方法将返回null。
Ø public java.lang.String getLocalAddr()
返回接收到请求的网络接口的IP地址。
Ø public java.lang.String getLocalName()
返回接收到请求的IP接口的主机名。
Ø public int getLocalPort()
返回接收到请求的网络接口的IP端口号。
Ø public java.lang.String getParameter(java.lang.String name)
返回请求中name参数的值。如果name参数有多个值,那么这个方法将返回值列表中的第一个值。如果在请求中没有找到这个参数,这个方法将返回null。
Ø public java.util.Enumeration getParameterNames()
返回请求中包含的所有的参数的名字。如果请求中没有参数,这个方法将返回一个空的枚举集合。
Ø public java.lang.String[] getParameterValues(java.lang.String name)
返回请求中name参数所有的值。如果这个参数在请求中并不存在,这个方法将返回null
ServletResponse接口中的常用方法
Ø public java.lang.String getCharacterEncoding()
返回在响应中发送的正文所使用的字符编码(MIME字符集)。
Ø public java.lang.String getContentType()
返回在响应中发送的正文所使用的MIME类型。
Ø public java.io.PrintWriter getWriter() throws java.io.IOException
返回PrintWriter对象,用于发送字符文本到客户端。PrintWriter对象使用getCharacterEncoding()方法返回的字符编码。如果没有指定响应的字符编码方式,默认将使用ISO-8859-1。
Ø public void setCharacterEncoding(java.lang.String charset)
设置发送到客户端的响应的字符编码,例如,GB2312。
Ø public void setContentType(java.lang.String type)
设置要发送到客户端的响应的内容类型,此时响应应该还没有提交。
l GenericServlet
如果通过实现Servlet接口来编写的Servlet类,这需要实现Servlet接口中定义的5个方法,这样将非常麻烦
l HttpServlet
在绝大多数的网络应用中,都是客户端(浏览器)通过HTTP协议去访问服务器端的资源,而我们所编写的Servlet也主要是应用于HTTP协议的请求和响应
l GenericServlet
如果通过实现Servlet接口来编写的Servlet类,这需要实现Servlet接口中定义的5个方法,这样将非常麻烦
l Servlet转发:
1) RequestDispatcher接口
2) 得到RequestDispatcher对象
Ø Servlet请求的转发
n request.getRequestDispatcher("")
n response.sendRedirect("");
l 会话跟踪
实现会话跟踪有四种方法:
Ø 建立含有数据的隐藏表单字段
Ø URL重写
Ø Cookie
Ø 使用HttpSession API
会话跟踪的创建和使用
HttpServletRequest 的 getSession() 方法用于创建会话,其语法如下:
public HttpSession getSession();
public HttpSession getSession(boolean value);
如果没有与当前请求关联的会话,则 getSession() 方法用于创建会话。
如果布尔值为 true 且当前没有与请求关联的会话,则使用 getSession(boolean value) 创建会话。如果布尔值为 false,如果没有与当前请求关联的会话,返回null。
l 可以使用会话跟踪对客户端发出的一系列请求进行跟踪
l 不同的会话跟踪技术包括用户授权、隐藏表单字段、URL 重写和 Cookie
l Servlet 使用 RequestDispatcher 接口的 forward() 和 include() 方法进行通信
l Servlet 上下文用于存储不同 Servlet 的信息
l ServletConfig 接口的 getServletContext() 方法用于配置 Servlet 上下文
l
l Model I体系结构:
Model I 体系结构结合使用 JSP 页面和 JavaBean 来开发 Web 应用程序 响应 JSP页面 请求 应用服务器 JavaBean 数据库 服务器
l Model I模型特点
q Model I 体系结构用于开发简单的应用程序
q Model I 体系结构包括多个用户可与之交互的页面
q 客户端能够直接访问加载到服务器上的页面
q Model I Web 应用程序由复杂的 Web 逻辑组成,并链接至 Web 应用程序的其他页面
l Model II体系结构:
q Model II 体系结构结合使用 JSP 页面、 JavaBean和Servlet 来开发 Web 应用程序
请求 应用服务器 响应 JSP页面 JavaBean Servlet 数据库 服务器
l Model I模型特点
q Model II 是一种设计模式
q MVC 将交互式应用程序组织成三个独立的模块:
q 应用程序模块,用于表示数据和业务逻辑数据表示
q 数据表示
q 控制器,用于发送请求和控制应用程序的流程
Model II 体系结构的优点:
可以很灵活地设计 和实现模型对象 使用同一模型处理多个请求 增加新客户端更容易 MVC 的优点
l MVC体系各个对象
MVC 对象 控制器 模型 视图
模型对象 表示 Web 应用程序的数据元素,用户可与这些数据元素进行交互 控制器对象 充当应用程序视图对象和模型对象之间的中间对象 视图对象 提供模型组件以开发用户界面
Model 1模式的实现比较简单,适用于快速开发小规模项目。但从工程化的角度看,它的局限性非常明显:JSP页面身兼View和Controller两种角色,将控制逻辑和表现逻辑混杂在一起,从而导致代码的重用性非常低,增加了应用的扩展性和维护的难度。
Model 2已经是基于MVC架构的设计模式。在Model 2架构中,Servlet作为前端控制器,负责接收客户端发送的请求,在Servlet中只包含控制逻辑和简单的前端处理;然后,调用后端JavaBean来完成实际的逻辑处理;最后,转发到相应的JSP页面处理显示逻辑。
Servlet过滤器
在源和目标之间起到过滤作用的中间组件
l 过滤器在WEB应用程序中的位置
l 多个过滤器组的过滤链
l 过滤器在WEB开发中的一些主要应用
Ø 对用户请求进行统一认证
Ø 用户的访问进行记录和审核
Ø 对用户发送的数据进行过滤或替换
Ø 转换图像格式
Ø 对响应内容进行压缩,减少传输量
Ø 对请求和响应进行加解密处理
l 实现Servlet过滤器的步骤
Ø 实现javax.servlet.Filter接口的servlet类
Ø 实现init方法,读取过滤器的初始化函数
Ø 实现doFilter方法,完成对请求或过滤的响应
Ø 调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应
Ø 在web.xml中配置Filter
Ø 过滤器有什么用途?
n 在服务器端与客户端起到了一个中间组件的作用,对请求和响应的数据信息进行过滤,一个WEB应用可以部署多个过滤器,组成过滤器链,完成各自过滤功能
Ø 过滤器有什么用途?
n 监听器可以监听WEB容器中正在执行的程序。根椐发生的事件作出特定的响应,共有三类八种监听器。
理解对象序列化的概念及用途:序列化(Serializable)定义
把对象转换为字节序列的过程称为序列化(冷冻)
把字节序列恢复为对象的过程称为反序列化(解冻)
l 对象序列化的作用
把对象永久保存到硬盘中
在网络上传递对象
1.2. 对象序列化的原理机制:
1.3. 对象是怎样被序列化的?
采用默认情况下,只需实现Serializable接口即可。
l 默认方式哪些信息会被序列化?
序列化保存对象的状态(各属性及其对应的值)
注意:序列化不会保存对象的方法
l 默认方式哪些信息不会被序列化?
不会序列化transient的属性和静态变量
l 默认反序列化时,是否调用了类的构造方法?
不会调用类的构造方法
构造方法的作用是初始化类的状态,反序列化时,类的状态是保存在序列化文件中的,所以不必再对类的状态进行初始化
l 序列化前的对象与序列化后的对象是同一个对象吗?
不是同一对象,序列化前后的对象仅状态相同(各属性值相同)
l 自定义序列化
如果用户想控制类的序列化方式,可以采用以下两种方式实现自定义序列化:
- 在序列化类中提供writeObject()方法和readObject()方法
- 序列化类实现Externalizable接口,替换原来Serializable 接口,该接口声明了两个方法:
public void writeExternal(ObjectOutput out)
public void readExternal(ObjectInput in)
l 序列化对象包含其他对象的处理方式:
当一个对象被序列化时,与之相关的其他对象也应该同时实现序列化接口。
l 序列化类版本
每一个序列化类都有一个唯一的标识号与它相关联,我们称它为序列版本UID(SerialVersionUID)
l 采用默认的序列化方式非常简单,只需让一个类实现Serializable接口即可。
但是我们任然需要谨慎地考虑是否需要让一个类实现此接口,特别是针对继承而设计的类尽量不要设计它实现此接口,因为一旦父类实现了此接口,所有的子类都需要实现。
1.4. 理解数据库连接池的原理:
1.5. 使用数据直接连接的缺点
在某一时刻连接必须服务于一个用户,以免造成事务冲突
1. 来自不同用户的请求(都使用了同一个连接)对相同的事务进行操作,如果一个请求试图回滚,那么所有使用相同连接的数据库操作都要被回滚。
创建连接需要耗费时间
1. 创建一个连接大概需要1-2秒的时间。
保持连接打开状态的代价很大
1. 尤其是在系统资源(例如内存)方面。
2. 数据库产品的许可证都按照同时打开的连接数目来收费。
l 什么是数据库连接池
数据库连接池:Connection pooling,它是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
l 数据库连接池运行机制
n 从连接池获取或创建可用连接;
n 使用完毕之后,把连接返还给连接池;
n 在系统关闭前,断开所有连接并释放连接占用的系统资源;
n 还能够处理无效连接(原来登记为可用的连接,由于某种原因不再可用,如超时,通讯问题),并能够限制连接池中的连接总数不低于某个预定值和不超过某个预定值;
l 连接池示例图
l 使用数据库连接池技术的好处
1. 资源重用
由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。
2. 更快的系统响应速度
数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。
3. 统一的连接管理,避免数据库连接泄漏
在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄漏。
1.6. DBCP的使用:
1.7. 什么是DBCP
DBCP连接池是Apache软件基金组织下的一个开源连接池实现。
编写DBCP测试类,DBCP主要接口与类。
n DBCP配置类:org.apache.tomcat.dbcp.dbcp.BasicDataSource;
n 数据库连接工厂接口:org.apache.tomcat.dbcp.dbcp.ConnectionFactory;
n 默认数据库连接工厂:org.apache.tomcat.dbcp.dbcp.DataSourceConnectionFactory;
需要:
commons-dbcp-1.2.1.jar //连接池的实现
commons-pool-1.2.jar //连接池实现的依赖库
commons-collection.jar //连接池实现的依赖库
private static BasicDataSource datasource=new BasicDataSource();
//取得数据库对象
public Connection getconn() {
Connection conn = null;
try {
datasource.setDriverClassName("sun.jdbc.odbc.JdbcOdbcDriver");
datasource.setUrl("jdbc:odbc:accp");
datasource.setUsername("sa");
datasource.setPassword("sa");
datasource.setMaxActive(10);
datasource.setMaxIdle(5);
datasource.setMaxWait(500);
conn = datasource.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("取得数据库连接错误!");
}
return conn;
1.8. C3P0的使用:
1.9. 什么是C3PO
C3PO 连接池是一个优秀的连接池,推荐使用。C3PO实现了JDBC3.0规范的部分功能,因而性能更加突出。
需要的jar包: c3po0.902.jar
主要接口与类:
com.mchange.v2.c3p0.ComboPooledDataSource;
private static ComboPooledDataSource cdatasource =new
ComboPooledDataSource();
//取得数据库对象
public Connection getconn() {
Connection conn = null;
try {
cdatasource.setDriverClass("sun.jdbc.odbc.JdbcOdbcDriver");
cdatasource.setJdbcUrl("jdbc:odbc:accp");
cdatasource.setUser("sa");
cdatasource.setPassword("sa");
cdatasource.setMaxPoolSize(4);
cdatasource.setMaxIdleTime(500);
cdatasource.setMinPoolSize(2);
conn = cdatasource.getConnection();
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("取得数据库连接错误!");
}
return conn;
}
Ø 数据库连接池,可以缓存连接对象
Ø 传统的连接对象,在使用完后没有很好的回收
Ø dbcp连接池,在多用户访问时,连接速度比较快
Ø 连接池可以,有效的管理数据库连接对象
Ø 在tomcat上配置的连接池,一定要经过tomcat的容器调用
l 什么是Ajax
AJAX(Asynchronous JavaScript And XML),是一套编程技术,或者说是一种特殊的Web编程方法。通过这种编程技术,开发人员能够使用来自服务器的输入无缝地更新Web页面或一部分Web应用程序,而且这种更新不需要立即刷新页面。这并非说浏览器就不与Web服务器连接了。事实上,用于描绘网页的页面或数据仍必须通过服务器端来更新。
Ajax让人们通过现有的成熟稳定的方法来创建Web应用程序,它使得开发人员可以利用已有的JavaScritp、CSS和DOM技术,而不用夜以继日地追逐最新的基于标记的页面构建语言。
l Ajax的生命周期
Ajax的生命周期由下面七个阶段组成:
5. 用户访问
6. 页面初始化
7. 触发浏览器事件
8. 向服务器发起请求
9. 服务器处理请求
10. 服务器响应请求
11. 浏览器更新页面
1.10. 关于同步与异步交互方式:
l 同步交互方式
传统的Web应用程序使用的是同步交互方式,当用户向Http服务器提交一个处理请求时,服务器端将在接受该请求后,按照预先编写好的业务逻辑进行处理。例如:和数据库服务器之间进行数据信息的交换,然后对请求处理进行响应,即将结果传送回发出请求的浏览器客户端,返回一个HTML页面在浏览器端进行显示,在显示该页面时,往往使用CSS层叠样式表丰富页面的显示效果。这样一种处理方式一定会给用户一种不连贯的体验,特别当服务器处理数量较多的请求时,用户多数时间只能处于等待状态,用户在等待期间浏览器中只能看到一片空白。
l 异步交互方式
Ajax采用的是异步交互方式,它相当于在浏览器客户端与服务器之间架设了一个桥梁、一个媒介,在它的帮助下,可以消除同步交互方式中出现的处理à等待à处理à等待等缺陷。在处理过程中Web服务器响应是标准的且易于解析的XML格式的数据传递给Ajax,然后再转换成HTML页面的格式,辅助CSS进行显示。
Ajax相关的一个重要对象是XMLHttpRequest对象,这个对象从IE5.0时代就已经存 ,Ajax允许用户与服务器端交互异步进行,即独立于用户与服务器之间的直接交流。在这种异步交互的过程中,可以使用JavaScript调用Ajax来代替传统提交请求的方式,内存中的数据编辑、页面导航、数据校验等处理都不再需要重新载入整个页面的需求,这些工作都可以交给Ajax单独来执行。
1.11. Ajax运行原理:
l 传统Web应用程序模型
传统的Web应用程序采用同步交互过程,这种交互形式下,用户首先向Web服务器发送一个请求,服务器接受这个请求后执行相关任务,再向发起请求的用户返回一个HTML/XTML页面。这样给用户带来的感觉就是不连贯,服务器在接受请求执行相关任务的时候,用户多数时间处于等待状态,屏幕也会呈现出白屏。
13-1 传统Web应用程序模型
图13-2同步的Web传输过程
l Ajax应用程序模型
Ajax采用异步交互过程。Ajax在用户与服务器之间引入一个中间媒体,从而消除了网络交互过程中处理à等待à处理à等待的缺点。用户的浏览器在执行任务时即装载了Ajax引擎。Ajax引擎用JavaScript语言编写,通常藏在一个隐藏的框架中。它负责编译用户界面及服务器之间的交互。Ajax引擎允许用户与应用软件之间的交互过程异步地进行,独立于用户与网络服务器间的交流。现在,可以用JavaScript调用Ajax引擎来代替产生一个Http请求的用户动作,内存中的数据编辑、页面导航、数据校验、部分数据加载显示这些都不需要重新载入整个页面的需求,可以交给Ajax来执行。
图13-3 Ajax应用程序模型
图13-5 异步的Ajax传输过程
1.12. XMLHttpRequest对象(API):[40分钟]
2.1 方法:
Ø void open(string method, string url, boolean asynch, string username, string password)
这个方法会建立对服务器的调用。这是初始化一个请求的纯脚本方法。
Ø void send(content)
这个方法具体向服务器发出请求。如果请求声明为异步的,这个方法就会立即返回,否则它会等待直到接收到响应为止。
Ø void setRequestHeader(string header, string value)
这个方法为HTTP请求中一个给定的头部设置值。它有两个参数,第一个串表示要设置的首部,第二个串表示要在头部中放置的值。
Ø void abort()
停止请求
Ø String getAllResponseHeaders()
它返回一个字符串,其中包含HTTP请求的所有响应头信息,首部包括Content-Length、Date和URI。
Ø String getResponseHeader(string header)
这个方法与getAllResponseHeaders()是对应的,使用headers标识来获取指定的HTTP头信息。
2.2 属性:
Ø onreadystatechange
在向服务器端发送了一个请求后,往往不知道请求什么时候完成,所以必须使有一种机
制来获取请求处理的状态。onreadystatechange状态变量就是XMLHttpRequest对象用来实现这一功能的。
Ø readyState
onreadystatechange事件是在readyState属性发生改变的时候触发执行的,该属性记录当前请求的状态,然后在程序中根据不同请求状态进行不同的处理。
Ø status
status属性存储服务器返回的http请求响应状态码,例如200代表请求成功,404代表请求资源未找到。最常见的响应代码为200,它表示请求处理成功。
Ø responseText
当服务器已经成功处理完请求之后,就可以使用XMLHttpRequest对象中的responseText属性来获取返回的文本或数据。
Ø responseXML
除了上面responseText属性来获取纯文本信息外,对于结构比较复杂的响应数据,还可以使用其中的responseXML来获取服务器返回的XML文档对象。它需要服务器返回的HTTP头的content-type设置为:“text/xml”。
l 什么是DWR
DWR(Direct Web Remoting,直接Web远程控制)项目是在Apache许可下的一个开源解决方案,它主要提供给那些想以一种简单的方式使用Ajax和XMLHttpRequest对象的开发者。
它具有一套Javascript功能集,它们将从HTML页面调用应用服务器上Java对象方法的过程简化了。它能操控不同类型的参数,并同时保持HTML代码的可读性
l DWR的结构由两部分组成:
Ø 一个运行在服务器端的Java Servlet,它处理请求并且向浏览器发回响应。
Ø 运行在浏览器端的JavaScript,它发送请求而且还能动态更新网页。
l DWR的工作原理
DWR工作原理是通过动态把Java类生成为Javascript。它的代码就像Ajax魔法一样,你感觉调用就像发生在浏览器端,但是实际上代码调用发生在服务器端,DWR负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制,而且DWR的优点在于不需要任何的网页浏览器插件就能运行在网页上。 Java从根本上讲是同步机制,然而AJAX却是异步的。所以你调用远程方法时,当数据已经从网络上返回的时候,你要提供有反调 (callback) 功能的DWR。
DWR动态在JavaScript里生成一个AjaxService类,去匹配服务气端的代码。由eventHandler去调用它,然后DWR处理所有的远程细节,包括倒置 (converting) 所有的参数以及返回Javascript和Java之的值。在示例中,先在eventHandler方法里调用AjaxService的getOptions() 方法,然后通过反调 (callback) 方法populateList(data) 得到返回的数据,其中data就是String[]{"1", "2", "3"},最后再使用DWR utility 把data加入到下拉列表。
1.13. 熟悉DWR核心脚本使用:[40分钟]
l dwr核心脚本engine.js
作用:
dwr的核心脚本,只要用到DWR的地方都需要导入它.
-
- 截取每个后台组件的请求实现客户端的统一入口
- 将用于组件调用的JS参数对象重新包装组合
- 检测客户端浏览器的环境并选择最佳的数据提交方案
- 处理后台执行结果并通过执行回调函数通知客户
常用方法:
设置全局超时时长
1. DWREngine.setTimeout(3000);
设置全局选项
1. 设置发送方式(是否为异步)true 异步 false同步
DWREngine.setAsync(falg)
2. 设置请求方法 参数值只能为POST和GET
DWREngine.setHttpMethod(method)
批处理
1. DWREngine.beginBatch();
调用代码…
DWREngine.endBatch();
l dwr核心脚本util.js
作用:
DWR核心工具包,提供了些常用的js的函数集合,使用它可以简化DOM操作
常用方法
Ø 处理select下拉列表
DWRUtil.addOptions(selectId,array)
Ø 处理表格
添加行
DWRUtil.addRows(tableId,array)
Ø 其他常用方法
返回id对应的元素值
DWRUtil.getValue()
获取下拉菜单文本值(<option>文本</option>)
DWRUtil.getText()
理解WebContext工作原理
Ø 引入
虽然DWR使得js能直接调用后台的java代码,但DWR本质还是通过XMLHTTPRequest与服务器进行通讯,DWR很好的对其进行了封装(包括HTTP协议)感觉好像是js直接调用后台java代码一样。但如果后台程序需要通过servletAPI进行操作怎么办呢?
Ø 解决方式
DWR给我们提供了两个工具类:WebContext和WebContextFactory,通过这两个类可以访问ServletAPI
Ø WebContext是什么?
WebContext对象相当与ServletContext对象,可以直接得到HttpServletRequest、HttpServletResponse等对象
Ø 获取WebContext对象
通过WebContextFactory提供的静态方法get()获取WebContext对象。
WebContext webContext = WebContextFactory.get();
Ø WebContext常用方法
1. getHttpServletRequest():获取request对象。
2. getHttpServletResponse():获取response对象。
3. getServletConfig():获取ServletConfig对象。
4. getSession():获取session对象。