- 浏览: 165658 次
- 性别:
- 来自: 唐山
文章分类
最新评论
-
wmx2003:
你好,第一次使用Netbeans RCP,有问题想请教下。刚用 ...
开篇:netbeans RCP介绍 -
fxbird:
http://netbeans.org/projects/um ...
netbeans UML插件 -
socket2008:
去试一下 phpDesigner 代码片段功能吧,[[curs ...
自制netbeans插件:代码收集插件——code collect征集帮助 -
archwuke:
我文章比较早了,我不知道楼主还能不能看到我的回贴我是个java ...
netbeans有望2010年实现完整的可视化设计器 -
ilikegirl123:
我也喜欢Netbeans并且不顾上面的用eclipse的压力. ...
netbeans(4):netbeans6.9新特征
这几天在读netbeans关于struts部分的源码。因为前段时间看了传智博客的巴巴运动网视频,实体的数据库服务类的常见操作都可以用一个基类来完成,这样下来,其他的工作就是不断的重复,就是拷贝粘贴代码,然后再改改。可以说都是一些重复的工作,于是我想把这部分工作通过扩展插件来让IDE自动完成。
大致思想如下:
将官网struts插件当作类库使用。
因为spring使用注释,不涉及操作配置文件,只有struts需要写配置文件,但是控制器可以使用注释。
spring服务类:
1 根据实体类生成服务类。
比如实体类为Product
public class ProductServiceBean extends DaoSupport<实体类Product> implements ProductService
public interface ProductService extends DAO<实体类Product>
选择 实体类,将自动匹配成上述名称,Product——ProductService(接口)——ProductServiceBean(服务类)
上述名称只是默认生成,可以更改。
关键:找到所有实体类,列入下拉选择框中;根据所选包,并根据相应模板生成相应文件;
此处使用注释,因此不需要读写配置文件。
2 根据实体类生成formbean类
根据所选的实体类生成formbean类,默认继承BaseForm,并且:
使用反射查找所有字段,并列入表格中,可以通过选择框勾选是否放入formbean的字段中。
(可以通过添加按钮,可以添加字段,并设置其类型。这个是否能提高开发效率也难说,直接在类中添加也不慢
因为IDE有自动完成功能,没必要通过弹出框来添加)
3 生成struts的Actions类。
选择实体类 服务类 formbean类
首先此处,除了标记其为Controller外,需要写配置文件。
生成一个ProductAction(默认,可以更改),默认继承DispatchAction
该Action生成 list addUI add editUI edit delete等6个方法。
4 生成相应的页面
1列表页面——包含链接: 添加、编辑、删除
2添加页面——针对实体类中划入formbean类的字段生成input框。
(添加成功后是转向列表页面 还是转向成功提示页?)
3编辑页面——和添加页面类似
4 删除页面——(删除成功后是转向列表页面 还是转向成功提示页?)
此外,上述都需要考虑失败页面。
其实就是和netbeans的EJB+JSF的根据实体类生成更删查改的应用类似。
如果能实现这些功能,效率将提高很多。
其中使用的几个基础类如下:
1 BaseForm类
public class BaseForm extends org.apache.struts.action.ActionForm { private static Properties properties = new Properties(); static { try { properties.load(BaseForm.class.getClassLoader().getResourceAsStream("arrowuploadfiletype.properties")); } catch (IOException e) { e.printStackTrace(); } } /**获取当前页数**/ private int pageNum; public int getPageNum() { return pageNum < 1 ? 1 : pageNum; } public void setPageNum(int pageNum) { this.pageNum = pageNum; } public static Properties getProperties() { return properties; } public static void setProperties(Properties properties) { BaseForm.properties = properties; } /** * 验证上传文件类型是否属于图片格式 * @return */ public static boolean validateImageFileType(FormFile formfile) { if (formfile != null && formfile.getFileSize() > 0) { List<String> arrowType = Arrays.asList("image/bmp", "image/png", "image/gif", "image/jpg", "image/jpeg", "image/pjpeg"); List<String> arrowExtension = Arrays.asList("gif", "jpg", "bmp", "png"); String ext = getExt(formfile); return arrowType.contains(formfile.getContentType().toLowerCase()) && arrowExtension.contains(ext); } return true; } public static String getExt(FormFile formfile) { return formfile.getFileName().substring(formfile.getFileName().lastIndexOf('.') + 1).toLowerCase(); } /** * 验证上传文件是否属于图片/flash动画/word文件/exe文件/pdf文件/TxT文件/xls文件/ppt文件 * @param formfile * @return */ public static boolean validateFileType(FormFile formfile) { if (formfile != null && formfile.getFileSize() > 0) { String ext = formfile.getFileName().substring(formfile.getFileName().lastIndexOf('.') + 1).toLowerCase(); List<String> arrowType = new ArrayList<String>(); for (Object key : properties.keySet()) { String value = (String) properties.get(key); String[] values = value.split(","); for (String v : values) { arrowType.add(v.trim()); } } return arrowType.contains(formfile.getContentType().toLowerCase()) && properties.keySet().contains(ext); } return true; } /** * 保存文件 * @param savedir 存放目录 * @param fileName 文件名称 * @param data 保存的内容 * @return 保存的文件 * @throws Exception */ public static File saveFile(File savedir, String fileName, byte[] data) throws Exception { if (!savedir.exists()) { savedir.mkdirs();//如果目录不存在就创建 } File file = new File(savedir, fileName); FileOutputStream fileoutstream = new FileOutputStream(file); fileoutstream.write(data); fileoutstream.close(); return file; } }
2 DAO顶级接口类
package com.kks.service.base; import java.io.Serializable; import java.util.LinkedHashMap; public interface DAO<T> { /** * 获取记录总数 * @param entityClass 实体类 * @return */ public long getCount(); /** * 清除一级缓存的数据 */ public void clear(); /** * 保存实体 * @param entity 实体id */ public void save(Object entity); /** * 更新实体 * @param entity 实体id */ public void update(Object entity); /** * 删除实体 * @param entityClass 实体类 * @param entityids 实体id数组 */ public void delete(Serializable... entityids); /** * 获取实体 * @param <T> * @param entityClass 实体类 * @param entityId 实体id * @return */ public T find(Serializable entityId); /** * 获取分页数据 * @param <T> * @param entityClass 实体类 * @param firstindex 开始索引 * @param maxresult 需要获取的记录数 * @return */ public QueryResult<T> getScrollData(int firstindex, int maxresult, String wherejpql, Object[] queryParams, LinkedHashMap<String, String> orderby); public QueryResult<T> getScrollData(int firstindex, int maxresult, String wherejpql, Object[] queryParams); public QueryResult<T> getScrollData(int firstindex, int maxresult, LinkedHashMap<String, String> orderby); public QueryResult<T> getScrollData(String wherejpql, Object[] queryParams); public QueryResult<T> getScrollData(String wherejpql, Object[] queryParams, LinkedHashMap<String, String> orderby); public QueryResult<T> getScrollData(int firstindex, int maxresult); public QueryResult<T> getScrollData(); }
3 数据库操作基类DaoSupport
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.kks.service.base; import com.kks.util.GenericsUtils; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.io.Serializable; import java.lang.reflect.Method; import java.util.LinkedHashMap; import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; /** * */ @Transactional public class DaoSupport<T> implements DAO<T> { protected Class<T> entityClass = GenericsUtils.getSuperClassGenricType(this.getClass()); @PersistenceContext protected EntityManager em; public void clear() { em.clear(); } public void delete(Serializable... entityids) { for (Object id : entityids) { em.remove(em.getReference(this.entityClass, id)); } } @Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED) public T find(Serializable entityId) { if (entityId == null) { throw new RuntimeException(this.entityClass.getName() + ":传入的实体id不能为空"); } return em.find(this.entityClass, entityId); } public void save(Object entity) { em.persist(entity); } @Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED) public long getCount() { return (Long) em.createQuery("select count(" + getCountField(this.entityClass) + ") from " + getEntityName(this.entityClass) + " o").getSingleResult(); } public void update(Object entity) { em.merge(entity); } @Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED) public QueryResult<T> getScrollData(int firstindex, int maxresult, LinkedHashMap<String, String> orderby) { return getScrollData(firstindex, maxresult, null, null, orderby); } @Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED) public QueryResult<T> getScrollData(int firstindex, int maxresult, String wherejpql, Object[] queryParams) { return getScrollData(firstindex, maxresult, wherejpql, queryParams, null); } @Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED) public QueryResult<T> getScrollData(int firstindex, int maxresult) { return getScrollData(firstindex, maxresult, null, null, null); } @Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED) public QueryResult<T> getScrollData() { return getScrollData(-1, -1); } @Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED) public QueryResult<T> getScrollData(String wherejpql, Object[] queryParams) { return getScrollData(-1, -1, wherejpql, queryParams); } @Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED) public QueryResult<T> getScrollData(String wherejpql, Object[] queryParams, LinkedHashMap<String, String> orderby) { return getScrollData(-1, -1, wherejpql, queryParams, orderby); } @Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED) public QueryResult<T> getScrollData(int firstindex, int maxresult, String wherejpql, Object[] queryParams, LinkedHashMap<String, String> orderby) { QueryResult qr = new QueryResult<T>(); String entityname = getEntityName(this.entityClass); Query query = em.createQuery("select o from " + entityname + " o " + (wherejpql == null || "".equals(wherejpql.trim()) ? "" : "where " + wherejpql) + buildOrderby(orderby)); setQueryParams(query, queryParams); if (firstindex != -1 && maxresult != -1) { query.setFirstResult(firstindex).setMaxResults(maxresult); } qr.setResultlist(query.getResultList()); query = em.createQuery("select count(" + getCountField(this.entityClass) + ") from " + entityname + " o " + (wherejpql == null || "".equals(wherejpql.trim()) ? "" : "where " + wherejpql)); setQueryParams(query, queryParams); qr.setTotalrecord((Long) query.getSingleResult()); return qr; } protected static void setQueryParams(Query query, Object[] queryParams) { if (queryParams != null && queryParams.length > 0) { for (int i = 0; i < queryParams.length; i++) { query.setParameter(i + 1, queryParams[i]); } } } /** * 组装order by语句 * @param orderby * @return */ protected static String buildOrderby(LinkedHashMap<String, String> orderby) { StringBuffer orderbyql = new StringBuffer(""); if (orderby != null && orderby.size() > 0) { orderbyql.append(" order by "); for (String key : orderby.keySet()) { orderbyql.append("o.").append(key).append(" ").append(orderby.get(key)).append(","); } orderbyql.deleteCharAt(orderbyql.length() - 1); } return orderbyql.toString(); } /** * 获取实体的名称 * @param <E> * @param clazz 实体类 * @return */ protected static <E> String getEntityName(Class<E> clazz) { String entityname = clazz.getSimpleName(); Entity entity = clazz.getAnnotation(Entity.class); if (entity.name() != null && !"".equals(entity.name())) { entityname = entity.name(); } return entityname; } /** * 返回实体类的符合能够count的值,主要是考虑复合主键的情况,不是复合主键的话,直接实体即可 * @param <E> * @param clazz * @return */ protected static <E> String getCountField(Class<E> clazz) { String out = "o"; try { PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(clazz).getPropertyDescriptors(); for (PropertyDescriptor propertydesc : propertyDescriptors) { Method method = propertydesc.getReadMethod(); if (method != null && method.isAnnotationPresent(EmbeddedId.class)) { PropertyDescriptor[] ps = Introspector.getBeanInfo(propertydesc.getPropertyType()).getPropertyDescriptors(); out = "o." + propertydesc.getName() + "." + (!ps[1].getName().equals("class") ? ps[1].getName() : ps[0].getName()); break; } } } catch (Exception e) { e.printStackTrace(); } return out; } }
其他的类都从上面继承,可以说结构非常类似,这样借助IDE自动生成,将极大提高效率。
不过使用注释,意味着必须使用jdk1.5及以上。
暂时想到这些,更详细的设计还在进行中,粗略的做了个对话框,证明可以使用struts插件已有的东西。现在就差我自己的实现了。 我也想放到kenail上,不知道有没有志同道合的,对netbeans RCP有一定了解,又想做这个插件的。该想法基于传智博客的巴巴视频的封装,有此封装,其他代码就是结构一致的代码,自动生成的价值非常高。
我的开发环境 spring2.5 ,jpa1.0(hibernate或toplink实现) ,struts1.3.8.
或者有一些想法可以留言,比如根据实体类拿到它的字段以及生成formbean类,还有再根据formbean类的原始字段生成
页面的添加的input(都先一致生成input,其他类型可以改),还是可以选择生成input或textarea呢?如果生成textarea是否就给它选择框,选择是否使用富文本支持呢(就是html编辑器)?如果使用html编辑器,这个也不好办,因为大家使用的编辑器不同。这些详细的可以作为未来版本的完善。目前围绕功能实现。如果能提供高效的查找机制就更好了。比如实体类的字段,我可以选择那些进入formbean类,然后我还要根据formbean类去生成页面,然后Action类的
添加和修改方法,还要去根据它们进行setter/getter的设置,然后调用合适的服务类调用基类的save update方法。
可能开始并不会完善,集中体验就是不能拿来就运行,只是哪怕是生成框架呢,也是能极大减少代码输入量。希望我的想法最终变成现实。
发表评论
-
netbeans代码收集插件0.66 for 6.8以前0.69 for nb6.9(7.14日)
2010-03-03 23:17 2622本插件使用netbeans6.8开 ... -
为netbeans的文本组件添加右键菜单功能的插件
2010-02-28 23:18 2599netbeans是基于swing的,很多人在使用时总是感觉少了 ... -
可视化编辑JPA实体类的插件(netbeans6.7.1或更高)
2010-02-26 22:40 1427这是一个类似UML格式的可视化编辑JPA实体类的插件。下面是网 ... -
自制netbeans插件:代码收集插件——code collect征集帮助
2010-02-25 11:52 2062该插件已经在netbeans插 ... -
netbeans下gwt(gwt4nb插件)开发环境
2010-02-03 19:02 3063netbeans提供了与eclipse下 ... -
netbeans UML插件
2010-01-22 21:23 10090以前把下载地址给错了 ... -
支持最新的netbeans6.8的velocity插件总算发布了
2009-12-24 21:33 1072今天,我又去看这个插件,因为以前发布的只支持6.0版本的,因为 ...
相关推荐
本篇文章将详细介绍如何在NetBeans 6中下载并安装Struts2插件。 首先,我们需要了解NetBeans 6是一款历史悠久的IDE,它支持多种编程语言,包括Java,是Java开发者常用的选择之一。Struts2插件的集成使得开发者可以...
标题中的"NetBeans下的Struts2.0插件"指的是专门为NetBeans IDE设计的扩展,用于增强对Struts2框架的支持。通过这个插件,开发者可以在NetBeans中享受到诸如代码自动完成、模板生成、调试和部署等针对Struts2的定制...
6. **插件扩展性**:NetBeans平台允许开发人员根据需求扩展插件,添加自定义的模板或者功能,适应不同项目的需求。 7. **版本兼容性**:NetBeans Struts2插件通常会跟进Struts2框架的新版本,确保与最新框架的兼容...
"NetBeans 7.0版Struts2架构插件"是专门为NetBeans 7.0设计的扩展,它允许开发者在NetBeans环境中无缝地集成和使用Struts2框架。这个插件提供了以下功能: 1. **项目模板**:通过预定义的Struts2项目模板,开发者...
6. **版本兼容**:根据选择的插件版本,适应不同的Struts2框架,满足不同需求。 安装NetBeans的Struts2插件非常简单,只需要将`.nbm`文件导入到IDE中,通过“插件”菜单进行安装和激活即可。在开发过程中,可以根据...
6. **更新和升级**:通过NetBeans的插件管理器,开发者可以方便地检查并安装Struts2插件的最新版本,确保始终使用稳定和功能齐全的工具。 7. **示例和教程**:插件可能还附带一些Struts2的示例项目,供开发者学习和...
标题提到的“支持Netbeans7.0的Struts2插件”是专门为Netbeans 7.0定制的一个开发辅助工具,它扩展了IDE的功能,使开发者在使用Struts2框架时能够享受到代码自动完成、错误检查、模板生成等便利特性。通过这个插件,...
标题中的"NetBeans的Struts2.0插件"指的是专门为NetBeans IDE设计的一个扩展,它提供了对Struts2框架的集成支持。这个插件允许开发者在NetBeans环境中创建、编辑和调试基于Struts2的应用程序,极大地提升了开发效率...
6. **NetBeans 6.7的集成特性**:NetBeans 6.7支持Struts2的插件,提供代码自动完成、错误检查、调试等功能,提高了开发效率。同时,IDE还支持Maven和Ant构建系统,方便管理项目依赖。 7. **国际化和本地化**:...
这暗示了我们可能会讨论一个针对NetBeans 5.5设计的Hibernate插件,用于增强IDE对Hibernate的支持。 在提供的压缩包文件名称列表中,我们看到了多个以`.nbm`结尾的文件。这些是NetBeans模块(Module)的安装包,...
Struts2是一个强大的MVC(模型-视图-控制器)框架,它在Java Web开发中广泛应用,用于构建可维护、可扩展且结构清晰的Web应用程序。NetBeans是一款集成开发环境(IDE),支持多种编程语言,包括Java,为开发者提供了...
Struts2的核心功能包括动作调度、请求处理、结果渲染、异常处理、国际化支持以及插件扩展等。 首先,让我们深入理解Struts2的关键特性: 1. **Action和Result**:在Struts2中,业务逻辑主要由Action类执行,Action...
- NetBeans IDE支持用户扩展其功能通过自定义插件模块。 - 开发者可以根据需求创建自己的插件模块来增强IDE的功能性。 **2. 构建插件模块步骤** - **设计**: 明确插件的目的和功能。 - **实现**: 使用Java编程...
- **插件机制**:解释 Struts 的插件机制及其扩展性。 - **配置文件详解**:深入分析 Struts-config 文件的作用和配置方法。 #### 七、开发环境配置 - **概述**:这一章节介绍了如何配置 Struts 开发环境,主要...
- **插件开发**:NetBeans 5.0进一步增强了插件开发工具,使开发者能够更容易地为NetBeans添加新功能。 - **NetBeans平台应用**:对于那些希望构建非IDE应用的开发者来说,NetBeans平台提供了一套强大的框架来支持...
Struts2 框架实例教程 Struts2 是一款基于 Model-...同时,Struts2 提供的拦截器、插件和自定义标签库等功能,进一步增强了其灵活性和扩展性。对于初学者来说,理解并实践这样的实例是掌握 Struts2 框架的关键步骤。
- **Struts 支持插件机制**:允许扩展 Struts 功能,例如增加新的标签库、自定义拦截器等。 #### 十三、Struts-Config 文件详解 - **Struts-Config 文件**:详细配置 Struts 的各种设置,包括但不限于 Action 映射...
4. **生命周期管理**:JSF拥有清晰的请求生命周期,便于插件开发,如自定义渲染工具包,增强了可扩展性。 5. **模型绑定**:JSF提供了直接将UI组件与后端模型绑定的能力,减少了数据转换的繁琐工作。 然而,JSF也...
在后续的学习中,你将更深入地了解Struts2的特性,包括Interceptor拦截器、结果类型、OGNL表达式、动态方法调用、插件扩展等。此外,还会涉及如何与Spring、Hibernate等其他框架集成,以构建更复杂的Java Web应用...