VFP教程 十一、 应用程序开发

2024-09-25

VFP教程 十一、 应用程序开发(共5篇)

VFP教程 十一、 应用程序开发 篇1

11.1 开发应用程序的基本步骤

在开发应用程序时,首先应进行系统环境规划,规划中要考虑的因素有:应用程序所面向的用户及其可能需要的各种操作、数据库规模、系统工作平台(单用户或是网络)、程序要处理的数据类型(是本地数据还是远程数据)等,

VFP教程 十一、 应用程序开发

。规划完成之后,即可利用项目管理器来进行每一步开发,它可以帮助管理开发过程中的所有文件,并最终连编成应用程序。应用程序的开发步骤大致如下图所示:

1. 数据库结构设计

2. 系统功能模块设计

3. 菜单设计

4. 用户界面设计

5. 查询设计

6. 报表设计

7. 系统维护设计

8. 系统模块调试

9. 用项目管理器连编成应用程序

11.2 优化应用程序的技巧

1. 优化表和索引

(1) 如果没有启用记录或表缓冲,应该使用INSERT-SQL命令(因索引只需更新一次),而不要使用APPEND BLANK 命令后再使用REPLACE;

(2) 当需要将大量记录追加到索引过的表中时,应先取消或关闭索引,在数据追加完毕,再重建索引,这样速度会快些;

(3) 在SQL语句中要尽量避免函数调用;

(4) 如果需要经常使用某种索引顺序,应周期性使用此索引对表进行排序,提高表的性能;

(5) 在多用户环境中,使用CDX 索引文件比 IDX 索引文件快。

2. 使用Rushmore 技术加速数据访问

使用 Rushmore 技术可以显著地提高查询的速度,

电脑资料

Rushmore 是一种从表中快速地选取记录集的技术,它可将查询响应时间从数小时或数分钟降低到数秒。访问单表时,使用 FOR 子句,访问多表时,使用SELECT-SQL 查询,可自动隐含地使用该技术。

(1)访问单个表中的数据,使用一个FOR子句;

(2)访问多个表中的数据,使用SELECT-SQL、DELETE-SQL、UPDATE-SQL命令。

3. 优化表单和控件

(1) 使用数据环境;

(2)在表单集里限制表单数目;

(3)在页框中动态加载页面控件;

(4)动态绑定控件与数据;

(5)当必须对屏幕进行多处更改时,延迟屏幕刷新;

(6)在经常使用的方法程序中减少代码。

4. 提高VFP程序性能的一般技巧

(1)数据要选择正确的数据类型

(2)避免重复打开文件,需要打开多个文件时,将它们分配给不同的工作区,需要时使用SELECT命令选择工作区;

(3)尽量使用FOR…ENDFOR循环,而不要使用DO WHILE…ENDDO循环,因为FOR循环较快;

(4)从多个字段复制数据时,用SCATTER TO ARRAY 比用SCATTER MEMVER快;

(5)为了有效的使用内存,避免在需要对象之前就创建它们,当不要该对象时应及时清除它;

(6)尽量将输出发送到顶层窗口,速度快些;

(7)使用SET TALK OFF命令取消状态显示,可节省屏幕顶端更新时间;

(8)将SET DOHISTORY 设置为OFF,避免当运行程序时每次都更新命令窗口;

(9)使用名称表达式代替宏替换,因为名称表达式更快;

(10)有效地引用对象属性:

·优化对属性的重复引用,可将属性值保存到一个变量中,再进行更改,在完成时一次性的设置属性;

·有效地引用多个属性,可以用WITH…ENDWITH命令避免重复查找同一个对象,或将对象的引用保存在变量中。

VFP教程 十一、 应用程序开发 篇2

本文在My Eclipse开发环境下, 演示快速SSH应用开发的一般过程, 同时理解性地介绍相关的SSH基本概念, 及常见错误的处理方法。除了Java编程和HTML标签外, 您还需要了解HTML“表单”的概念:通过表单 (form) 可以将在web页面上使用文本框、单选按钮、复选框等收集用户输入, 并提交 (submit) 给系统后台。后台数据处理的结果, 也可以通过表单带到前台页面中;阅读本文不需要有JSP语言的知识基础。

1 开发环境

本例开发环境为My Eclipse7.5和Struts 2.2.1, Spring和Hibernate使用My Eclipse内置的版本。注意下载Struts时, 要下载完全版Full Distribution, 该版中包括样例“空工程”struts2-blank-2.2.1.war (在apps目录下) , 这个文件中有快速开发可以套用的各种文件。附注:war文件是部署Web应用系统时用的压缩文件格式, 但是也可以使用RAR等程序解压。

2 建立Web工程并导入Struts支持包

在“空工程”的WEB-INFlib目录下, 是支持Struts所需要的最简化的jar包, 它们是:

将这些包解压到一个目录中 (例如C:struts) , 然后在My Eclipse中新建一个“Web Project”, 命名为“Warp Speed”并勾选Java EE 5.0 (需要在系统中已经安装JDK5.0以上的版本) ;在工程名上面点鼠标右键, 选择“Build Path-Configure Build Path”调出配置对话框 (如图1) , 在该对话框中选择“Libraries”选项卡, 使用“Add External JARs”按钮, 将上面的7个jar文件添加到工程目录中。这样Warp Speed工程就已经支持Struts2了。

3 设置全局配置xml文件以支持Struts过滤器

在系统中加入Struts支持, 实际上就是要在系统中增加一个Struts“过滤器 (filter) ”;所有的文件, 在以页面形式展示到用户的浏览器之前, 先要通过该过滤器“过滤” (即处理) 一遍, 这样给了Struts控制模块一个处理页面中特有的Struts标签的机会;也就是说, 后台程序可以将这些Struts标签“翻译”成为相关的数据并处理后, 才将生成的页面提交给终端用户。

在系统中添加Struts“过滤器”的方法, 是设置系统的全局配置文件web.xml;该文件在工程的树形结构中位于WebRoot/WEB-INF目录下。这里暂不需要理解复杂的配置语法, 只需要在My Eclipse的Package窗口中, 找到该文件并双击, 即可进入图形化的web.xml配置界面 (如图2) 。该界面中, 树型结构的第二项, 即是“Fileters”, 选中后使用窗体右边的“Add”按钮, 弹出“Add Filters”对话框;这个框中只有两项带“*”号的项目是必填的:

第一项是要为过滤器起一个名字, 可以随便起一个好记的名称, 例如“s2”;

第三项是实现该过滤器的Java类;点击“Browse”按钮, 输入Struts Prepare And Execute Filter (实际上只需要输入前几个字母, 例如strutsp就可找到该类) , 将该类设为过滤器类即可。

