??xml version="1.0" encoding="utf-8" standalone="yes"?> 下蝲 Struts2的下载地址是: http://struts.apache.org/download.cgi 到现在ؓ止:最新版本是2.0.11.1。把下蝲后的文g解压~到一个目录中。在解压~后的apps目录中,有个struts2-blank-2.0.11.war。这是搭Z个新的struts2目的很好的参考。本文就参考这个?/p>
新徏web工程 新徏一个web project。这里假设project 名称为struts2 复制*.jar文g 臛_需?个jar文g?/p>
修改web.xml文g 在web.xml文g中加入下面的内容。(在web-app节点中) 新徏q编辑struts.xml文g struts.xml文g的骨架是下面q样的: 到现在ؓ止,struts环境已经搭徏好了。下面可以编写一个HelloAction来运行测试一下环境?/p>
HelloAction Action的一般流E是q样?/p>
下面的程序是对两个十六进ӞhexQ字面常量进行相加,然后打印出十六进制的l果。这个程序会打印Z么呢Q?/p>
看v来很明显Q该E序应该打印?cafebabe。毕竟,q确实就是十六进制数?0000000016与cafebabe16的和。该E序使用的是long型运,它可以支?6位十六进制数Q因此运溢出是不可能的?/p>
遗憾的告诉你Q结果是cafebabeQƈ没有M前导?。这个输C的是正结果的?2位,但是不知何故Q第33位丢׃?/p>
十进制字面常量具有一个很好的属性,x有的十进制字面常量都是正的,而十六进制或是八q制字面帔Rq不具备q个属性?/p>
要想书写一个负的十q制帔RQ可以用一元取反操作符Q?Q连接一个十q制字面帔R。以q种方式Q你可以用十q制来书写Q何int或long型的数|不管它是正的q是负的Qƈ且负的十q制常数可以很明地用一个减Lh标识?/p>
但是十六q制和八q制字面帔Rq不是这么回事,它们可以h正的以及负的数倹{如果十六进制和八进制字面常量的最高位被置位了Q那么它们就是负数。在q个E序中,数字0xcafebabe是一个int帔RQ它的最高位被置位了Q所以它是一个负数。它{于十进制数?889275714?/p>
该程序执行的q个加法是一U?混合cd的计(mixed-type computationQ。左操作数是 long cd的,而右操作数是 int cd的。ؓ了执行该计算QJavaintcd的数值用拓宽原始cd转换提升Z个longcdQ然后对两个longcd数值相加。因为int是一个有W号的整数类型,所以这个{换执行的是符合扩展,它将负的intcd的数值提升ؓ一个在数g相等的longcd数倹{?/p>
q个加法的右操作?xcafebabe被提升ؓ了longcd的数?xffffffffcafebabeL。这个数g后被加到了左操作?x100000000L上。当作ؓintcd来被审视Ӟl过W号扩展之后的右操作数的?2位是-1Q而左操作数的?2位是1Q将q两个数值相加就得到?Q这也就解释了ؓ什么在E序输出中前?丢失了?/p>
q个题给我们的教训是Q?strong>混合cd的计可能会产生hQ尤其是十六q制和八q制字面帔R无需昑ּ的减L号就可以表示负的数倹{ؓ了避免这U窘境,通常最好是避免混合cd的计?/strong>?/p>
对于语言的设计者们来说Q应该考虑支持无符L整数cdQ从而根除符h展的可能性。可能会有这L争辩Q负的十六进制和八进制字面常量应该被用Q但是这可能会挫伤程序员Q他们经怋用十六进制字面常量来表示那些W号没有M重要含义的数倹{?/p>
转型被用来将一个数g一U类型{换到另一U类型。下面的E序q箋使用了三个{型。那么它到底会打印出什么呢Q?/p>
它又会打印出什么呢Q?/p>
q个题看hg太简单了。结果不是66666吗? 遗憾的告诉你Q结果是17777?/p>
事物往往有别于它的表象。就以这个问题ؓ例,它ƈ没有打印出我们想要的输出。请仔细观察 + 操作W的两个操作敎ͼ 我们是将一个intcd?2345加到了longcd?432l上。请注意左操作数开头的数字1和右操作数结写字母l之间的细微差异?数字1的水q笔划(UCؓ"臂(armQ?Q和垂直W划Q称?茎(stemQ?Q之间是一个锐角,而与此相对照的是Q小写字母l的臂和茎之间是一个直角?/p>
用大写的L替换写字母l?/p>
在你大喊"恶心Q?之前Q你应该注意到这个问题确实已l引起了混ؕQ这里确实有一个教训: 在long型字面常量中Q一定要用大写的LQ千万不要用写的l。这样就可以完全掐断q个谜题所产生的q源头?/p>
相类似的Q要避免使用单独的一个l字母作ؓ变量名。例如,我们很难通过观察下面的代码段来判断它到底是打印出列表lq是数字1?/p>
也许当初允许用小写的l来编写long型字面常量本w就是一个错误?/p>
下面的程序是对两个十六进ӞhexQ字面常量进行相加,然后打印出十六进制的l果。这个程序会打印Z么呢Q?/p>
被除数表C的是一天里的微U数Q而除数表C的是一天里的毫U数。这个程序会打印Z么呢Q?/p>
q个题看h相当直观。每天的毫秒数和每天的微U数都是帔R。ؓ清楚赯Q它们都被表C成U的形式。你可能想都没想Q就脱口而出Q结果是1000?遗憾的是Q它打印的是5。这里到底发生了什么呢Q?/p>
问题在于常数MICROS_PER_DAY的计?实"溢出了。尽计的l果适合攑օlong中,q且其空间还有富余,但是q个l果q不适合攑օint中?q个计算完全是以intq算来执行的Qƈ且只有在q算完成之后Q其l果才被提升到longQ而此时已l太q了Q计已l溢ZQ?它返回的是一个小?00倍的数倹{从int提升到long是一U拓宽原始类型{换(widening primitive conversionQ, 它保留了Q不正确的)数倹{这个g后被MILLIS_PER_DAY整除Q而MILLIS_PER_DAY的计是正确的,因ؓ它适合intq算。这h除的l果得C5 那么Z么计会是以intq算来执行的呢?因ؓ所有乘在一L因子都是int数倹{当你将两个int数值相乘时Q?你将得到另一个int数倹{?strong>Java不具有目标确定类型的Ҏ,q是一U语aҎ,其含义是指存储结果的变量的类型会影响到计所使用的类?/strong> 通过使用long帔R来替代int帔R作ؓ每一个乘U的W一个因子,我们可以很Ҏ地订正这个程序。这样做可以强制表达式中所有的后箋计算都用longq作来完成?管q么做只在MICROS_PER_DAY表达式中是必需的,但是在两个乘U中都这么做是一U很好的方式。相似地Q用long作ؓ乘积?W一?数gq不L必需的, 但是q么做也是一U很好的形式。在两个计算中都以long数值开始可以很清楚地表明它们都不会溢出。下面的E序打印出我们所期望?000 q个教训很简单:当你在操作很大的数字Ӟ千万要提防溢?/strong>--它可是一个缄默杀手?即用来保存l果的变量已昑־_大,也ƈ不意味着要生结果的计算h正确的类型。当你拿不准Ӟ׃用longq算来执行整个计?/p>
语言设计者从中可以吸取的教训是:也许降低~默溢出产生的可能性确实是值得做的一件事。这可以通过对不会生缄默溢出的q算提供支持来实现?E序可以抛出一个异常而不是直接溢出,像Ada所作的那样Q或者它们可以在需要的时候自动地切换C个更大的内部表示上以防止溢出Q就像Lisp所作的那样?q两U方式都可能会遭受与其相关的性能斚w的损失?降低~默溢出的另一U方式是支持目标定cdQ但是这么做会显著地增加cdpȝ的复杂度 它又会打印出什么呢Q?/p>
误虑下面q段话所描述的问题: 明在超市购C一个h|E1.10的东西,但是他钱包中只有两元一张的钞票。如果他用一张两元的钞票支付Q那么应该找l他多少雉呢? 下面是一个试图解决上q问题的E序Q它会打印出什么呢Q?/p>
你可能会_q不是很单嘛Q输?.90。但实际的输出确实:0.8999999999999999?/p>
一、程序如何才能知道你惌打印数点后两位数呢? JDK API文档中关于Double.toString的部分指出: Double.toString的返回|是以将doublecd的g最靠近它的临近值区分出来的最短的数Q它在小数点之前和之后都臛_有一位?/p>
因此Q看hQ该E序应该打印0.9是合理的?/p>
二、ƈ不是所有的数都可以用二进制QҎ来精表C的?/p>
问题在于1.1q个数字不能被精表C成Z个doubleQ因此它被表C成为最接近它的double倹{?该程序从2中减ȝ是q个倹{?遗憾的是Q这个计的l果q不是最接近0.9的double倹{?表示l果的double值的最短表C就是你所看到的打印出来的那个可恶的数字?/p>
q条语句打印的是正确的结果,但是qƈ不表C它是对底层问题的通用解决Ҏ。它使用的仍旧是二进制QҎ的doubleq算?点q算在一个范围很q的值域上提供了很好的近|但是它通常不能产生_的结果?二进制Q点对于货币计是非常不适合?/strong>Q因为它不可能将0.1--或?0的其它Q何次负幂--_表示Z个长度有限的二进制小?/p>
q是在Java中一U简单的解决Ҏ。在Java标准库中Q有一个类似的范例Datec,Datecȝ对于旉的内部表C就是一个以毫秒为单位的long整数?对于像货币这L数|可以用int或long来表C。如果你采纳了解x法,L保该整数cd大到_表示在程序中你将要用到的所有?/strong>?/p>
解决该问题的另一U方式是使用执行_数q算的BigDecimal?q里要告诫你一点: 一定要用BigDecimal(String)构造器Q而千万不要用BigDecimal(double)?后一个构造器用它的参数?_"值来创徏一个实例:new BigDecimal(1.1)返回一个表C?.100000000000000055511151231257827021181583404541015625 的BigDecimal?/strong>
q个版本q不是十分地完美Q因为Javaq没有ؓBigDecimal提供M语言上的支持。原因: 在需要精答案的地方Q要避免使用float和double?/p>
对于货币计算Q要使用int、long或BigDecimal?/p>
对于语言设计者来_应该考虑对小数运提供语a支持。可以支持下列方式中的一U?/p>
被除数表C的是一天里的微U数Q而除数表C的是一天里的毫U数。这个程序会打印Z么呢Q?/p>
下面的方法意囄定它那唯一的参数是否是一个奇数。这个方法能够正运转吗Q?/p>
?/4的情况下Q答案是错误的。比如:odd(-3) 表达式得到的l果是 fasle。对于所有的负奇敎ͼ上面的方法都会得到错误的l果?/p>
问题的原因在于求余操作符(%)Q在Java中该操作W被定义?/p>
对于所有的 int 数?a 和所有的非零 int 数?bQ都满下面的恒{式
换句话说Q?a % b) = a - (a / b) * b 由数学推理运可知,a % b 的符h操作数a军_Q要么ؓ0Q要么和a一_。也是_ -5 % 3 => -2Q?-5 % -3 => -2?/p>
因此Q对于所有的负奇数nQ?n % 2 => -1。问题中的方法自然有问题啦?/p>
要判断一个整数是否ؓ奇数的解军_法有两种?/p>
无论你何时用到了取余操作符Q都要考虑到操作数和结果的W号?/strong>
该操作符的行为在其操作数非负时是一目了然的Q但是当一个或两个操作数都是负数时Q它的行为就不那么显而易见了?/p>
误虑下面q段话所描述的问题: 明在超市购C一个h|E1.10的东西,但是他钱包中只有两元一张的钞票。如果他用一张两元的钞票支付Q那么应该找l他多少雉呢? 下面是一个试图解决上q问题的E序Q它会打印出什么呢Q?/p>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
<struts>
<package name="struts" extends="struts-default">
<!--action is here-->
</package>
</struts>
]]>
public class JoyOfHex {
public static void main(String[] args) {
System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));
}
}
W?5 天问题的解答
原因
解决办法
System.out.println(Long.toHexString(0x100000000L + 0xcafebabeL));
W?5 天问题的ȝ
今天的问?/h2>
public class Multicast {
public static void main(String[] args) {
System.out.println((int) (char) (byte) -1);
}
}
]]>
public class Elementary{
public static void main(String[] args){
System.out.println(12345 + 5432l);
}
}
W?4 天问题的解答
原因
解决办法
System.out.println(12345+5432L);
W?4 天问题的ȝ
//不良代码-使用了l作ؓ变量?/span>
List l = new ArrayList<String>();
l.add("Foo");
System.out.println(1);
今天的问?/h2>
public class JoyOfHex {
public static void main(String[] args) {
System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));
}
}
]]>
public class LongDivision{
public static void main(String args[]){
final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY);
}
}
W?3 天问题的解答
原因
解决办法
public class LongDivision{
public static void main(String args[ ]){
final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000;
final long MILLIS_PER_DAY = 24L * 60 * 60 * 1000;
System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY);
}
}
W?3 天问题的ȝ
今天的问?/h2>
public class Elementary{
public static void main(String[] args){
System.out.println(12345+5432l);
}
}
]]>
public class Change{
public static void main(String args[]){
System.out.println(2.00 - 1.10);
}
}
W?2 天问题的解答
原因
W?2 天问题的解决办法
Ҏ一
//拙劣的解x?-仍旧是用二q制点?/span>
System.out.printf("%.2f%n",2.00 - 1.10);
Ҏ?/h3>
System.out.println((200 - 110) + "?);
Ҏ?/h3>
import java.math.BigDecimal;
public class Change1{
public static void main(String args[]){
System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.10")));
}
}
ȝ
今天的问?/h2>
public class LongDivision{
public static void main(String args[]){
final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY);
}
}
]]>
public static boolean odd(int number) {
return number % 2 == 1;
}
W?1 天问题的解答
原因
(a / b) * b + (a % b) == a解决办法
public static boolean odd(int number) {
return number % 2 != 0;
}
/**
* q种Ҏ的性能更好? */
public static boolean odd(int number) {
return (number & 1) != 0;
}
ȝ
今天的问?/h2>
public class Change{
public static void main(String args[]){
System.out.println(2.00 - 1.10);
}
}
]]>
public static boolean odd(int number) {
return number % 2 == 1;
}
HTTP是一U请?响应模式?/p>
telnet www.baidu.com 80
80是HTTP协议默认的端口?/p>
GET / HTTP/1.0?br>?/p>
↙表C回车?/p>
GET | / | HTTP/1.0 |
---|---|---|
查询Ҏ名,有GET和POST GETҎ不支持消息体 | 服务器资?/td> | HTTP版本 |
在telnet中测试HTTP的POST是很ȝ的事。这里就不讲了,何况GET和POST很类伹{?/p>
Baidu服务器根据请求,处理h。如果用的是ServletQ就是执行那个Servlet的doGetҎ?/p>
HTTP/1.1 200 OK
Date: Sun, 03 Feb 2008 08:08:44 GMT
Server: BWS/1.0
Content-Length: 3022
Content-Type: text/html
Cache-Control: private
Expires: Sun, 03 Feb 2008 08:08:44 GMT
Set-Cookie: BAIDUID=2BB1B837C8EC6794A132C5D8DDD76721:FG=1; expires=Sun, 03-Feb-38 08:08:44 GMT; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
<html><head><meta http-equiv=Content-Type content="text/html;charset=gb2312"><title>癑ֺ一下,你就知道 </title><style>body{margin:4px 0}p{margin:0;padding:0}img{border:0}td,p,#u{font-size:12px}#b,#u,#l td,a{font-family:arial}#kw{font:16px Verdana;height:1.78em;padding-top:2px}#b{height:30px;padding-top:4px}#b,#b a{color:#77c;font-size:12px}#u{padding-right:10px;line-height:19px;text-align:right;margin-bottom:3px !important;margin-bottom:10px}#sb{height:2em;width:5.6em}#km{height:50px}#km a{font-family:宋体}#l{margin-bottom:5px}#m{margin-left:100px;width:22.1em;text-align:center}p,#b,table{width:600px;border:0}#sb,#km,#l,#m{font-size:14px}#m a,#m b{margin-right:1.14em}a{color:#00c}a:active{color:#f60}</style></head>
<body><div id=u></div><center><a href=http://hi.baidu.com/baidu target=_blank><img src=http://www.baidu.com/img/logo.gif width=174 height=59 alt="Ҏq入 癑ֺI间"></a><br><br><br><br><table cellpadding=0 cellspacing=0 id=l><tr><td align=left><div id=m><a onclick=s(this) href=http://news.baidu.com>?amp;nbsp;?lt;/a><b>|?amp;nbsp;?lt;/b><a onclick=s(this) href=http://tieba.baidu.com>?amp;nbsp;?lt;/a><a onclick=s(this) href=http://zhidao.baidu.com>?amp;nbsp;?lt;/a><a onclick=s(this) href=http://mp3.baidu.com>MP3</a><a onclick=s(this) href=http://image.baidu.com>?amp;nbsp;?lt;/a></div></td></tr></table>
<table cellpadding=0 cellspacing=0><tr valign=top><td width=92></td><td height=62 nowrap><form name=f action=/s><input type=text name=wd id=kw size=36 maxlength=100><script>var w=document.f.wd;w.focus();document.getElementById("u").innerHTML='<a ;function s(o){if(w.value.length>0){var h=o.href;var q=encodeURIComponent(w.value);if(h.indexOf("q=")!=-1){o.href=h.replace(new RegExp("q=[^&$]*"),"q="+q)}else{o.href+="?q="+q}}};(function(){if(new RegExp("q=([^&]+)").test(location.search)){w.value=decodeURIComponent(RegExp.$1)}})()</script><input type=hidden name=cl value=3> <input type=submit value=癑ֺ一?id=sb><br><br></form></td><td width=100><a href=/search/jiqiao.html>帮助</a><br><a href=/gaoji/advanced.html>高</a></td></tr></table>
<p id=km> <a href=http://hi.baidu.com>I间</a> | <a href=http://www.baidu.com/more>更多>></a></p>
<p style=height:60px></p>
<p style=height:30px><a onClick="this.style.behavior='url(#default#homepage)';this.setHomePage('http://www.baidu.com')" href=http://utility.baidu.com/traf/click.php?id=215&url=http://www.baidu.com>把百度设为首?lt;/a></p><p style=height:14px><a href=http://jingjia.baidu.com>企业推广</a> | <a href=http://top.baidu.com>搜烦风云?lt;/a> | <a href=/home.html>关于癑ֺ</a> | <a href=http://ir.baidu.com>About Baidu</a></p><p id=b>©2008 Baidu <a href=http://www.baidu.com/duty>使用癑ֺ前必?lt;/a> <a href=http://www.miibeian.gov.cn target=_blank>京ICP?30173?lt;/a> <a href=http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001092500412><img src=http://gimg.baidu.com/img/gs.gif></a></p></center></body></html><!--4eca38de351397c2-->
失去了跟L的连接?br>
用telnetq接web服务器,q接会立马终止。如果用览器访问,览器会取得与页面有关的所有图像、样式表和脚本文件等Q才l止q接?/p>
HTTP查询和响应的消息格式差不多?/p>
格式 | initliaze line key1:value1 key2:value2 [Optional message body] |
---|---|
查询格式 | GET /newaddr?name=jack&email=2 HTTP/1.0 accept:*/* accept-language:zh-cn ... ... |
响应格式 (具体见上? | HTTP/1.1 200 OK Date: Sun, 03 Feb 2008 08:08:44 GMT Server: BWS/1.0 ... ... <html>...</html> |
HTTP定义了查询和响应的消息格式。但每个览器和服务器在q种格式下,有自己定义的内容。服务器通过览器请求的消息Q知道浏览器具体是什么型LQ是什么操作系l。这些具体怎么做的Q下文分?/p>
我们在写blog或写文档说明的时候,有时候说明在控制C怎样使用Q在windows xp/2000中就是cmd命o?Z表达q种在控制台中的操作Q我写了?CSS来呈现效果?/p>
可以?lt;div class="console" ...>中设|高度来讄控制台的高度?/p>
一个控制台的效果基本出来了。在IE6和Firefox中测试通过。还有工作可?/p>
q是我第一ơ用BlogQ还不知道上传。这些源代码和图片的Q请留下EMailQ或{我熟悉了Blog再下载?/p>