- 浏览: 1927165 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
cht的大摩托:
学习
IBM WebSphere Performance Tool / ISA / jca457.jar / ha456.jar / ga439.jar -
leeking888:
有没有linux 64位的相关librfccm.so等包啊?
web test LoadRunner SAP / java / Java Vuser / web_set_max_html_param_len -
paladin1988:
非常不错,多谢了。。
appServer IBM WebSphere / WAS 7 / 8.5 / was commerce -
hzxlb910:
写了这么多
net TCP/IP / TIME_WAIT / tcpip / iperf / cain -
acwyg:
ed2k://|file|LoadRunner.V8.1.is ...
web test performance tools / linux performance tools / windows performance tools
http://commons.apache.org/
web service >>> xml to java object = diggester+beanutils+logging
Commons Digester 2.0 API
http://commons.apache.org/digester/
http://commons.apache.org/digester/commons-digester-2.0/docs/api/
Digester download
http://archive.apache.org/dist/commons/digester/binaries/
http://archive.apache.org/dist/commons/digester/binaries/commons-digester-2.0-bin.zip
Commons BeanUtils 1.8.2 API
http://commons.apache.org/beanutils/
http://commons.apache.org/beanutils/api/index.html
beanutils download
http://archive.apache.org/dist/commons/beanutils/binaries/
http://labs.xiaonei.com/apache-mirror/commons/beanutils/binaries/commons-beanutils-1.8.2-bin.zip
Commons Logging 1.1.2-SNAPSHOT API
http://commons.apache.org/logging/apidocs/index.html
loggind download
http://archive.apache.org/dist/commons/logging/
http://archive.apache.org/dist/commons/logging/binaries/commons-logging-1.1.1-bin.zip
webservice begin
[root@localhost digester]# pwd
/home/lindows/workspace/test/src/com/javaeye/lindows/digester
[root@localhost digester]# ll
总计 64
-rw-r--r-- 1 lindows users 835 11-25 21:17 Academy.java
-rw-r--r-- 1 lindows users 993 11-25 21:29 academyRules.xml
-rw-r--r-- 1 lindows users 984 11-20 08:18 acdemy.xml
-rw-r--r-- 1 lindows users 330 11-25 15:40 Course.java
drwxr-xr-x 2 lindows users 4096 11-25 21:31 CVS
-rw-r--r-- 1 lindows users 2114 11-25 21:23 DigestXMLJavaAcademy.java
-rw-r--r-- 1 lindows users 755 11-25 18:45 Student.java
-rw-r--r-- 1 lindows users 607 11-25 21:22 Teacher.java
http://developer.ccidnet.com/art/322/20021211/33259_1.html
相关资源
·The Jakarta Commons homepage: http://jakarta.apache.org/commons
·Two open source XML parsers suitable for use with Digester are:
o Xerces
o Crimson
·Open source projects that use Digester:
o Struts
o Tomcat
·Other Jakarta Commons components:
http://jakarta.apache.org/commons/components.html
· Erik Swenson's previous Open Source Profile column, "Reports Made Easy with JasperReports" (JavaWorld, September 2002):
http://www.javaworld.com/javaworld/jw-09-2002/jw-0920-opensourceprofile.html
· Browse the Java and XML section of JavaWorld's Topical Index:
http://www.javaworld.com/channel_content/jw-xml-index.shtml
·Chat about Java development in the JavaWorld Forum:
http://forums.devworld.com/webx?13@@.ee6b802
· Sign up for JavaWorld's free weekly email newsletters:
http://www.javaworld.com/subscribe
· You'll find a wealth of IT-related articles from our sister publications at IDG.net
Java Open Source Software: Jakarta commons Digester
http://www.itags.org/java/583235/
Hi
Anyone like to offer an example that uses the org.apache.commons.digester to create objects with a non empty constructor. Nothing too complicated - an object with a String in the Constructor will suffice.
Apache Digester应用实例 [原创]
http://www.iteye.com/topic/39330
http://philos.iteye.com/blog/176724
前段时间项目中需要根据xml文件创建java对象,而apache commons-digester是首选.
一直想把它写下来,可是总有点懒
这次介绍一下digester的常用法,其他更高级的使用方法请参阅digester doc(由于比较忙,下次有时间写一篇关于cglib的常用法,呵呵)
Apache Digester应用实例 [原创]
--------------利用 apache commons-digester 自动根据xml文件创建java 对象
<day day up>
author: binker
email: binker_cao@163.com
date: 2006/12/16
note: 本文可以任意转载,但请保持其完整性并注明来源,谢谢.
一.序
Digester是apache的一个组件 apache
commons-digester.jar,通过它可以很方便的从xml文件生成java对象.你不用再象以前通过jdom或者Xerces去读取一个
document对象.(jdom和Xerces仍然有它们的用武之地及强大之处,在其它应用里你也少不了它们)
我只是用一个例子展示一下如何把xml文件生成一个java object.
首先你必须把jar加入到你的项目classpath.
(一)准备:
1.环境: Eclipse, jdk1.4+
2.需求说明:学院包含学生和老师,学生可以选修课程,老师有不同的资格认证。
3.Java Class的定义,简洁起见,略去import内容。
4.使用Digester生成java对象 必须要定义一个xml文件,此xml文件必须符合digester-rules.dtd的规则。
5.所有的xml文件必须在classpath路径中,这样可以通过Class.getClassLoader().getInputStream()读取xml文件。
(二)提要:
本示例所需的java class 和 xml文件分成四类:
1.基础xml文件: [academy.xml]: 你将要解析的xml文件.
2.基础java class: [Academy.java, Teacher.java, Student.java, Cousre.java]: 生成的对象的类定义
3.digesterRules.xml: [academyRules.xml]: 定义了基础xml文件到基础java class的匹配(映射)关系
4.Digester class: [DigestXMLJavaAcademy.java]: 根据digesterRules.xml去解析基础xml文件,并生成java 对象
(三)参考资料
1.English ebook: Pro Jakarta Commons by Harshad Oak Apress 2004
二.基础Java Class
1.学院 class Academy.java
- public class Academy {
- private Vector students;
- private Vector teachers;
- private String name;
- public Academy() {
- students = new Vector();
- teachers = new Vector();
- }
- public void addStudent(Student student) {
- students.addElement(student);
- }
- public void addTeacher(Teacher teacher) {
- teachers.addElement(teacher);
- }
- public Vector getStudents() {
- return students;
- }
- public void setStudents(Vector newStudents) {
- students = newStudents;
- }
- public Vector getTeachers() {
- return teachers;
- }
- public void setTeachers(Vector newTeachers) {
- teachers = newTeachers;
- }
- public String getName() {
- return name;
- }
- public void setName(String newName) {
- name = newName;
- }
- }
public class Academy { private Vector students; private Vector teachers; private String name; public Academy() { students = new Vector(); teachers = new Vector(); } public void addStudent(Student student) { students.addElement(student); } public void addTeacher(Teacher teacher) { teachers.addElement(teacher); } public Vector getStudents() { return students; } public void setStudents(Vector newStudents) { students = newStudents; } public Vector getTeachers() { return teachers; } public void setTeachers(Vector newTeachers) { teachers = newTeachers; } public String getName() { return name; } public void setName(String newName) { name = newName; } }
============================================================
2.学生 Student.java
- public class Student {
- private Vector courses;
- private String name;
- private String division;
- public Student() {
- courses = new Vector();
- }
- public void addCourse(Course course) {
- courses.addElement(course);
- }
- public String getName() {
- return name;
- }
- public void setName(String newName) {
- name = newName;
- }
- public String getDivision() {
- return division;
- }
- public void setDivision(String newDivision) {
- division = newDivision;
- }
- public void setCourses(Vector courses) {
- this .courses = courses;
- }
- public Vector getCourses() {
- return courses;
- }
- }
public class Student { private Vector courses; private String name; private String division; public Student() { courses = new Vector(); } public void addCourse(Course course) { courses.addElement(course); } public String getName() { return name; } public void setName(String newName) { name = newName; } public String getDivision() { return division; } public void setDivision(String newDivision) { division = newDivision; } public void setCourses(Vector courses) { this.courses = courses; } public Vector getCourses() { return courses; } }
============================================================
3.老师 Teacher.java
- public class Teacher {
- private String name;
- private Vector certifications;
- public Teacher() {
- certifications = new Vector();
- }
- public void addCertification(String certification) {
- certifications.addElement(certification);
- }
- public String getName() {
- return name;
- }
- public void setName(String newName) {
- name = newName;
- }
- public void setCertifications(Vector certifications) {
- this .certifications = certifications;
- }
- public Vector getCertifications() {
- return certifications;
- }
- }
public class Teacher { private String name; private Vector certifications; public Teacher() { certifications = new Vector(); } public void addCertification(String certification) { certifications.addElement(certification); } public String getName() { return name; } public void setName(String newName) { name = newName; } public void setCertifications(Vector certifications) { this.certifications = certifications; } public Vector getCertifications() { return certifications; } }
============================================================
4.课程 Course.java
- public class Course {
- private String id;
- private String name;
- public Course() {
- }
- public String getId() {
- return id;
- }
- public void setId(String newId) {
- id = newId;
- }
- public String getName() {
- return name;
- }
- public void setName(String newName) {
- name = newName;
- }
- }
public class Course { private String id; private String name; public Course() { } public String getId() { return id; } public void setId(String newId) { id = newId; } public String getName() { return name; } public void setName(String newName) { name = newName; } }
三.基础XML文件
============================================================
学院 academy.xml,包含了学生(包含了课程),老师
- <?xml version= "1.0" ?>
- <academy name="JAcademy" >
- <student name="JavaBoy" division= "A" >
- <course>
- <id>C1</id>
- <name>JSP</name>
- </course>
- <course>
- <id>C2</id>
- <name>Servlets</name>
- </course>
- </student>
- <student name="JavaGirl" division= "B" >
- <course>
- <id>C3</id>
- <name>EJB</name>
- </course>
- </student>
- <teacher name="JavaGuru" >
- <certification>SCJP</certification>
- <certification>SCWCD</certification>
- </teacher>
- <teacher name="JavaMaster" >
- <certification>OCP</certification>
- <certification>SCJP</certification>
- <certification>SCEA</certification>
- </teacher>
- </academy>
<?xml version="1.0"?> <academy name="JAcademy" > <student name="JavaBoy" division="A"> <course> <id>C1</id> <name>JSP</name> </course> <course> <id>C2</id> <name>Servlets</name> </course> </student> <student name="JavaGirl" division="B"> <course> <id>C3</id> <name>EJB</name> </course> </student> <teacher name="JavaGuru"> <certification>SCJP</certification> <certification>SCWCD</certification> </teacher> <teacher name="JavaMaster"> <certification>OCP</certification> <certification>SCJP</certification> <certification>SCEA</certification> </teacher> </academy>
============================================================
四.Digester Class
DigestXMLJavaAcademy.java 和academyRules.xml
其中academyRules.xml用来定义xml文件和java对象的匹配(映射)关系,格式要符合digester-rules.dtd格式约束
DigestXMLJavaAcademy.java 根据academyRules.xml解析academy.xml文件并生成 Academy对象.
============================================================
- 1 . academyRules.xml
- <?xml version="1.0" ?>
- <digester-rules>
- <pattern value="academy" >
- <object-create-rule classname="com.commonsbook.chap7.academy.Academy" />
- <set-properties-rule />
- <pattern value="student" >
- <object-create-rule classname="com.commonsbook.chap7.academy.Student" />
- <set-properties-rule />
- <pattern value="course" >
- <object-create-rule classname="com.commonsbook.chap7.academy.Course" />
- <bean-property-setter-rule pattern="id" />
- <bean-property-setter-rule pattern="name" />
- <set-next-rule methodname="addCourse" />
- </pattern>
- <set-next-rule methodname="addStudent" />
- </pattern>
- <pattern value="teacher" >
- <object-create-rule classname="com.commonsbook.chap7.academy.Teacher" />
- <set-properties-rule />
- <call-method-rule pattern="certification" methodname= "addCertification"
- paramcount="1" />
- <call-param-rule pattern="certification" paramnumber= "0" />
- <set-next-rule methodname="addTeacher" />
- </pattern>
- </pattern>
- </digester-rules>
1. academyRules.xml <?xml version="1.0"?> <digester-rules> <pattern value="academy"> <object-create-rule classname="com.commonsbook.chap7.academy.Academy" /> <set-properties-rule /> <pattern value="student"> <object-create-rule classname="com.commonsbook.chap7.academy.Student" /> <set-properties-rule /> <pattern value="course"> <object-create-rule classname="com.commonsbook.chap7.academy.Course" /> <bean-property-setter-rule pattern="id"/> <bean-property-setter-rule pattern="name"/> <set-next-rule methodname="addCourse" /> </pattern> <set-next-rule methodname="addStudent" /> </pattern> <pattern value="teacher"> <object-create-rule classname="com.commonsbook.chap7.academy.Teacher" /> <set-properties-rule /> <call-method-rule pattern="certification" methodname="addCertification" paramcount="1" /> <call-param-rule pattern="certification" paramnumber="0"/> <set-next-rule methodname="addTeacher" /> </pattern> </pattern> </digester-rules>
============================================================
2. DigestXMLJavaAcademy.java
- public class DigestXMLJavaAcademy {
- public void digest(){
- try {
- //Create Digester using rules defined in academyRules.xml
- Digester digester = DigesterLoader.createDigester(
- this .getClass().getClassLoader().getResource( "academyRules.xml" ));
- //Parse academy.xml using the Digester to get an instance of Academy
- Academy a = (Academy)digester.parse(
- this .getClass().getClassLoader().getResourceAsStream( "academy.xml" ));
- Vector vStud=a.getStudents();
- Vector vTeach=a.getTeachers();
- for ( int i = 0 ; i < vStud.size(); i++) {
- System.out.println("Student>> " +PropertyUtils.describe(vStud.get(i)));
- }
- for ( int i = 0 ; i < vTeach.size(); i++) {
- System.out.println("Teacher>> " + PropertyUtils.describe(vTeach.get(i)));
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- DigestXMLJavaAcademy xmlDigest= new DigestXMLJavaAcademy();
- xmlDigest.digest();
- }
- }
public class DigestXMLJavaAcademy { public void digest(){ try { //Create Digester using rules defined in academyRules.xml Digester digester = DigesterLoader.createDigester( this.getClass().getClassLoader().getResource("academyRules.xml")); //Parse academy.xml using the Digester to get an instance of Academy Academy a = (Academy)digester.parse( this.getClass().getClassLoader().getResourceAsStream("academy.xml")); Vector vStud=a.getStudents(); Vector vTeach=a.getTeachers(); for (int i = 0; i < vStud.size(); i++) { System.out.println("Student>> "+PropertyUtils.describe(vStud.get(i))); } for (int i = 0; i < vTeach.size(); i++) { System.out.println("Teacher>> "+ PropertyUtils.describe(vTeach.get(i))); } } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { DigestXMLJavaAcademy xmlDigest= new DigestXMLJavaAcademy(); xmlDigest.digest(); } }
五.运行结果
PropertyUtils.describ(Object)用法
http://philos.iteye.com/blog/176724
使用org.apache.commons.beanutils.PropertyUtils.describ(Object)生成Map实例,其中包含了源bean中所有可读的属性。下面的代码片段演示了这个特性:
- Person author = new Person();
- author.setName("Timothy M. O'Brien" );
- Book book = new Book();
- book.setName("Jakarta Commons Cookbook" );
- book.setAuthor(author);
- // 取得book中的所有可读属性,返回到map中
- Map bookMap = PropertyUtils.describe(book);
- // Book类中包含一个Author类型的属性
- // 取bookMap中的author bean,并将其所有可读属性返回到authorMap中
- Map authorMap = PropertyUtils.describe(bookMap.get("author" ));
- // 输出
- // Book Name: Jakarta Commons Cookbook
- // Author Name: Timothy M. O'Brien
- System.out.println("Book Name: " + bookMap.get( "name" ));
- System.out.println("Author Name: " + authorMap.get( "name" ));
Person author = new Person(); author.setName("Timothy M. O'Brien"); Book book = new Book(); book.setName("Jakarta Commons Cookbook"); book.setAuthor(author); // 取得book中的所有可读属性,返回到map中 Map bookMap = PropertyUtils.describe(book); // Book类中包含一个Author类型的属性 // 取bookMap中的author bean,并将其所有可读属性返回到authorMap中 Map authorMap = PropertyUtils.describe(bookMap.get("author")); // 输出 // Book Name: Jakarta Commons Cookbook // Author Name: Timothy M. O'Brien System.out.println("Book Name: " + bookMap.get("name")); System.out.println("Author Name: " + authorMap.get("name"));
在上面的例子中假如Book类中还有个Integer型的page属性,代表书籍页数,在没设置的情况下,将返回null,如果page属性为int型,则将返回0。
http://commons.apache.org/fileupload/
FileUpload 1.2.1 - 18 January 2008
- Download the binary and source distributions from a mirror site here
DWR + FileUpload 多文件上传实例
http://www.iteye.com/topic/247420
功能: 文件上传
特点: 动态显示进度, 百分比, 文件名, 文件长度, 上传速度... 剩下的自己看吧
主要技术: DWR, Apache commons FileUpload
原理: FileUpload实现上传功能, UploadListener 监听上传进度, DWR push (Reverse Ajax) 进度信息并更新页面, 实现无刷新多文件上传
运行环境: Tomcat 6, WAS 6 测试通过
WAR 包下载 见附件
顺便截个图:
http://dl.iteye.com/topics/download/53b9ba95-5a12-3d89-a545-8d7f90fddb75
end
- FileUpload.war (1.1 MB)
- 下载次数: 32
发表评论
-
JAVA EE BigData Apache Storm / Spark / Samza / apache storm / Flink
2016-11-23 16:38 1139sd http://storm.apache.org/ ... -
JAVA EE Code Quality / Sonar / findbugs / checkstyle / cobertura(coverage) / PMD
2016-11-11 10:53 1270s http://sonar.oschina.net/ ... -
JAVA EE Apache Zookeeper / Google Chubby
2016-11-08 00:00 2365s http://zookeeper.apache.or ... -
framework Schedule Quartz
2009-10-13 10:53 4296quartz http://www.opensymp ... -
Java EE search_lucene xapian
2009-09-03 00:43 2409搜索引擎产品 http://www.bing.com ... -
Java EE VM Montior JMX / Hyperic HQ / OpenNMS /
2009-08-24 16:54 3449Monitoring and Managemen ... -
framework ldap
2009-08-17 12:29 1247http://www.oschina.net/project/ ... -
JAVA EE robot_ItSucks
2009-08-15 15:19 1495http://open-open.com/open223668 ... -
JAVA EE Projects_apacheFoundation
2009-07-29 09:47 1352Apache Software Foundation Di ... -
framework freemarker / velocity
2009-03-26 21:16 2517CMS 静态化参考 JAVA静态化,如何生成html ... -
JAVA_EE EJB
2009-03-25 22:02 1418E:\lindows\workspace\ejb>tre ... -
JAVA EE JSP 2.1
2009-03-07 00:22 2255JSP 2.1对JSP2.0的改动 http://mar ... -
JAVA EE JSP_JNDI
2009-02-24 12:24 1707dsfdsa http://lindows.iteye.c ... -
JAVA EE JSP_EL
2009-02-21 17:28 1565http://www.javapassion.com/j2 ... -
framework JasperReport
2008-12-06 17:16 1401JasperReport报表设计总结 ... -
framework osworkflow / jbpm
2008-12-01 20:58 3682osworkflow http://gr ... -
JAVA EE JSP_Servlet
2008-11-01 16:25 1779Servlet API htt ... -
framework junit
2008-10-29 15:30 1936http://www.appperfect.com/ A ... -
JAVA EE Projects_sourceforge
2008-10-13 14:30 4663http://www.sourceforge.net/ ... -
framework SiteMesh
2008-09-28 03:02 2586http://www.opensymphony.com/s ...
相关推荐
spring-framework-4.0.6.RELEASE依赖包 --- 用于整合其他的日志的包(类似Hibernate中slf4j)
Apache Commons Collections 包包含扩展和增强 Java Collections Framework 的类型。 文档 更多信息可以在。 可以浏览 。 与 Apache Commons Collections 的使用相关的问题应该发布到。 我在哪里可以获得最新版本?...
标题中的"commons.*.jar"指的是Apache Commons项目中的一系列Java库,这些库是Java开发者常用的工具类集合,为各种常见的编程任务提供了便利。Apache Commons是Apache软件基金会的一个子项目,旨在提供高质量、可...
`commons.codec`是Apache Commons项目的一部分,这个项目旨在提供Java编程语言中的实用工具类。 `codec`一词来源于“coder-decoder”的缩写,通常指的是进行编码和解码的算法或软件。在`commons.codec`中,主要包含...
在Java开发中,这三个JAR文件分别是Apache Commons项目的一部分,以及Struts框架的一个遗留版本。以下是关于这些组件的详细知识: 1. **Apache Commons DBCP** (Database Connection Pool): - Apache Commons ...
《Apache Commons Discovery详解》 Apache Commons Discovery是Apache软件基金会下的一个开源项目,主要目标是解决Java应用程序中的服务发现问题。这个库提供了API和机制,使得Java应用能够在运行时动态地发现和...
Apache Commons Discovery是Apache软件基金会开发的一个Java库,主要用于在运行时发现JAR文件中的服务和API。这个库的核心功能在于帮助应用程序找到并使用其他服务,如JMX(Java Management Extensions)、JAF(Java...
虽然在Commons Logging的API中没有直接的LoggingSystem概念,但在Spring中,我们可以通过`org.springframework.core.log.LogSystem`接口来理解这个概念,它代表了日志系统的抽象,Spring会根据Commons Logging的...
本篇将深入探讨一个名为"OpenSourceFramework.zip"的压缩包,其中包含了三个核心的Apache Commons组件:Apache Commons、Apache Commons Lang以及Apache Commons IO。这些组件是Java开发者常使用的开源工具集,它们...
首先,`commons-email-1.2.jar`是Apache Commons Email项目的主库,它包含了创建和发送电子邮件所需的所有核心类和方法。Apache Commons项目是Apache软件基金会的一部分,致力于提供一系列通用的Java工具和库,以...
标题中的"commons.codec-1.4.0.jar.zip"是一个包含Apache Commons Codec库的压缩文件,版本号为1.4.0。这个库是Java编程语言中的一个实用工具集,专注于编码和解码各种格式的数据,如音频、视频、文本等。它提供了...
Apache Commons Email是一个强大的Java库,专门用于简化电子邮件的发送。标题中的"commons_mail.jar"是这个库的可执行JAR文件,它包含了Apache Commons Email项目的核心功能。这个库是Apache软件基金会开发的,是对...
- `commons-email-1.5-javadoc.jar`:包含Apache Commons Email 1.5版本的Java文档,开发者可以查阅这些文档了解详细API信息。 - `commons-email-1.5-sources.jar`:包含了源代码,对开发者来说非常有用,他们可以...
其次,`commons-io-1.3.2.jar` 是Apache Commons IO库的一部分,它提供了大量的I/O操作相关的实用工具类。虽然FileUpload库本身可以处理文件上传,但许多辅助操作,如读写文件、复制、移动、检查文件属性等,都需要...
1. **Apache Commons Lang**:Apache Commons Lang是Apache软件基金会的一个项目,提供了大量实用的Java工具类,如字符串处理、日期时间处理、数组操作等。 2. **Guava**:Google推出的Guava库提供了许多高级数据...
这里主要涉及的是JavaMail API和Apache Commons Email库,这两个是Java环境下处理邮件的重要工具。 1. **JavaMail API**: JavaMail API是Java平台上的一个标准API,它提供了用于发送和接收电子邮件的标准接口和实现...
在Java开发中,电子邮件的发送是一项常见的任务,而Apache Commons Email库正是为了简化这一过程而设计的。`commons-email-1.1.jar`是Apache Commons Email项目的早期版本,它提供了一系列API来帮助开发者构建和发送...
例如,使用Spring的依赖注入管理Apache Commons中的工具类,或者利用Apache Commons的I/O工具来处理Spring MVC应用中的文件上传下载。 在实际项目中,这两个库的组合可以帮助开发者快速构建稳健、可维护的后端服务...
Spring Framework 4.3.6.RELEASE 和 Commons Logging 1.2 是两个在Java开发中广泛应用的库。Spring Framework是Java领域的一个重量级框架,它为构建企业级应用提供了全面的解决方案,包括依赖注入(DI)、面向切面...
标题 "Spring+commons.log" 暗示了我们要讨论的是Spring框架与Apache Commons Logging的集成。这个主题主要涉及两个核心知识点:Spring框架和 Commons Logging API。 Spring是一个广泛使用的Java企业级应用开发框架...