BigDecimal总结

      在最近的项目中,由于负责到了支付模块,就少不了使用BigDecimal。奈何这些Java基础都随着时光的流逝淡出了记忆,特意写篇总结博客方便使用和回顾,高手可以忽略。

    首先无论是float还是double都是浮点数,在进行计算时会损失一定的精度。但是在项目中,特别是金融项目,涉及到金额的计算都必须十分精确,在Java.math包中提供了BigDecimal,用来对于超过16位有效的数进行精确的运算。我们可以调用BigDecimal的相应方法来进行加减乘除,方法中的参数也必须是BigDecimal的对象。

1.构造器描述 
       BigDecimal(int)       创建一个具有参数所指定整数值的对象。 
       BigDecimal(double) 创建一个具有参数所指定双精度值的对象。 //不推荐使用
       BigDecimal(long)    创建一个具有参数所指定长整数值的对象。 
       BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。//推荐使用

2.方法描述 
       add(BigDecimal)        BigDecimal对象中的值相,然后返回这个对象。 
       subtract(BigDecimal) BigDecimal对象中的值相,然后返回这个对象。 
       multiply(BigDecimal)  BigDecimal对象中的值相,然后返回这个对象。 
       divide(BigDecimal)     BigDecimal对象中的值相,然后返回这个对象。 
       toString()                将BigDecimal对象的数值转换成字符串。 
       doubleValue()          将BigDecimal对象中的值以双精度数返回。 
       floatValue()             将BigDecimal对象中的值以单精度数返回。 
       longValue()             将BigDecimal对象中的值以长整数返回。 
       intValue()               将BigDecimal对象中的值以整数返回。

3.BigDecimal的大小比较 compareTo(BigDecimal )

如:

   BigDecimal判断是否为0:new BigDecimal("0.00").compareTo(BigDecimal.ZERO)  == 0 

   BigDecimal判断是否大于0:new BigDecimal("0.1").compareTo(BigDecimal.ZERO)>0 //返回true

4.BigDecimal格式化

       由于NumberFormat类的format()方法可以使用BigDecimal对象作为其参数,可以利用BigDecimal对超出16位有效数字的货币值,百分值,以及一般数值进行格式化控制。

       以利用BigDecimal对货币和百分比格式化为例。首先,创建BigDecimal对象,进行BigDecimal的算术运算后,分别建立对货币和百分比格式化的引用,最后利用BigDecimal对象作为format()方法的参数,输出其格式化的货币值和百分比。


    NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立货币格式化引用 
    NumberFormat percent = NumberFormat.getPercentInstance();  //建立百分比格式化引用 
    percent.setMaximumFractionDigits(3); //百分比小数点最多3位 
    
    BigDecimal loanAmount = new BigDecimal("15000.48"); //贷款金额
    BigDecimal interestRate = new BigDecimal("0.008"); //利率   
    BigDecimal interest = loanAmount.multiply(interestRate); //相乘
 
    System.out.println("贷款金额:\t" + currency.format(loanAmount)); 
    System.out.println("利率:\t" + percent.format(interestRate)); 
    System.out.println("利息:\t" + currency.format(interest)); 

结果:

贷款金额: ¥15,000.48 利率: 0.8% 利息: ¥120.00

BigDecimal格式化保留2为小数,不足则补0:

public class NumberFormat {
	
	public static void main(String[] s){
		System.out.println(formatToNumber(new BigDecimal("3.435")));
		System.out.println(formatToNumber(new BigDecimal(0)));
		System.out.println(formatToNumber(new BigDecimal("0.00")));
		System.out.println(formatToNumber(new BigDecimal("0.001")));
		System.out.println(formatToNumber(new BigDecimal("0.006")));
		System.out.println(formatToNumber(new BigDecimal("0.206")));
    }
	/**
	 * @desc 1.0~1之间的BigDecimal小数,格式化后失去前面的0,则前面直接加上0。
	 * 2.传入的参数等于0,则直接返回字符串"0.00"
	 * 3.大于1的小数,直接格式化返回字符串
	 * @param obj传入的小数
	 * @return
	 */
	public static String formatToNumber(BigDecimal obj) {
		DecimalFormat df = new DecimalFormat("#.00");
		if(obj.compareTo(BigDecimal.ZERO)==0) {
			return "0.00";
		}else if(obj.compareTo(BigDecimal.ZERO)>0&&obj.compareTo(new BigDecimal(1))<0){
			return "0"+df.format(obj).toString();
		}else {
			return df.format(obj).toString();
		}
	}
}

