长航

简介: 代码神奇,分发给个社区

Struts2的参数绑定固然好用,只需要在Action中声明参数属性,那么就能够实现表单参数的绑定,单我认为作为一个商业项目而言这种应用不可取。因为一个Action 80%的情况的是多用的,里面会有很多方法需要调用执行,那么如果每个方法的都采取Struts2的参数绑定传参势必造成Action中的属性泛滥,不利于开发和维护。我个人认为完全可以自己通过请求对象取出请求表单元素,当然为了效率,你可以封装一下代码:
以下是BaseAction类的代码:
[java] view plain copy
Map _paramMap = new HashMap();

/** 
 * 获得表单元素值 
 * @param name 
 * @return 
 */  
public Object getParam(String key){  
    if (_paramMap.size()==0){  
        Map<String,Object> paramMap = ActionContext.getContext().getParameters();       
        for (Map.Entry<String,Object> kvp : paramMap.entrySet()) {  
            _paramMap.put(kvp.getKey().toUpperCase(),kvp.getValue());  
        }  
    }             
      
    if(!_paramMap.containsKey(key.toUpperCase()))  
        return "";  
    Object[] values =  (Object[])_paramMap.get(key.toUpperCase());  
    if (values==null || values.length==0)  
        return "";  
    if (values.length==1)  
        return values[0]==null?"":values[0];  
    return values;    
}  
  
/** 
 * 绑定参数到对象属性 
 * @param entity 
 * @param params 
 */  
public void bindParam2Bean(Object entity){  
      
    Map<String,Object> paramMap = ActionContext.getContext().getParameters();  
    if (paramMap==null || paramMap.size()==0)  
        throw new InvalidParameterException("没有有效的参数可以绑定");  
    Class classzz = entity.getClass();  
    //將所有私有字段裝入Map<字段名,字段對象>  
    Map<String,Field> fieldMap = new HashMap<String,Field>();  
    for (Field f : classzz.getDeclaredFields()) {  
        fieldMap.put(f.getName().toUpperCase(),f);  
    }  
    Field f = null;  
    Object fvalue = null;  
    for (Map.Entry<String,Object> kvp : paramMap.entrySet()) {  
        try {  
            Object[] values = (Object[])kvp.getValue();  
            if (null != values && values.length==1){  
                //f = classzz.getDeclaredField(kvp.getKey());  
                f = fieldMap.get(kvp.getKey().toUpperCase());//從HashMap中取得字段對象[不區分大小寫]  
                if ( null == f)  
                    continue;  
                f.setAccessible(true);  
                if (f.getType()==String.class){  
                    f.set(entity, values[0]);  
                }else{  
                    fvalue = f.getType().getDeclaredMethod("valueOf",String.class).invoke(null, values[0]);  
                    f.set(entity, fvalue);  
                }  
                      
            }  
        } catch (Exception e) {  
            if (super.LOG.isInfoEnabled())                    
                super.LOG.info(java.text.MessageFormat.format("封装请求参数{0}到JavaBean的{1}属性失败[{2}]", kvp.getKey(),f.getName(),e.getMessage()));  
        }  
    }  
}  

所有Action类继承自BaseAction类,子类中调用上面的父类方法实现参数获取非常方便,例如:
[java] view plain copy
/**

 * 添加诊所管理文章 
 *  
 * @return 
 */  
public String addCliniqueArticle() {  
    CliniqueArticle ca = null;  
    try {  
        ca = new CliniqueArticle();  
        super.bindParam2Bean(ca);  
        if (StringUtils.isBlank(ca.getTitle())  
                || !com.defshare.foundation.global.StringUtils.isValid(ca  
                        .getTitle())) {  
            super.request.setAttribute("ErrorMessage", "诊所文章的标题不能为特殊字符或空");  
            return "add_input";  
        }  
        if (StringUtils.isBlank(ca.getContent())) {  
            super.request.setAttribute("ErrorMessage", "诊所文章的内容不能为空");  
            return "add_input";  
        }  
        if (StringUtils.isBlank(ca.getSummary())) {  
            super.request.setAttribute("ErrorMessage", "文章摘要不能为空");  
            return "add_input";  
        }  
        if (null == ca.getOrderNum()) {  
            ca.setOrderNum(0);  
        }  
        // 当没有上传图片时,则将设置为默认的图片  
        if (StringUtils.isBlank(super.getUploadFileName())) {  
            ca.setPic(super.DEFAULT_PIC);  
        } else {  
            ca.setPic(super.saveFile());  
        }  
        cliniqueArticleService.addCliniqueArticle(ca);  
        super.request.setAttribute("ErrorMessage", "添加诊所文章信息成功");  
        return "add_success";  

    } catch (Exception e) {  
        // 出异常时,当已经上传的图片删除  
        new File(super.getSavePath() + "\\" + ca.getPic()).delete();  
        super.addFieldError("message", e.getMessage());  

        return "add_input";  
    }  
}  

