- 浏览: 425245 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
burningblood:
最近也遇到了这个细节问题。我用的是4,里面没有 get.rel ...
httpclient的并发连接问题 -
greatwqs:
使用HttpURLConnection注意设置超时 -
qinweilh:
...
tomcat报错:standardServer.await: create[8005]: -
jayyunfei:
还是不很明白
JPA entityManager的管理 -
a418040445:
...
Calendar
在appfuse手册中的开发步骤是先建立数据库表,然后通过自动化的工具产生pojo以及其他的对象。但是对于复杂的pojo,用数据库表现出来就显得力不从心。因此,适当的方法应当是先去写pojo,然后自动产生其他的代码。这里是我总结的开发步骤。
1。首先编写pojo,继承BaseObject,通过自动化工具产生set/get方法,以及hashCode(), toString(), equals()方法。我用了网上的一段开源代码放到我的工程里面,在eclipse里面直接调用:
java 代码
- package org.appfuse.tools;
- import java.lang.reflect.Field;
- import java.lang.reflect.Modifier;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * A utility class that generates source code for good
- *
boolean equals()
,int hashCode()
, and - *
String toString()
implementations. - *
- *
- * The algorithms used here are based largely on those presented in
- * "Effective Java" by
- * Josh Bloch, with some variations based on conversations with colleagues.
- *
- *
- * @author Erick G. Reid
- */
- public class SourcecodeGenerator {
- /**
- * Returns a
String
representing usable - *
boolean equals(Object)
sourcecode for the given - *
Class
. - *
- * @param source the
Class
to inspect. - * @return a
String
representing usable - *
boolean equals(Object)
sourcecode for the given - *
Class
. - */
- public static String getEqualsSourceCode(Class source) {
- Field[] fields = _getEligibleFields(source);
- StringBuffer sb = new StringBuffer();
- String className = _getClassName(source);
- sb.append("/**\n");
- sb.append(" * Compares this object to the specified object. The result is\n");
- sb.append(" *
true
if and only if the argument is notnull
\n"); - sb.append(" * and is an instance of
"
which represents a\n" + className + "); - sb.append(" * value equivalent to this
"
.\n" + className + "); - sb.append(" *\n");
- sb.append(" * @param object the object to compare with.\n");
- sb.append(" * @return
true
if the objects are the same,\n)"); - sb.append(" * returns
false
otherwise.\n"); - sb.append(" */\n");
- sb.append("public boolean equals(Object object) {\n");
- sb.append(" if (object != this) {\n");
- if (fields.length == 0) {
- sb.append(
- " return object != null && getClass().equals(object.getClass());\n");
- }
- else {
- sb.append(" if (object != null && getClass().equals(object.getClass())) {\n");
- sb.append(" final " + className + " other = (" + className + ") object;\n");
- for (int i = 0; i < fields.length; i++) {
- if (i == 0) sb.append(" return ");
- else sb.append(" ");
- if (fields[i].getType().isPrimitive()) {
- sb.append("(" + fields[i].getName() + " == other." + fields[i].getName() + ")");
- }
- else {
- sb.append("(" + fields[i].getName() + " == null ? other." +
- fields[i].getName() + " == null : " + fields[i].getName() +
- ".equals(other." + fields[i].getName() + "))");
- }
- if (i == fields.length - 1) sb.append(";\n");
- else sb.append(" &&\n");
- }
- sb.append(" }\n");
- sb.append(" return false;\n");
- }
- sb.append(" }\n");
- sb.append(" return true;\n");
- sb.append("}\n");
- return sb.toString();
- }
- /**
- * Returns a
String
representing usablehashCode()
- * sourcecode for the given
Class
. - *
- * @param source the
Class
to inspect. - * @return a
String
representing usablehashCode()
- * sourcecode for the given
Class
. - */
- public static String getHashCodeSourceCode(Class source) {
- Field[] fields = _getEligibleFields(source);
- String className = _getClassName(source);
- StringBuffer sb = new StringBuffer();
- sb.append("/**\n");
- sb.append(" * Returns a hash code value for this
"
.\n" + - className + ");
- sb.append(" *\n");
- sb.append(" * @return a hash code value for this
"
.\n" + - className + ");
- sb.append(" */\n");
- sb.append("public int hashCode() {\n");
- sb.append(" int hashCode = " + source.getName().hashCode() +
- "; // result of getClass().getName().hashCode() \n");
- for (int i = 0; i < fields.length; i++) {
- if (fields[i].getType().isArray()) {
- sb.append(" for (int i = 0; i < " +
- fields[i].getName() + ".length; i++) {\n");
- _appendFieldHashCalculation(
- sb, fields[i].getType().getComponentType(),
- fields[i].getName() + "[i]", " ");
- sb.append(" }\n");
- continue;
- }
- _appendFieldHashCalculation(
- sb, fields[i].getType(), fields[i].getName(), " ");
- }
- sb.append(" return hashCode;\n");
- sb.append("}\n");
- return sb.toString();
- }
- /**
- * Returns a
String
representing usable - *
String toString()
sourcecode for the givenClass
. - *
- * @param source the
Class
to inspect. - * @return a
String
representing usable - *
String toString()
sourcecode for the given - *
Class
. - */
- public static String getToStringSourceCode(Class source) {
- Field[] fields = _getEligibleFields(source);
- StringBuffer sb = new StringBuffer();
- String className = _getClassName(source);
- sb.append("/**\n");
- sb.append(" * Returns a
String
representation of this"
.\n" + - className + ");
- sb.append(" *\n");
- sb.append(" * @return a
String
representation of this"
.\n" + - className + ");
- sb.append(" */\n");
- sb.append("public String toString() {\n");
- if (fields.length == 0) {
- sb.append(" return \"" + className + "()\";\n");
- }
- else {
- sb.append(" StringBuffer buffer = new StringBuffer(\"" +
- className + "(\");\n");
- for (int i = 0; i < fields.length; i++) {
- sb.append(" buffer.append(\"" + fields[i].getName() + "=\" + " +
- fields[i].getName());
- if (i == fields.length - 1) sb.append(" + \")\");\n");
- else sb.append(" + \",\");\n");
- }
- sb.append(" return buffer.toString();\n");
- }
- sb.append("}\n");
- return sb.toString();
- }
- //--------------------------------------------------
- // implementation:
- //--------------------------------------------------
- private static void _appendFieldHashCalculation(
- StringBuffer sb, Class type, String fieldName, String indent) {
- if (type.isPrimitive()) {
- if (Boolean.TYPE.equals(type)) {
- sb.append(indent +
- "hashCode = 37 * hashCode + (" + fieldName + " ? 0 : 1);\n");
- }
- else if (Byte.TYPE.equals(type) || Character.TYPE.equals(type) ||
- Short.TYPE.equals(type) || Integer.TYPE.equals(type)) {
- sb.append(indent + "hashCode = 37 * hashCode + " +
- (Integer.TYPE.equals(type) ? "" : "(int) ") + fieldName + ";\n");
- }
- else if (Long.TYPE.equals(type)) {
- sb.append(indent + "hashCode = 37 * hashCode + (int)(" + fieldName +
- " ^ (" + fieldName + " >>> 32));\n");
- }
- else if (Float.TYPE.equals(type)) {
- sb.append(indent + "hashCode = 37 * hashCode + Float.floatToIntBits(" +
- fieldName + ");\n");
- }
- else if (Double.TYPE.equals(type)) {
- sb.append(indent + "long longBits = Double.doubleToLongBits(" +
- fieldName + ");\n");
- sb.append(indent +
- "hashCode = 37 * hashCode + (int)(longBits ^ (longBits >>> 32));\n");
- }
- return;
- }
- sb.append(indent + "hashCode = 37 * hashCode + (" +
- fieldName + " == null ? 0 : " + fieldName + ".hashCode());\n");
- }
- /**
- * Returns all instance fields from the given class that are found to be
- * non-public.
- */
- private static Field[] _getEligibleFields(Class source) {
- Field[] fields = source.getDeclaredFields();
- List<field></field> eligibleFields = new ArrayList<field></field>();
- for (int i = 0; i < fields.length; i++) {
- int modifiers = fields[i].getModifiers();
- if (!Modifier.isPublic(modifiers) && !Modifier.isStatic(modifiers)) {
- eligibleFields.add(fields[i]);
- }
- }
- return (Field[]) eligibleFields.toArray(new Field[eligibleFields.size()]);
- }
- private static String _getClassName(Class source) {
- String className = source.getName();
- return className.substring(className.lastIndexOf(".") + 1);
- }
- public static void main(String[] args) {
- Class source=null;
- //reslove object
- try {
- source=Class.forName(args[0]);
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- return;
- }
- System.out.println(SourcecodeGenerator.getEqualsSourceCode(source));
- System.out.println(SourcecodeGenerator.getHashCodeSourceCode(source));
- System.out.println(SourcecodeGenerator.getToStringSourceCode(source));
- }
- }
产生pojo以后,加上xdoclet的tag,主要包含@hibernate以及◎spring.validator两方面的tag。通过tag的增加,规定了如何产生数据库的表。
2。运行ant hibernatedoclet自动产生hbm文件,在build/dao/gen/目录下。
3。通过如下的脚本工具可以根据指定的hbm文件创建数据库,当然也可以使用hibernate的schemaexport工具。
java 代码
- import java.io.FileInputStream;
- import java.io.InputStream;
- import java.util.Properties;
- import org.appfuse.util.XmlTools;
- import org.hibernate.cfg.Configuration;
- import org.hibernate.tool.hbm2ddl.SchemaExport;
- import org.w3c.dom.Document;
- /**
- *
- * @author Cheney Yuan
- *
- */
- public class HibernateSchemaExport {
- /**
- * @param args
- */
- public static void main(String[] args) {
- if (args.length < 1) {
- System.err.println("Usage: HibernateSchemaExport [full file path]hibernate.cfg.xml/database.properties "
- + "[resource path]mapping.hbm.xml\n");
- System.exit(-1);
- }
- Configuration config=new Configuration();
- Properties properties=new Properties();
- String fullPathName=args[0];
- try {
- if (fullPathName.indexOf(".xml")>0) {
- System.out.println("use xml file to configure.");
- Document doc = null;
- doc = XmlTools.getDocumentFromXmlFile(fullPathName);
- config.configure(doc);
- }else if (fullPathName.indexOf(".properties")>0) {
- System.out.println("use properties to configure.");
- Properties props = new Properties();
- props.putAll( config.getProperties() );
- props.load( new FileInputStream( fullPathName ) );
- config.setProperties( props );
- }
- } catch (Exception e) {
- e.printStackTrace();
- return;
- }
- //add hbm resources
- for (int i=1;i
- config.addResource(args[i]);
- }
- /**
- * @param script print the DDL to the console
- * @param export export the script to the database
- */
- new SchemaExport(config).create(true, false);
- }
- }
4。到extras/appgen下面运行ant install-detailed产生其他的类和测试程序。
5。applicationContext-hibernate.xml里面的hbm文件必须自己添加,该文件的位置在src/dao/org/appfuse/dao/hibernate/目录下。
6。运行ant deploy即可完成整个开发步骤。
发表评论
-
varnish实现设备检测
2013-09-23 10:16 1093原文出处:https://www.varnish-cache ... -
HTTP 头信息Vary对Reverse Proxy的作用
2013-09-22 16:32 3658原文出自http://mark.koli.ch/2010/0 ... -
android页面用jquery窗口大小获取错误问题的解决
2013-09-22 08:24 814在android设备上面,当变换屏幕方向的时候,使用jque ... -
varnish configuration
2013-03-01 22:14 638http://www.drupal001.com/2011/ ... -
apache rewrite
2013-01-31 16:51 1894RewriteCond Syntax: RewriteCon ... -
how the drupal set css/js query string for cache buster
2012-12-13 17:31 1353Css/js can be cached by browser ... -
drupal7 配置dev环境不压缩js, css
2012-11-23 17:01 732为了性能考虑,一般我们都将performance里面的aggr ... -
drupal7+varnish: varnish总是miss的原因
2012-11-16 11:12 986最近发现不知什么原因,匿名用户访问的页面都返回varnis ... -
drupal7+varnish: varnish总是miss的原因
2012-11-16 11:11 8<!-- [if gte mso 9]><x ... -
tomcat read correct request server name behand apache
2012-03-28 17:09 883I need read requested server na ... -
create maven repository and use curl upload file
2012-03-28 11:22 809We can use Nexus to build maven ... -
use x-forwarded-for
2011-12-20 15:29 1906X-Forwarded-For (XFF )是用 ... -
web环境中配置log4j记录用户跟踪信息
2011-12-14 17:46 671http://www.ibm.com/developerwor ... -
apache日志配置
2011-11-15 16:28 1021有时候我们需要定制Apac ... -
设置HTTP persistent connection提高网站访问性能
2011-11-11 09:42 1601经过紧张的开发过程,新的网站总算上线了。但是使用流量分析工具进 ... -
How to rotate tomcat logs
2011-09-28 10:18 853If catalina.out becomes 2GB in ... -
win7上apache+php环境搭建
2011-09-13 10:22 1149http://www.leapsoul.cn/?p=695 ... -
URL 参数的安全性
2011-04-18 10:04 2466在开发基于web的服务器的时候,我们经常需要传递一些敏感数据, ... -
cdn工作原理
2010-12-08 11:40 13561.前言 Internet的高速发展,给人们的工作和生活 ... -
在linux上面LAMP安装
2010-09-15 15:06 20991. Apache安装 1. download http ...
相关推荐
为了开始使用AppFuse,首先需要准备一个合适的开发环境。以下是一些基本步骤: 1. **下载AppFuse**: 从AppFuse的官方网站下载最新版本的源码包(本文使用的版本是appfuse-tapestry-1.9.3-src.zip)。将其解压至所需...
以上步骤详细介绍了如何使用AppFuse搭建一套完整的开发环境。通过遵循这些步骤,开发者可以快速构建出一个具备基本功能的Java Web应用程序,并能够在此基础上进一步定制和扩展功能。此外,掌握AppFuse的使用对于熟悉...
在提供的压缩包中,"基于appfuse开发网站.doc"很可能是详细的开发指南,涵盖了AppFuse的使用方法、配置步骤以及常见问题。"CertsManSys"可能是一个实际的AppFuse应用示例,包含了完整的源代码,你可以运行这个例子来...
1. **集成流行框架**:Appfuse 将 Hibernate、Struts、Spring 等框架进行了深度集成,为开发者提供了一个统一的开发平台,降低了学习和使用这些框架的门槛。 2. **提供常用功能**:框架内已经预设了如用户认证、角色...
以上步骤提供了关于如何使用AppFuse框架进行开发的基本指南,包括配置环境、导入项目以及生成CRUD操作所需的代码模板。这些指南对于初学者来说尤其有用,可以帮助他们快速上手并高效地进行应用程序的开发。
### Appfuse 学习笔记 #### 一、Appfuse 简介 Appfuse 是一个开源框架,...通过以上步骤,可以成功搭建起基于 Appfuse 2.0 的开发环境,并创建出各种类型的应用项目。接下来可以根据实际需求进行更深入的学习和开发。
AppFuse的使用流程通常包括以下几个步骤: 1. **下载或从CVS获取源码**:可以从官方站点下载最新版本的AppFuse,或者通过CVS命令直接检出项目源码。 2. **创建新应用**:运行Ant命令,指定应用名和数据库名,生成...
AppFuse 是一个开源项目,旨在帮助开发者快速构建J2EE应用...本文提供的示例和步骤是基于一个使用Tapestry、Hibernate和Spring的简单应用,但AppFuse也支持其他技术栈,如Struts、JSF等,可以根据项目需求进行选择。
在最新的版本2.1.0-M2中,AppFuse 提供了基本(basic)和模块化(modular)两种类型的原型,以便于开发者根据项目需求选择合适的方式来创建项目。 建立项目原型骨架的步骤如下: 1. 首先,通过Maven的archetype...
【MAVEN 搭建APPFUSE】是一个关于使用Maven构建基于...总之,通过这个教程,你将掌握如何使用Maven与AppFuse相结合,高效地构建和管理Java Web应用,从而提升开发效率,减少重复工作,使你的项目更加规范和易于维护。
通过使用 AppFuse,开发人员可以在构建新的 Web 项目时大大节省在项目结构设置上的时间。 - **定位**:AppFuse 更像是一个项目的骨架或模板,它通过集成各种工具和技术(如 Java, Maven, Struts 等),提供了快速...
### AppFuse Primer 相关知识点 ...综上所述,《AppFuse Primer》是一本非常适合希望使用AppFuse框架进行Java Web应用开发的读者的书籍。无论是初学者还是有经验的开发者,都可以从中获取到有价值的信息和实践技巧。
根据给定的文件信息,我们可以详细解析如何配置和使用AppFuse进行开发。以下是详细的配置步骤: ##### 1. **搭建开发环境** - **下载AppFuse源码**:从官方网站下载`appfuse-1.9.3-src.zip`,并将其解压至`D:\...
尽管具体的博客内容无法在这里直接展示,但我们可以推测这篇文章会涵盖 AppFuse 的基本概念、安装步骤、创建第一个应用的过程以及如何利用 AppFuse 的特性来简化开发工作。 标签“源码”和“工具”暗示了这个压缩包...
这部分内容对于初学者尤为重要,因为它覆盖了如何从零开始搭建基于 AppFuse 的项目,并介绍了 Maven 的基本概念,例如依赖管理、构建生命周期等。 #### 商业支持 (Commercial Support) 除了免费的社区支持之外,...