结果为:

3.44
0.00
0.00
0.00
0.01
0.21

5.BigDecimal常见异常

5.1、除法的时候出现异常

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result

原因分析:

​ 通过BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

解决方法:

​ divide方法设置精确的小数点,如:divide(xxxxx,2)

其实divide方法有可以传三个参数

public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) 

第一参数表示除数, 二个参数表示小数点后保留位数,第三个参数表示舍入模式。

只有在作除法运算或四舍五入时才用到舍入模式,有下面这几种:

  1. ROUND_UP :向远离零的方向舍入。舍弃非零部分,并将非零舍弃部分相邻的一位数字加一。
  2. ROUND_DOWN :向接近零的方向舍入。舍弃非零部分,同时不会非零舍弃部分相邻的一位数字加一,采取截取行为。
  3. ROUND_CEILING :向正无穷的方向舍入。如果为正数,舍入结果同ROUND_UP一致;如果为负数,舍入结果同ROUND_DOWN一致。注意:此模式不会减少数值大小。
  4. ROUND_FLOOR :向负无穷的方向舍入。如果为正数,舍入结果同ROUND_DOWN一致;如果为负数,舍入结果同ROUND_UP一致。注意:此模式不会增加数值大小。
  5. ROUND_HALF_UP :向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。如果舍弃部分>= 0.5,则舍入行为与ROUND_UP相同;否则舍入行为与ROUND_DOWN相同。这种模式也就是我们常说的我们的“四舍五入”。
  6. ROUND_HALF_DOWN :向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则为向下舍入的舍入模式。如果舍弃部分> 0.5,则舍入行为与ROUND_UP相同;否则舍入行为与ROUND_DOWN相同。这种模式也就是我们常说的我们的“五舍六入”。
  7. ROUND_HALF_EVEN :向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则相邻的偶数舍入。如果舍弃部分左边的数字奇数,则舍入行为与 ROUND_HALF_UP 相同;如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。注意:在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况,如果前一位为奇数,则入位,否则舍去。
  8. ROUND_UNNECESSARY :断言请求的操作具有精确的结果,因此不需要舍入。如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

按照各自的需要,可传入合适的第三个参数。四舍五入采用 ROUND_HALF_UP

6.BigDecimal总结

6.1、总结

  1. 在需要精确的小数计算时再使用BigDecimal,BigDecimal的性能比double和float差,在处理庞大,复杂的运算时尤为明显。故一般精度的计算没必要使用BigDecimal。
  2. 尽量使用参数类型为String的构造函数。
  3. BigDecimal都是不可变的(immutable)的, 在进行每一次四则运算时,都会产生一个新的对象 ,所以在做加减乘除运算时要记得要保存操作后的值。

6.2、工具类推荐

package com.vivo.ars.util;
import java.math.BigDecimal;

/**
 * 用于高精确处理常用的数学运算
 */
public class ArithmeticUtils {
    //默认除法运算精度
    private static final int DEF_DIV_SCALE = 10;

    /**
     * 提供精确的加法运算
     *
     * @param v1 被加数
     * @param v2 加数
     * @return 两个参数的和
     */