@SuppressWarnings("static-access")  
public String updateCliniqueArticle() {  
    CliniqueArticle clinique = null;  
    try {  
        clinique = new CliniqueArticle();  
        String id = super.getParam("cliniqueArticleId").toString();  
        String title = super.getParam("title").toString();  
        String summary = super.getParam("summary").toString();  
        String content = super.getParam("content").toString();  
        String defaultPic = super.getParam("dfpic").toString();  
        clinique.setContent(content);  
        clinique.setSummary(summary);  
        clinique.setTitle(title);  
        clinique.setCliniqueArticleId(Long.parseLong(id));  

        if (null == clinique.getCliniqueArticleId()  
                || clinique.getCliniqueArticleId() < 1) {  
            request.setAttribute("ErrorMessage", "管理文章编号无效!");  
            super.request.setAttribute("clinique", clinique);  
            return "update_input";  
        }  
        if (StringUtils.isBlank(clinique.getTitle())  
                || !com.defshare.foundation.global.StringUtils  
                        .isValid(clinique.getTitle())) {  
            request.setAttribute("ErrorMessage", "文章管理标题不能为特殊字符或空!");  
            super.request.setAttribute("clinique", clinique);  
            return "update_input";  
        }  
        if (StringUtils.isBlank(clinique.getContent())) {  
            request.setAttribute("ErrorMessage", "文章管理内容不能为空!");  
            super.request.setAttribute("clinique", clinique);  
            return "update_input";  
        }  
        if (StringUtils.isBlank(clinique.getSummary())) {  
            request.setAttribute("ErrorMessage", "文章摘要不能为空");  
            super.request.setAttribute("clinique", clinique);  
            return "update_input";  
        }  
        if (!StringUtils.isBlank(defaultPic)) {  
            clinique.setPic(DEFAULT_PIC);  
        }  
        // 获得图片,当用户上传图片的时候  
        else if (!StringUtils.isBlank(super.getUploadFileName())) {  
            clinique.setPic(super.saveFile());  
        }  
        // 获得原来的图片地址  
        String oldPic = cliniqueArticleService.getCliniqueArticle(  
                clinique.getCliniqueArticleId().longValue()).getPic();  
        cliniqueArticleService.updateCliniqueArticle(clinique);  
        // 判断是否是缺省图片  
        if (!StringUtils.isBlank(super.getUploadFileName())) {  
            if (!oldPic.equals(super.DEFAULT_PIC)) {  
                new File(super.getSavePath() + "\\" + oldPic).delete();  
            }  
        }  

        super.request.setAttribute("ErrorMessage", "修改诊所文章成功");  
        return "update_success";  
    }catch (NumberFormatException e) {  
        request.setAttribute("ErrorMessage", "无效的编号信息");  
        return "update_input";  
    }   
    catch (Exception e) {  
        super.request.setAttribute("clinique", clinique);  
        request.setAttribute("ErrorMessage", e.getMessage());  
        return "update_input";  
    }  

}  

/** 
 * 后台显示诊所文章信息 
 * @return 
 */  
