xiuli's profile我的岛屿PhotosBlogListsMore ![]() | Help |
我的岛屿那段混乱费力的青春 |
||||||||||||||||||||||||||||||||||||||||||||
|
some brilliant links
|
November 15 hehe a successful man is one who can earn more than his wife/GF can spend. a successful woman is one who can find such a man.. hehe 关于爱情我觉得应该是有宿命的 哪十句英文脏话绝不能说?1. I'm so fed up with your BS. Cut the crap. 我受够了你的废话,少说废话吧。
美女(美国的女人)是不喜欢说shit这个不雅的字的,所以她们就说shoot,或是BS(=Bull shit)来表示她们还是很有气质的. "Cut your crap."是当你听到对方废话连篇,讲个不停时,你就可以说, "Cut the crap."相当于中文里的废话少话。 2. Hey! wise up! 放聪明点好吗? 当别人作了什么愚蠢的事时,你可以说, "Don't be stupid"或是"Don't be silly."但是这是非常不礼貌的说法。比较客气一点的说法就是, wise up!它就相当于中文里的放聪明点。你也可以用坚酸刻薄的语气说. Wise up, please。然后故意把please的尾音拉得长长的。 也有人会说, Hey! grow up。意思就是你长大一点好不好?例如有人二十岁了却还不会自己补衣服,你就可以说Hey! grow up。这根wise up是不是也差不多呢? 3. Put up or shut up. 要吗你就去做,不然就给我闭嘴。 有些人就是出那张嘴,只会出意见,此时就可以说, Put up or shut up。要注意的是,Put up字典上是查不到"自己去做"的意思,但是见怪不怪,很多笔记本上的用法都是字典上查不到的。比方说今天你在写程式,有人明明不懂却喜欢在一旁指挥你,这时候你就可以说, Put up or shut up。 有时为了要加强shut up的语气,老美会把它说成, shut the f**k up。这句话常在二人火气很大时的对话中可以听到,例如电影The house on the haunted hill女主角身陷鬼屋之中,其它人又七嘴八舌时,她就很生气地说了一句, shut the f**k up。 这句话也让我想到一句成语, walk the walk, talk the talk,也就是说到就要作到,有点像是中文里知行要合一的意思,或是只说, walk the talk也可以。 4. You eat with that mouth? 你是用这张嘴吃饭的吗? 别人对你说脏话,你就回敬他这一句,言下之意,就是你的嘴那么脏,你还用这张嘴吃饭。还有一种说法, "You kiss your Momma with that mouth?"就是说你也是用这脏嘴亲你***吗?所以下次记得如果有老美对你说脏话,记得不要再Fxxx回去,保持风度,说一句, "You eat with that mouth?"就扯平了 5. You are dead meat. 你死定了。 我们说你完蛋了,可以说"You are dead."或是像这样说"You are dead meat."意思都是一样的,比如说你跟别人说过不淮碰我的东西,但有人他就是老爱用你的东西,下次要是再被你抓到,你就可以说, "You are dead meat." 6. Don't you dare! How dare you! 你好大的胆子啊! 这句话跟中文里"你好大的胆子"是一样,可以在两种场合说,第一种是很严肃的场合,比如说小孩子很调皮,讲又讲不听,父母就会说, "Don't you dare!"那意思就是这个小孩要当心点,不然等会就要挨打了。另一种场合是开玩笑,比如有人跟你说我跟某网友约会去了,你说"Don't you dare?"就有点开玩笑的语气. (你不怕被恐龙给吃了吗?) Dare在英文里还有许多有趣的用法,例如, "You dare me."或是"I double dare you."还有一种游戏叫Truth or Dare,限于篇幅,容后再作介绍。 7. Don't push me around. 不要摆布我。 这个词很有意思,把你推来推去,作摆布解释,如果有人指挥你一下作这个一下作那个,你就可以用这一句Hey! Don't push me around。通常当我讲"Don't push me around."时,我还会想到一个字bossy. Bossy就是说像是老板一样,喜欢指挥别人。例如,"You are so bossy. I don't like that." 这句话也可以单讲, "Don't push me."或是"Don't push me any further."还有一句根push有关的成语,叫push the button,意思就是,指使, *纵。例如, "I know why you are doing this, someone is pushing your button!" 如何用英语优雅骂人 1. Stop complaining! 别发牢骚! 2. You make me sick! 你真让我恶心! 3. What's wrong with you? 你怎么回事? 4. You shouldn't have done that! 你真不应该那样做! 5. You're a jerk! 你是个废物/混球! 6. Don't talk to me like that! 别那样和我说话! 7. Who do you think you are? 你以为你是谁? 8. What's your problem? 你怎么回事啊? 9. I hate you! 我讨厌你! 10. I don't want to see your face! 我不愿再见到你! 11. You're crazy! 你疯了! 12. Are you insane/crazy/out of your mind? 你疯了吗?(美国人绝对常用!) 13. Don't bother me. 别烦我。 14. Knock it off. 少来这一套。 15. Get out of my face. 从我面前消失! 16. Leave me alone. 走开。 17. Get lost。滚开! 18. Take a hike! 哪儿凉快哪儿歇着去吧。 19. You piss me off. 你气死我了。 20. It's none of your business. 关你屁事! 21. What's the meaning of this? 这是什么意思? 22. How dare you! 你敢! 23. Cut it out. 省省吧。 24. You stupid jerk! 你这蠢猪! 25. You have a lot of nerve. 脸皮真厚。 26. I'm fed up. 我厌倦了。 27. I can't take it anymore. 我受不了了!(李阳老师常用) 28. I've had enough of your garbage. 我听腻了你的废话。 29. Shut up! 闭嘴! 30. What do you want? 你想怎么样?
31. Do you know what time it is? 你知道现在都几点吗?
32. What were you thinking? 你脑子进水啊? 33. How can you say that? 你怎么可以这样说? 34. Who says? 谁说的? 35. That's what you think! 那才是你脑子里想的! 36. Don't look at me like that. 别那样看着我。 37. What did you say? 你说什么? 38. You are out of your mind. 你脑子有毛病! 39. You make me so mad。你气死我了啦。 40. Drop dead. 去死吧!
41. Fuck off. 滚蛋。
42. Don't give me your shit. 别跟我胡扯。 43. Don't give me your excuses/ No more excuses. 别找借口。 44. You're a pain in the ass. 你这讨厌鬼。 45. You're an asshole. 你这缺德鬼。 46. You bastard! 你这杂种! 47. Get over yourself. 别自以为是。 48. You're nothing to me. 你对我什么都不是。 49. It's not my fault. 不是我的错。 50. You look guilty. 你看上去心虚。 51. I can't help it. 我没办法。 52. That's your problem. 那是你的问题。 53. I don't want to hear it. 我不想听! 54. Get off my back. 少跟我罗嗦。 55. Give me a break. 饶了我吧。 56. Who do you think you're talking to? 你以为你在跟谁说话? 57. Look at this mess! 看看这烂摊子! 58. You're so careless. 你真粗心。 59. Why on earth didn't you tell me the truth? 你到底为什么不跟我说实话? 60. I'm about to explode! 我肺都快要气炸了!
61. What a stupid idiot! 真是白痴一个!
62. I'm not going to put up with this! 我再也受不了啦! 63. I never want to see your face again! 我再也不要见到你! 64. That's terrible. 真糟糕! 65. Just look at what you've done! 看看你都做了些什么! 66. I wish I had never met you. 我真后悔这辈子遇到你! 67. You're a disgrace. 你真丢人! 68. I'll never forgive you! 我永远都不会饶恕你! 69. Don't nag me! 别在我面前唠叨! 70. I'm sick of it. 我都腻了。 71. You're son of bitch! 婊子养的! 72. Stop screwing/ fooling/ messing around! 别鬼混了! 73. Mind your own business! 管好你自己的事! 74. You're just a good for nothing bum! 你真是一个废物!/ 你一无是处! 75. You've gone too far! 你太过分了! 76. I loathe you! 我讨厌你! 77. I detest you! 我恨你! 78. Get the hell out of here! 滚开! 79. Don't be that way! 别那样! 80. Can't you do anything right? 成事不足,败事有余。 81. You're impossible. 你真不可救药。 82. Don't touch me! 别碰我! 83. Get away from me! 离我远一点儿! 84. Get out of my life. 我不愿再见到你。/ 从我的生活中消失吧。 85. You're a joke! 你真是一个小丑! 86. Don't give me your attitude. 别跟我摆架子。 87. You'll be sorry. 你会后悔的。 88. We're through. 我们完了! 89. Look at the mess you've made! 你搞得一团糟! 90. You've ruined everything. 全都让你搞砸了。 91. I can't believe your never. 你好大的胆子! 92. You're away too far. 你太过分了。 93. I can't take you any more! 我再也受不了你啦! 94. I'm telling you for the last time! 我最后再告诉你一次! 95. I could kill you! 我宰了你! 96. That's the stupidest thing I've ever heard! 那是我听到的最愚蠢的事!(比尔?盖茨常用) 97. I can't believe a word you say. 我才不信你呢! 98. You never tell the truth! 你从来就不说实话! 99. Don't push me ! 别逼我! 100. Enough is enough! 够了够了! 101. Don't waste my time anymore. 别再浪费我的时间了! 102. Don't make so much noise. I'm working. 别吵,我在干活。 103. It's unfair. 太不公平了。 104. I'm very disappointed. 真让我失望。 105. Don't panic! 别怕! 106. What do you think you are doing? 你知道你在做什么吗? 107. Don't you dare come back again! 你敢再回来! 108. You asked for it. 你自找的。 109. Nonsense! 鬼话! 110. Get the fuck out of here!从这滚开。 August 10 web.xml配置文件详解From[http://blog.csdn.net/Imain/archive/2006/12/28/1465770.aspx] DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本(如2.2或2.3)并指定管理此文件其余部分内容的语法的DTD(Document Type Definition,文档类型定义)。 所有部署描述符文件的顶层(根)元素为web-app。请注意,XML元素不像HTML,他们是大小写敏感的。因此,web-App和WEB-APP都是不合法的,web-app必须用小写。 2 部署描述符文件内的元素次序 XML元素不仅是大小写敏感的,而且它们还对出现在其他元素中的次序敏感。例如,XML头必须是文件中的第一项,DOCTYPE声明必须是第二项,而web-app元素必须是第三项。在web-app元素内,元素的次序也很重要。服务器不一定强制要求这种次序,但它们允许(实际上有些服务器就是这样做的)完全拒绝执行含有次序不正确的元素的Web应用。这表示使用非标准元素次序的web.xml文件是不可移植的。 下面的列表给出了所有可直接出现在web-app元素内的合法元素所必需的次序。例如,此列表说明servlet元素必须出现在所有servlet-mapping元素之前。请注意,所有这些元素都是可选的。因此,可以省略掉某一元素,但不能把它放于不正确的位置。 icon icon元素指出IDE和GUI工具用来表示Web应用的一个和两个图像文件的位置。 3 分配名称和定制的UL 在web.xml中完成的一个最常见的任务是对servlet或JSP页面给出名称和定制的URL。用servlet元素分配名称,使用servlet-mapping元素将定制的URL与刚分配的名称相关联。 3.1 分配名称 为了提供初始化参数,对servlet或JSP页面定义一个定制URL或分配一个安全角色,必须首先给servlet或JSP页面一个名称。可通过servlet元素分配一个名称。最常见的格式包括servlet-name和servlet-class子元素(在web-app元素内),如下所示: <servlet> 这表示位于WEB-INF/classes/moreservlets/TestServlet的servlet已经得到了注册名Test。给servlet一个名称具有两个主要的含义。首先,初始化参数、定制的URL模式以及其他定制通过此注册名而不是类名引用此servlet。其次,可在URL而不是类名中使用此名称。因此,利用刚才给出的定义,URL http://host/webAppPrefix/servlet/Test 可用于 http://host/webAppPrefix/servlet/moreservlets.TestServlet 的场所。 请记住:XML元素不仅是大小写敏感的,而且定义它们的次序也很重要。例如,web-app元素内所有servlet元素必须位于所有servlet-mapping元素(下一小节介绍)之前,而且还要位于5.6节和5.11节讨论的与过滤器或文档相关的元素(如果有的话)之前。类似地,servlet的servlet-name子元素也必须出现在servlet-class之前。5.2节"部署描述符文件内的元素次序"将详细介绍这种必需的次序。 程序清单5-1 TestServlet.java import java.io.*; /** Simple servlet used to illustrate servlet naming public class TestServlet extends HttpServlet { 程序清单5-2 web.xml(说明servlet名称的摘录) <web-app> 3.2 定义定制的URL 大多数服务器具有一个缺省的serlvet URL: 事实上,有时需要使用定制的URL。比如,你可能想关闭缺省URL映射,以便更好地强制实施安全限制或防止用户意外地访问无初始化参数的servlet。如果你禁止了缺省的URL,那么你怎样访问servlet呢?这时只有使用定制的URL了。 下面给出一个简单的web.xml摘录,它允许使用URL http://host/webAppPrefix/UrlTest而不是http://host/webAppPrefix/servlet/Test或 <servlet> URL模式还可以包含通配符。例如,下面的小程序指示服务器发送所有以Web应用的URL前缀开始,以..asp结束的请求到名为BashMS的servlet。 <servlet> 3.3 命名JSP页面 因为JSP页面要转换成sevlet,自然希望就像命名servlet一样命名JSP页面。毕竟,JSP页面可能会从初始化参数、安全设置或定制的URL中受益,正如普通的serlvet那样。虽然JSP页面的后台实际上是servlet这句话是正确的,但存在一个关键的猜疑:即,你不知道JSP页面的实际类名(因为系统自己挑选这个名字)。因此,为了命名JSP页面,可将jsp-file元素替换为servlet-calss元素,如下所示: <servlet> 命名JSP页面的原因与命名servlet的原因完全相同:即为了提供一个与定制设置(如,初始化参数和安全设置)一起使用的名称,并且,以便能更改激活JSP页面的URL(比方说,以便多个URL通过相同页面得以处理,或者从URL中去掉.jsp扩展名)。但是,在设置初始化参数时,应该注意,JSP页面是利用jspInit方法,而不是init方法读取初始化参数的。 例如,程序清单5-3给出一个名为TestPage.jsp的简单JSP页面,它的工作只是打印出用来激活它的URL的本地部分。TestPage.jsp放置在deployDemo应用的顶层。程序清单5-4给出了用来分配一个注册名PageName,然后将此注册名与http://host/webAppPrefix/UrlTest2/anything 形式的URL相关联的web.xml文件(即,deployDemo/WEB-INF/web.xml)的一部分。 程序清单5-3 TestPage.jsp 程序清单5-4 web.xml(说明JSP页命名的摘录) <web-app> 4 禁止激活器servlet 有两种禁止此缺省URL的主要方法: 在每个Web应用中重新映射/servlet/模式。 重要的是应该注意到,虽然重新映射每个Web应用中的/servlet/模式比彻底禁止激活servlet所做的工作更多,但重新映射可以用一种完全可移植的方式来完成。相反,全局禁止激活器servlet完全是针对具体机器的,事实上有的服务器(如ServletExec)没有这样的选择。下面的讨论对每个Web应用重新映射/servlet/ URL模式的策略。后面提供在Tomcat中全局禁止激活器servlet的详细内容。 4.1 重新映射/servlet/URL模式 在一个特定的Web应用中禁止以http://host/webAppPrefix/servlet/ 开始的URL的处理非常简单。所需做的事情就是建立一个错误消息servlet,并使用前一节讨论的url-pattern元素将所有匹配请求转向该servlet。只要简单地使用: <url-pattern>/servlet/*</url-pattern> 作为servlet-mapping元素中的模式即可。 例如,程序清单5-5给出了将SorryServlet servlet(程序清单5-6)与所有以http://host/webAppPrefix/servlet/ 开头的URL相关联的部署描述符文件的一部分。 程序清单5-5 web.xml(说明JSP页命名的摘录) <web-app> 程序清单5-6 SorryServlet.java import java.io.*; /** Simple servlet used to give error messages to public class SorryServlet extends HttpServlet { public void doPost(HttpServletRequest request, 4.2 全局禁止激活器:Tomcat 1.禁止激活器: Tomcat 4 Tomcat 4用与前面相同的方法关闭激活器servlet,即利用web.xml中的url-mapping元素进行关闭。不同之处在于Tomcat使用了放在install_dir/conf中的一个服务器专用的全局web.xml文件,而前面使用的是存放在每个Web应用的WEB-INF目录中的标准web.xml文件。 因此,为了在Tomcat 4中关闭激活器servlet,只需在install_dir/conf/web.xml中简单地注释出/servlet/* URL映射项即可,如下所示: <!-- 再次提醒,应该注意这个项是位于存放在install_dir/conf的Tomcat专用的web.xml文件中的,此文件不是存放在每个Web应用的WEB-INF目录中的标准web.xml。 2.禁止激活器:Tomcat3 在Apache Tomcat的版本3中,通过在install_dir/conf/server.xml中注释出InvokerInterceptor项全局禁止缺省servlet URL。例如,下面是禁止使用缺省servlet URL的server.xml文件的一部分。 <!-- 5 初始化和预装载servlet与JSP页面 这里讨论控制servlet和JSP页面的启动行为的方法。特别是,说明了怎样分配初始化参数以及怎样更改服务器生存期中装载servlet和JSP页面的时刻。 5.1 分配servlet初始化参数 利用init-param元素向servlet提供初始化参数,init-param元素具有param-name和param-value子元素。例如,在下面的例子中,如果initServlet servlet是利用它的注册名(InitTest)访问的,它将能够从其方法中调用getServletConfig().getInitParameter("param1")获得"Value 1",调用getServletConfig().getInitParameter("param2")获得"2"。 <servlet> 在涉及初始化参数时,有几点需要注意: 返回值。GetInitParameter的返回值总是一个String。因此,在前一个例子中,可对param2使用Integer.parseInt获得一个int。
import java.io.*; /** Simple servlet used to illustrate servlet public class InitServlet extends HttpServlet { public void init() { public void doGet(HttpServletRequest request, 程序清单5-8 web.xml(说明初始化参数的摘录) <web-app> 5.2 分配JSP初始化参数 1)使用jsp-file而不是servlet-class。因此,WEB-INF/web.xml文件的servlet元素如下所示: <servlet> 2)几乎总是分配一个明确的URL模式。对servlet,一般相应地使用以http://host/webAppPrefix/servlet/ 开始的缺省URL。只需记住,使用注册名而不是原名称即可。这对于JSP页面在技术上也是合法的。例如,在上面给出的例子中,可用URL http://host/webAppPrefix/servlet/PageName 访问RealPage.jsp的对初始化参数具有访问权的版本。但在用于JSP页面时,许多用户似乎不喜欢应用常规的servlet的URL。此外,如果JSP页面位于服务器为其提供了目录清单的目录中(如,一个既没有index.html也没有index.jsp文件的目录),则用户可能会连接到此JSP页面,单击它,从而意外地激活未初始化的页面。因此,好的办法是使用url-pattern(5.3节)将JSP页面的原URL与注册的servlet名相关联。这样,客户机可使用JSP页面的普通名称,但仍然激活定制的版本。例如,给定来自项目1的servlet定义,可使用下面的servlet-mapping定义: <servlet-mapping> 3)JSP页使用jspInit而不是init。自动从JSP页面建立的servlet或许已经使用了inti方法。因此,使用JSP声明提供一个init方法是不合法的,必须制定jspInit方法。 为了说明初始化JSP页面的过程,程序清单5-9给出了一个名为InitPage.jsp的JSP页面,它包含一个jspInit方法且放置于deployDemo Web应用层次结构的顶层。一般,http://host/deployDemo/InitPage.jsp 形式的URL将激活此页面的不具有初始化参数访问权的版本,从而将对firstName和emailAddress变量显示null。但是,web.xml文件(程序清单5-10)分配了一个注册名,然后将该注册名与URL模式/InitPage.jsp相关联。 程序清单5-9 InitPage.jsp public void jspInit() { 程序清单5-10 web.xml(说明JSP页面的init参数的摘录) <web-app> 5.3 提供应用范围内的初始化参数 可利用context-param元素声明这些系统范围内的初始化值。context-param元素应该包含param-name、param-value以及可选的description子元素,如下所示: <context-param> 可回忆一下,为了保证可移植性,web.xml内的元素必须以正确的次序声明。但这里应该注意,context-param元素必须出现任意与文档有关的元素(icon、display-name或description)之后及filter、filter-mapping、listener或servlet元素之前。 5.4 在服务器启动时装载servlet 假如servlet或JSP页面有一个要花很长时间执行的init(servlet)或jspInit(JSP)方法。例如,假如init或jspInit方法从某个数据库或ResourceBundle查找产量。这种情况下,在第一个客户机请求时装载servlet的缺省行为将对第一个客户机产生较长时间的延迟。因此,可利用servlet的load-on-startup元素规定服务器在第一次启动时装载servlet。下面是一个例子。 <servlet> 可以为此元素体提供一个整数而不是使用一个空的load-on-startup。想法是服务器应该在装载较大数目的servlet或JSP页面之前装载较少数目的servlet或JSP页面。例如,下面的servlet项(放置在Web应用的WEB-INF目录下的web.xml文件中的web-app元素内)将指示服务器首先装载和初始化SearchServlet,然后装载和初始化由位于Web应用的result目录中的index.jsp文件产生的servlet。 <servlet> 6 声明过滤器 servlet版本2.3引入了过滤器的概念。虽然所有支持servlet API版本2.3的服务器都支持过滤器,但为了使用与过滤器有关的元素,必须在web.xml中使用版本2.3的DTD。 例如,程序清单5-11帝国难以了一个简单的过滤器,只要访问相关的servlet或JSP页面,它就截取请求并在标准输出上打印一个报告(开发过程中在桌面系统上运行时,大多数服务器都可以使用这个过滤器)。 程序清单5-11 ReportFilter.java import java.io.*; /** Simple filter that prints a report on the standard output public class ReportFilter implements Filter { public void init(FilterConfig config) public void destroy() {} web.xml 详解三 <filter> 一旦命名了一个过滤器,可利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。关于此项工作有两种选择。 首先,可使用filter-name和servlet-name子元素把此过滤器与一个特定的servlet名(此servlet名必须稍后在相同的web.xml文件中使用servlet元素声明)关联。例如,下面的程序片断指示系统只要利用一个定制的URL访问名为SomeServletName的servlet或JSP页面,就运行名为Reporter的过滤器。 <filter-mapping> 其次,可利用filter-name和url-pattern子元素将过滤器与一组servlet、JSP页面或静态内容相关联。例如,相面的程序片段指示系统只要访问Web应用中的任意URL,就运行名为Reporter的过滤器。 <filter-mapping> 例如,程序清单5-12给出了将ReportFilter过滤器与名为PageName的servlet相关联的web.xml文件的一部分。名字PageName依次又与一个名为TestPage.jsp的JSP页面以及以模式http://host/webAppPrefix/UrlTest2/ 开头的URL相关联。TestPage.jsp的源代码已经JSP页面命名的谈论在前面的3节"分配名称和定制的URL"中给出。事实上,程序清单5-12中的servlet和servlet-name项从该节原封不动地拿过来的。给定这些web.xml项,可看到下面的标准输出形式的调试报告(换行是为了容易阅读)。 audit.irs.gov tried to access 程序清单5-12 Web.xml(说明filter用法的摘录) <web-app> 7 指定欢迎页 假如用户提供了一个像http://host/webAppPrefix/directoryName/ 这样的包含一个目录名但没有包含文件名的URL,会发生什么事情呢?用户能得到一个目录表?一个错误?还是标准文件的内容?如果得到标准文件内容,是index.html、index.jsp、default.html、default.htm或别的什么东西呢? Welcome-file-list元素及其辅助的welcome-file元素解决了这个模糊的问题。例如,下面的web.xml项指出,如果一个URL给出一个目录名但未给出文件名,服务器应该首先试用index.jsp,然后再试用index.html。如果两者都没有找到,则结果有赖于所用的服务器(如一个目录列表)。 <welcome-file-list> 虽然许多服务器缺省遵循这种行为,但不一定必须这样。因此,明确地使用welcom-file-list保证可移植性是一种良好的习惯。 8 指定处理错误的页面 现在我了解到,你在开发servlet和JSP页面时从不会犯错误,而且你的所有页面是那样的清晰,一般的程序员都不会被它们的搞糊涂。但是,是人总会犯错误的,用户可能会提供不合规定的参数,使用不正确的URL或者不能提供必需的表单字段值。除此之外,其它开发人员可能不那么细心,他们应该有些工具来克服自己的不足。 error-page元素就是用来克服这些问题的。它有两个可能的子元素,分别是:error-code和exception-type。第一个子元素error-code指出在给定的HTTP错误代码出现时使用的URL。第二个子元素excpetion-type指出在出现某个给定的Java异常但未捕捉到时使用的URL。error-code和exception-type都利用location元素指出相应的URL。此URL必须以/开始。location所指出的位置处的页面可通过查找HttpServletRequest对象的两个专门的属性来访问关于错误的信息,这两个属性分别是 javax.servlet.error.status_code和javax.servlet.error.message。 可回忆一下,在web.xml内以正确的次序声明web-app的子元素很重要。这里只要记住,error-page出现在web.xml文件的末尾附近,servlet、servlet-name和welcome-file-list之后即可。 8.1 error-code元素 为了更好地了解error-code元素的值,可考虑一下如果不正确地输入文件名,大多数站点会作出什么反映。这样做一般会出现一个404错误信息,它表示不能找到该文件,但几乎没提供更多有用的信息。另一方面,可以试一下在www.microsoft.com、www.ibm.com 处或者特别是在www.bea.com 处输出未知的文件名。这是会得出有用的消息,这些消息提供可选择的位置,以便查找感兴趣的页面。提供这样有用的错误页面对于Web应用来说是很有价值得。事实上rm-error-page子元素)。由form-login-page给出的HTML表单必须具有一个j_security_check的ACTION属性、一个名为j_username的用户名文本字段以及一个名为j_password的口令字段。 例如,程序清单5-19指示服务器使用基于表单的验证。Web应用的顶层目录中的一个名为login.jsp的页面将收集用户名和口令,并且失败的登陆将由相同目录中名为login-error.jsp的页面报告。 程序清单5-19 web.xml(说明login-config的摘录) <web-app> 9.2 限制对Web资源的访问 现在,可以指示服务器使用何种验证方法了。"了不起,"你说道,"除非我能指定一个来收到保护的URL,否则没有多大用处。"没错。指出这些URL并说明他们应该得到何种保护正是security-constriaint元素的用途。此元素在web.xml中应该出现在login-config的紧前面。它包含是个可能的子元素,分别是:web-resource-collection、auth-constraint、user-data-constraint和display-name。下面各小节对它们进行介绍。 web-resource-collection 此元素确定应该保护的资源。所有security-constraint元素都必须包含至少一个web-resource-collection项。此元素由一个给出任意标识名称的web-resource-name元素、一个确定应该保护的URL的url-pattern元素、一个指出此保护所适用的HTTP命令(GET、POST等,缺省为所有方法)的http-method元素和一个提供资料的可选description元素组成。例如,下面的Web-resource-collection项(在security-constratint元素内)指出Web应用的proprietary目录中所有文档应该受到保护。 <security-constraint> 重要的是应该注意到,url-pattern仅适用于直接访问这些资源的客户机。特别是,它不适合于通过MVC体系结构利用RequestDispatcher来访问的页面,或者不适合于利用类似jsp:forward的手段来访问的页面。这种不匀称如果利用得当的话很有好处。例如,servlet可利用MVC体系结构查找数据,把它放到bean中,发送请求到从bean中提取数据的JSP页面并显示它。我们希望保证决不直接访问受保护的JSP页面,而只是通过建立该页面将使用的bean的servlet来访问它。url-pattern和auth-contraint元素可通过声明不允许任何用户直接访问JSP页面来提供这种保证。但是,这种不匀称的行为可能让开发人员放松警惕,使他们偶然对应受保护的资源提供不受限制的访问。 auth-constraint 尽管web-resource-collention元素质出了哪些URL应该受到保护,但是auth-constraint元素却指出哪些用户应该具有受保护资源的访问权。此元素应该包含一个或多个标识具有访问权限的用户类别role-name元素,以及包含(可选)一个描述角色的description元素。例如,下面web.xml中的security-constraint元素部门规定只有指定为Administrator或Big Kahuna(或两者)的用户具有指定资源的访问权。 <security-constraint> 重要的是认识到,到此为止,这个过程的可移植部分结束了。服务器怎样确定哪些用户处于任何角色以及它怎样存放用户的口令,完全有赖于具体的系统。 例如,Tomcat使用install_dir/conf/tomcat-users.xml将用户名与角色名和口令相关联,正如下面例子中所示,它指出用户joe(口令bigshot)和jane(口令enaj)属于administrator和kahuna角色。 <tomcat-users> user-data-constraint 这个可选的元素指出在访问相关资源时使用任何传输层保护。它必须包含一个transport-guarantee子元素(合法值为NONE、INTEGRAL或CONFIDENTIAL),并且可选地包含一个description元素。transport-guarantee为NONE值将对所用的通讯协议不加限制。INTEGRAL值表示数据必须以一种防止截取它的人阅读它的方式传送。虽然原理上(并且在未来的HTTP版本中),在INTEGRAL和CONFIDENTIAL之间可能会有差别,但在当前实践中,他们都只是简单地要求用SSL。例如,下面指示服务器只允许对相关资源做HTTPS连接: <security-constraint> display-name security-constraint的这个很少使用的子元素给予可能由GUI工具使用的安全约束项一个名称。 9.3 分配角色名 迄今为止,讨论已经集中到完全由容器(服务器)处理的安全问题之上了。但servlet以及JSP页面也能够处理它们自己的安全问题。 例如,容器可能允许用户从bigwig或bigcheese角色访问一个显示主管人员额外紧贴的页面,但只允许bigwig用户修改此页面的参数。完成这种更细致的控制的一种常见方法是调用HttpServletRequset的isUserInRole方法,并据此修改访问。 Servlet的security-role-ref子元素提供出现在服务器专用口令文件中的安全角色名的一个别名。例如,假如编写了一个调用request.isUserInRole("boss")的servlet,但后来该servlet被用在了一个其口令文件调用角色manager而不是boss的服务器中。下面的程序段使该servlet能够使用这两个名称中的任何一个。 <servlet> 也可以在web-app内利用security-role元素提供将出现在role-name元素中的所有安全角色的一个全局列表。分别地生命角色使高级IDE容易处理安全信息。 10 控制会话超时 如果某个会话在一定的时间内未被访问,服务器可把它扔掉以节约内存。可利用HttpSession的setMaxInactiveInterval方法直接设置个别会话对象的超时值。如果不采用这种方法,则缺省的超时值由具体的服务器决定。但可利用session-config和session-timeout元素来给出一个适用于所有服务器的明确的超时值。超时值的单位为分钟,因此,下面的例子设置缺省会话超时值为三个小时(180分钟)。 <session-config> 11 Web应用的文档化 越来越多的开发环境开始提供servlet和JSP的直接支持。例子有Borland Jbuilder Enterprise Edition、Macromedia UltraDev、Allaire JRun Studio(写此文时,已被Macromedia收购)以及IBM VisuaAge for Java等。 大量的web.xml元素不仅是为服务器设计的,而且还是为可视开发环境设计的。它们包括icon、display-name和discription等。 icon icon元素指出GUI工具可用来代表Web应用的一个和两个图像文件。可利用small-icon元素指定一幅16 x 16的GIF或JPEG图像,用large-icon元素指定一幅32 x 32的图像。下面举一个例子: <icon> display-name display-name元素提供GUI工具可能会用来标记此Web应用的一个名称。下面是个例子。 <display-name>Rare Books</display-name> description description元素提供解释性文本,如下所示: <description> 12 关联文件与MIME类型 服务器一般都具有一种让Web站点管理员将文件扩展名与媒体相关联的方法。例如,将会自动给予名为mom.jpg的文件一个image/jpeg的MIME类型。但是,假如你的Web应用具有几个不寻常的文件,你希望保证它们在发送到客户机时分配为某种MIME类型。mime-mapping元素(具有extension和mime-type子元素)可提供这种保证。例如,下面的代码指示服务器将application/x-fubar的MIME类型分配给所有以.foo结尾的文件。 <mime-mapping> 或许,你的Web应用希望重载(override)标准的映射。例如,下面的代码将告诉服务器在发送到客户机时指定.ps文件作为纯文本(text/plain)而不是作为PostScript(application/postscript)。 <mime-mapping>
JSP taglib元素具有一个必要的uri属性,它给出一个TLD(Tag Library Descriptor)文件相对于Web应用的根的位置。TLD文件的实际名称在发布新的标签库版本时可能会改变,但我们希望避免更改所有现有JSP页面。此外,可能还希望使用保持taglib元素的简练性的一个简短的uri。这就是部署描述符文件的taglib元素派用场的所在了。Taglib包含两个子元素:taglib-uri和taglib-location。taglib-uri元素应该与用于JSP taglib元素的uri属性的东西相匹配。Taglib-location元素给出TLD文件的实际位置。例如,假如你将文件chart-tags-1.3beta.tld放在WebApp/WEB-INF/tlds中。现在,假如web.xml在web-app元素内包含下列内容。 <taglib> 给出这个说明后,JSP页面可通过下面的简化形式使用标签库。 <%@ taglib uri="/charts.tld" prefix="somePrefix" %> 14 指定应用事件监听程序 应用事件监听器程序是建立或修改servlet环境或会话对象时通知的类。它们是servlet规范的版本2.3中的新内容。这里只简单地说明用来向Web应用注册一个监听程序的web.xml的用法。 注册一个监听程序涉及在web.xml的web-app元素内放置一个listener元素。在listener元素内,listener-class元素列出监听程序的完整的限定类名,如下所示: <listener> 虽然listener元素的结构很简单,但请不要忘记,必须正确地给出web-app元素内的子元素的次序。listener元素位于所有的servlet元素之前以及所有filter-mapping元素之后。此外,因为应用生存期监听程序是serlvet规范的2.3版本中的新内容,所以必须使用web.xml DTD的2.3版本,而不是2.2版本。 例如,程序清单5-20给出一个名为ContextReporter的简单的监听程序,只要Web应用的Servlet-Context建立(如装载Web应用)或消除(如服务器关闭)时,它就在标准输出上显示一条消息。程序清单5-21给出此监听程序注册所需要的web.xml文件的一部分。 程序清单5-20 ContextReporterjava import javax.servlet.*; /** Simple listener that prints a report on the standard output public class ContextReporter implements ServletContextListener { public void contextDestroyed(ServletContextEvent event) { 程序清单5-21 web.xml(声明一个监听程序的摘录) <web-app> 15 J2EE元素 本节描述用作J2EE环境组成部分的Web应用的web.xml元素。这里将提供一个简明的介绍,详细内容可以参阅http://java.sun.com/j2ee/j2ee-1_3-fr-spec.pdf的Java 2 Plantform Enterprise Edition版本1.3规范的第5章。 distributable distributable元素指出,Web应用是以这样的方式编程的:即,支持集群的服务器可安全地在多个服务器上分布Web应用。例如,一个可分布的应用必须只使用Serializable对象作为其HttpSession对象的属性,而且必须避免用实例变量(字段)来实现持续性。distributable元素直接出现在discription元素之后,并且不包含子元素或数据,它只是一个如下的标志。 resource-env-ref resource-env-ref元素声明一个与某个资源有关的管理对象。此元素由一个可选的description元素、一个resource-env-ref-name元素(一个相对于java:comp/env环境的JNDI名)以及一个resource-env-type元素(指定资源类型的完全限定的类),如下所示: <resource-env-ref> env-entry env-entry元素声明Web应用的环境项。它由一个可选的description元素、一个env-entry-name元素(一个相对于java:comp/env环境JNDI名)、一个env-entry-value元素(项值)以及一个env-entry-type元素(java.lang程序包中一个类型的完全限定类名,java.lang.Boolean、java.lang.String等)组成。下面是一个例子: ejb-ref ejb-ref元素声明对一个EJB的主目录的应用。它由一个可选的description元素、一个ejb-ref-name元素(相对于java:comp/env的EJB应用)、一个ejb-ref-type元素(bean的类型,Entity或Session)、一个home元素(bean的主目录接口的完全限定名)、一个remote元素(bean的远程接口的完全限定名)以及一个可选的ejb-link元素(当前bean链接的另一个bean的名称)组成。 ejb-local-ref May 06 美国导演/演员Woody Allen (伍迪艾伦)的幽默http://club.chinaren.com/16/107953479 最近看了Woody Allen的几部电影,Woody Allen号称是继卓别林之后最具喜剧天才的电影导演,果然名不虚传。
我因为考纯粹哲学时作弊被大学开除了;我在考试时窥探坐在我旁边男孩的灵魂。
2、When I was kidnapped, my parents snapped into action. They rented out my room. 我被绑架后,我父母迅速采取了行动,他们把我的房间出租了出去。
如果你放弃让你想活100岁的所有事情,你就能活到100岁。 分析:无欲则刚。
4、It's not that I'm afraid to die, I just don't want to be there when it happens. 我并不是害怕死亡,只是当死亡发生时我并不想在那儿。
5、The lion and the calf shall lie down together but the calf won't get much sleep. 狮子和小牛能躺在一起,但小牛肯定睡不塌实。
6、To you I'm an atheist; to God, I'm the Loyal Opposition. 对你来说我是个无神论者,对上帝来说,我是个忠诚的反对者。
7、If only God would give me some clear sign! Like making a large deposit in my name at a Swiss bank. 如果上帝能给我显现一些神迹(签名)该多好!比如说在瑞士银行以我的名字存一大笔钱。 分析:sign一个意思是签名,另一个含义是显神迹。
8、If you want to make God laugh, tell him about your plans. 如果你想让上帝发笑,就告诉他你的计划。 分析:上帝觉得人们的计划是可笑的,因为上帝掌握着运气。
9、In my house I'm the boss, my wife is just the decision maker. 在我家我是老板,我太太只是一个决策者。
10、My brain? That´s my second favourite organ. 我的大脑?那是我第二喜欢的器官。
11、It seemed the world was divided into good and bad people. The good ones slept better... while the bad ones seemed to enjoy the waking hours much more. 世人好象被分成了好人而后坏人。好人睡觉塌实…..但坏人好象更享受清醒的时候。
12、I've often said, the only thing standing between me and greatness is me 我经常说站在我和伟大之间的唯一的东西是我自己。
13、I don't want to achieve immortality through my work. I want to achieve it through not dying. 我不想通过我的作品使我自己不朽,我想通过不死来达到不朽。
14、I have bad reflexes. I was once run over by a car being pushed by two guys. 我条件反射很迟钝,曾经被汽车轧了过去,因为两个家伙推我。
15、I'd never join a club that would allow a person like me to become a member. 我决不会参加一个允许我这样的人成为会员的俱乐部。
16、Life is full of misery, loneliness, and suffering - and it's all over much too soon. 生活充满了痛苦、孤独和苦难——这些结束得太快了。
17、I'm very proud of my gold pocket watch. My grandfather, on his deathbed, sold me this watch. 我非常骄傲拥有一块金表,那是我爷爷在临死时卖给我的。
18、I believe there is something out there watching us. Unfortunately, it's the government. 我相信有什么东西一直在关注我我们,不幸得是那是政府。
19、The talent for being happy is appreciating and liking what you have, instead of what you don't have. 保持快乐的才能是欣赏和喜欢你拥有的东西,而不是你没有的东西。
20、Time is nature's way of keeping everything from happening at once 时间是防止任何事情马上发生的一种自然方式。
21、有人问Woody Allen:
22、I do not believe in an afterlife, although I am bringing a change of underwear.
23、More than any other time in history, mankind faces a crossroads. One path leads to despair and utter hopelessness. The other, to total extinction. Let us pray we have the wisdom to choose correctly.
24、I'm short enough and ugly enough to succeed on my own.
25、Dying is one of the few things that can be done as easily lying down. Java Encoding1.字符
字符集是字符的集合。例如,汉字字符是中国人最先发明的字符,在中文、日文、韩文和越南文的书写中使用。这也说明了字符和字符集之间的关系,字符组成字符集。 3.编码字符集 编码字符集是一个字符集(有时候也被简称位字符集),它为每一个字符分配一个唯一数字。最早的编码是iso8859-1,和ascii编码相似。但为了方便表示各种各样的语言,逐渐出现了很多标准编码。 iso8859-1:属于单字节编码字符集,最多能表示的字符范围是0-255,应用于英文系列,除了iso8859-1以外还有其他iso8859系列的编码,这些编码都是为了满足欧洲国家语言字符的需要而设计的。 GB2312/GBK/ GB18030:前面提到的iso8859-1最多只能表示256个字符,这对于汉字来说实在是有些抱歉,所以就有了现在要介绍的汉字国标码,专门用来表示汉字,是双字节编码字符集,而英文字母和iso8859-1一致(兼容iso8859-1编码)。其中GBK编码能够用来同时表示繁体字和简体字,而GB2312只能表示简体字,GBK是兼容GB2312编码的。而GB18030-2000则是一个更复杂的字符集,采用变长字节的编码方式,能够支持更多的字符。需要注意的是中国政府要求所有在中国出售的软件必须支持GB18030。 Unicode:这是最统一的编码字符集,可以用来表示所有语言的字符,不兼容任何前面提到的编码字符集。Unicode 标准始终使用十六进制数字,而且在书写时在前面加上前缀“U+”,所以“A”的编码书写为“U+0041”。注意:在JAVA语言中书写时应该使用转义符‘\u’表示,如 char charA = ‘\u0041’; 这种表示方法等与 char charA = ‘A’; 。 从ASCII(英文) ==> 西欧文字 ==> 东欧字符集(俄文,希腊语等) ==> 东亚字符集(GB2312 BIG5 SJIS等)==> 扩展字符集GBK GB18030这个发展过程基本上也反映了字符集标准的发展过程,但这么随着时间的推移,尤其是互联网让跨语言的信息的交互变得越来越多的时候,太多多针对本地语言的编码标准的出现导致一个应用程序的国际化变得成本非常高。尤其是你要编写一个同时包含法文和简体中文的文档,这时候一般都会想到要是用一个通用的字符集能够显示所有语言的所有文字就好了,而且这样做应用也能够比较方便的国际化,为了达到这个目标,即使应用牺牲一些空间和程序效率也是非常值得的。UNICODE就是这样一个通用的解决方案。 4.Unicode编码字符集 Unicode 因为必须将中、韩、日、英、法、阿拉伯……等许多国家所使用的文字都纳入,目前已经包含了六万多个字符,所以 Unicode 使用了16个位来为字符编码。因为 Unicode 使用了 16 位编码,所以每个字符都用 16 位来储存或传输是很自然的事,这种储存或传输的格式称为UTF-16(一种Unicode的字符编码方案,在这里所说的UTF-16并不涉及增补字符的表示,本文将会在稍后介绍)。但是如果你使用到的字符都是西方字符,那么你一定不会想用 UTF-16 的格式,因为体积比8位的iso8859-1多了一倍,如此一来就必须考虑程序运行时各种字符在内存中所占空间的性能问题,这便引入了字符编码方案的概念:
最常用的代码单元是字节,所以可以简单的认为字符编码方案是为了告诉计算机如何将编码字符集(如Unicode)映射到计算机可以识别的数据格式中,如字节。这种编码方案往往能够为他所对应的字符集在计算机处理时提供更为优化的空间以及性能上的解决方案。Unicode编码字符集有三种字符编码方案,下面将逐一介绍: l UTF-32* 即将每一个Unicode编码表示为相同值的32位整数。很明显,它是内部处理最方便的表达方式,但是,如果作为一般字符串表达方式,则要消耗更多的内存。显而易见,对于英文字母的表示将需要多个0字节,仅仅因为我们需要4个字节32位来表示一个Unicode字符。 l UTF-16 使用一个或两个未分配的 16位代码单元的序列对Unicode编码进行编码。值U+0000至U+FFFF 编码为一个相同值的16位单元。增补字符*编码为两个代码单元,第一个单元来自于高代理范围(U+D800 至 U+DBFF),第二个单元来自于低代理范围(U+DC00 至U+DFFF)。这在概念上可能看起来类似于多字节编码,但是其中有一个重要区别:值 U+D800 至 U+DFFF 保留用于 UTF-16;没有这些值分配字符作为代码点。这意味着,对于一个字符串中的每个单独的代码单元,软件可以识别是否该代码单元表示某个单单元字符,或者是否该代码单元是某个双单元字符的第一个或第二单元。这相当于某些传统的多字节字符编码来说是一个显著的改进,在传统的多字节字符编码中,字节值0x41 既可能表示字母“A”,也可能是一个双字节字符的第二个字节。 l UTF-8 使用一至四个字节的序列对编码Unicode进行编码。U+0000至U+007F使用一个字节编码,U+0080至U+07FF 使用两个字节,U+0800 至U+FFFF使用三个字节,而U+10000至U+10FFFF使用四个字节。UTF-8设计原理为:字节值0x00至0x7F始终表示代码点U+0000至U+007F(Basic Latin 字符子集,它对应 ASCII 字符集)。这些字节值永远不会表示其他Unicode编码字符,这一特性使 UTF-8 可以很方便地在软件中将特殊的含义赋予某些 ASCII 字符。UTF-8 的格式在编码英文时,只需要8位,但是中文则是24位,其他更加偏僻的字符才又可能是32位,这也是UTF-8最大的编码特点,可以最高效率的利用计算机空间,因为在计算机处理的时候大多数情况下还是只使用英文进行运算和处理,这也是为什么还需要UTF-8的主要原因,因为毕竟互联网70%以上的信息仍然是英文。如果连英文都用2个字节存取(UCS-2),空间浪费不就太多了?
5.Java与编码字符集 从上面的介绍我们知道了Unicode编码字符集可以用来表示世界上所有的语言文字。Java内部处理字符使用的字序方式是Unicode,这是一种通行全球的编码方式,他使Java语言能够描述世界上所有的文字。在Java程序中对各种字符在内存中处理是使用Unicode的UTF-8编码方式,这也是因为UTF-8的特点所决定的,Class File(也就是bytecode)中有一栏位叫做常数区(Constant Pool),一律使用UTF-8为子元编码。 这看起来一切正常,Java可以处理世界上所有的字符,一切都是按照秩序在运行,但是,从前面的讨论我们知道,世界上并不是仅仅只有Unicode编码字符集,同时存在的还有iso8859-1、GBK等编码字符集,就是在Unicode中也同样存在着UTF-8,UTF-16,UTF-32等多种编码,如果传入的字节编码采用的是GB18030,而采用的解码方式为UTF-8那会有什么后果呢,看看下面的代码片段: public static final String TEST_RESOURCE = "你好"; public static void testEncoding() { try {
byte[] bytes = TEST_RESOURCE.getBytes("GB18030");
String result = new String(bytes, "UTF-8"); System.out.println("Receive value: [" + result + "].");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block e.printStackTrace(); } } 执行以上的代码片段,在我的机器(Win XP中文版)上面得到的结果是: Receive value: [���]. 明白了吧,这就是久负盛名的乱码问题的根源,目前在市面上存在有多种编码字符集,以及编码字符集的编码方案,所以虽然在Java中内部是以Unicode的UTF-8来处理各种字符的表示以及运算,但是这仅仅是在Java内部而以,如果Java程序需要和外部应用系统进行交互,比如与操作系统,数据库系统之间的交互,那么在这些交互过程中如何处理字符集的编码解码是解决好Java应用程序乱码问题的根源。如果将上面的代码块修改成如下的代码块: public static void testEncoding() { try {
byte[] bytes = TEST_RESOURCE.getBytes("GB18030");
String result = new String(bytes, "GB18030"); System.out.println("Receive value: [" + result + "].");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block e.printStackTrace(); } } 注意红色标注的地方,执行以上的代码块将会受到预期的结果: Receive value: [你好]. 统一字符的编码类型和解码类型,如此一来任何乱码问题都不会再是问题了。在网上可以搜索到N多的关于如何解决J2EE乱码问题的文章,我在这里也就不废话了,我只是想说说Java乱码问题的根源之所在。 如果你仔细想想Java的开发过程,原文件编写、javac编译、java执行,这每一步骤都会涉及到编码的转换过程,这个过程总是存在的,只是有的时候用默认的参数进行。 我们从javac这个命令来开始我们的分析,编译的时候,如果你不说明源文件编码方式的话,javac 编译器在读进此原始程序文件开始编译之前,会先去询问操作系统档案预设的编码方式为何。以我的操作系统WIN XP 中文版来说,javac 会先询问WIN XP,得知当前的编码是用GB18030的方式编码。然后就可以将源文件由GB18030转成Unicode编码方式,开始进行编译。在这里就会发生一下一些编码问题: l 如果操作系统的国籍资料设定错误,会造成javac编译器取得的编码信息是错误的,这里也有可能由于系统属性file.encoding设置错误,在我的系统中该属性为GB18030,可以通过代码System.out.println(System.getProperties());输出可能的系统属性。 l 较差劲的编译器可能没有主动询问操作系统的编码方式,而是采用编译器预设的编码方式,当然这种情况对于目前先进的编译器来说已经不存在了,但是这确实是一种可能的原因。 l 源代码是在英文操作系统上书写采用编码iso8859-1,写好以后再将源代码传递给中文操作系统进行编译,这样由于两个操作系统的编码方式不同,也会造成javac执行错误。 明白了吧,这些问题在我们日常的代码编写过程中,往往由于默认的属性都正好能满足我们的需要,即源代码的书写以及编译都采用操作系统默认的编码方式,所以可能很多人到目前为止都没有遇见过诸如此类的问题,但是我们要知道,这些问题确实是存在的。 Java编译器在执行过程中给我们提供了可选的encoding参数来告诉编译器该采用何种编码方式将读入的源文件转换成Unicode编码方式,然后再进行后续的编译工作。 javac –encoding GB18030 …. 6.Inside OK,通过前面的介绍希望读者能够对Java以及各种字符编码之间的关系有个简单的了解,下面我在继续总结一下: l Javac是以系统默认编码(file.encoding系统属性)读入源文件,然后按Unicode进行编码的。 l 在JAVA运行的时候,JAVA也是采用Unicode编码的,为了高度利用内存空间提高效率对Unicode字符编码采用了UTF-8的方式编码,并且默认输入和输出的都是操作系统的默认编码。 l 也就是说在new String(bytes,encode)中,系统认为输入的是编码为encode的字节流,换句话说,如果按encode来翻译bytes才能得到正确的结果;而在new String(bytes)中采用的就是根据file.encoding系统属性读入的编码方式来进行编码,同样也必须根据系统默认的编码才能得到正确的结果,这个结果最后要在JAVA中保存,它还是要从这个encode转换成Unicode,因为在JAVA中各种字符均是以Unicode的形式来处理的。 l 也就是说有bytes-->encode字符-->Unicode字符的转换;而在String.getBytes([encode])中,系统要做一个Unicode字符-->encode字符-->bytes的转换。 希望通过本文的介绍能够使你对字符集编码的概念以及Java与字符集编码之间的关系有个清楚的认识,我相信,如果搞清楚了他们之间的关系,那个在Java world鼎鼎有名的乱码问题将一去不再复返了 April 28 doodleApril 27 sslSSL (Secure Socket Layer) 为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络 上之传输过程中不会被截取及窃听。目前一般通用之规格为40 bit之安全标准,美国则已推出128 bit之更高安全 标准,但限制出境。只要3.0版本以上之I.E.或Netscape浏览器即可支持SSL。 当前版本为3.0。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。 SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。 SSL协议提供的服务主要有: 1)认证用户和服务器,确保数据发送到正确的客户机和服务器; 2)加密数据以防止数据中途被窃取; 3)维护数据的完整性,确保数据在传输过程中不被改变。 SSL协议的工作流程: 服务器认证阶段:1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;4)服务器恢复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。 用户认证阶段:在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。 从SSL 协议所提供的服务及其工作流程可以看出,SSL协议运行的基础是商家对消费者信息保密的承诺,这就有利于商家而不利于消费者。在电子商务初级阶段,由于运作电子商务的企业大多是信誉较高的大公司,因此这问题还没有充分暴露出来。但随着电子商务的发展,各中小型公司也参与进来,这样在电子支付过程中的单一认证问题就越来越突出。虽然在SSL3.0中通过数字签名和数字证书可实现浏览器和Web服务器双方的身份验证,但是SSL协议仍存在一些问题,比如,只能提供交易中客户与服务器间的双方认证,在涉及多方的电子交易中,SSL协议并不能协调各方间的安全传输和信任关系。在这种情况下,Visa和 MasterCard两大信用卡公组织制定了SET协议,为网上信用卡支付提供了全球性的标准。 https介绍 HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的完全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。。 https是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,https的安全基础是SSL,因此加密的详细内容请看SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。 限制 它的安全保护依赖浏览器的正确实现以及服务器软件、实际加密算法的支持. 一种常见的误解是“银行用户在线使用https:就能充分彻底保障他们的银行卡号不被偷窃。”实际上,与服务器的加密连接中能保护银行卡号的部分,只有用户到服务器之间的连接及服务器自身。并不能绝对确保服务器自己是安全的,这点甚至已被攻击者利用,常见例子是模仿银行域名的钓鱼攻击。少数罕见攻击在网站传输客户数据时发生,攻击者尝试窃听数据于传输中。 商业网站被人们期望迅速尽早引入新的特殊处理程序到金融网关,仅保留传输码(transaction number)。不过他们常常存储银行卡号在同一个数据库里。那些数据库和服务器少数情况有可能被未授权用户攻击和损害。 April 24 TCP/IP这部分简要介绍一下TCP/IP的内部结构,为讨论与互联网有关的安全问题打下基础。TCP/IP协议组之所以流行,部分原因是因为它可以用在各种各样的信道和底层协议(例如T1和X.25、以太网以及RS-232串行接口)之上。确切地说,TCP/IP协议是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议和其他一些协议的协议组。 TCP/IP整体构架概述 TCP/IP协议并不完全符合OSI的七层参考模型。传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这7层是:物理层、数据链路层、网路层、传输层、话路层、表示层和应用层。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为: 应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。 传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。 互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。 网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。 TCP/IP中的协议 以下简单介绍TCP/IP中的协议都具备什么样的功能,都是如何工作的: 1. IP 网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。 IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。 高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好象是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。 2. TCP 如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。 TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。 面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。 3.UDP UDP与TCP位于同一层,但对于数据包的顺序错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网落时间协议)和DNS(DNS也使用TCP)。 欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。 4.ICMP ICMP与IP位于同一层,它被用来传送IP的的控制信息。它主要是用来提供有关通向目的地址的路径信息。ICMP的‘Redirect’信息通知主机通向其他系统的更准确的路径,而‘Unreachable’信息则指出路径有问题。另外,如果路径不可用了,ICMP可以使TCP连接‘体面地’终止。PING是最常用的基于ICMP的服务。 5. TCP和UDP的端口结构 TCP和UDP服务通常有一个客户/服务器的关系,例如,一个Telnet服务进程开始在系统上处于空闲状态,等待着连接。用户使用Telnet客户程序与服务进程建立一个连接。客户程序向服务进程写入信息,服务进程读出信息并发出响应,客户程序读出响应并向用户报告。因而,这个连接是双工的,可以用来进行读写。 两个系统间的多重Telnet连接是如何相互确认并协调一致呢?TCP或UDP连接唯一地使用每个信息中的如下四项进行确认: 源IP地址 发送包的IP地址。 目的IP地址 接收包的IP地址。 源端口 源系统上的连接的端口。 目的端口 目的系统上的连接的端口。 端口是一个软件结构,被客户程序或服务进程用来发送和接收信息。一个端口对应一个16比特的数。服务进程通常使用一个固定的端口,例如,SMTP使用25、Xwindows使用6000。这些端口号是‘广为人知’的,因为在建立与特定的主机或服务的连接时,需要这些地址和目的地址进行通讯。 April 23 胡兰成是不是张爱玲的悲哀?2009-04-08 16:04:03 来自: 湘水逝云(吃咸梅干变超人,哇哈哈哈哈) 今天看到张爱玲写给胡兰成的话“我是已经不喜欢你了。是你早就不喜欢我的” 他是不是她生命的劫?爱上他,是不是她的悲哀?能让一个如此高傲的女子低头的爱情,如果不发生是不是更好…怎忍心让曾经是心头好的她难过…不曾相遇,是不是更幸福~ 推荐语:
|
|||||||||||||||||||||||||||||||||||||||||||
|
|