    public static double add(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).doubleValue();
    }

    /**
     * 提供精确的加法运算
     *
     * @param v1 被加数
     * @param v2 加数
     * @return 两个参数的和
     */
    public static BigDecimal add(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.add(b2);
    }

    /**
     * 提供精确的加法运算
     *
     * @param v1    被加数
     * @param v2    加数
     * @param scale 保留scale 位小数
     * @return 两个参数的和
     */
    public static String add(String v1, String v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.add(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 提供精确的减法运算
     *
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    public static double sub(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 提供精确的减法运算。
     *
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    public static BigDecimal sub(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.subtract(b2);
    }

    /**
     * 提供精确的减法运算
     *
     * @param v1    被减数
     * @param v2    减数
     * @param scale 保留scale 位小数
     * @return 两个参数的差
     */
    public static String sub(String v1, String v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.subtract(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 提供精确的乘法运算
     *
     * @param v1 被乘数
     * @param v2 乘数
     * @return 两个参数的积
     */
    public static double mul(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).doubleValue();
    }

    /**
     * 提供精确的乘法运算
     *
     * @param v1 被乘数
     * @param v2 乘数
     * @return 两个参数的积
     */
    public static BigDecimal mul(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.multiply(b2);
    }

    /**
     * 提供精确的乘法运算
     *
     * @param v1    被乘数
     * @param v2    乘数
     * @param scale 保留scale 位小数
     * @return 两个参数的积
     */
    public static double mul(double v1, double v2, int scale) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return round(b1.multiply(b2).doubleValue(), scale);
    }

    /**
     * 提供精确的乘法运算
     *
     * @param v1    被乘数
     * @param v2    乘数
     * @param scale 保留scale 位小数
     * @return 两个参数的积
     */
    public static String mul(String v1, String v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
     * 小数点以后10位,以后的数字四舍五入
     *
     * @param v1 被除数
     * @param v2 除数
     * @return 两个参数的商
     */

    public static double div(double v1, double v2) {
        return div(v1, v2, DEF_DIV_SCALE);
    }

    /**
     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
     * 定精度,以后的数字四舍五入
     *
     * @param v1    被除数
     * @param v2    除数
     * @param scale 表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    public static double div(double v1, double v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
     * 定精度,以后的数字四舍五入
     *
     * @param v1    被除数
     * @param v2    除数
     * @param scale 表示需要精确到小数点以后几位
     * @return 两个参数的商
     */
    public static String div(String v1, String v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v1);
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 提供精确的小数位四舍五入处理
     *
     * @param v     需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static double round(double v, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(v));
        return b.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 提供精确的小数位四舍五入处理
     *
     * @param v     需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static String round(String v, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(v);
        return b.setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 取余数
     *
     * @param v1    被除数
     * @param v2    除数
     * @param scale 小数点后保留几位
     * @return 余数
     */
    public static String remainder(String v1, String v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.remainder(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 取余数  BigDecimal
     *
     * @param v1    被除数
     * @param v2    除数
     * @param scale 小数点后保留几位
     * @return 余数
     */
    public static BigDecimal remainder(BigDecimal v1, BigDecimal v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        return v1.remainder(v2).setScale(scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 比较大小
     *
     * @param v1 被比较数
     * @param v2 比较数
     * @return 如果v1 大于v2 则 返回true 否则false
     */
    public static boolean compare(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        int bj = b1.compareTo(b2);
        boolean res;
        if (bj > 0)
            res = true;
        else
            res = false;
        return res;
    }
}

学而不思则罔,思而不学则殆。希望对看到的小伙伴们有所帮助!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
abstract (关键字) 抽象 ['æbstrækt] access vt.访问,存取 ['ækses]'(n.入口,使用权) algorithm n.算法 ['ælgәriðm] Annotation [java] 代码注释 [ænәu'teiʃәn] anonymous adj.匿名的[ә'nɒnimәs]'(反义:directly adv.直接地,立即[di'rektli, dai'rektli]) apply v.应用,适用 [ә'plai] application n.应用,应用程序 [,æpli'keiʃәn]' (application crash 程序崩溃) arbitrary a.任意的 ['ɑ:bitrәri] argument n.参数;争论,论据 ['ɑ:gjumәnt]'(缩写 args) assert (关键字) 断言 [ә'sә:t] ' (java 1.4 之后成为关键字) associate n.关联(同伴,伙伴) [ә'sәuʃieit] attribute n.属性(品质,特征) [ә'tribju:t] boolean (关键字) 逻辑的, 布尔型 call n.v.调用; 呼叫; [kɒ:l] circumstance n.事件(环境,状况) ['sә:kәmstәns] crash n.崩溃,破碎 [kræʃ] cohesion 内聚,黏聚,结合 [kәu'hi:ʒәn] (a class is designed with a single, well-focoused purpose. 应该不止这点) command n. 命令,指令 [kә'mɑ:nd](指挥, 控制) (command-line 命令行) Comments [java] 文本注释 ['kɒments] compile [java] v.编译 [kәm'pail]' Compilation n.编辑[,kɒmpi'leiʃәn] const (保留字) constant n. 常量, 常数, 恒量 ['kɒnstәnt] continue (关键字) coupling 耦合,联结 ['kʌpliŋ] making sure that classes know about other classes only through their APIs. declare [java] 声明 [di'klєә] default (关键字) 默认值; 缺省值 [di'fɒ:lt] delimiter 定义符; 定界符 Encapsulation[java] 封装 (hiding implementation details) Exception [java] 例外; 异常 [ik'sepʃәn] entry n.登录项, 输入项, 条目['entri] enum (关键字) execute vt.执行 ['eksikju:t] exhibit v.显示, 陈列 [ig'zibit] exist 存在, 发生 [ig'zist] '(SQL关键字 exists) extends (关键字) 继承、扩展 [ik'stend] false (关键字) final (关键字) finally (关键字) fragments 段落; 代码块 ['frægmәnt] FrameWork [java] 结构,框架 ['freimwә:k] Generic [java] 泛型 [dʒi'nerik] goto (保留字) 跳转 heap n.堆 [hi:p] implements (关键字) 实现 ['implim
ARCH4系统开发指南 1 ARCH4开发小组 1 1 前言 7 1.1 文档编写目的 7 1.2 文档适用范围 7 1.3 修订历史 8 1.4 参考资料 8 2 常用功能处理方式 9 2.1 如何执行条件查询 9 2.1.1 查询示例 9 2.1.2 查询限制 9 2.1.2.1 Like 9 2.1.2.2 In 10 2.1.2.3 Between 10 2.1.2.4 Equal 10 2.1.2.5 NotEqual 10 2.1.2.6 GreaterThan 10 2.1.2.7 GreaterEqual 11 2.1.2.8 LessThan 11 2.1.2.9 LessEqual 11 2.1.2.10 直接Sql限制 11 2.1.2.11 多条件限制 11 2.1.3 查询排序 11 2.2 如何执行HQL查询 11 2.3 如何执行SQL查询 12 2.4 如何使用Mail 12 2.4.1 确保资源文件正确 12 2.4.1.1 确认mail.properties文件设置正确 12 2.4.1.2 确认applicationContext-mail.xml文件设置正确 12 2.4.1.3 确认applicationContext-service.xml文件设置正确 12 2.4.2 编写使用mailService的代码 12 2.5 如何使用规则引擎 14 2.5.1 规则引擎使用说明 14 2.5.2 确保资源文件正确 14 2.5.2.1 确认applicationContext-rule.xml文件设置正确 14 2.5.2.2 确认applicationContext-service.xml文件设置正确 15 2.5.3 规则引擎的使用方式 15 2.6 如何使用代码翻译 16 2.6.1 配置文件 16 2.6.2 在Action中翻译代码 17 2.6.3 在jsp页面中翻译代码 18 2.7 如何使用取单号服务 18 2.7.1 配置文件 19 2.7.2 取单号使用方式 19 2.8 如何使用Hibernate操作Informix数据库 20 2.8.1 实现对LOB数据对象的支持 20 2.8.1.1 配置dataAccessContext-hibernate.xml 20 2.8.1.2 操作CLOB数据 20 2.8.1.3 操作BLOB数据 21 2.8.2 实现Sequence主键生成策略 21 2.9 如何清除Hibernate Session中的对象 22 2.10 使用日期控件 22 2.11 如何引入外部文件 23 2.11.1 主页面采用include方式,引入各个子页面jsp文件 23 2.11.2 主页面用${ctx}方式,引入超链接或资源文件等。 23 2.11.3 主页面用${ctx}方式,引入frame中包含的各个页面。 23 2.12 如何处理代码双击域 24 2.12.1 普通的代码双击域 24 2.12.2 多行输入域中的代码双击域 26 2.12.3 代码双击域的后台处理 27 2.12.4 代码双击域的常见问题 28 2.13 表单提交时调用的JS函数 28 2.13.1 submitFormToSave(form, funcSubmit) 28 2.13.2 submitFormWithoutConfirm(form, funcSubmit) 28 2.13.3 为什么要引入funcSubmit参数 29 2.13.4 为什么要先弹出“Are you sure?”确认信息再判断funcSubmit变量 29 2.14 日期时间和DateTime对象 29 2.15 Service和Dao的关系 31 2.16 如何调用其他Service 31 2.17 校验框架 32 2.17.1 单行校验 32 2.17.2 多行校验 32 2.18 事件处理机制 34 2.18.1 使用Observer模式 34 2.18.2 程序修改方式 34 2.19 用AJAX获取数据(通用做法) 36 2.19.1 “查看条款内容”的操作情景 36 2.19.2 前台JS函数调用后台JAVA类 36 2.19.3 后台JAVA类为前台JS函数返回结果 42 2.19.4 总结 45 2.20 金额的JAVA精确计算 45 2.20.1 double型数据不能进行精确计算 45 2.20.2 四舍五入 46 2.20.3 科学记数法 47 2.20.4 java.math.BigDecimal介绍 48 2.20.4.1 BigDecimal的构造方法 48 2.20.4.2 用BigDecimal进行四则运算 49 2.20.4.3 舍入模式 51 2.20.4.3.1 ROUND_CEILING 51 2.20.4.3.2 ROUND_FLOOR 52 2.20.4.3.3 ROUND_DOWN 53 2.20.4.3.4 ROUND_UP 54 2.20.4.3.5 ROUND_ UNNECESSARY 55 2.20.4.3.6 ROUND_HALF_DOWN 56 2.20.4.3.7 ROUND_HALF_UP 57 2.20.4.3.8 ROUND_HALF_EVEN 58 2.20.4.4 用BigDecimal进行除法运算 60 2.20.5 系统中精确计算的原则 60 2.21 金额的JS精确计算 60 2.22 根据语种取得代码名称 62 2.23 取兑换率的Javascript函数 62 2.23.1 一个原币和一个折币getGgExchProcess 62 2.23.2 一个原币和多个折币getGgExchListProcess 63 2.23.3 多个原币和一个折币getGgExchListListProcess 63 2.23.4 关于回调函数 64 2.24 同一个Edit页面用于多模块多actionType的实现方法 64 2.25 在Action和ServiceSpringImpl中读取资源文件 65 2.26 异常管理 65 2.26.1 分类概述 65 2.26.2 异常与系统架构的关系图 66 2.26.3 异常类的使用方法 67 2.26.3.1 ExceptionCause 67 2.26.3.2 BusinessException和PermissionException 67 2.26.3.3 DataVerifyException 68 2.26.3.4 ExceptionHelper 68 2.26.3.5 应用服务器异常 69 2.27 日志管理 69 2.27.1 概述 69 2.27.2 基本用法 69 2.27.3 什么是NDC 70 2.28 校验管理 70 2.28.1 Struts2校验框架简述 70 2.28.2 Struts2校验框架应用 71 2.28.2.1 校验配置文件 71 2.28.2.2 角色Insert页面示例 71 2.28.2.3 用户Query页面示例 73 2.28.2.4 多行输入域校验 75 2.29 多语言管理 77 2.29.1 定义输入域的name属性和资源文件 77 2.29.2 用户登录语种 78 2.30 使用select…for update解决并发问题 78 2.31 新增成功/失败弹出对话框而不离开窗口 78 2.32 权限检查调用点 79 2.32.1 为查询方法增加权限控制(PowerUtils.addPower()) 79 2.32.2 为按钮增加权限控制(在平台子系统配置方法任务关联) 81 2.33 保存成功后提示alert()而不跳转页面 82 3 页面多行录入的处理方案 83 3.1 概述 83 3.2 设计思想 84 3.3 方法调用顺序 85 3.3.1 点击增加按钮时 85 3.3.2 点击删除按钮时 85 3.4 Javascript API 85 3.4.1 insertRow 85 3.4.2 deleteRow 85 3.4.3 getOrderForMulLine 86 3.4.4 getFirstOrderForMulLine 86 3.4.5 getLastOrderForMulLine 86 3.4.6 getRecentDeletedTBody 87 3.4.7 getInnerOrderForMulLine 88 3.4.8 getTableOrderForMulLine 88 3.5 举例 88 3.5.1 两层嵌套的多行输入域举例 88 3.5.1.1 样例演示 88 3.5.1.2 内层和外层嵌套的关系图 92 3.5.1.3 注意事项 93 3.5.2 三层嵌套的多行输入域举例 93 3.5.2.1 样例演示 93 3.5.2.2 三层嵌套的关系图 94 3.5.3 四层嵌套的多行输入域举例 95 3.5.3.1 样例演示 95 3.5.3.2 四层嵌套的关系图 95 4 JSP页面风格规范 95 4.1 新增/修改页面风格 95 4.2 查询条件页面风格 97 4.3 查询结果页面风格 98 5 缓存管理方案 99 5.1 EHCache介绍 99 5.2 应用EHCache 99 6 系统的JSP标签库 100 6.1 双击域 100 6.2 <app:validate/> 103 6.3 <app:select/> 103 6.4 <app:navigate/>和<app:command/> 104 6.5 <app:localeInputName/> 104 6.6 <app:translateCode/> 105 6.7 <app:localeName/> 105 7 系统基础类库 106 7.1 ins.framework.dao 106 7.1.1 GenericDao<T, PK extends Serializable> 106 7.1.2 EntityDaoHibernate 106 7.1.3 GenericDaoHibernate<T, PK extends Serializable> 107 7.2 ins.framework.common 107 7.2.1 Page 107 7.2.2 DateTime 107 8 开发常见问题 110 8.1 informix jdbc中文配置 110 8.2 服务器启动时报Connection refused 110 8.3 OC4J不能启动和清理OC4J缓存 111 8.4 “a different object with the session identifier…”异常 111 8.5 声明对象句柄时不需要使用new关键字 112 8.6 一个POJO对象只能映射为一条数据库记录 114 8.6.1 实体对象生命周期 115 8.6.2 实体对象的识别 115 8.7 String对象、StringBuilder对象和原始数据类型的特点 116 8.7.1 String对象的“equals()”和“==” 116 8.7.2 StringBuilder对象 116 8.7.3 原始数据类型的“==” 117 8.8 代码双击域onchange之后弹出iframe窗口 117 8.9 系统登录安全认证配置 119 8.10 Service互调的实现 119 8.11 页面刷新几次后,有些输入域出现空白现象 120 9 系统遗留问题 120 10 附录 121 10.1 嵌套的多行输入域的样例文件 121 10.1.1 NestedMultiLineExampleLayer2.jsp源码 121 10.1.2 NestedMultiLineExampleLayer3.jsp源码 125 10.1.3 NestedMultiLineExampleLayer4.jsp源码 129 10.2 JSP页面风格规范样例文件 134 10.2.1 UserList.jsp 134 10.2.2 UserEdit.jsp 134

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值