添加完过滤器后, 还需要指定哪些文件必须通过该过滤器。在例子中, 简单地要求所有的文件都要通过Struts过滤器, 因此可以这样来设置过滤器的“mapping”:点击web.xml树形目录的Filters, 在右边“Filter Mappings”列表框旁边, 点击“Add”按钮, 输入刚才的过滤器名“s2”, 并在“URL-Pattern”处输入“/*”, 即要求系统根目录下所有的文件都需要通过该过滤器处理。保存web.xml文件;这时Warp Speed工程可以说已经完全支持Struts2了。下面验证一下。

4 设计一个最简单的Struts2系统

在设计一个最简单的Struts系统之前, 需要理解这样两个概念:“action”的执行和导航。

(1) 所谓“action” (“动作”) , 就是在表单提交后系统会自动执行的一个Java类, 该类必须继承Action Support (在com.opensymphony.xwork2中) 并重写其中的execute () 方法。表单提交后, 系统会将表单里包含的字段数据传递给该action类, 并执行其中的execute () 方法。

(2) execute () 方法必须返回一个字符串, 而该字符其将决定系统要转向那个页面;这就是所谓的“导航”。

因此, 一个最简单的Struts系统, 起码包括这样几个文件:

带有表单的页面文件 (jsp文件)

表单提交后要执行的action (java类)

Action执行完毕要转向的页面 (jsp文件)

因此, 在构建系统前, 首先要构思系统到底需要怎样的功能结构, 以及需要哪些文件来实现这些功能——这正是软件工程的“设计”阶段的任务。作为最简单的例子, 可以这样设计系统:

(1) 页面index.jsp, 其中包含一个简单的form, 该form的action名为“a Check”, 其中包含两个文本字段:name和password;

(2) 表单提交后要执行的action类为Account Check;

(3) Account Check类执行时, 打印出传递过来的name和password参数的值

(4) Account Check执行后转向页面index2.jsp。

为了将这一个构思传递给系统, 需要使用struts.xml来配置这几个文件之间的逻辑关系。在“空”样例工程struts2-blank-2.2.1.war的WEB-INFsrcjava目录下可以找到一个example.xml文件, 该文件可以作为编写struts.xml配置文件的起点。其内容为:

在上面的代码中, 有四行代码做了下划线标记。采用第四行带下划线的代码的语法形式 (即含有“name”属性的result标签) 来修改第三行带下划线的代码, 并删除后面两个“action”标签;修改后的这三行带下划线的代码变为:

说明:

(1) “action”标签定义了一个动作, 该动作由其name属性确定, 并和页面表单中的“action=”属性相对应;class属性则指定了该动作由哪个Java类来实现。例如, 上面的代码相对应的页面表单应该有如下形式:

...

则上述form提交时, 系统将寻找Account Check类并执行之。

(2) “result”标签定义了在动作执行之后的跳转 (导航) , 其中name属性和动作中execute () 函数的返回值相应, 也就是说, 如果动作中execute () 返回值为字符串“to Index2”, 则系统跳转到index2.jsp页面。

(3) package是对action分类的标签, 其最核心的属性是“name”, 该name是与其他package区分的依据;而namespace (命名空间) 属性则定义了到哪个地址寻找其下属的action;例如, namespace="/example"表示, 如果请求的动作的URL是“/example/Hello World.action”的话, 系统首先到/example命名空间寻找“Hello World”动作对应的Java类;如果没有找到, 系统还会到默认的命名空间去寻找, 以及到“/”根命名空间寻找。对于修改后的例子, 只是简单的定义了一个名为“default”的package并指定根命名空间。需要注意的是, 命名空间只有“一层”, 而不是像文件目录那样可以有多个层次。另注意:URL中“xxx.action”和简化形式的“xxx”是等同的。

5 实现最简单的Struts2系统

对于上面设计好的简单Struts2系统, 可以根据struts.xml的要求按下面步骤实现之——注意这里体现的软件工程思想:先设计, 后实现:

(1) 页面表单编码:Web工程默认的“入口”页面是index.jsp, 位于Web Root (相当于网站的根目录) 下。最简单的支持Struts2框架的JSP文件结构为:

也就是说, 最上面两行最关紧要!使用上面的模板替换系统中index.jsp原来的内容, 并在

标签内加入struts表单:

其中“s:”是由上面所示第二行代码

<%@taglib prefix="s"uri="/struts-tags"%>

规定的struts标签的前缀, 也就是说, 所有struts标签都要以“s:”打头。“form”和“submit”标签和HTML表单中类似的标签的意义相同, 而“textfield”标签相当于HTML表单的input标签。请注意下划线的部分:action属性定义的名称"a Check"和struts.xml中的action name是一致的;两个textfield定义了两个表单字段, 一个名为“name”, 另一个名为“password”。用户在这两个字段中输入的数据将被Struts传递到后台action程序中。

补充说明:My Eclipse7.5中有一个Web Page Editor, 用这个编辑器可以插入struts2的标签!方法是在JSP文件上点击鼠标右键, 选择“Open with”, 并从弹出的窗口中找到Web Page Editor并确定即可。展开右边工具栏中“Struts Tags”即可使用该工具栏添加Struts标签了, 可以节省不少键盘输入的时间 (见图3) 。

(2) 动作编程:根据struts.xml要求, 要编写一个名为“Account Check”的类来实现action“a Check”。这个类有4个要求:

1) 继承Action Support。

2) 包含表单字段对应的属性变量。

3) 对上面的属性变量编写getter和setter方法。

4) 重写execute () 方法, 并返回与struts.xml对应的字符串以进行导航。

Account Check.java的代码如下:

上文中的核心代码只有4行 (使用下划线标出) , 前两行只是声明了与表单字段相对应的变量 (Struts会自动在表单和action类之间进行数据传递) ;第三行将传递过来的字段值打印出来 (一个简单的数据处理) ;最后一行返回字符串“to Index2”以指示系统导航到/index2.jsp页面。注意其中的setter和getter函数分别用于设置和获取字段变量的值;但是在上面的代码中并没有看到对getter和setter的引用, 而其实这正是Struts的奇妙之处:当execute () 被执行时, 所有的字段变量已经在Struts的控制调度下被设置好了!

(3) 结果页面编程:根据struts.xml的要求, 结果页面是index2.jsp;目前暂不需要在该页面中工作, 因此可以随便写个页面并命名为index2.jsp即可。

现在可以运行系统了。由于工程是Web Project, 因此只要在工程名上点鼠标右键, 并选择:

“Run As”—》“My Eclipse Server Application”

My Eclipse会自动配置运行参数, 启动内置的Tomcat应用服务器, 打开浏览器并提供index.jsp页面。页面地址形如:

http://computername:8080/Warp Speed/index.jsp

其中computername是的计算机的名称。可以输入一些内容, 点击“Submit”按钮, 系统将自动转到index2.jsp, 并在控制台打印出来您输入的内容 (由execute () 函数中的println () 实现) 。

在这一阶段常见的错误是:

HTTP Status 404-There is no Action mapped for namespace/and action name xxx

该错误意味着在指定的命名空间没有找到名为xxx的动作 (同时在“根”命名空间也没有找到) 。需要查看并修改你的xtruts.xml配置文件。

6 错误

My Eclipse首次启动的时候, 会要求你建一个“工作区 (workspace) ”, 后继的工程文件均存放到这个工作区文件夹中。如果在学习过程中, 编写了多个工程, 有时候会出现莫名其妙的错误, 那么除了认真阅读错误提示并进行更正意外, 有些错误可能是前期的工程遗留下来的, 即使早已删除了那些工程, 其发布到tomcat中的应用并没有移除干净!

解决的方法很简单:

退出My Eclipse, 到workspace目录, 在.metadata.me_tcatwebapps中有已经发布所有工程的文件夹, 找到原来的工程文件夹, 删除那些有问题的工程 (或者干脆全部删除, 因为这并不影响源文件) , 然后重新启动My Eclispse就可以了。

因此, 如果怕麻烦, 最好一个工程使用一个独立的工作区。

7 编程

从上面的实验当中可以看到, Java的打印语句只能在服务器的控制台上输出结果, 而不能将结果显示到用户的浏览器中。Struts将action处理的数据 (包括表单提交给action的数据) 和应用 (Application) 范围内的数据, 都存储在一个叫做“值栈” (value Stack) 的地方;有很多种方法可以从这里取出值来。现在重新对index2.jsp编程, 已将这些值取出到页面中:

首先, 使用通用的struts页面模板替换index2.jsp的内容, 并在

标签内加上:

运行一下试试。可以看到, 三种方法都可以将输入的password显示出来。其中前两种为Struts标签形式, ${password}的写法是OGNL表达式语言, 其用法暂略。

8 导航

如果需要根据后台程序的处理结果转向不同的页面的话, 必须同时配置struts.xml和action。例如, 如果要在传递过来的name和password参数的值分别为“wang”和“123”时, 系统导航转向index2.jsp页面, 否则的话转向验证失败页面fail.jsp, 则可以先配置struts.xml如下:

根据这一配置, 需要在action的execute () 方法作相应修改:

最后, 需要实现fail.jsp;由于这个页面比较简单, 只需要将index2.jsp另存为fail.jsp, 并将其页面内容修改为“失败”信息即可 (略) 。

再次运行工程, 则输入数据不同会导航到不同的页面。至此, 已经完整的体验了Struts2简单而强大的前后台交互及表现能力。下面看看如何方便地与底层数据处理进行交互。

9 为工程添加Spring支持

在工程名上点鼠标右键并选择

“My Eclipse”—》“Add Spring Capabilities”

为简单起见, 因为系统内置的Spring支持是2.5版本的, 选中所有2.5版的Spring包, 并选择“拷贝支持包到lib目录”;另特别注意:

(1) 将Spring的配置文件application Context.xml放到WEB-INF/目录下 (而不是缺省的src目录) ;

(2) 重要:web.xml中增加一个listener:Context Loader Listener;

上述第 (2) 项致使可以方便的获取当前程序的运行上下文, 从而得到DAO对象以操纵数据库。

10 添加Hiberbate支持

和上面的步骤类似, 为工程添加Hibernate支持。同样选择将Hibernate的支持包拷贝到lib目录下;在“配置文件”选项中, 选择使用已有的Spring配置文件 (即上一步中的WEB-INF/application Context.xml) ;然后, 设定要使用的数据库为My Eclipse自带的小型数据库Derby (在选项窗口的“DB Driver”下拉菜单中选择) 。在最后的选项窗口中, 还要为Hibernate创建一个专用的包:点击“Java Package”右边的“New”按钮, 在src目录下面输入包名 (例如hib) 即可;这个包是以后放置Hibernate有关文件的包。

附注:Derby数据库是Apache的开源小型数据库, 具有体积小, 易安装, 支持Java、JDBC和SQL标准, 并可用于嵌入式环境等特点, 参见http://db.apache.org/derby/。

11 启动Derby数据库

为了在后继的工作中使用数据库, 需要先启动My Eclipse内置的Derby数据库, 方法是:

在My Eclipse的右上角, 有一个带加号的窗口的小按钮, 名为“Open Perspective” (鼠标悬停在该按钮上方的时候会显示它的名称) ;点击该按钮并选择“My Eclipse Database Explorer” (或者使用“Window”菜单的“Show View”—》“DB Browser”) 即可打开数据库浏览窗口;双击其中的“My Eclipse Derby”即可启动数据库。

Derby启动以后, 展开已经启动的数据库连接, 可以看到有多个数据库, 包括“APP”, “CLASSICCARS”等。展开“CLASSICCARS”下面的“TABLE”, 会看到该数据库下属的多个表, 例如“CUSTOMER”、“EMPLOYEE”等 (见图4) , 展开后者可以观察其包含的字段。如果希望编辑该表中的数据, 可以在表名上点击鼠标右键并选择“Edit Data”。可以看到, 在“EMPLOYEE”表中, 已经有数十条数据;可以试着修改一下这些数据, 我们下面的工作就以这些数据为基础。

然后使用屏幕左下角的按钮回到“Package Explorer”视图中。

12 其他错误

直到目前为止, 还没有进行任何涉及底层数据库操作的编码工作, 仅仅是为Warp Speed工程添加了Spring和Hibernate的支持而已。现在看看在新的支持下, 原来的页面是否还能正常运行:

在工程名上点击鼠标右键并选择

“Run As”—》“My Eclipse Server Application”

——竟然是“404” (资源无法找到) 错误!

可以仔细研究Console控制台中显示的异常信息, 有一个简单得多的经验:这个错误本来不应该发生!出错的原因是添加的各种支持里面所包含的JAR包有重复的, 并且版本不一致所至。

展开“Package Explorer”中的“Referenced Libraries”, 可以看到工程中所引用的所有JAR包;现在知道为什么在前面的步骤中要将支持的JAR包拷贝到同一个lib目录下面了吧:起码检查重复JAR包的时候方便多了。

仔细检查后可以发现, “asm-2.2.3.jar”和“asm.jar”以及“cglib-nodep-2.1.3.jar”和“cglib-2.1.3.jar”是重复的;要删除这两对中的后者, 方法是:在要删除的包上面点击鼠标右键并选择:

“Build Path”—》“Remove From Build Path”

然后就可以删除了。

再运行一下试试, 如果还不行, 就要按照上面第“6”步所说的方法, 彻底地清空一下已经发布的文件了。

13 Table记录显示系统

目的:从“CLASSICCARS.EMPLOYEE”表中读出所有数据, 并显示在页面中。

流程:

(1) 在index3.jsp中建立一个表单, 对应的动作是“e List”。

(2) “e List”对应的Java类命名为“Employee List”, 它在Struts的调控下获取数据表中的记录。

(3) “e List”执行完毕后转向elist.jsp, 在该页面上显示动作类获取的数据。

14 实现显示系统

根据上述设计, 首先修改struts.xml文件, 添加如下的动作配置:

然后依次编码所需要的各个文件:

首先是起始页面index3.jsp:

这里面实际上只有一个submit按钮。

然后是动作类Employee List.java;因为该类需要读取数据表“CLASSICCARS.EMPLOYEE”, 因此在编写该类之前需要先对所涉及的表进行所谓“逆向工程”以生成相关的实体类和DAO (数据存取对象) 类。方法是:

(1) 在Database Explorer中, 找到数据表“CLASSIC-CARS.EMPLOYEE”并点击右键, 选择“Hibernate Reverse Engineering”, 设定Java src folder (点击Browse选择/Warp Speed/src) 和Java Package (还记得在第10步中创建的hib包吗?就是这个) , 勾选下面的三个复选框 (其中“Create Abstract Class”不用选;这三个复选框的含义就是指定使用逆向工程生成数据表相关的实体类或说POJO类以及对应的DAO类) 。

(2) 第二页中, 比较重要的是确定Id生成策略, 例如, 如果你的主键是自增生成的id, 请使用identity策略。目前的例子暂时不需要设置这项, 直接点击“Next”到下一页。

(3) 第三页中, 注意在表清单的下方, 有两个复选框, “Include referenced tables”和“Include referencing tables”, 意思是在逆向工程的时候要包含和当前表有关联的其他表。选中这两个框后可以看到, 表清单中多了一个表名“OFFICE”, 因为EMPLOYEE通过“OFFICECODE”字段作为外键和OFFICE表关联。

执行逆向工程后, 在Package Explorer中可以看到src/hib包下面多了许多源文件, 例如Employee.java是EMPLOYEE表对应的实体类, 而Employee DAO.java则是其DAO类。

说明:DAO类:

DAO类中集成了对实体类的通用操作, 例如find All () , find By () , attach Dirty () 等;特别地, DAO类包含一个静态方法用于从应用上下文中获取该DAO类的一个实例:get From Application Context (Application Context ctx) ;这样只要我们获取了当前应用的上下文 (Context) 后, 即可取得DAO实例并通过该实例操作数据对象了 (参见下面的步骤) 。

数据处理action的“三板斧”为:

(1) 获取当前应用上下文。

(2) 获取实体类的DAO对象实例。

(3) 使用DAO对象操作数据。

特别提醒:在使用DAO对象操作数据时, 经常使用Java的集合类对象, 例如List等。

Employee List.java核心代码为:

暂且不实现elist.jsp, 先测试一下已经实现的部分。

运行工程;系统自动打开一个浏览器, 其地址栏中显示的是工程的Web主目录, 形如:

http://computername:8080/Warp Speed/

现在, 在该地址后面加上“index3.jsp”并回车, 即可显示该起始页面。点击“List Employee”按钮, 则浏览器提示“404”无法找到资源错误 (暂且不用管它, 下面再来解决) ;但是可以看到, 控制台中已经打印出来所有的员工名单了。

15 显示记录

上面的实现还有缺陷:并没有将action获取的数据带到结果页面上。要做到这一点, 必须进行两项工作:

(1) 在action中将需要传递给结果页面的数据声明为类属性并为其编写setter和getter函数。

(2) 在页面中使用Struts标签取出action传递过来的数据。

因此首先将Employee List.java做如下修改:将list声明为类属性, 并为其list添加getter和setter:

注意execute () 中对list引用的时候就不需要重复声明了。然后编写elist.jsp:

这里面, 尝试了几种不同的表现方法。

首先看标签:它的作用是遍历由value指定的“集合型”对象 (一般为Map或List类型) ;在例子中, 要遍历的是“list”对象 (该对象由action传递过来, 对应于action内的一个类属性) 。

其次要注意标签, 它的作用是将iterator中的对象的属性取出来, 即的作用相当于调用list的get Firstname () 方法 (action中的getter在这里得到了“隐形的”调用) 。

从上面的代码中可以看出, 除了使用之外, 还尝试另外两种标签方法, 一是, 它可以生成一个国际化的信息文本;另一个是${email}, 用的是OGNL表达式语言。网上有争论说, 既然是struts2, 就尽量用struts2的标签;也有人说:OGNL是主流, 应该和标签配合使用;请自行深入学习后选择。

16 插入新记录

在讲解这个例子之前, 先介绍一下Struts2的新特性:Struts2表单的对象注入;也就是说, Struts2在表单级即支持对象的概念, 例如, 假设要在页面index4.jsp的表单中输入要插入到EMPLOYEE表中的数据, 可以使用如下形式:

注意各个字段都使用了复合的形式, 其第一部分为要作为整体传递到action的对象的名称, 第二部分为该对象的属性 (字段) 名。自然地, 其相对应的action类中, 要有对“em”属性的声明和处理。请看Insert Employee.java的主要代码:

别忘了在上面代码中还需要为em属性生成getter和setter函数。

从上面的例子中还可以学到数据操纵的四板斧:

(1) 依次获取应用上下文、DAO对象和当前会话对象。

(2) 启动事务。

(3) 数据操纵。

(4) 提交事务。

和上面程序相对应的, 需要在struts.xml中添加如下的action定义:

可以重新部署系统并访问index4.jsp来测试程序运行结果。

想一想:如果想把出错时的Exception信息显示到一个单独的结果页面上, 应该怎么做?

提示:不仅要配置独立的出错页面, 还要注意:“出错信息”也应该声明成一个“类属性”才能传递到结果页面上。

17 自定义页面格式

页面index4.jsp的运行结果没有问题, 但是其显示格式却有些古怪:所有的字段标签并没有像预期的那样和文本框一一对应, 而是统统放到了页面最上端。可以在IE浏览器中重新打开这个页面并观察其HTML源码, 就会发现里面除了由Struts标签生成的表单代码外, 还有许多类似

这样的表格标签等。这些标签是Struts为美化表单的排版而自动加上的。如果想自己控制表单的排版, 可以抑制Struts的这个功能, 方法是在表单中指定“simple”主题:

这样, 生成的表单的排版格式就完全可以自由控制了。

18 提示

Tips 1:从一个action跳转到另一个action:在struts.xml中可以这样配置:

action name

这种方法是直接跳转, 不传递上一个action中的属性数据。

action name

这种方法可以将上一个action中的属性数据带上。

注意:action name需要直接写名字, 不能带路径, 也不能带.action这样的后缀。

Tips 2:输入数据校验:

最简单的输入数据校验方法, 是重写validate () 方法 (当然, action需要继承Struts的Action Support) 。

例如, 在页面中, 使用如下表单:

那么, 如果想捕捉没有输入密码的错误, 则在action中加入这样的语句即可:

需要注意, 必须在struts.xml中定义input页面 (即错误输出页面) 。例如, 如果想在输入页面的本身显示错误信息的话, 可以这样写:假设表单在myform.jsp, 那么struts.xml中应包含这样的语句:

myform.jsp

如果希望将错误输出定向到别的页面, 除了要修改上面的配置语句外, 还需要在错误输出页面内加上:

这个标签是“表单字段输入错误”标签, 它负责显示字段的校验错误信息, 也就是你在action中使用add Field Error () 函数要显示的信息。当然, 如果使用了别的错误信息函数, 例如, add Action Error () 或者add Action Message () , 则需要在错误输出页面加上相应的显示标签, 例如

Tips 3:关于自动提交 (auto commit) :

在Hibernate配置文件 (application Context.xml) 中的数据源 (Data Source) 的配置中加入自动提交的设置, 如下:

即可不需要在action中加入Session, Transaction的语句, 就可以将数据直接更新到数据库。

19 结语

在这个短短的教程中, 可以学习使用Struts处理用户输入, 并通过实体类存取数据库;数据可以在前台 (页面) 和后台 (Java类) 之间方便以面向对象的方式传递;Java程序员可以专注于后台的Java编程, 前后台分工更加合乎软件工程思想, 从而为构建复杂系统提供有力支持。文中的样例工程Warp Speed的目录打包后存放在文件Warp Speed.rar中, 可以从本刊网站下载。

摘要:SSH2 (Struts2+Spring+Hibernate) 是当前开发Java动态网站的流行框架。虽然其涉及的技术较为繁杂, 但是根据软件工程的原则, 避开底层繁杂的技术细节, 并分离页面设计和后台编程任务, 仅着重于应用层的构建, 是可以在仅具有Java编程知识和简单HTML标签的基础上, 快速开发基于SSH2的应用系统的。由于该快速入门最快可以在1小时之内完成而不失其典型示范作用, 故称之为“超光速”教程。

VFP教程 十一、 应用程序开发 篇3

5、如果希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。给WebView添加一个事件监听对象(WebViewClient)

并重写其中的一些方法

shouldOverrideUrlLoading:对网页中超链接按钮的响应。

当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url

onLoadResource

onPageStart

onPageFinish

onReceiveError

onReceivedHttpAuthRequest6、如果用webview点链接看了很多页以后,如果不做任何处理,点击系统“Back”键,整个浏览器会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件。

覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。

public boolean onKeyDown(int keyCoder,KeyEvent event){

if(webView.canGoBack()&& keyCoder == KeyEvent.KEYCODE_BACK){

webview.goBack();//goBack()表示返回webView的上一页面

return true;

}

return false;

VFP教程 十一、 应用程序开发 篇4

http://www.lampbrother.net 量大,数据库压力大是必然。这里不是说51cto网站不好,所有的网站都是从类似的程序架构开始发展的。CU也可能 是如此。

提示:我们可以在静态数据层的前端自己架设一层cache层,对我们购买的CDN提供数据源服务,可用的软件有varnish/nginx/squid 等cache。在这层的前端我们也可以架设DNS服务器,来达到跨机房业务拓展及智能解析的目的。

第四层:动态服务器层:php,java等,只有透过了前面3层后的访问请求才会到这个层,才可能会访问数据库及存储设备。经过前三层的访问过滤 能到这层访问请求一般来说已非常少了,一般都是新发布的内容和新发布内容第一次浏览如;博文(包括微博等),BBS帖子。

特别提示:此层可以在程序上多做文章,比如向下访问cache层,memcache,memcachedb,tc,mysql,oracle,在程序级别实现分布式访问,分布式 读写分离,而程序级别分布式访问的每个db cache节点,又可以是一组业务或者一组业务拆分开来的多台服务器的负载均衡。这样的架构会为后面 的数据库和存储层大大的减少压力,那么这里呢,相当于指挥部的外层了。

第五层:数据库cache层,比如:memcache,memcachedb,tc等等。根据不同的业务需求,选择适合具体业务的数据库。对于memcache、memcachedb、ttserver及相关nosql数据库,可以在第四层通过程序来实现对本层实现分布式访问,每个分布式访问的节点都可能是一组负载均衡(数十台机器)。

第六层:数据库层,一般的不是超大站点都会用mysql主从结构,如:163,sina,kaixin都是如此,程序层做分布式数据库读写分离,一主(或双主)多从的方式,访问大了,可以做级连的主从及环状的多主多从,然后,实现多组负载均衡,供前端的分布式程序调用,如果访问量在大,就需要拆业 务了,比如:我再给某企业做兼职时,发现类似的51cto的一个站点,把www服务,blog服务,bbs服务都放一个服务器上,然后做主从。这种情况,当业务访问量大了,可以简单的把www,blog,bbs服务分别各用一组服务器拆分开,这种方式运维都会的没啥难度。当然访问量在大了,可以继续针 对某一个服务拆分如:www库拆分,每个库做一组负载均衡,还可以对库里的表拆分。需要高可用可以通过drbd等工具做成高可用方式。对于写大的,可以做主主或多主的MYSQL REP方式,对于ORACLE来说,来几组oracle DG(1master多salve方式)就够了,11G的DG可以象mysql rep一样,支 持读写分离了。当然可选的方案还有,mysql cluster 和oracle 的RAC,玩mysql cluster和oracle RAC要需要更好更多的硬件及部署后的大量 维护成本,因此,要综合考虑,到这里访问量还很大,那就恭喜了,起码是几千万以上甚至上亿的PV了。

象百度等巨型公司除了会采用常规的mysql及oracle数据库库外,会在性能要求更高的领域,大量的使用nosql数据库,然后前端在加DNS,负载均衡,分布式的读写分离,最后依然是拆业务,拆库。。逐步细化,然后每个点又可以是一组或多组机器。

特别提示:数据库层的硬件好坏也会决定访问量的多少,尤其是要考虑磁盘IO的问题,大公司往往在性价比上做文章,比如核心业务采用硬件 netapp/emc及san光纤架构,对于资源数据存储,如图片视频,会采用sas或固态ssd盘,如果数据超大,可以采取热点分取分存的方法,如:最常访问的10-20%使用ssd存储,中间的20-30%采用sas盘,最后的40-50%可以采用廉价的sata。

第七层:千万级PV的站如果设计的合理一些,1,2个NFS SERVER就足够了。我所维护(兼职)或经历过的上千万PV的用NFS及普通服务器做存储的 还有大把,多一些磁盘,如SAS 15K*6的,或者用dell6850,搞几组 NFS存储,中小网站足够了。当然可以做成drbd+heartbeat+nfs+a/a的方式。

http://www.lampbrother.net

如果能达到本文设计要求的,中等规模网站,后端的数据库及存储压力会非常小了。象门户网站级别,如sina等,会采用硬件netapp/emc等等 硬件存储设备或是san光纤同道,甚至在性价比上做文章,比如核心业务采用硬件netapp/emc及san光纤架构,对于资源数据存储,如图片视频,会采用sas或固态ssd盘,如果数据超到,可以采取热点分取分存的方法:如:最常访问的10-20%使用ssd存储,中间的20-30%采用sas盘,最后 的40-50%可以采用廉价的sata。

VFP教程 十一、 应用程序开发 篇5

一、管理系统需求分析

华东交通大学是一所以工为主的综合性大学, 培养涵盖了普通专科、本科、专升本教育, 其中又有辅修专业、背景专业, 十分复杂。管理涉及面广, 数据处理任务重。主要工作有:各类毕业生数据统计, 学历证书及学位证书打印、管理、发放, 学历及学位证明书补办, 学历学位电子信息注册等。原来功能单一的证书打印系统, 效率低下, 人为出错率高, 已不能适应我校的发展, 急需一套新的系统来对毕业生进行管理, 提高工作效率, 保证学校的稳定。

二、管理系统功能模块

基于系统需求, 选用了VFP6.0作为开发工具, 该管理系统包括了证书打印、各种报表打印、电子数据输出、数据统计上报等模块。

(一) 证书打印模块

此为该系统核心模块。包含毕业证书打印, 学士学位证书打印, 结业证书打印, 肄业证书打印, 辅修专业证书打印, 辅修学士学位证书打印, 学业证书打印等, 并可按学院、班级、批量打印, 并可按个人单独打印。

(二) 各种报表打印

包括证书审批表、证书发放表、毕业生花名册、学院 (班级) 毕业生统计表, 电子注册报表, 电子注册报告等。

(三) 电子数据输出

根据教育部普通高等学校学生信息网的学历注册数据结构要求, 输出学校上报的电子数据, 可直接上传至学历平台。根据学位备案平台数据结构要求, 输出学位信息电子数据, 并与其对接。

(四) 其他

如学历证明书、学位证明书办理审批、打印等功能。

三、管理系统开发实现

管理系统包括了数据库、自由表、表单及多个报表。

(一) 建立毕业生信息数据库

建立毕业学生基本信息数据库, 各项功能的实现都查询引用该表的相关数据。此库的结构与学校教务管理系统数据库对接, 可将学生毕业资格审查的结果直接导入本系统中。

(二) 功能模块设计

图1所示为系统主界面, 采用页框控件 (Page Frame) , 各项功能清晰明了, 方便直观。报表使用VFP6.0自带的报表设计器。

(三) 核心功能模块实现

此管理系统最核心的功能是证书打印功能, 这是设计的重点, 也是设计的难点。

为了便于管理和发放, 通常证书是按学院顺序, 以班级为单位进行打印。基于前面的分析, 我校的学生培养模式比较复杂, 学校不同专业的证书打印模式存在差异, 有时甚至同一个班级的学生的证书打印专业及学位信息的格式也不尽相同。在使用老系统的情况下, 只能是相同模板的证书一批打印, 然后再调整模板后再打印。工作效率极其低下, 并且极易出错, 严重影响毕业生离校工作的顺利进行, 容易出现安全隐患。

基于这种实际情况, 我们的设计思想是:基于毕业生数据库, 选择或输入班级编号后, 该班学生的证书一起打印出来。为此, 设计了多个证书的模板, 并根据每个毕业生的专业学位等信息自动判断其应采用哪种证书模板, 并自动调用打印。整个证书打印过程中不需要进行任何调整。主要设计思想及程序代码描述如下:

1.根据设定的第一个证书模板对要打印班级学生的毕业结论及专业学位等信息进行查询, 并生成临时数据表。程序代码如下:

&&byz01格式

where bh==alltrim (thisform.Pageframe1.page1.text1.value) and bjyjl="毕业"and dybj=""and csd=""and zyfx=""and fxzy=""into cursor byz01

2.如果该数据表数据记录不为空, 则调用第一个模板进行打印。程序代码如下:

if reccount () >0

report form byz01.frx to print

endif

3.重复第1步, 用设定的第二个证书模板进行查询后, 重复第2步。直至将设定的所有模板条件查询打印完毕。

&&byz02格式

select*from bys;

where bh==alltrim (thisform.Pageframe1.page1.text1.value) and bjyjl="毕业"and dybj=""and csd=""and zyfx=""and fxzy<>""into cursor byz01

if reccount () >0

report form byz02.frx to print

endif

……

&&打印后将打印标记赋为"是"

update bys set dybj="是"where bh==alltrim (thisform.Pageframe1.page1.text1.value)

四、结束语

该管理系统的应用, 结束了以往主要靠人工处理数据, 效率低下, 出错率高的状况。将毕业证书打印等复杂工作全部由计算机完成, 比原来的打印系统更加精准、智能和高效, 保证了证书的及时发放。仅证书打印工作效率就提高了三分之二以上。该系统将会根据办学的需要, 不断完善, 进一步提高工作的信息化水平。

参考文献

[1]吴昊, 熊李燕.Visual Fox Pro程序设计[M].中国铁道出版社, 2008.

上一篇:园长培训考察报告下一篇:教育信息化促进教育改革的理论