深入理解隐式类型转换

一、隐式类型转换的规则

在C语言中,自动类型转换遵循以下规则:

  1. 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
  2. 转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。
    a、若两种类型的字节数不同,转换成字节数高的类型
    b、若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型
  3. 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
  4. char型和short型参与运算时,必须先转换成int型。
  5. 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。

二、整型提升

1.提升的原因

C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

2.提升的意义

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。

3.如何进行提升

整型提升(隐式转换的一种)是按照变量自身的数据类型的符号位提升的。
原理:有符号补符号位;无符号无脑补0。


  1. 负数的整形提升
    char c1 = -1;
    变量c1的二进制位(补码)中只有8个比特位:
    1111 111
    因为 char 为有符号的 char
    所以整形提升的时候,高位补充符号位,即为1
    提升之后的结果是:
    1111 1111 1111 1111 1111 1111 1111 1111

  2. 正数的整形提升
    char c2 = 1;
    变量c2的二进制位(补码)中只有8个比特位:
    0000 0001
    因为 char 为有符号的char
    所以整形提升的时候,高位补充符号位,即为0
    提升之后的结果是:
    0000 0000 0000 0000 0000 0000 0000 0001

  3. 无符号整形提升,高位补0请添加图片描述

4.整型提升的例子

例1:
很棒的一道题

int main()
{
	char a = 0xb6;
	short b = 0xb600;
	int c = 0xb6000000;
	if (a == 0xb6)
		printf("a");
	if (b == 0xb600)
		printf("b");
	if (c == 0xb6000000)
		printf("c");
	return 0;
}

输出结果为:

c

分析过程:
题中的a,b要进行整形提升,但是c不需要整形提升a,b整形提升之后,变成了负数,所以表达式a == 0xb6 , b == 0xb600 的结果是假,但是c不发生整形提升,则表达式c == 0xb6000000的结果是真.请添加图片描述
例2:

int main()
{
 char c = 1;
 printf("%u\n", sizeof(c));
 printf("%u\n", sizeof(+c));
 printf("%u\n", sizeof(!c));
 return 0; }

实例2中的,c只要参与表达式运算,就会发生整形提升,表达式+c ,就会发生提升,所以 sizeof(+c)是4个字节.
表达式 -c也会发生整形提升,所以sizeof(-c)是4个字节,但是sizeof(c) ,就是1个字节.

三、算术转换

1.如何进行转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换
请添加图片描述
如果在同一个运算当中的操作数类型不一样,等级较低的都往等级较高的转换。
注意:
但是算术转换要合理,要不然会有一些潜在的问题

float f = 3.14;
int num = f;//隐式转换,会有精度丢失

2.例题

int main(void)
{
	unsigned char a = 0;
	unsigned char b = 255;
	unsigned char c = 255;
	a = b + c;
	printf("a = %d\n", a);
	return 0;
}

输出结果:

在这里插入图片描述

分析:
请添加图片描述
b和c的值被提升为普通整型,然后再执行加法运算。
加法运算完成之后,结果将被截断,然后再存储于a中。
注意:

char a = 10;
printf("%d,a);
int b = a;

这也是函数,传参就要发生值拷贝,就要用到CPU,也同样要发生隐式转换。

3.总结

为什么要发生转换

硬件:CPU寄存器的比特位是统一的,将内存中的数据放入寄存器中就会发生隐式转换
软件:c语言的操作符对多个操作数进行操作时,必须保证其类型一致

四、操作符的属性

1.操作符

复杂表达式的求值有三个影响的因素。

  1. 操作符的优先级。决定了有多个操作符和多个操作数时,先执行那部分。
  2. 操作符的结合性。当优先级相同,多个或单个操作符之间从左向右执行还是从右向左执行。
  3. 是否控制求值顺序。特定的某些表达式在进行求值,根据不同的条件产出不同的求值过程。

两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。

操作符优先级,从上往下
重点要记住的几个

操作符描述用法示例结果类型结合性是否控制求值顺序
()聚组(表达式)与表达式同N/A
.访问结构成员lexp.member_namelexpL-R
->访问结构指针成员rexp->member_namelexpL-R
++后缀自增lexp ++rexpL-R
- -后缀自减lexp - -rexpL-R
++前缀自增++lexprexpR-L
- -前缀自减- - lexprexpR-L
*间接访问* rexplexpR-L

2.问题表达式

表达式1
a*b + c*d + e*f

注释:代码1在计算的时候,由于的优先级比+的优先级高,只能保证的计算是比+早,但是优先级并不能决定第三个*比第一个+早执行。

所以表达式的计算机顺序就可能是:

a*b
c*d
a*b + c*d
e*f
a*b + c*d + e*f
或者:
a*b
c*d
e*f
a*b + c*d
a*b + c*d + e*f


表达式2
c + --c;

同上,操作符的优先级只能决定自减–的运算在+的运算的前面,但是我们并没有办法得知,+操作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预的,是有歧义的。


代码3-非法表达式

int main()
{
	int i = 10;
	i = i-- - --i * (i = -3) * i++ + ++i;
	printf("i = %d\n", i);
	return 0;
}

表达式3在不同编译器中测试结果:非法表达式程序的结果
vs2013中结果为

4

linux中结果为

36


代码4

int fun()
{
     static int count = 1;
     return ++count; }
int main()
{
     int answer;
     answer = fun() - fun() * fun();
     printf( "%d\n", answer);//输出多少?
     return 0; }

此代码也有问题

上述代码 answer = fun() - fun() * fun(); 中我们只能通过操作符的优先级得知:先算乘法,再算减法。
函数的调用先后顺序无法通过操作符的优先级确定。

总结:我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题的。

  • 27
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
 针对数据库的启动和关闭、控制文件与数据库初始化、参数及参数文件、数据字典、内存管理、Buffer Cache与Shared Pool原理、重做、回滚与撤销、等待事件、性能诊断与SQL优化等几大Oracle热点主题,本书从基础知识入手,深入研究相关技术,并结合性能调整及丰富的诊断案例,力图将Oracle知识全面、系统、深入地展现给读者。   本书给出了大量取自实际工作现场的实例,在分析实例的过程中,兼顾深度与广度,不仅对实际问题的现象、产生原因和相关的原理进行了深入浅出的讲解,更主要的是,结合实际应用环境,提供了一系列解决问题的思路和方法,包括详细的操作步骤,具有很强的实战性和可操作性,适用于具备一定数据库基础、打算深入学习Oracle技术的数据库从业人员,尤其适用于入门、进阶以及希望深入研究Oracle技术的数据库管理人员。 第1章 数据库的启动和关闭 1 1.1 数据库的启动 1 1.1.1 启动数据库到NOMOUNT状态的过程 2 1.1.2 启动数据库到MOUNT状态 18 1.1.3 启动数据库OPEN阶段 26 1.2 数据库的访问 37 1.2.1 客户端的TNSNAMES.ORA文件配置 37 1.2.2 服务器端的监听器文件listener.ora配置 39 1.2.3 通过不同服务器名对数据库的访问 41 1.2.4 动态监听器注册服务 42 1.3 数据库的关闭 46 1.3.1 数据库关闭的步骤 46 1.3.2 几种关闭方式的对比 48 第2章 控制文件与数据库初始化 51 2.1 控制文件的内容 51 2.2 SCN 53 2.2.1 SCN的定义 53 2.2.2 SCN的获取方式 53 2.2.3 SCN的进一步说明 54 2.3 检查点(Checkpoint) 57 2.3.1 检查点(Checkpoint)的工作原理 57 2.3.2 常规检查点与增量检查点 59 2.3.3 LOG_CHECKPOINT_TO_ALERT参数 63 2.3.4 控制文件与数据文件头信息 64 2.3.5 数据库的启动验证 66 2.3.6 使用备份的控制文件 70 2.3.7 FAST_START_MTTR_TARGET 71 2.3.8 关于检查点执行的案例 74 2.3.9 Oracle 10g自动检查点调整 75 2.3.10 检查点信息及恢复起点 78 2.3.11 正常关闭数据库的状况 78 2.3.12 数据库异常关闭的情况 80 2.3.13 数据库并行恢复案例一则 82 2.3.14 判断一个死事务的恢复进度 85 2.4 数据库的初始化 86 2.4.1 bootstrap$及数据库初始化过程 86 2.4.2 bootstrap$的定位 88 2.4.3 Oracle中独一无二的Cache对象 89 2.4.4 Oracle数据库的引导 91 2.4.5 系统对象与bootstrap$ 92 2.4.6 bootstrap$的重要性 94 2.4.7 BBED工具的简要介绍 95 2.4.8 坏块的处理与恢复 97 第3章 参数及参数文件 103 3.1 初始化参数的分类 103 3.1.1 推导参数(Derived Parameters) 103 3.1.2 操作系统依赖参数 104 3.1.3 可变参数 104 3.1.4 初始化参数的获取 105 3.2 参数文件 107 3.2.1 PFILE和SPFILE 108 3.2.2 获取参数的视图 110 3.2.3 SPFILE的创建 111 3.2.4 SPFILE的搜索顺序 112 3.2.5 使用PFILE/SPFILE启动数据库 112 3.2.6 修改参数 113 3.2.7 解决SPFILE参数修改错误 118 3.2.8 重置SPFILE中设置的参数 120 3.2.9 判断是否使用了SPFILE 120 3.2.10 SPFILE的备份与恢复 121 3.2.11 Oracle 11g参数文件恢复 127 3.2.12 如何设置Events事件 128 3.2.13 导出SPFILE文件 129 3.3 诊断案例之一:参数文件 131 3.3.1 登录系统检查告警日志文件 131 3.3.2 尝试重新启动数据库 132 3.3.3 检查数据文件 132 3.3.4 MOUNT数据库,检查系统参数 133 3.3.5 检查参数文件 133 3.3.6 再次检查alert文件 134 3.3.7 修正PFILE 135 3.3.8 启动数据库 135 3.4 诊断案例之二:RAC环境参数文件 135 3.4.1 数据库资源异常 135 3.4.2 问题的发现 136 3.4.3 参数文件问题的解决 137 第4
英文版深入理解Scala。 本书由Scala之父作序推荐,深入探讨了Scala里几个较为复杂的领域,包括类型系统的高阶内容、隐式转换、特质的组合技巧、集合、Actor、函数式编程的范畴论等,而且不是干巴巴地讲述语言和库的概念。本书示例丰富,是目前为止该领域最好的参考书籍,非常适合有经验的Scala程序员向专家水平进阶的参考读物。本书适合想要了解Scala语言的底层机制和技术细节的读者阅读参考,是学习Scala语言的上上之选择。 Scala是一种多范式的编程语言,它既支持面向对象编程,也支持函数式编程的各种特性。 本书深入探讨了Scala里几个较为复杂的领域,包括类型系统的高阶内容、隐式转换、特质的组合技巧、集合、Actor、函数式编程的范畴论等,而且不是干巴巴地讲述语言和库的概念。本书充满各种实用的建议和最佳实践,可以来帮助读者学习怎样把Scala里较少被掌握的部分应用到工作中。 本书不是Scala的入门级教程,而是适合有经验的Scala程序员向专家水平进阶的参考读物。本书适合想要了解Scala语言的底层机制和技术细节的读者阅读参考。 专业书评 “权威并且易于理解”。——Martin Odersky Scala之父 “带你深入Scala的内部工作机制”。——John C Tyler PROS Pricing “目前为止,我在技术书里读到过的最好的示例”。——Eric Weinberg Wagger Designs “一本开拓眼界的书,现在我对Scala知其所以然了”。——John Criffin Hibernate Search in Action合著者
在国际象棋中,学会如何移动棋子只能算是入门:要想掌控整个棋局,我们必须了解自己所下的每一步棋后的策略和战术。在C++中也同样如此。掌握正确的策略可以帮助我们避免常见的陷阱,并提高我们的工作效率。在本书中,C++专家Rob Murray就与我们分享了他宝贵的经验和建议,以帮助初中级C++程序员得到进一步的提高。 在本书中,作者大量采用了实际开发中的代码来作为示例,向读者展示了那些有用的编程策略,并对那些有害的做法进行了警示。为了帮助读者更好地理解,在书中的每一章结束前,在该章中被介绍过的主要内容都被放到了一个列表中,此外,书中还给出了一些问题来激励读者们进行更多的思考和讨论。 本书在一开始就向我们讲解了如何为我们的设计选择正确的抽象,提示我们注意抽象和现实之间的区别。然后,我们就将学到如何将已得到的抽象转化成一个(或多个)C++中的类,期间进行的讨论所涵盖的范围上至高层的设计策略,下至底层的接口和实现细节。 接下来本书对单继承和多重继承进行了深入的探索。一开始书中会给出一个关于它们应该用在设计的什么地方的讨论,然后就是一些详细的示例代码,用来向我们演示如何在实践中使用这些概念。对于 mulu 代译者序 序 第0章 简介 0.1 关于示例代码 0.2 本书的组织 0.3 问题 0.4 语言规则 第1章 抽象 1.1 有关电话号码的抽象模型 1.2 抽象模型间的关系 1.3 请考虑边界条件 1.4 使用CRC卡片来辅助设计 1.5 小结 1.6 问题 第2章 类 2.1 构造函数 2.2 赋值 2.3 公用数据 2.4 隐式类型转换 2.5 操作符重载:成员或非成员? 2.6 重载、缺省值以及省略符 2.7 Const 2.8 返回值为引用 2.9 静态对象的构造 2.10 小结 2.11 问题 第3章 句柄 3.1 一个String类 3.2 使用计数器来避免多份拷贝 3.3 避免进行重编译:Cheshire Cat 3.4 使用句柄来隐藏设计 3.5 多种实现 3.6 作为对象的句柄 3.7 综述 3.8 小结 3.9 问题 第4章 继承 4.1 is-a关系 4.2 公有继承 4.3 私有继承 4.4 保护型继承 4.5 与基类抽象的一致性 4.6 纯虚函数 4.7 有关继承的细节和陷阶 4.8 小结 4.9 问题 第5章 多重继承 5.1 作为交集的多重继承 5.2 虚基类 5.3 一些有关多重继承的细节问题 5.4 小结 5.5 问题 第6章 考虑继承的设计 6.1 被保护的接口 6.2 我们的设计是否应该考虑到继承? 6.3 一些为继承所做的设计的例子 6.4 结论 6.5 小结 6.6 问题 第7章 模板 7.1 模板类Pair 7.2 一些有关模板的细节 7.3 模板的实例化 7.4 智能指针 7.5 作为模板参数的表达式 7.6 模板函数 7.7 小结 7.8 问题 第8章 模板的高级用法 8.1 使用了模板的容器类 8.2 示例:Block 8.3 有关Block的设计细节 8.4 带有迭代器的容器:List 8.5 迭代器的设计细节 8.6 性能上的考虑 8.7 对模板参数的限制 8.8 模板特化 8.9 小结 8.10 问题 第9章 重用 9.1 发现和获得 9.2 健壮性 9.3 内存管理 9.4 可选的内存分配方案 9.5 传递参数给operator new 9.6 管理外部资源 9.7 寻找有关内存的bug 9.8 名字冲突 9.9 性能 9.10 不要去猜想,而应该度量! 9.11 算法 9.12 动态内存分配中的瓶颈 9.13 内嵌 9.14 Tiemann法则 9.15 小结 9.16 问题 第10章 异常 10.1 一个负面的声明 10.2 为什么需要异常? 10.3 一个异常的例子 10.4 异常只应该用来表述异常情况 10.5 理解异常 10.6 责任评估 10.7 设计异常对象 10.8 小结 10.9 问题 第11章 向C++移植 11.1 选择使用C++ 11.2 采用C++ 11.3 设计和实现 11.4 开发一个坚实的基础 11.5 相关的思考 11.6 小结 11.7 问题
本书是广受赞誉的Struts 2优秀教程,它全面而深入地阐述了Struts 2的各个特性,并指导开发人员如何根据遇到的问题对症下药,选择使用最合适的特性。作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,如数据类型转换、文件上传和下载、提高Struts 2应用的安全性、调试与性能分析、FreeMarker、Velocity、Ajax,等等。跟随作者一道深入Struts 2,聆听大量来之不易的经验之谈,你对Struts 2开发框架的理解和应用水平都将更上一层楼。本书适合Java Web 程序员阅读和参考 第1章 Model 2应用程序 1 1.1 Model 2概览 1 1.2 带servlet控制器的Model 2 2 1.2.1 Product动作类 3 1.2.2 ControllerServlet类 4 1.2.3 视图 6 1.2.4 部署描述文件 8 1.2.5 示例程序的运行 9 1.3 带过滤器调度程序的Model 2 9 1.4 小结 13 第2章初识Struts 14 2.1 Struts的优点 14 2.2 Struts的动作处理流程 15 2.3 拦截器 17 2.4 Struts配置文件 18 2.4.1 struts.xml文件 19 2.4.2 struts.properties文件 26 2.5 Struts应用程序示例 26 2.5.1 部署描述文件和Struts配置文件 27 2.5.2 动作类 28 2.5.3 运行app02a程序 29 2.6 依赖注入 29 2.6.1 概述 29 2.6.2 依赖注入的几种方式 31 2.7 小结 31 第3章动作与结果 32 3.1 动作类 32 3.2 如何访问资源 34 3.2.1 ServletActionContext对象 34 3.2.2 Aware接口 35 3.2.3 通过Aware接口访问资源 38 3.3 把静态参数传递给一个动作 41 3.4 ActionSupport类 41 3.5 结果 42 3.5.1 Chain 43 3.5.2 Dispatcher 44 3.5.3 FreeMarker 44 3.5.4 HttpHeader 44 3.5.5 Redirect 45 3.5.6 Redirect Action 46 3.5.7 Stream 47 3.5.8 Velocity 47 3.5.9 XSLT 47 3.5.10 PlainText 47 3.6 异常处理:exception-mapping元素 47 3.7 通配符映射 48 3.8 动态方法调用 51 3.9 对动作类进行测试 51 3.10 小结 51 第4章 OGNL 52 4.1 Value Stack栈 52 4.2 读取Object Stack里的对象的属性 53 4.3 读取Context Map里的对象的属性 54 4.4 如何调用字段和方法 55 4.5 如何访问数组类型的属性 56 4.6 如何访问List类型的属性 56 4.7 如何访问Map类型的属性 57 4.8 JSP EL:当OGNL帮不上忙时 58 4.9 小结 58 第5章表单标签 59 5.1 Struts标签的使用方法 59 5.2 表单标签的共同属性 60 5.3 form标签 62 5.4 textfield、password、hidden标签 63 5.5 submit标签 65 5.6 reset标签 65 5.7 label标签 66 5.8 head标签 66 5.9 textarea标签 66 5.10 checkbox标签 67 5.11 list、listKey和listValue属性 72 5.11.1 赋值一个String 72 5.11.2 赋值一个Map 73 5.11.3 赋值一个Collection或一个对象数组 73 5.12 radio标签 74 5.13 select标签 76 5.14 用optgroup标签对选项进行分组 79 5.15 checkboxlist标签 82 5.16 combobox标签 83 5.17 updownselect标签 85 5.18 optiontransferselect标签 87 5.19 doubleselect标签 90 5.20 主题 92 5.21 小结 94 第6章通用标签 95 6.1 property标签 95 6.2 a标签 97 6.3 action标签 97 6.4 param标签 98 6.5 bean标签 98 6.6 date标签 100 6.7 include标签 100 6.8 set标签 101 6.9 push标签 103 6.10 url标签 104 6.11 if、else和elseif标签 105 6.12 iterator标签 107 6.13 append标签 110 6.14 merge标签 111 6.15 generator标签 113 6.16 sort标签 116 6.17 subset标签 118 6.18 小结 119 第7章类型转换 120 7.1 类型转换概述 120 7.2 类型转换错误消息的定制 121 7.3 类型转换器的定制 125 7.3.1 对自定义的类型转换器进行配置 126 7.3.2 自定义的类型转换器示例 127 7.4 扩展StrutsTypeConverter类 130 7.5 与复杂对象配合使用 134 7.6 与Collection配合使用 137 7.7 与Map配合使用 142 7.8 小结 145 第8章输入验证 146 8.1 验证程序概述 146 8.2 验证程序的配置 147 8.3 Struts内建验证程序 148 8.3.1 required验证程序 149 8.3.2 requiredstring验证程序 150 8.3.3 stringlength验证程序 152 8.3.4 int验证程序 154 8.3.5 date验证程序 156 8.3.6 email验证程序 157 8.3.7 url验证程序 159 8.3.8 regex验证程序 160 8.3.9 expression和fieldexpression验证程序 161 8.3.10 conversion验证程序 164 8.3.11 visitor验证程序 166 8.4 编写自定义的验证程序 173 8.4.1 注册 176 8.4.2 示例 177 8.5 利用Validateable接口实现编程验证 180 8.6 小结 182 第9章消息处理与国际化 183 9.1 地区和Java资源绑定 183 9.2 Struts中的国际化支持 185 9.3 text标签 188 9.4 i18n标签 191 9.5 以手动方式选择一个资源包 193 9.6 小结 195 第10章 Model Driven和Preparable拦截器 196 10.1 把动作与模型隔离开 196 10.2 Model Driven拦截器 197 10.3 Preparable拦截器 201 10.4 小结 206 第11章持久层 207 11.1 DAO模式 207 11.1.1 DAO模式的最简单实现 208 11.1.2 使用DAO接口的DAO模式 208 11.1.3 使用Abstract Factory模式的DAO模式 209 11.2 实现DAO模式 209 11.2.1 DAO接口和DAOBase类 210 11.2.2 EmployeeDAO类 213 11.2.3 EmployeeDAOMySQLImpl类 214 11.2.4 DAOFactory类 218 11.2.5 EmployeeManager类 219 11.2.6 运行app11a应用程序 220 11.3 Hibernate 221 11.4 小结 221 第12章文件的上传 222 12.1 文件上传概述 222 12.2 在Struts里上传文件 223 12.3 File Upload拦截器 224 12.4 上传单个文件示例 225 12.5 上传多个文件示例 227 12.6 小结 230 第13章文件的下载 231 13.1 文件下载概述 231 13.2 Stream结果类型 232 13.3 文件下载功能的编程实现 235 13.4 小结 238 第14章提高Struts应用程序的安全性 239 14.1 用户和角色 239 14.2 编写安全策略 240 14.2.1 保护资源 240 14.2.2 指定登录方法 241 14.3 身份验证方法 242 14.3.1 使用基本身份验证方法 243 14.3.2 使用基于表单的身份验证方法 245 14.4 隐藏资源 247 14.5 Struts安全配置 248 14.6 以编程方式提高安全性 250 14.6.1 getAuthType方法 250 14.6.2 isUserInRole方法 250 14.6.3 getUserPrincipal方法 251 14.6.4 getRemoteUser方法 251 14.7 小结 251 第15章防止重复提交 252 15.1 标记管理 252 15.2 使用Token拦截器 253 15.3 使用Token Session拦截器 256 15.4 小结 257 第16章调试与性能分析 258 16.1 debug标签 258 16.2 Debugging拦截器 259 16.3 性能分析 261 16.4 小结 262 第17章进度条 263 17.1 Execute and Wait拦截器 263 17.2 使用Execute and Wait拦截器 264 17.3 使用一个自定义的“等待”页面 265 17.4 小结 266 第18章定制拦截器 267 18.1 Interceptor接口 267 18.2 编写一个自定义的拦截器 268 18.3 使用DataSourceInjectorInterceptor拦截器 269 18.4 小结 273 第19章定制结果类型 274 19.1 概述 274 19.2 编写一个自定义的结果类型 274 19.3 使用新的结果类型 277 19.4 小结 279 第20章 Velocity 280 20.1 概述 280 20.2 Velocity隐式对象 281 20.3 标签 281 20.4 Velocity示例 282 20.5 小结 284 第21章 FreeMarker 285 21.1 概述 285 21.2 FreeMarker标签 286 21.3 示例 287 21.4 小结 289 第22章 XSLT结果类型 290 22.1 概述 290 22.2 XSLT结果类型 292 22.3 示例 294 22.4 小结 295 第23章插件 296 23.1 概述 296 23.2 从哪里获得插件 296 23.3 编写一个自定义的插件 296 23.4 使用Captcha插件 297 23.5 小结 300 第24章 Tiles插件 301 24.1 JSP include指令/标签的不足 302 24.2 Tiles布局和定义 303 24.2.1 布局页面 303 24.2.2 Tiles定义 304 24.3 Struts Tiles插件 305 24.4 Struts Tiles示例 306 24.5 小结 309 第25章 JFreeChart插件 310 25.1 JFreeChart API 310 25.1.1 JFreeChart类 310 25.1.2 Plot抽象类 310 25.2 使用标准的插件 311 25.3 使用BrainySoftware JFreeChart插件 313 25.4 小结 315 第26章零配置 316 26.1 准备工作 316 26.2 注解 317 26.2.1 @Result注解 317 26.2.2 @Results注解 318 26.2.3 @Namespace注解 318 26.2.4 @ParentPackage注解 319 26.3 CodeBehind插件 319 26.4 小结 321 第27章 Ajax 322 27.1 Ajax概述 322 27.2 Dojo的事件系统 323 27.3 使用Struts Dojo插件 324 27.4 head标签 324 27.5 div标签 325 27.5.1 示例程序1 326 27.5.2 示例程序2 326 27.5.3 示例程序3 327 27.6 a标签 328 27.7 submit标签 330 27.8 bind标签 331 27.9 datetimepicker标签 333 27.10 tabbedpanel标签 334 27.11 textarea标签 336 27.12 autocompleter标签 337 27.12.1 示例程序1 339 27.12.2 示例程序2 339 27.12.3 示例程序3 340 27.13 tree和treenode标签 341 27.13.1 示例程序1 342 27.13.2 示例程序2 343 27.14 小结 345 附录A Struts配置 346 附录B JSP EL语言 361 附录C Java注解 370
内容简介 Struts 2 是Java Web 应用首选的MVC 框架。《深入浅出Struts2》对Struts 2 的工作机理进行了透彻的阐述。书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。书中概念清晰、环环相扣,便于读者高效地学习。《深入浅出Struts2》适合Java Web 程序员阅读和参考,也可以作为计算机相关专业教材。 编辑推荐 《深入浅出Struts2》是广受赞誉的Struts2优秀教程.它全面而深入地阐述了Strut2的各个特性,并指导开发人员如何根据遇到的问题对症下药。选择使用最合适的特性。作者处处从实战出发。在丰富的示例中直观地探讨了许多实用的技术。如数据类型转换、文件上传和下载、Struts2应用的安全性、调试与性能分析、FreeMarker、Velocily、Ajax,等等。跟随作者一道深入Struts2。聆听大量来之不易的经验之谈。你对Struts2开发框架的理解和应用水平都将更上一层楼。 Struts2权威著作 深入全面阐释Struts2的方方面面 涵盖FreeMarker、Ajax等大量相关技术 媒体推荐 “本书是毋庸置疑的struts2权威著作,虽然肯定还会有更多相关图书出现,但是我相信它已经不可超越。”   ——JavaRanch网站 “本书内容极为扎实。充满了其他地方找不到的技术细节,而且深入剖析了Struts的内部机理。强烈推荐”   ——JosephBrutto,资深程序员 作者简介 作者:(加拿大)Budi Kurniawan 译者:杨涛 王建桥 杨晓云 Budi Kurniawan,世界知名的Java专家和资深JavaEE高级架构师,自己创建了软件咨询和技术出版公司Brainy Software。他还撰写了深入揭示Tomcat工作机理和设计理念的名著How Tomcat Works,并在多种权威出版物上发表过100多篇文章。 目录 第1章 Model 2应用程序 1 1.1 Model 2概览 1 1.2 带servlet控制器的Model 2 2 1.2.1 Product动作类 3 1.2.2 ControllerServlet类 4 1.2.3 视图 6 1.2.4 部署描述文件 8 1.2.5 示例程序的运行 9 1.3 带过滤器调度程序的Model 2 9 1.4 小结 13 第2章 初识Struts 14 2.1 Struts的优点 14 2.2 Struts的动作处理流程 15 2.3 拦截器 17 2.4 Struts配置文件 18 2.4.1 struts.xml文件 19 2.4.2 struts.properties文件 26 2.5 Struts应用程序示例 26 2.5.1 部署描述文件和Struts配置文件 27 2.5.2 动作类 28 2.5.3 运行app02a程序 29 2.6 依赖注入 29 2.6.1 概述 29 2.6.2 依赖注入的几种方式 31 2.7 小结 31 第3章 动作与结果 32 3.1 动作类 32 3.2 如何访问资源 34 3.2.1 ServletActionContext对象 34 3.2.2 Aware接口 35 3.2.3 通过Aware接口访问资源 38 3.3 把静态参数传递给一个动作 41 3.4 ActionSupport类 41 3.5 结果 42 3.5.1 Chain 43 3.5.2 Dispatcher 44 3.5.3 FreeMarker 44 3.5.4 HttpHeader 44 3.5.5 Redirect 45 3.5.6 Redirect Action 46 3.5.7 Stream 47 3.5.8 Velocity 47 3.5.9 XSLT 47 3.5.10 PlainText 47 3.6 异常处理:exception-mapping元素 47 3.7 通配符映射 48 3.8 动态方法调用 51 3.9 对动作类进行测试 51 3.10 小结 51 第4章 OGNL 52 4.1 Value Stack栈 52 4.2 读取Object Stack里的对象的属性 53 4.3 读取Context Map里的对象的属性 54 4.4 如何调用字段和方法 55 4.5 如何访问数组类型的属性 56 4.6 如何访问List类型的属性 56 4.7 如何访问Map类型的属性 57 4.8 JSP EL:当OGNL帮不上忙时 58 4.9 小结 58 第5章 表单标签 59 5.1 Struts标签的使用方法 59 5.2 表单标签的共同属性 60 5.3 form标签 62 5.4 textfield、password、hidden标签 63 5.5 submit标签 65 5.6 reset标签 65 5.7 label标签 66 5.8 head标签 66 5.9 textarea标签 66 5.10 checkbox标签 67 5.11 list、listKey和listValue属性 72 5.11.1 赋值一个String 72 5.11.2 赋值一个Map 73 5.11.3 赋值一个Collection或一个对象数组 73 5.12 radio标签 74 5.13 select标签 76 5.14 用optgroup标签对选项进行分组 79 5.15 checkboxlist标签 82 5.16 combobox标签 83 5.17 updownselect标签 85 5.18 optiontransferselect标签 87 5.19 doubleselect标签 90 5.20 主题 92 5.21 小结 94 第6章 通用标签 95 6.1 property标签 95 6.2 a标签 97 6.3 action标签 97 6.4 param标签 98 6.5 bean标签 98 6.6 date标签 100 6.7 include标签 100 6.8 set标签 101 6.9 push标签 103 6.10 url标签 104 6.11 if、else和elseif标签 105 6.12 iterator标签 107 6.13 append标签 110 6.14 merge标签 111 6.15 generator标签 113 6.16 sort标签 116 6.17 subset标签 118 6.18 小结 119 第7章 类型转换 120 7.1 类型转换概述 120 7.2 类型转换错误消息的定制 121 7.3 类型转换器的定制 125 7.3.1 对自定义的类型转换器进行配置 126 7.3.2 自定义的类型转换器示例 127 7.4 扩展StrutsTypeConverter类 130 7.5 与复杂对象配合使用 134 7.6 与Collection配合使用 137 7.7 与Map配合使用 142 7.8 小结 145 第8章 输入验证 146 8.1 验证程序概述 146 8.2 验证程序的配置 147 8.3 Struts内建验证程序 148 8.3.1 required验证程序 149 8.3.2 requiredstring验证程序 150 8.3.3 stringlength验证程序 152 8.3.4 int验证程序 154 8.3.5 date验证程序 156 8.3.6 email验证程序 157 8.3.7 url验证程序 159 8.3.8 regex验证程序 160 8.3.9 expression和fieldexpression验证程序 161 8.3.10 conversion验证程序 164 8.3.11 visitor验证程序 166 8.4 编写自定义的验证程序 173 8.4.1 注册 176 8.4.2 示例 177 8.5 利用Validateable接口实现编程验证 180 8.6 小结 182 第9章 消息处理与国际化 183 9.1 地区和Java资源绑定 183 9.2 Struts中的国际化支持 185 9.3 text标签 188 9.4 i18n标签 191 9.5 以手动方式选择一个资源包 193 9.6 小结 195 第10章 Model Driven和Preparable拦截器 196 10.1 把动作与模型隔离开 196 10.2 Model Driven拦截器 197 10.3 Preparable拦截器 201 10.4 小结 206 第11章 持久层 207 11.1 DAO模式 207 11.1.1 DAO模式的最简单实现 208 11.1.2 使用DAO接口的DAO模式 208 11.1.3 使用Abstract Factory模式的DAO模式 209 11.2 实现DAO模式 209 11.2.1 DAO接口和DAOBase类 210 11.2.2 EmployeeDAO类 213 11.2.3 EmployeeDAOMySQLImpl类 214 11.2.4 DAOFactory类 218 11.2.5 EmployeeManager类 219 11.2.6 运行app11a应用程序 220 11.3 Hibernate 221 11.4 小结 221 第12章 文件的上传 222 12.1 文件上传概述 222 12.2 在Struts里上传文件 223 12.3 File Upload拦截器 224 12.4 上传单个文件示例 225 12.5 上传多个文件示例 227 12.6 小结 230 第13章 文件的下载 231 13.1 文件下载概述 231 13.2 Stream结果类型 232 13.3 文件下载功能的编程实现 235 13.4 小结 238 第14章 提高Struts应用程序的安全性 239 14.1 用户和角色 239 14.2 编写安全策略 240 14.2.1 保护资源 240 14.2.2 指定登录方法 241 14.3 身份验证方法 242 14.3.1 使用基本身份验证方法 243 14.3.2 使用基于表单的身份验证方法 245 14.4 隐藏资源 247 14.5 Struts安全配置 248 14.6 以编程方式提高安全性 250 14.6.1 getAuthType方法 250 14.6.2 isUserInRole方法 250 14.6.3 getUserPrincipal方法 251 14.6.4 getRemoteUser方法 251 14.7 小结 251 第15章 防止重复提交 252 15.1 标记管理 252 15.2 使用Token拦截器 253 15.3 使用Token Session拦截器 256 15.4 小结 257 第16章 调试与性能分析 258 16.1 debug标签 258 16.2 Debugging拦截器 259 16.3 性能分析 261 16.4 小结 262 第17章 进度条 263 17.1 Execute and Wait拦截器 263 17.2 使用Execute and Wait拦截器 264 17.3 使用一个自定义的“等待”页面 265 17.4 小结 266 第18章 定制拦截器 267 18.1 Interceptor接口 267 18.2 编写一个自定义的拦截器 268 18.3 使用DataSourceInjectorInterceptor拦截器 269 18.4 小结 273 第19章 定制结果类型 274 19.1 概述 274 19.2 编写一个自定义的结果类型 274 19.3 使用新的结果类型 277 19.4 小结 279 第20章 Velocity 280 20.1 概述 280 20.2 Velocity隐式对象 281 20.3 标签 281 20.4 Velocity示例 282 20.5 小结 284 第21章 FreeMarker 285 21.1 概述 285 21.2 FreeMarker标签 286 21.3 示例 287 21.4 小结 289 第22章 XSLT结果类型 290 22.1 概述 290 22.2 XSLT结果类型 292 22.3 示例 294 22.4 小结 295 第23章 插件 296 23.1 概述 296 23.2 从哪里获得插件 296 23.3 编写一个自定义的插件 296 23.4 使用Captcha插件 297 23.5 小结 300 第24章 Tiles插件 301 24.1 JSP include指令/标签的不足 302 24.2 Tiles布局和定义 303 24.2.1 布局页面 303 24.2.2 Tiles定义 304 24.3 Struts Tiles插件 305 24.4 Struts Tiles示例 306 24.5 小结 309 第25章 JFreeChart插件 310 25.1 JFreeChart API 310 25.1.1 JFreeChart类 310 25.1.2 Plot抽象类 310 25.2 使用标准的插件 311 25.3 使用BrainySoftware JFreeChart插件 313 25.4 小结 315 第26章 零配置 316 26.1 准备工作 316 26.2 注解 317 26.2.1 @Result注解 317 26.2.2 @Results注解 318 26.2.3 @Namespace注解 318 26.2.4 @ParentPackage注解 319 26.3 CodeBehind插件 319 26.4 小结 321 第27章 Ajax 322 27.1 Ajax概述 322 27.2 Dojo的事件系统 323 27.3 使用Struts Dojo插件 324 27.4 head标签 324 27.5 div标签 325 27.5.1 示例程序1 326 27.5.2 示例程序2 326 27.5.3 示例程序3 327 27.6 a标签 328 27.7 submit标签 330 27.8 bind标签 331 27.9 datetimepicker标签 333 27.10 tabbedpanel标签 334 27.11 textarea标签 336 27.12 autocompleter标签 337 27.12.1 示例程序1 339 27.12.2 示例程序2 339 27.12.3 示例程序3 340 27.13 tree和treenode标签 341 27.13.1 示例程序1 342 27.13.2 示例程序2 343 27.14 小结 345 附录A Struts配置 346 附录B JSP EL语言 361 附录C Java注解 370 序言 Servlet①技术和1JSP(JaLvaServer Pages)是利用Java语言开发Web/_立用程序的两种主要技术。Sun公司于1996年首次推出Servlet技术时,人们认为这种技术远优于当时占主导地位的公共网关接口(Common Gateway Inter。face,CGI)。这是因为某个servlet(服务器端Java程序)在应用户的请求而首次调入内存执行之后将一直驻留在内存里,对同一个servlet的后续请求不用再对这个servlet的类进行实例化,因此响应速度更快。 可是,servlet也存在一个严重问题,因为所有的HTML输出必须像下面这段代码那样封装在string对象里,所以servlet将HTML标签发送给浏览器时既繁琐又容易出错: 这大大增加了编程的难度,而且即便是对网页在表现方面的细微改动,例如改变网页的背景颜色,也需要重新编译整个servlet。 Sun公司意识到了这个问题,并提出了JSP技术。JSP允许Java代码和HTML标签混杂在一起以简化页面的编辑工作,所有的改动无需重新进行编译:某个页面修改后,将在第一次被调用时自动编译。JSP里的Java代码段称为scrilmlet。 允许Java代码乘HTML混杂在一起的办法乍看起来很实用,但实际上并不好,原因有以下几点。 文摘 插图: 消息处理是应用程序开发工作中的一项重要任务。例如,文本和消息必须是可编辑的, 并且无需重新编译。另外,应用程序必须能“说”多种语言。在程序设计领域,人们把能够在无需改写有关代码的前提下,让开发出来的应用程序能够支持多种语言和数据格式的技术称为国际化技术。在计算机文档里,国际化(internationalization)通常简写为i18n,这是因为这个单词的第一个字母是i,最后一个字母是n,i和n之间总共有18个字母。与国际化相对应的是本地化,指让一个具备国际化支持的应用程序支持某个特定的地区。这里所说的地区(10cale)可以是一个特定的地理区域、政治区域或文化区域。如果某种操作在不同的地区有不同的结果,那它就是对地区敏感的(10cale-sensitive),例如,显示日期就是一种对地区敏感的操作,因为日期的显示格式应该顺应本地用户所在的国家或地区的语言习惯。以2007年8月15日为例,美国人会把这个日期写成8/15/2007,澳大利亚人则会把它写成15/8/2007。本地化(10calization)通常简写为110n,这是因为这个单词的第一个字母是l,最后一个字母是n,并且l和n之间总共有10个字母。 如果某个应用程序具备国际化支持,我们就可以快速方便地改变它的各种屏显文字。Java已经内建了国际化支持功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bruin_du

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值