删除
userForm.jsp
代码
<%@ page contentType="text/html;charset=GBK"%>
<%@taglib prefix="s" uri="/struts-tags" %>
User Form
应用程序目录结构
代码
WEB-INF
│ web.xml
│
├─classes
│ │ commons-logging.properties
│ │ helloworld.xml
│ │ log4j.properties
│ │ struts.properties
│ │ struts.xml
│ │
│ └─com
│ └─jamesby
│ └─struts2
│ │ ExampleSupport.class
│ │ Logon-validation.xml
│ │ Logon.class
│ │ LogonInterceptor.class
│ │ package.properties
│ │ UserAction-validation.xml
│ │ UserAction.class
│ │
│ └─persist
│ DataBaseMock.class
│ User.class
│
├─jsp
│ Logon.jsp
│ Main.jsp
│ userForm.jsp
│ userList.jsp
│
├─lib
commons-collections-3.1.jar
commons-logging-1.0.4.jar
freemarker-2.3.8.jar
log4j-1.2.9.jar
ognl-2.6.11.jar
struts2-core-2.0.6.jar
xwork-2.0.1.jar
http://www.ideagrace.com/blog/?p=101
wukele收录,使用标签:java,时间:2008-2-21 14:09:56 | 相关网摘,我也收藏
一、根据发布目标分析需求,把需求分析成独立的故事,初步的分析可以是粗略的,随着需求的不断深入刻意对故事进行整合或者切割。
要注意的是分析出来的需求尽量在发布目标的范围之内,超出发布目标的需求应该尽量避免过深分析。
所谓的发布目标是确定了这个版本可以让用户满意的条件。
故事模式:做为(用户角色),我可以(做什么),以便(业务价值)。后面的业务价值在比较简单或者大家都比较明确的时候刻意不需要注明。
当前团队实践推行方法:
第一阶段,这个分析工作开始由PM进行收集,整理和分析。
第二阶段,当大家都为用户故事的方式接受以后,采用需求讨论的方式来明确和分析用户故事。
二、对分析的故事进行相对估计,估计出来的故事点是对用户故事和复杂度的无单位估计值,使用的数值大小本身没有绝对意义,只有相对于其他故事规模的相对意义。
比如,用户登录这个用户故事的估计值是2,那么做为同等开发规模的用户推出,这个用户故事的估计只也因该是2。
当前团队实践推行方法:
第一阶段,这个估计的工作暂时由pm来负责完成,但是由于一个人的估计肯定会有偏差,所以在估计完成之后需要进行调查来进行修正
第二阶段,用估计扑克会议来统一的对用户故事进行估计,当主持人拿出一个新的用户故事之后,大家给出自己对这个故事使用扑克打分,然后取出平均值,对差异较大的估计值要给出解释,来消除对用户故事的错误理解。估计扑克会议的实践不超过1个小时。
三、准备产品调查,对用户故事进行功能存在,和功能缺失性的产品调查,然后根据调查结果对用户故事进行划分,划分成3类,基本需求,线性需求,线性需求。
此外还有反对的需求,存在疑问的需求,无所谓的需求3种类型的需求,这些需求将根据进一步的发展进行确认。
当前团队的实践推行办法:
第一阶段,由pm发出调查问卷在参与到项目的开发团队,测试团队,技术支持团队来进行调查,然后汇总答案根据存在问题和缺失问题的答案,对用户故事进行定性
第二阶段,由pm发出调查问卷扩展到相关的用户群体中进行调查,然后汇总答案根据存在问题和缺失问题的答案,对用户故事进行定性
四、确定发布规划,首先要确定的是迭代周期的长度,以周为单位,然后估计出每个迭代周期团队的速度。然后可以从用户故事池中选择出合适的用户故事来填充到第一次和第二次的迭代周期中。其余的暂时可以先不用填充,随着每次迭代周期的完成来对发布计划进行更新。最后根据估计的速度和需要开发的故事来确定需要几个迭代周期,并最终有几个迭代周期来确定需要开发的时间周期。发布计划可以以功能来驱动进行,也可以以日期来驱动进行。
发布规划的特点,以月做为时间范围,规划对象是用户故事,估计的单位是故事点
当前团队的实践推行办法:
第一阶段,使用1周做为迭代周期,开始时团队速度使用估计的方式做出简单估计,根据每个周期结束后的团队速度再进行发布计划的调成。迭代周期内用户故事的完成暂时以开发完成做为标准。
第二阶段,使用2周做为迭代周期,可以使用原有的历史速度做为团队速度,多出的一周时间做为测试修复时间,迭代周期内用户故事的完成以测试完成,完整的功能提交做为标准,并在开发过程中熟练使用单元测试来进行确保功能的完整完成。
五、确定迭代规划,根据填充到迭代周期内的用户故事来分解成工作任务,工作任务包括设计工作,不同层次的开发工作,调试工作和测试工作等等具体的任务,然后对任务进行估计,这时候估计的单位以理想工作小时做为单位。比如,设计需要两个人小时,开发持久层需要1个人小时,调试持久层需要半个人小时,开发业务层需要2个人小时,调试中间层需要1个小时等等。。。
然后根据每个故事的人小时和这个迭代周期内参与的人数,以及每个人所能参与的实际有效时间(注意有效时间约为每天6小时,需要考虑到会议,讨论,头脑休息等非理想工作时间)来判断这个迭代周期的填充是否足够,如果不够则再加入一个用户故事,如果超出则移出一个用户故事到下一个迭代周期中。
迭代规划的特点,以周做为时间范围,规划对象是工作任务,估计的单位是理想小时
当前团队的实践推行办法:
第一阶段,使用速度驱动的方法来进行迭代规划,即确定了本次迭代的速度,然后选择用户故事扩展成任务,对任务进行估计。
第二阶段,使用承诺驱动的方法来进行迭代规划,即提出一个故事,把故事扩展成任务,对任务进行估计,让小组承诺是否可以完成这个故事,如果可以在迭代周期内完成则加入这个故事,如果不能完成则推迟到下一个迭代走起。
六、迭代开始,在迭代开始时召开迭代启动会,分配迭代周期内的用户故事和工作任务到个人,每个工作任务必须精确到个人,同一个用户故事的不同工作任务可以根据情况适当分配给不同的人来完成。
当前团队的实践推行办法:
第一阶段,任务分配给个人,通常一个故事的任务分配给同一个人。
第二阶段,任务分配给结对,通常一个故事的任务分配给同一个结对。
七、迭代进行,每日早对昨日完成的工作任务和问题进行汇报,并且同时计划今天需要完成的工作任务,对于迭代过程中的进度和问题进行及时的观察和调整,要求每个人完成某个任务之后要及时的告知整个小组知道(qq群的方式最为快捷)。
当前团队的实践推行办法:
第一阶段,由pm及时地对当日工作进行询问。并负责把遇到的问题跑出来进行解决。
第二阶段,小组成员主动地对已经完成的任务进行汇报,并及时把自己遇到的问题抛出来。
八、迭代结束,确认本次迭代完成的用户故事,对于完成一部分的用户故事计算到下一次迭代中。并对本次迭代的过程资产进行总结,形成FAQ方式的文档进行规整。
同时根据新的需求情况,资源情况,已完成功能的回馈,以及开发中遭遇的不确定性问题,对发布规划和迭代规划作出调整。
当前团队的实践推行办法:
第一阶段,使用学习网站,或者博客等方式对经验进行记录。
第二阶段,使用完善的skills对经验进行记录,可以方便的组织成培训文档,并方便的进行搜索,查找。
九、迭代测试,为了保证用户功能完整的提交,每个用户故事开发完成之后都要对该用户故事进行测试,然后在针对开发中出现的问题进行修复,以便完整的完成一个用户故事。
第一阶段:测试迭代周期和开发迭代周期分开。
每次迭代开始阶段由pm告知开发组需要开发的和修复的的用户故事,同时告知测试组本次迭代需要测试的故事,需要准备的故事,需要复测的故事。
并在分配任务时,把修复故事的工作规划到本次迭代中来。
每次开发完成的用户故事点算作本次迭代的速度
迭代1
迭代2
迭代3
迭代4
迭代5
测试
准备故事1,2
测试故事1,2
准备故事3,4
测试故事3,4
准备故事5,6
复测故事1,2
测试故事5,6
准备故事7,8
复测故事3,4
测试故事7,8
准备故事9,10
开发
开发故事1,2
开发故事3,4
修复故事1,2
开发故事5,6
修复故事3,4
开发故事7,8
修复故事5,6
开发故事9,10
第二阶段:测试迭代周期和开发迭代周期合并。
每次迭代开始阶段由pm告知开发组需要开发的故事,同时这些故事也是测试组需要准备测试的故事。要求这些故事分解的工作任务中要包括测试工作和修复工作。
每次测试完成的用户故事点算作本次迭代的速度
迭代X
测试
准备故事1,2,3,4
测试故事1,2,3,4
复测故事1,2,3,4
开发
开发故事1,2,3,4
修复故事1,2,3,4
完成故事1,2,3,4
十、发布结束,对本次发布中完成的用户故事进行会议总结:
1确定最终完成的用户故事,以及花费的迭代周期
2通过计算得到一个团队的人平均速度,这个速度做为下次发布规划的参考
3分析哪些用户故事的估计出现了失误,以及出现失误的原因是什么。
4最初的发布版本在市场上有了初步反馈信息之后,可以延长1个迭代周期用来做为发布版本的反馈收尾。
http://www.blogjava.net/rocket/archive/2008/02/20/180920.html
wukele收录,使用标签:java,时间:2007-12-11 13:03:52 | 相关网摘,我也收藏
1. Hibernate简介
Hibernate是非常流行的对象-关系映射工具。
2. 什么是ORM映射
ORM(Object Relational Mapping)简单的说,就是对象与关系的映射,对于实际应用来讲,对象一般指面向对象中的对象,关系指关系型数据库,对于我们具体的项目来说,就是将java中的对象与关系型数据库(oracle,mysql)中的表联系起来 。Hibernate是很强大的工具,当我们将建立联系的工作交给它后,就可以专注于与java中的对象打交道,而不需要知道它代表的是哪些表。
3. POJO(用来映射数据库中的表,构建我们的持久化层)
一个典型的POJO
public class Person{
private long id;
private String name;
public void setId(BigDecimal value) {
this.id = value;
}
public BigDecimal getId() {
return this.id;
}
public void setName(String value) {
this.name = value;
}
public String getName() {
return this.name;
}
}
表面上看来,一个POJO与一个普通的JavaBean没有什么区别,我们需要了解的是如何让POJO和一个表建立联系。
4. 建立联系的桥梁,映射文件XML。
一个典型的映射文件Person.hbm.xml(注意他的命名方式,一般是类名+hbm+xml)
注意红线部分代表了Pojo对应的是那张表。
一般来说映射文件放在和Pojo同一个包
5. 和数据库的连接
Hibernate配置文件,可以采用xml或者property文件。
一个典型的配置文件
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
toposs
toposs
org.hibernate.dialect.Oracle9Dialect
jdbc:oracle:thin:@172.16.1.3:1521:orcl
oracle.jdbc.driver.OracleDriver
6. Hibernate在Eclipse中快速应用
6.1 新建一个工程,将Hibernate3.jar和你需要的数据库驱动添加到工程path中
6.2 在数据库中新建一个名为person的表。
6.3 在工程的默认package下建立一个POJO,Person类与表person对应。
public class Person{
private long id;
private String name;
public void setId(long value) {
this.id = value;
}
public long getId() {
return this.id;
}
public void setName(String value) {
this.name = value;
}
public String getName() {
return this.name;
}
}
6.4 现在我们来建立一个xml的映射文件(Person.hbm.xml)
6.5 建立hibernate.cfg.xml
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
scott
tiger
org.hibernate.dialect.Oracle9Dialect
jdbc:oracle:thin:@172.16.1.2:1521:rsora
oracle.jdbc.driver.OracleDriver
true
注意红线的部分将mapping文件写到resource中,如果有多个文件,要写多个文件,文件的路径是对于根目录的绝对路径
6.6 项目结构图
6.7 所有准备工作都已经做好了,下面在Person中建立一个main方法,我们做一个简单的插入数据库的工作
6.7.1 Main函数的代码
Public static main(String[] args){
Configuration config=new Configuration().configure();
SessionFactory factory=config.buildSessionFactory();
Session session=factory.openSession();
Transaction tran=session.beginTransaction();
Person p=new Person();
p.setName("test");
session.save(p);
tran.commit();
session.close();
}
6.7.2 点击Run As Java Application,运行这个main函数
6.7.3 然后查看数据库
我们发现数据库已经新增加了一条记录
7. 最常见的关联关系,一对多关联。
7.1 用父子关系说明一对多(多对一关联)
在实际应用中,很少有一个表是独立的,大部分情况是表和表之间是有关联关系的,其中最常见的是一对多(多对一关联)。
父亲和儿子是典型的一对多关系,一个父亲有多个儿子,儿子只有一个父亲。在这个关系中,父亲是一方,儿子是多方。
7.2 在数据库中建立父子关系。
建表的sql语句:
CREATE TABLE father (
Father_id INTEGER NOT NULL,
name VARCHAR(10) NULL,
PRIMARY KEY (father_id) );
CREATE TABLE son (
Son_id INTEGER NOT NULL,
Son_name VARCHAR(10) NULL,
Father_ID INTEGER NULL
PRIMARY KEY (son_id),
FOREIGN KEY (father_id)
REFERENCES father
);
7.3 建立的表的结构
儿子的表
父亲的表
7.4 建立POJO
同样在我们的工程的defalt package下面新建类Father和Son。
7.4.1 Father类
public class Father {
private long fid;
private String name;
private Set sons = new HashSet();
public long getFid() {
return fid;
}
public void setFid(long fid) {
this.fid = fid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set getSons() {
return sons;
}
public void setSons(Set sons) {
this.sons = sons;
}
}
7.4.2 Son类
public class Son {
private long sid;
private String name;
private Father father;
public Father getFather() {
return father;
}
public void setFather(Father father) {
this.father = father;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getSid() {
return sid;
}
public void setSid(long sid) {
this.sid = sid;
}
}
7.5 注意到什么不同了吗,在Father类里多了个Set,Son类中多了个Father成员变量。
这里我们做的是双向关系,也可以做单向关系只在一方做关联。
7.6 映射文件的写法
7.6.1 Father.hbm.xml
7.6.2 Son.hbm.xml
7.6.3 看到红线的部分是对应的关联关系的写法,其中没项具体的含义我们留到后面解释
7.7 不要忘了在配置文件中添加我们的映射文件。
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
scott
tiger
org.hibernate.dialect.Oracle9Dialect
jdbc:oracle:thin:@172.16.1.2:1521:rsora
oracle.jdbc.driver.OracleDriver
true
7.8 所有准备工作做好了,下面在原来的Main函数中添加代码
public static void main(String[] args) {
Configuration config=new Configuration().configure();
SessionFactory factory=config.buildSessionFactory();
Session session=factory.openSession();
Transaction tran=session.beginTransaction();
Father father=new Father();
father.setName("fanta");
Son son1=new Son();
Son son2=new Son();
son1.setName("son1");
son2.setName("son2");
father.getSons().add(son1);
father.getSons().add(son2);
session.save(father);
tran.commit();
session.close();
}
7.9 点击Run As Java Application,运行这个main函数,看看数据库发生了什么
7.10 Father表插入了1条记录,son表插入了2条记录,然后回头看看我们的代码做了些什么
……
Father father=new Father();
father.setName("fanta");
Son son1=new Son();
Son son2=new Son();
son1.setName("son1");
son2.setName("son2");
father.getSons().add(son1);
father.getSons().add(son2);
session.save(father);
……
我们看到显式的调用存储就只有红线的这句话,只存了father,并没有存son,那为什么数据库会有son的记录呢,这就是Hibernate帮我们做的事情,回忆一下Father的POJO里有个Set吗
public class Father {
private long fid;
private String name;
private Set sons = new HashSet();
……
因为我们将Set中添加了东西(增加了2个儿子),所以Hibernate在存储Father的时候 “顺便”(J)将他的2个儿子也插入到数据库中了。
8. 常用的一对多和多对一映射选项
8.1 多对一设置
(1) name: 属性名。
(2) column (可选): 外间字段名。它也可以通过嵌套的 元素指定。
(3) class (可选 - 默认是通过反射得到属性类型): 关联的类的名字。
(4) cascade(级联) (可选): 指明哪些操作会从父对象级联到关联的对象。
(5) unique (可选): 使用DDL为外键字段生成一个唯一约束。此外, 这也可以用作property-ref的目标属性。这使关联同时具有 一对一的效果。
(6) not-null (可选): 使用DDL为外键字段生成一个非空约束。
(7) lazy (可选 - 默认为 proxy): 默认情况下,单点关联是经过代理的。lazy="true"指定此属性应该在实例变量第一次被访问时应该延迟抓取(fetche lazily)(需要运行时字节码的增强)。 lazy="false"指定此关联总是被预先抓取。
8.2 一对多配置
(1) name 集合属性的名称
(2) table (可选——默认为属性的名称)这个集合表的名称(不能在一对多的关联关系 中使用)
(3) lazy (可选--默认为true) 可以用来关闭延迟加载,指定一直使用预先抓取(对数组 不适用)
(4) inverse (可选——默认为false) 标记这个集合作为双向关联关系中的方向一端。
(5) cascade (可选——默认为none) 让操作级联到子实体
(6) order-by (可选) 指定表的字段(一个或几个)再加上asc或者desc(可选), 定义Set的迭代顺序
http://www.blogjava.net/fanscial/archive/2005/12/12/23509.html
wukele收录,使用标签:java,时间:2007-12-11 12:27:22 | 相关网摘,我也收藏
:m8YB/[xE
"-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" DWBk 9RW
"http://jakarta.apache.org/struts/dtds/struts-config.dtd"> z_;``v<
PSr)v
d'_F(C@G
),#/@;
BiMItG4
Q%&e-7
{ tNx2{
7A%f)f31
*0'C] dc
sjbTa"|7I
ccwbiA
c@TLJ
9xqS4aXT
26lf#f.@@
[C[seUqw
1hYb8@-
aFoSpD[]
+383 e,k+k
;WuILv8
r1;+9nN
^'ilmP
"$GwlYe%5y
YB()g.d
c.eEo'd
*dx=-[|1'8
tr0*
v *]D\-
ZX} XY7-k
vF70ng"2k/
] Dfx2t
l2&
type="addressbook.actions.SearchAction" Egux@a
name="searchForm" M3eh
scope="request" B 6S_c2@p
validate="true" CeF)Fei
input="/search.jsp"> XuZc4t_-t
Af XV/%wE<
2pah/1IU
r7$f=#EN
~QHPone
2JVq=cDm!3
,mM, {6V
^sZ:NNOD
?(y_Gl+n)9
G7z}Sc8T
ymgir+a[=
/9}If8
hOx3-0vZ
TpE#Z=+
t^/!ypt
JhP1:93H
/K$z&E8
I`0j=LQ
http://bbs.tech.ccidnet.com/read.php?tid=557960&fpage=2
wukele收录,使用标签:java,时间:2007-12-9 9:58:51 | 相关网摘,我也收藏
keytool的几个常用命令
1.4和1.5
使用keytool -genkey来产生一对密钥
a、长命令,将所有的参数写在一行
keytool -genkey -dname "cn=Mark Jones, ou=JavaSoft, o=Sun, c=US" -alias business -keypass kpi135 -keystore f:\certJava\myKeystore -storepass ab987c -validity 180 -keyalg RSA -keysize 576 -v
这条命令在sun提供的reference中可以找到,各参数解释如下(它们之间顺序任意):
dname:cn=Mark Jones, ou=JavaSoft, o=Sun, c=US
alias:别名business
keystore:keystore的位置
storepass:打开keystore所需要?.
http://cuiyingfeng.blog.51cto.com/43841/d-1
wukele收录,使用标签:java,时间:2007-12-6 21:08:15 | 相关网摘,我也收藏
AJAX 指南
进行中...
在eXtremeTable中使用AJAX非常简单,对现有功能的扩展也非常方便。 AJAX整合一个最强大的地方是它不需要整合。你可以自由地使用任何你想要使用的AJAX工具包。所有你要做的就是:当表的action被调用时,告诉 eXtremeTable使用什么javascript。表的actions包括:过滤、排序、分页、显示的行数和导出。
在我自己的示例中我将使用非常酷的DWR工具包。DWR 需要的粘合代码非常少,这样我们只需要关注如何构建表。你可以通过本站示例看到效果!
[edit]Assembler Example
本示例中将需要安装DWR工具包,创建POJO来构造表并创建包含eXtremeTable的JSP页面。
[edit]安装DWR
首先要做的就是下载DWR工具包。你应该浏览网站的使用说明,不过下面是我让它符合我的需要来工作所进行的操作:
将dwr-1.1.jar拷贝到WEB-INF/lib目录
在WEB-INF目录下创建一个dwr.xml文件
简而言之(In a nutshell)创建(create)标签允许当方法被调用时,参照构建表需要的POJO。签名(signature)标签声明了被调用方法使用的实际类型。 本示例的Assembler类的getTable方法将通过传入一个Map(包含form参数)和HttpServletRequest。
在WEB-INF/web.xml中对DWR servlet进行声明
dwr-invoker DWR Servlet uk.ltd.getahead.dwr.DWRServlet debug true dwr-invoker /dwr/*
以上就完成了DWR servlet的设置,它被用来调用你的POJO。除了设置它,你不需要对这个servlet有更多的了解。
[edit]创建POJO
DWR使用(works with)POJOs。这个非常符合我们的需要,因为eXtremeTable有足够的API使用Jsp标签来构造表。实际上,JSP标签只不过是eXtremeTable Java API的前端。首先,我将展示构造表的方法:
public class Assembler { private Object build(TableModel model, Collection presidents) throws Exception { Table table = model.getTableInstance(); table.setTableId("assembler"); table.setItems(presidents); table.setAction(model.getContext().getContextPath() + "/assembler.run"); table.setTitle("Presidents"); table.setOnInvokeAction("buildTable('assembler')"); model.addTable(table); Export export = model.getExportInstance(); export.setView(TableConstants.VIEW_XLS); export.setViewResolver(TableConstants.VIEW_XLS); export.setImageName(TableConstants.VIEW_XLS); export.setText(TableConstants.VIEW_XLS); export.setFileName("output.xls"); model.addExport(export); Row row = model.getRowInstance(); row.setHighlightRow(Boolean.FALSE); model.addRow(row); Column columnName = model.getColumnInstance(); columnName.setProperty("fullName"); columnName.setIntercept((AssemblerIntercept.class).getName()); model.addColumn(columnName); Column columnNickName = model.getColumnInstance(); columnNickName.setProperty("nickName"); model.addColumn(columnNickName); Column columnTerm = model.getColumnInstance(); columnTerm.setProperty("term"); model.addColumn(columnTerm); Column columnBorn = model.getColumnInstance(); columnBorn.setProperty("born"); columnBorn.setCell(TableConstants.DATE); model.addColumn(columnBorn); Column columnDied = model.getColumnInstance(); columnDied.setProperty("died"); columnDied.setCell(TableConstants.DATE); model.addColumn(columnDied); Column columnCareer = model.getColumnInstance(); columnCareer.setProperty("career"); model.addColumn(columnCareer); return model.assemble(); }}
上面的大部分代码是自解释性的,你将在下面看到如何构造一个TableModel,但是首先你应该注意到TableModel是构造表时需要交互的唯一对象。构造表的第一步就是使用TableModel来创建Table、Row、Column和Export。一旦你创建了一个model对象,你只需要将它添加到model中。除非你将它添加到TableModel,否则的话model将不会是用它。所有东西已经构建好后,你只需要调用model.assemble()方法来构造表了。
可能table.setOnInvokeAction("buildTable('assembler')");是最有趣的调用。当你使用表的actions(翻页、过滤、排序......),这个javascript方法将被调用。如果表的onInvokeAction空白,则默认的javascript方法将被提交(submit) ,正如你所期望的那样。
Assembler类的另一个方法---getTable():
public class Assembler { public String getTable(Map parameterMap, HttpServletRequest request) { WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext()); PresidentsDao presidentsDao = (PresidentsDao) webApplicationContext.getBean("presidentsDao"); Collection presidents = presidentsDao.getPresidents(); Context context = null; if (parameterMap == null) { context = new HttpServletRequestContext(request); } else { context = new HttpServletRequestContext(request, parameterMap); } TableModel model = new TableModelImpl(context); try { return build(model, presidents).toString(); } catch (Exception e) { e.printStackTrace(); } return ""; }}
这个方法调用比较频繁,它执