长航

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

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";  
    }  

}  
相关文章
|
14天前
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
阿里云与企业共筑容器供应链安全
171332 12
|
17天前
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
随着云计算和DevOps的兴起,容器技术和自动化在软件开发中扮演着愈发重要的角色,但也带来了新的安全挑战。阿里云针对这些挑战,组织了一场关于云上安全的深度访谈,邀请了内部专家穆寰、匡大虎和黄竹刚,深入探讨了容器安全与软件供应链安全的关系,分析了当前的安全隐患及应对策略,并介绍了阿里云提供的安全解决方案,包括容器镜像服务ACR、容器服务ACK、网格服务ASM等,旨在帮助企业构建涵盖整个软件开发生命周期的安全防护体系。通过加强基础设施安全性、技术创新以及倡导协同安全理念,阿里云致力于与客户共同建设更加安全可靠的软件供应链环境。
150295 32
|
25天前
|
弹性计算 人工智能 安全
对话 | ECS如何构筑企业上云的第一道安全防线
随着中小企业加速上云,数据泄露、网络攻击等安全威胁日益严重。阿里云推出深度访谈栏目,汇聚产品技术专家,探讨云上安全问题及应对策略。首期节目聚焦ECS安全性,提出三道防线:数据安全、网络安全和身份认证与权限管理,确保用户在云端的数据主权和业务稳定。此外,阿里云还推出了“ECS 99套餐”,以高性价比提供全面的安全保障,帮助中小企业安全上云。
201962 14
对话 | ECS如何构筑企业上云的第一道安全防线
|
3天前
|
机器学习/深度学习 自然语言处理 PyTorch
深入剖析Transformer架构中的多头注意力机制
多头注意力机制(Multi-Head Attention)是Transformer模型中的核心组件,通过并行运行多个独立的注意力机制,捕捉输入序列中不同子空间的语义关联。每个“头”独立处理Query、Key和Value矩阵,经过缩放点积注意力运算后,所有头的输出被拼接并通过线性层融合,最终生成更全面的表示。多头注意力不仅增强了模型对复杂依赖关系的理解,还在自然语言处理任务如机器翻译和阅读理解中表现出色。通过多头自注意力机制,模型在同一序列内部进行多角度的注意力计算,进一步提升了表达能力和泛化性能。
|
7天前
|
存储 人工智能 安全
对话|无影如何助力企业构建办公安全防护体系
阿里云无影助力企业构建办公安全防护体系
1253 8
|
8天前
|
人工智能 自然语言处理 程序员
通义灵码2.0全新升级,AI程序员全面开放使用
通义灵码2.0来了,成为全球首个同时上线JetBrains和VSCode的AI 程序员产品!立即下载更新最新插件使用。
1306 24
|
9天前
|
机器学习/深度学习 自然语言处理 搜索推荐
自注意力机制全解析:从原理到计算细节,一文尽览!
自注意力机制(Self-Attention)最早可追溯至20世纪70年代的神经网络研究,但直到2017年Google Brain团队提出Transformer架构后才广泛应用于深度学习。它通过计算序列内部元素间的相关性,捕捉复杂依赖关系,并支持并行化训练,显著提升了处理长文本和序列数据的能力。相比传统的RNN、LSTM和GRU,自注意力机制在自然语言处理(NLP)、计算机视觉、语音识别及推荐系统等领域展现出卓越性能。其核心步骤包括生成查询(Q)、键(K)和值(V)向量,计算缩放点积注意力得分,应用Softmax归一化,以及加权求和生成输出。自注意力机制提高了模型的表达能力,带来了更精准的服务。
|
7天前
|
消息中间件 人工智能 运维
1月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
597 23
1月更文特别场——寻找用云高手,分享云&AI实践
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
|
13天前
|
人工智能 自然语言处理 API
阿里云百炼xWaytoAGI共学课DAY1 - 必须了解的企业级AI应用开发知识点
本课程旨在介绍阿里云百炼大模型平台的核心功能和应用场景,帮助开发者和技术小白快速上手,体验AI的强大能力,并探索企业级AI应用开发的可能性。