实现多submit的方法非常多,这只是其中之一,在struts1.2.9以后的struts1.x版本中提供了一个action来处理,原理是通过判断某个请求参数是否为null来处理(这个请求参数就是某个submit的name属性值)
result里面的属性可以是任何值,不能是execute,还有其它几个actionsupport定义的方法名,否则会抛出异常,
re: AJAX从服务端获取数据的三种方法 银河使者 2008-07-19 19:51
本文的只是代码片段,为了演示这个功能,本文已经假设读者对javascript比较熟悉,因此,并没有列出所有的代码。如果那么,会无法突出重点,让想看这部分内容的读者不容易找到了。在以后的文章,我会提供源代码供读者下载学习。谢谢关注本文。
re: Java编码问题解决方案大揭密 银河使者 2008-07-19 19:13
我看到网上关于在servlet中向客户端输出中文字符时乱码解决方案一般是通过如下的代码解决:
response.setCharacterEncoding("utf-8");
或
response.setContentType("text/html;charset=utf-8");
但关键是web服务器转换字节时是否读取了这个设置的字符集编码呢?如果未读取,等于没设。所以最通用的方法是采用如同的代码解决向客户端中文乱码的问题:
String ss = "中华人民共和国";
String utf8 = new String(ss.getBytes("utf-8"), "iso-8859-1");
response.setCharacterEncoding("iso-8859-1");
response.getWriter().write(utf8);
re: Java编码问题解决方案大揭密 银河使者 2008-07-19 18:42
如果直接用getBytes("unicode"),就直接把ucs2编码得出来了。
如果用下面的代码:
zg.getBytes("unicode");
由于zg是以iso-8859-1保存的,因此,按着字节输出,就会有下面的结果:
0
e4
0
b8
0
ad
0
e5
0
9b
0
bd
这也说明iso-8859-1的编码转换成ucs2后,第一个字节补0
re: Java编码问题解决方案大揭密 银河使者 2008-07-19 18:41
要注意的一点就是getBytes和String都具有编码转换功能。
getBytes是将ucs2转换成其他的编码,而String是将其他的编码转换成ucs2编码
re: Java编码问题解决方案大揭密 银河使者 2008-07-19 18:30
@ James
不错,你的第一种方法是比我的通用,因为你的方法是通过String类进行编码转换的,而我的是通过web服务器所提供的setCharacterEncoding方法实现编码转换的。由于String类是jdk的标准类,所以这种转换方式和web服务器无关,任何基于java的程序(包括桌面程序)都可以使用这种方式进行转换。
而且将其以ISO-8859-1取出,实际上用iso-8859-1往外取字节,就相当于是不经过转换,直接取出来了,如将“中国"的utf-8编码“0xe4, 0xb8, 0xad,0xe5,0x9b, 0xbd”直接用iso-8859-1保存在String中(注意,不是将其转换成ucs2,而是直接用utf-8共6个字节将其保存在String中),代码如下:
byte[] utf8 = new byte[]{(byte)0xe4, (byte)0xb8, (byte)0xad,(byte) 0xe5, (byte)0x9b, (byte)0xbd};
String zg = new String(utf8, "iso-8859-1");
String sss = new String(zg.getBytes("iso-8859-1"), "utf-8"); // 不能用utf-8
String zg1 = new String(sss.getBytes("utf-8"), "utf-8");
System.out.println(sss);
System.out.println(zg1);
其中 String zg = new String(utf8, "iso-8859-1");的作用就是将“中国”的6个utf-8编码直接保存在String中,在这种情况下,不能使用zg.getBytes("utf-8")获得字节,因为getBytes方法功能是将String中的ucs2编码(4个字节)转换成utf-8编码的6个字节,而现在String中是6个字节的utf-8,而不是4个字节的ucs2,如果这时再用utf-8的话,java就会将这6个字节的utf-8编码当成了3个ucs2编码(2个字节为一个ucs2编码),所以就会出现乱码了。
而用zg.getBytes("iso-8859-1")就是将这6个字节的utf-8编码按原样取出,然后用 new String(zg.getBytes("iso-8859-1"), "utf-8");将这6个字节按着utf-8格式转换成了java内部使用的ucs2编码。(实际上utf-8编码并没有真正转化为ucs2,因为这样太占资源了,在程序中还可能有很多英文字符,因此,utf-8就直接放到那了,反正将它转换成ucs也很容易)。
而在sss中的编码就已经是utf-8(ucs2)了,因此,必须使用下面的代码获得字节数组:
sss.getBytes("utf-8")
re: Java编码问题解决方案大揭密 银河使者 2008-07-19 17:06
没有办法,由于做服务器的大多都是老外,它们永远不会有编码问题的,所以估计request.setCharacterEncoding方法就成了可选实现的功能的,但我想国产的web服务器应该都支持,如apusic 。
re: Java编码问题解决方案大揭密 银河使者 2008-07-19 17:05
如果response.setCharacterEncoding不好使,可以试试response.setContentType("text/html;charset=utf-8");
如果都不好使,就想别的方法,方法还是有的呢,可以用%xxxx形式,或是看一下setCharacterEncoding是怎么弄的,自已处理一下。
re: Java编码问题解决方案大揭密 银河使者 2008-07-19 16:59
@James
我的程序是在tomcat6调试通过的,你说的可能是tomcat5以前的版本,但那应该是这些版本的bug,从理论上,是必须支持这个功能的,否则web程序是无法在这些web服务器上运行的。但很遗憾,我没有碰到过这些版本的tomcat。
至于web乱码问题,我只是简单提了一下,本文的目的并不是解决web乱码问题。而是让读者了解java内部编码的问题。如果了解了java编码原理,你认为web乱码问题,甚至其他的乱码问题还能算是问题吗?
你说的没错,用form提交是产生乱码问题的一种原因,而用httpxmlrequest提交也会产生乱码。这种情况下最好使用encodeURI或encodeURIComponent将中文编成%xxxx的形式,然后在服务端使用java.net.URLDecoder.decode方法进行解码。
象在struts里的actionform,都可能会产生乱码问题。
还有就是在http请求头或响应头中传中文,也会出现乱码问题。这些只要了解了java的编码体系,都可以迎刃而解。
最后总结一下:
一般编码传送可以采用两种方式:
1、直接编码。就是采用utf-8、gbk等形式。这样在服务端可以使用setCharacterEncoding指定相应的编码。
2、使用url形式的编码。如%xxxx
如果使用<form>的话,会根据当前浏览器的编码确定发送的中文编码。
如果用javascript,会以utf-8编码发送。
re: Java编码问题解决方案大揭密 银河使者 2008-07-19 16:46
@James
不好意思,我的程序都是在tomcat6里调试通过的,再说这些都是servlet规范规定的,所有的web服务器必须遵循。如果某个web服务器不遵循,那么web程序也就无法在其上正常运行了。
web乱码的问题非常多
@上善
是的,一个笔误,已经改过来了,多谢提醒。如果还有什么地方写的有错误,欢迎大家指正。
用表变量好象效率不高。采用哪种方法,读者可以实际情况而定
文章的代码里有啊,如果是多个文件,将每个文件作为一个java.io.File对象保存在List中,实际上,每一个File对象就是一个已经上传到服务器的临时文件了。
public class UploadMoreAction extends ActionSupport
{
private java.util.List<File> uploads;
...
}
re: 何谓精通 银河使者 2008-06-16 09:18
I following my heart.
re: 何谓精通 银河使者 2008-06-15 20:31
还有楼主第三阶段问到保存大量的数据应用Java的什么数据结构。其实Java中的数据结构没有一种适合于保存大量的数据(如搜索引擎所需的以T为单位的数据),要想保存,就只有自己设计了。可以采用键树或更复杂的数据结构。也可采用分布试的存储方式(就象google后台的几十万台服务器),但这就需要互相协调了。但可以肯定,曾经成功解决这些问题的人一定是凤毛麟角了。要是有的话,早就被那些超级公司给挖走了,或是自己去创业了。基本上不会到处去投简历了。因为他(她)们所要的报酬是大多数公司无法支付的。
re: 何谓精通 银河使者 2008-06-15 20:26
楼主的四组面试问题有的确实有一定的深度。如果没仔细研究过,确实很难给出准确的答案。不过在面试时应主要考察应聘者的理解能力和应变能力。至于某种技术如何使用,如setTcpNoDelay方法是用来决定是否采用Nagle算法的,但我们可以换一种更广义的问法。如果在使用TCP传输数据时,如果传输的数据大多数是小数据量的数据,为了更有效地节省带宽,可以采取什么办法呢? 这个问题并未涉及具体的技术,但确考察了分析问题和解决问题的能力。个人认为这种问题更可以判断应聘者的能力。至于setTcpNoDelay方法,只要在网上查查,几秒种就可知道答案。但如果应聘者在没有使用过setTcpNoDelay方法的前提下,也可以从理论上解决setTcpNoDelay能解决的问题,那么说明应聘者有这个意识,至于具体如何用java或其他技术来实现,这根本不是问题。而如果认为用不用Nagle都一样,就算知道了setTcpNoDelay方法是做什么的,也压根不打算用,并且认为只要把数据发出去了,就万事大吉,那才是非常可怕地。
re: 何谓精通 银河使者 2008-06-15 20:07
所谓精通,可以分开来看。先来看精。
所谓“精”就是指对于一种技术有很深入的了解,如java的网络技术(socket等),不仅要对上层知识了解,还要对底层的实现细节有很深入的了解。那么如何来判断是否对某种技术(转指软件编程技术)精呢? 其实这个很简单,只需要编写一个任意复杂的程序(一个人在有限的时间可以读完的),无需上机调试,就可以即快速,又准确地说出结果。如果这个程序有bug,也不需要上机运行,就可以知道如何改进这个程序。 要想达到这种程度,必须对相关的每一个方法、函数,甚至参数所起的作用,以及在不同的情况下可以达到什么效果了如指掌。这样还会在不运行程序的情况下,非常有把握地知道程序的运行结果。 但真正达到这种程度的人并不多,如果要真达到了这个程序,是不会为工作犯愁的。
下面再来说说“通”,通一般指范围,如神通广大、博古通今等就是这个意思。也就是说,要达到“通”,就必须掌握范围很广的知识,如精通Java,就要了解和Java相关的所有知识,如J2EE、J2SE、J2ME这三大块和一些边缘的知识(可以不包括框架等技术)。能达到这种程度的人也是非常少的。
从上面所述看,单是“精”或"通“就已经是很难达到了,如果将它们组合成”精通“,那几乎没人能真正达到。 所以简历上写的”精通“基本就成了客套话了,千万别当真。 我曾经看过一个简历,竟然把目前大多数主流的技术都写出来了,而且竟然都是精通。最后一问这个人多大年纪,结果才20多岁,于是惊呼,奇才也。粗略算一下,他写的那些技术,如果要都弄得基本上算是精通(只是接近),至少需要几百年。而且必须夜以继日地学习。
所以简历上还是尽量别写”精通“,如果要写某种技术,可以按着如下方式写:
主要使用的语言或技术:Java、C#
或是直接写使用过Java、C#多长时间,如使用过C#三年,至于到达什么水平,就由考管来判断吧。
反正按着我的习惯,如果简历上写着很多精通,基本上一概不通过,因为,没有人可以在短短几年时间精通这么多技术。
re: 实现Java Web程序的自动登录 银河使者 2008-06-06 18:55
现在我想知道的是除了将用户名和密码保存在cookie中,或使用session,还有没有别的方法。
re: 实现Java Web程序的自动登录 银河使者 2008-06-06 18:16
要保存用户的信息,只能在客户端或服务端来保存,如果在客户端的cookie保存,有些信息无法保存,或比较麻烦,如对象等。
在本例中因为我要实现当出现用户登录界面时,显示用户名,而这在可能要保存一年时间,而我又不想在一年内都自动登录,所以用了session,并设了两个小时。
第二个问题。当然可以只使用cookie来保存用户名和密码。只因为我要实现短时间的自动登录,所以才用了session。
建议你做个简单的程序,用记事本写个程序,最简单的,按着步骤写,看看到底是哪个地方出错了。用struts做这些东西稍有不注意,就可能出错。
我没用过netbeans6.1开发过基于struts的程序,用的是myeclipse6.x。
但我想netbeans6.1应该差不多。至于没出来错误提示的原因可能是某些资源没找到,如资源文件、验证文件(可能路径不对)、或是要验证的属性写的不正确。具体的只有调程序才能出来,原因很多。
有几点你可以看一下。
1. 类名是loginAction吗?一般类名单词第一个字母都是大写,如LoginAction。看看是不是名子弄错了。是区分大小写的。
2. 验证xml文件名为:类名-validation.xml,如类名为LoginAction,xml文件名为LoginAction-validation.xml,注意大小写。
3. LoginAction-validation.xml和LoginAction.class必须在同一个目录下。看看这些文件的位置
@Jeanvixue
有可能是你的用于验证的xml文件名不对。或是嵌套字段写的不对。如下面的所示:
<s:textfield name="user.name" label="姓名1" />
<s:textfield name="user.age" label="年龄1"/>
再仔细检查一下。
re: PHP生成XML注意的事项 银河使者 2008-06-02 19:29
客户端的XMLHttpRequest控件是需要检测content-type地。但是如果没设content-type,仍然可以通过获得文本方式进行解析。
re: 透视MySQL数据库之更新语句 银河使者 2008-06-02 19:12
中小网站应用比较广泛,尤其服务端是非windows操作系统的
re: AJAX从服务端获取数据的三种方法 银河使者 2008-05-30 20:45
只要适合自己的,就是好的。
如果写NetBeans6.1的教程,其实还是写用netbeans开发如struts、web、jpa的程序吧,但我想关于netbeans的开发环境的东西可能没有太多,也许更多的还是某些具体的开发技术,如struts2。
还有在循环里尽量不要使用“+”连接字符串,而要在循环外使用StringBuilder,并且在循环里使用append来连接字符串的结论,并不是我首先提出来的,而是由某位大师提出的。我只是在这里分析了一下这个结论,并验证它的正确性。
还是原创的比贴的文章多。贴的都是转载的文章,很多都是非计算机的,总不能给它们也加上原创吧。^-^。只是感觉有意思。哈哈,至于评论吗?多少也无所谓。只是做个备份。
编译码是可以帮助分析,但是有时编译码是很愚蠢的。就象编译器虽然可以优化代码,但是使用编译器生成的汇编代码永远不可能和手工编写的代码相比。
还有就是为什么有的基于java的软件,如某些桌面软件,office等,的速度或性能不如同类的软件,虽然它们实现的功能类似,但是如果不注意这些细节的地方。就会量变引起质变。从而将自己的程序拖跨。学习一门语言很容易,但要是充分了解这门语言,也许要花很多精力和时间。
re: AJAX从服务端获取数据的三种方法 银河使者 2008-05-29 18:45
ajax从原理上讲很简单。其实任何技术从基本原理上看都很简单。但实现起来,确是另外一回事。
re: Dudu老大,给你提个大Bug 银河使者 2008-05-29 16:25
一直也没改啊。这个二级域名不知怎么着,有时不太好使
re: AJAX从服务端获取数据的三种方法 银河使者 2008-05-29 12:39
我一般安装任何软件都是完全安装的,没办法,硬盘就是大。^-^,要说漏掉是不可能的,我都是全选的。单位的机器也是按着同样的方法安的,没有问题,就是家里的dell笔记本出这种事。昨天安了个vs2008的patch,也不好使。
re: B/S,C/S架构混合使用 银河使者 2008-05-28 17:55
另外,开发一个大的软件系统不仅需要开发人员有团队精神。所使用的技术也应团队合作。没有哪一种技术可以适合于所有的领域和应用。如进行数据迁移,就可以利用数据库本身的技术,如sql server的DTS技术。
re: B/S,C/S架构混合使用 银河使者 2008-05-28 17:52
@for_the_king
谁说delphi、vc做的东西不能自动升级。我不知道你用过瑞星或其他的杀毒软件没。也是用VC或其他的语言写的,不是也可以自动升级。还有微软的smallclient(智能客户端),用C#或VB.net写的C/S程序。不是也可以很好的自动升级吗!至于通过tcp协议访问,当然,用delphi做的程序不一定直接使用tcp。就象ajax可以使用json一样,做个通用的映射组件,类似于web services,解决的方法非常多。
但是web程序却无法做到C/S的某些功能,至少很复杂。如做个树、菜单。这些用delphi、vb,只要几分钟就可以做个很好的程序。还有更复杂的效果。
最烦人的是web程序并不真正跨平台,ie6、ie7、firefox都得单独考虑。除非你可以强迫用户必须使用自己指定的浏览器。而C/S程序则是真正意义上的跨平台。(只限于windows,客户端是非windows时除外),在win98、win2000、winxp,2003,vista,windows2008上,只要能运行起来,界面效果都一样。
至于什么是企业级应用,我认为没有必要非得强调必须有什么,不能有什么。只要能满足用户的需要,其他的一切都不重要。主要得用户满意、然后才能老板满意,最后才能自己满意。
re: B/S,C/S架构混合使用 银河使者 2008-05-28 17:42
@懒人
不是有很多语言,而是所有支持网络技术(TCP协议)的语言或技术都可以做客户端。包括flash、office。
如果需要非常绚丽的效果,我看flash就很好,flash做动画可以其他语言比不了的啊。而且flash的script也可以使用TCP协议。这就足够了。如果谁用flash做一个msn或QQ的客户端,那效果远比msn或QQ要好的多了。
要什么结果。 就是在循环里连接字符串时,最好要在循环外建立一个StringBuilder对象,然后在循环中使用StringBuilder.append方法连接,而不用直接使用“+”进行连接字符串
re: UFO目击报告[照片] 银河使者 2008-05-27 22:44
按常理推断,这应该是数码相机的对焦灯照在飞机的玻璃窗上留下的。这几张照片很明显是透过飞机的窗户照的。谁有相机,可以对着汽车玻璃照几张看看。但要使用有对焦灯的相机哦! ^-^
re: AJAX从服务端获取数据的三种方法 银河使者 2008-05-27 21:58
重装软件可是最后一招。 这最后一招杀手锏我可不想这么快就用。 还是研究一下vs2008的设计视图为什么不好使吧。要是一不好使就重装,那不是要把人弄疯了。vs2008很大的,如果重装还不行,是不是要重装xp啊。^-^
re: AJAX从服务端获取数据的三种方法 银河使者 2008-05-27 08:49
并不是所有的html标签的innerHTML都有bug。我碰到的是<select>标签的innerHTML有一些bug。
不信通过getElementById获得<select>对象后,使用下面的代码试试,看看会发生什么效果
var select = getElementById("selectid");
select.innerHTML = "<option>abc</option><option>ddd</option>";
上面的代码是出不来的选项的,不知怎么着,IE6把第一个<option>弄没了。
只有用下面的代码才好使:
var select = getElementById("selectid");
select.outerHTML = "<select id='selectid' ><option>abc</option><option>ddd</option></select>";
re: it人35岁时 转型不能转行 银河使者 2008-05-26 20:25
没有人会比自己更了解自己。一切得靠自己努力啊!let's go!
re: it人35岁时 转型不能转行 银河使者 2008-05-26 20:23
没有哪个老板是慈善家(包括微软、google等大公司的老板),经常有人抱怨,所有的老板都是混蛋,但是奇怪的是,每一个人都想做这个“混蛋”。 也许我们做了老板后,也会和他们一样成为“混蛋”。 但在我们成为“混蛋”之前,关于自身的发展问题,还得劳自己的大架想着,不要期望某位老板或某家公司会主动为我们铺一条金光大道。 要想铺路,就得我们自己亲自动手了。 ^-^
re: AJAX从服务端获取数据的三种方法 银河使者 2008-05-26 10:39
不过我认为第3种方法比较好,可以使客户端编程更容易,也更直观。如果返回的xml比较复杂,使用第一种方法,javascript代码会很多。
但在实现项目中,这三种方法可以混合使用。
那是因为最后一个文件将前两个文件覆盖了,你需要为每一个文件起不同的名子。
re: Struts2教程10:国际化 银河使者 2008-05-20 22:13
to 小鱼
只要你使用了struts2,就可以生效。 处理属性文件是由jdk完成的,而寻找属性文件,是由struts2完成的。
但如果你不用struts2,spring也支持国际化,不防使用spring的国际化功能。
绚丽是要自己做的,哈哈,只是演示了功能而已,没做那么复杂。