public String getAllCliniqueArticle() {  
    try {  
        int page = -1;  
        int size = -1;  
        // 获得当前页  
        String index = super.getParam("pageIndex").toString();  
        String pageSize = super.getParam("pageSize").toString();  
        String title = super.getParam("title").toString().trim();  
        PageInfo<CliniqueArticle> pageInfo = new PageInfo<CliniqueArticle>(  
                CliniqueArticle.class);  
        // 对当前页进行判断,如果为null则设置当前页为首页  

        if (StringUtils.isBlank(index)) {  
            index = "1";  
        }  
        if (StringUtils.isBlank(pageSize)) {  
            pageSize = "10";  
        }  
        // 判断是否是数字  
        if (!StringUtils.isNumeric(index)) {  
            request.setAttribute("ErrorMessage", "当前页无效");  
            return "page_input";  
        } else {  
            page = Integer.valueOf(index);  
        }  
        // 判断是否是数字  
        if (!StringUtils.isNumeric(pageSize)) {  
            request.setAttribute("ErrorMessage", "每页数据无效");  
            return "page_input";  
        } else {  
            size = Integer.valueOf(pageSize);  
        }  
        pageInfo.setPageIndex(page);  
        pageInfo.setPageSize(size);  
        pageInfo.getConditions().add(  
                new Condition("title", Compare.LIKE, title));  
        cliniqueArticleService.getCliniqueArticleByPageInfo(pageInfo);  
        // 将诊所文章的信息列表放到坏境中去  
        request.setAttribute("pi", pageInfo);  
        return "page_success";  
    } catch (Exception e) {  
        request.setAttribute("ErrorMessage", e.getMessage());  
        return "page_input";  
    }  

}  
相关文章
|
4天前
|
弹性计算 安全 API
访问控制(RAM)|云上安全使用AccessKey的最佳实践
集中管控AK/SK的生命周期,可以极大降低AK/SK管理和使用成本,同时通过加密和轮转的方式,保证AK/SK的安全使用,本次分享为您介绍产品原理,以及具体的使用步骤。
101786 0
|
5天前
|
SQL 关系型数据库 分布式数据库
Doodle Jump — 使用Flutter&Flame开发游戏真不错!
用Flutter&Flame开发游戏是一种什么体验?最近网上冲浪的时候,我偶然发现了一个国外的游戏网站,类似于国内的4399。在浏览时,我遇到了一款经典的小游戏:Doodle Jump...
|
12天前
|
弹性计算 运维 安全
访问控制(RAM)|云上程序使用临时凭证的最佳实践
STS临时访问凭证是阿里云提供的一种临时访问权限管理服务,通过STS获取可以自定义时效和访问权限的临时身份凭证,减少长期访问密钥(AccessKey)泄露的风险。本文将为您介绍产品原理,以及具体的使用步骤。
151035 4
|
10天前
|
数据采集 存储 运维
提升团队工程交付能力,从“看见”工程活动和研发模式开始
本文从统一工程交付的概念模型开始,介绍了如何将应用交付的模式显式地定义出来,并通过工具平台落地。
119991 57
|
11天前
|
监控 负载均衡 Java
深入探究Java微服务架构:Spring Cloud概论
**摘要:** 本文深入探讨了Java微服务架构中的Spring Cloud,解释了微服务架构如何解决传统单体架构的局限性,如松耦合、独立部署、可伸缩性和容错性。Spring Cloud作为一个基于Spring Boot的开源框架,提供了服务注册与发现、负载均衡、断路器、配置中心、API网关等组件,简化了微服务的开发、部署和管理。文章详细介绍了Spring Cloud的核心模块,如Eureka、Ribbon、Hystrix、Config、Zuul和Sleuth,并通过一个电商微服务系统的实战案例展示了如何使用Spring Cloud构建微服务应用。
103505 8
|
12天前
|
人工智能 Serverless 对象存储
让你的文档从静态展示到一键部署可操作验证
通过函数计算的能力让阿里云的文档从静态展示升级为动态可操作验证,用户在文档中单击一键部署可快速完成代码的部署及测试。这一改变已在函数计算的活动沙龙中得到用户的认可。
120870 230
|
12天前
|
SQL 存储 数据可视化
Ganos H3地理网格能力解析与最佳实践
本文介绍了Ganos H3的相关功能,帮助读者快速了解Ganos地理网格的重要特性与应用实践。H3是Uber研发的一种覆盖全球表面的二维地理网格,采用了一种全球统一的、多层次的六边形网格体系来表示地球表面,这种地理网格技术在诸多业务场景中得到广泛应用。Ganos不仅提供了H3网格的全套功能,还支持与其它Ganos时空数据类型进行跨模联合分析,极大程度提升了客户对于时空数据的挖掘分析能力。
|
12天前
|
存储 缓存 安全
深度解析JVM世界:JVM内存结构
深度解析JVM世界:JVM内存结构
|
18天前
|
人工智能 编解码 对象存储
一键生成视频!用 PAI-EAS 部署 AI 视频生成模型 SVD 工作流
本教程将带领大家免费领取阿里云PAI-EAS的免费试用资源,并且带领大家在 ComfyUI 环境下使用 SVD的模型,根据任何图片生成一个小短视频。