`
wsc830719
  • 浏览: 165658 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

netbeans(6):扩展struts插件预期讨论

阅读更多

      这几天在读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方法。

 

      可能开始并不会完善,集中体验就是不能拿来就运行,只是哪怕是生成框架呢,也是能极大减少代码输入量。希望我的想法最终变成现实。

 

 

 

 

 


 

0
0
分享到:
评论

相关推荐

    Netbeans6_Struts2插件下载与安装

    本篇文章将详细介绍如何在NetBeans 6中下载并安装Struts2插件。 首先,我们需要了解NetBeans 6是一款历史悠久的IDE,它支持多种编程语言,包括Java,是Java开发者常用的选择之一。Struts2插件的集成使得开发者可以...

    NetBeans下的Struts2.0插件

    标题中的"NetBeans下的Struts2.0插件"指的是专门为NetBeans IDE设计的扩展,用于增强对Struts2框架的支持。通过这个插件,开发者可以在NetBeans中享受到诸如代码自动完成、模板生成、调试和部署等针对Struts2的定制...

    Netbeans Struts2插件

    6. **插件扩展性**:NetBeans平台允许开发人员根据需求扩展插件,添加自定义的模板或者功能,适应不同项目的需求。 7. **版本兼容性**:NetBeans Struts2插件通常会跟进Struts2框架的新版本,确保与最新框架的兼容...

    netbeans7.0版struts2架构插件

    "NetBeans 7.0版Struts2架构插件"是专门为NetBeans 7.0设计的扩展,它允许开发者在NetBeans环境中无缝地集成和使用Struts2框架。这个插件提供了以下功能: 1. **项目模板**:通过预定义的Struts2项目模板,开发者...

    NetBeans 下struts2 的插件

    6. **版本兼容**:根据选择的插件版本,适应不同的Struts2框架,满足不同需求。 安装NetBeans的Struts2插件非常简单,只需要将`.nbm`文件导入到IDE中,通过“插件”菜单进行安装和激活即可。在开发过程中,可以根据...

    Struts2 Netbeans插件

    6. **更新和升级**:通过NetBeans的插件管理器,开发者可以方便地检查并安装Struts2插件的最新版本,确保始终使用稳定和功能齐全的工具。 7. **示例和教程**:插件可能还附带一些Struts2的示例项目,供开发者学习和...

    支持Netbeans7.0的Struts2插件

    标题提到的“支持Netbeans7.0的Struts2插件”是专门为Netbeans 7.0定制的一个开发辅助工具,它扩展了IDE的功能,使开发者在使用Struts2框架时能够享受到代码自动完成、错误检查、模板生成等便利特性。通过这个插件,...

    netbean的struts2.0插件

    标题中的"NetBeans的Struts2.0插件"指的是专门为NetBeans IDE设计的一个扩展,它提供了对Struts2框架的集成支持。这个插件允许开发者在NetBeans环境中创建、编辑和调试基于Struts2的应用程序,极大地提升了开发效率...

    struts2 for netbeans 6.7

    6. **NetBeans 6.7的集成特性**:NetBeans 6.7支持Struts2的插件,提供代码自动完成、错误检查、调试等功能,提高了开发效率。同时,IDE还支持Maven和Ant构建系统,方便管理项目依赖。 7. **国际化和本地化**:...

    hibernate for netbeans5.5

    这暗示了我们可能会讨论一个针对NetBeans 5.5设计的Hibernate插件,用于增强IDE对Hibernate的支持。 在提供的压缩包文件名称列表中,我们看到了多个以`.nbm`结尾的文件。这些是NetBeans模块(Module)的安装包,...

    struts2 netbeans

    Struts2是一个强大的MVC(模型-视图-控制器)框架,它在Java Web开发中广泛应用,用于构建可维护、可扩展且结构清晰的Web应用程序。NetBeans是一款集成开发环境(IDE),支持多种编程语言,包括Java,为开发者提供了...

    介绍struts2及struts2开发环境的搭建

    Struts2的核心功能包括动作调度、请求处理、结果渲染、异常处理、国际化支持以及插件扩展等。 首先,让我们深入理解Struts2的关键特性: 1. **Action和Result**:在Struts2中,业务逻辑主要由Action类执行,Action...

    netbeans magazine

    - NetBeans IDE支持用户扩展其功能通过自定义插件模块。 - 开发者可以根据需求创建自己的插件模块来增强IDE的功能性。 **2. 构建插件模块步骤** - **设计**: 明确插件的目的和功能。 - **实现**: 使用Java编程...

    struts中文教程

    - **插件机制**:解释 Struts 的插件机制及其扩展性。 - **配置文件详解**:深入分析 Struts-config 文件的作用和配置方法。 #### 七、开发环境配置 - **概述**:这一章节介绍了如何配置 Struts 开发环境,主要...

    Netbeans 初级入门教程

    - **插件开发**:NetBeans 5.0进一步增强了插件开发工具,使开发者能够更容易地为NetBeans添加新功能。 - **NetBeans平台应用**:对于那些希望构建非IDE应用的开发者来说,NetBeans平台提供了一套强大的框架来支持...

    struts框架实例

    Struts2 框架实例教程 Struts2 是一款基于 Model-...同时,Struts2 提供的拦截器、插件和自定义标签库等功能,进一步增强了其灵活性和扩展性。对于初学者来说,理解并实践这样的实例是掌握 Struts2 框架的关键步骤。

    struts入门

    - **Struts 支持插件机制**:允许扩展 Struts 功能,例如增加新的标签库、自定义拦截器等。 #### 十三、Struts-Config 文件详解 - **Struts-Config 文件**:详细配置 Struts 的各种设置,包括但不限于 Action 映射...

    JSF和Struts各自的优缺点

    4. **生命周期管理**:JSF拥有清晰的请求生命周期,便于插件开发,如自定义渲染工具包,增强了可扩展性。 5. **模型绑定**:JSF提供了直接将UI组件与后端模型绑定的能力,减少了数据转换的繁琐工作。 然而,JSF也...

    Struts2学习笔记(一) 环境的搭建与HelloWorld程序

    在后续的学习中,你将更深入地了解Struts2的特性,包括Interceptor拦截器、结果类型、OGNL表达式、动态方法调用、插件扩展等。此外,还会涉及如何与Spring、Hibernate等其他框架集成,以构建更复杂的Java Web应用...

Global site tag (gtag.js) - Google Analytics