re: 跳出多层循环的简单方法(Java版) 银河使者 2009-01-30 16:13
不可以的,我试了,编译不过去。我用的是jdk6
re: JDBC查询动态封装 银河使者 2009-01-29 19:31
封装本是面象对象最值得称道的地方,如果封装得太多有时得不偿失。个人认为在业务逻辑层,只要不直接涉及到SQL就可以,因为SQL本身是和数据库相关的,而业务逻辑层应和数据库不相关。但对于JDBC中的对象的使用上来说,一般也是和数据库不相关的(至少对于象SQL Server、oracle、db2、mysql这样的数据库来说是这样的)。
结论:数据访问层直接和数据库相关,可以涉及任何的SQL语句。业务逻辑层与数据库无关,在该层直接访问数据层,不能直接在业务逻辑层编写SQL语句,但可以使用JDBC的相关对象。
re: JDBC查询动态封装 银河使者 2009-01-29 19:26
@ cccp21
不讨论PreparedStatement了,要想动态,一般也是采用你的方法,即动态生成带SQL参数的SQL语句,以及通过循环调用setter方法来设置参数的值,这就是动态,所有的动态基本都是这么弄的。
我是说第二个问题,在查询后,又使用Map和Vector再对数据进行封装,是不是有些耗资源。要注意哦,如果是Web程序,可不是一个用户或几个用户在访问程序啊,要是门户类型的系统,可能在一分钟之内就会有数以万计的用户来访问。这时就要建立多达数万个Map和Vector,服务器会挂的。当然,如果用户在可控范围内,这么做是没有问题的。但是可以封装得更高级一些,如返回的这些数据直接可以被某些用于显示的组件使用,如使用json格式的组件。这根据具体情况而定。
是的,使用Map和Vector可以从逻辑上将JDBC和应用进行分离。但个人认为要想分离,可以从数据层及应用逻辑层进行分离更好。也就是有数据层提供相应的访问数据的方法,如获得指定用户的保存在数据库中的密码。而应用逻辑层一般不直接访问数据库,可以访问数据层中的方法进行逻辑处理。
虽然将数据放在Map是Vector中是更抽象了,但JDBC本身就是抽象的,在业务逻辑层直接访问ResultSet并没有什么不妥,因为不管后台用的是什么数据库,从ResultSet中获得数据的方法都是一样的。如果非想要跨数据库,不如直接用hibernate。
re: JDBC查询动态封装 银河使者 2009-01-26 19:00
条件是动态的也可以用查询参数,用java.sql.PreparedStatement就可以。楼主只是做了个封装,不过个人认为ResultSet本身也可以根据列名来定位列,而再把每行放在一个Map中,再把结果集放在Vector中,感觉有些多此一举。
re: 判断一个类是另一个类的子类 银河使者 2009-01-22 14:59
可以使用b instanceOf a
re: Hibernate的十大罪状 银河使者 2009-01-22 14:14
个人认为这种基于ORM的技术最好与语言和开发工具融合,也就是属于语言或开发工具的一部分,无缝结合,这要比framework更容易使用,说实话,所谓framework,实际上就是一个大大的patch,正因为语言不支持,才会做成framework来弥补这个不足,就象AOP,如果语言支持,那谁还会再实现一套AOP framework?
re: Hibernate的十大罪状 银河使者 2009-01-22 09:05
hibernate从总体上说设计思想还是很不错的,但高级的东西总是需要大量时间和精力去学习和研究。这也是hibernate的弊端。 这就象有一把绝世好剑,用好了,可以天下无敌,用不好可能会反伤了自己。
软件的发展历史也说明了这一点,想起当前使用面向过程的方式进行程序设计,虽然没有现在面向对象的思想选进,但程序结构很简单,实现也很容易,也没这么多设计模式,说起来很省力。而现在的OOP,虽然看似很先进,但实际上大大增加了程序的复杂度,之所有现在OOP的设计思想使程序设计更简单,是因为程序规模的增长已经远远超过了面向过程升级到OOP所增加的复杂度。
@Hadis
一般FilterDispatcher可设为"/*"以结果所有的请求,当然,也可以设为*.action,只截获action请求,
不知你客户端的jsp页面是GBK,还是utf-8,就算你在自己的过滤器中设了GBK,在执行FilterDispathcer时仍然按着Struts 2的设置来处理,就是说,还是会设成utf-8。你可以在自己的过滤器中在设置完request的gbk编码后,使用request.getParameter方法来自己读一下请求参数的值,看看是不是乱码!
@Hadis
是这样的,过滤器是对Servlet的,而Struts 2是通过拦截器来处理action的,当客户端发送请求时,首先这个请求会被struts 2的过滤器拦截(在web.xml文件中可以看到处理action的struts 2过滤器),并进行分析,如果是action,则进行Struts 2的处理流程,也就是调用相应的struts 2拦截器,最后会调用action类的execute方法。在这个过程中,和web.xml中配置的其他过滤器一点关系都没有,因为在web.xml文件中配置的过滤器并不会过滤action,而处理action的是由struts2的拦截器完成的。
如果客户端发送的是非action的请求,则struts2会将其交由Servlet引擎来处理,这时过滤器才有效。
如果非要在程序中设置request的编码,可以在struts 2的拦截器中设置。
@Hadis
是这样的,Struts 2默认采用了UTF-8编码(可以在struts.properties或struts.xml文件中修改这一设置),而我用的是GBK,把你的程序都改成UTF-8试试。实在不行,把你做的例子发给我,我的mail是asklining@126.com,我看看。发过来时别忘了留言。
时间复杂度怎么可能是O(1)呢?至少得移动结点啊,把算法或设计思想贴出来看看
在本系列的后续文章还会讲到使用service.xml文件来发布webservice,这种方式比较好,除此之外,还会讲到会话在web service中的应用,以及如何跨服务共享会话(session),在c#、delphi中使用调用复杂的web service等。
@加加
是这样的,axis2实际上就是一个Web目录,在该目录中可以发布jsp、servlet,而webservice是依赖servlet来实现的,因此,也可以发布web service,当然,可以将axis2改成其他的名子,如ws。如果想发布类,一般有两种方法:
1. 按着本文所述,直接放在pojo目录或其他的发布目录中。
2. 将这些类放在axis2\WEB-INF\classes目录中,然后使用service.xml文件进行发布。这块在后面的文章将详细讲解
在axis2目录有一些jar文件还需要带的,否则使用axis2无法成功发布web service,当然,axis2目录中的jar文件并不是都需要,根据使用的功能需要不同的jar文件,不过为了简单,可以将所有的jar包都保留。不过这是在服务端,应该没什么关系。
re: [算法]09考研数据结构试题解法 银河使者 2009-01-18 10:39
是的,@crtylr的算法比较好,下面的具体的实现代码,很简单:
private static int findNode(Node headNode, int k)
{
Node p1 = headNode, p2 = headNode;
for(int i = 0; i < k && p2.nextNode != null; i++)
p2 = p2.nextNode;
if(p2.nextNode == null) return 0;
while(p2.nextNode != null)
{
p1 = p1.nextNode;
p2 = p2.nextNode;
}
System.out.println(p1.nextNode.data);
return 1;
}
to ZelluX
这个方法不错,下面是具体的实现代码:
private static int findNode(Node headNode, int k)
{
Node p1 = headNode, p2 = headNode;
for(int i = 0; i < k && p2.nextNode != null; i++)
p2 = p2.nextNode;
if(p2.nextNode == null) return 0;
while(p2.nextNode != null)
{
p1 = p1.nextNode;
p2 = p2.nextNode;
}
System.out.println(p1.nextNode.data);
return 1;
}
re: [算法]09考研数据结构试题解法 银河使者 2009-01-17 20:53
这是一个算法,详细解释见我的blog:
http://www.blogjava.net/nokiaguy/archive/2009/01/17/251722.html
private static int findNode(Node headNode, int k)
{
Node p = headNode, p1 = headNode, p2 = null;
int count = 0; // 表示结点数
while (p.nextNode != null)
{
p = p.nextNode;
count++;
// 遇到k的整数位个结点,进行分块
if (count % k == 0)
{
if (p2 != null)
p1 = p2;
p2 = p;
}
}
// k超过链表结点数,未找到,返回0
if (p2 == null)
{
return 0;
}
else
{
int mod = count % k;
int offset = mod + 1; // 任何情况下,最终结果都是p1指向的结点向后移动(mod + 1)个结点
for (int i = 0; i < offset; i++)
p1 = p1.nextNode;
System.out.println(p1.data);
return 1;
}
}
这系列文章就是几年前写的,做个总结,不过一直没发出来,现在发出来,如果读者已经觉得这些已经会了或已经过时了,可以略过此文,看我写的《Struts 2系列文章》或其他的文章,当然,也可以什么都不看,打打酱油也可,哈哈!
也许新版本的jdk可以不使用\uxxxx格式,但并不是所有的开发人员都使用最新的jdk,还有就是虽然新版本的jdk可以读取其他格式的属性文件,但有些框架可能并没有使用这些功能,因此,使用Properties.load方法读取属性文件只能用在完全由自己控制的情况下,如果处理属性文件的功能是其他人做的,而且还不能修改代码,那就得听天由命了,完全取决于这个人是否使用了新功能来处理属性文件。
re: Java正则表达式初学者指南 银河使者 2009-01-14 13:54
没错,看任何文章或书,如果一点都不思考,基本上是看不明白的,除非这些已经明白了!!
re: 我无法解释的问题,请您一并来解释 银河使者 2009-01-14 12:54
只1500次,不可能产生内存溢出异常,根据你的描述是抛出NullPointerException异常,这说明你引用了一个对象变量,但这个对象变量值为null,问题出在equals方法中,有可能出在下面的代码中:
myPolSchema other = (myPolSchema) otherObject;
return GrpContNo.equals(other.getGrpContNo())
&& GrpPolNo.equals(other.getGrpPolNo());
上面的代码有可能other.getGrpConNo方法返回一个null,顺便问一下,GrpContNo字段在什么时候赋的值?
re: Struts2教程8:拦截器概述 银河使者 2008-12-29 08:37
struts2和webwork的拦截器在实现原理上基本一样,只是struts 2的拦截器是webwork拦截器的一个超集,也就是说,struts 2拦截器在webwork拦截器的基础上又增加了很多拦截器。从struts 2包中的struts-default.xml文件中就可以看到这点。在该文件中拦截器的定义如下:
<interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
<interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
<interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
<interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
<interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/>
<interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
<interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
<interceptor name="externalRef" class="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor"/>
<interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>
<interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
<interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
<interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
<interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
<interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
<interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
<interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/>
<interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
<interceptor name="sessionAutowiring" class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>
<interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
<interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
<interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
<interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" />
<interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" />
<interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
<interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" />
我们看到上面的拦截器有很多是webwork的(xwork)。
个人感觉如果只是创建com组件,并调用其中的方法或属性并不十分复杂,可以使用Jni技术用c++或delphi实现一个(返正做这个dll很简单,以前用delphi做过很多这种东西),并在java中提供接口。 不知道jacob有没有其他的功能?
@幻想~@@~
openoffice有自己的jdk,可以研究一下,不错,很好很强大。
@郁林
com组件需要一个id来引用,这个错误是com组件的id错了,或根本没有这个组件。
jacob还没用过,没使用过java调用com,一般调用com就使用delphi、c#或c++了。有空研究一下jacob。不过个人认为,com是windows特有的,如果想调用com,可以使用windows下的语言或工具,如delphi,c#都是很好的选择。最喜欢delphi,不会出现这样那样的兼容问题。当然,用vb6也很好。调用com并不是java的长项。如果非要使用java,那就只好用象jacob一样的库了。
不过还是支持楼主的文章!!!
不是validation.xmL文件,是<ActionClassName>-validation.xml文件
to 董
是这样的,如果使用Struts 2的<s:textfield>或其他的表单标签,字段错误是可以自动显示出的,并不需要编写代码或使用<s:fielderror/>标签去显示,当然,使用<s:fielderror/>标签也可以显示字段错误,但就重复了。
如果使用普通的html标签,就需要使用<s:fielderror/>标签显示字段错误了。如果是动作错误或消息,就需要使用<actionerror/>或<actionmessage/>标签显示了。
你好,很高兴认识你。如果你有联系方式,可以在我的blog里私人留言。 I'm glad to see you.
to Lau Jeffrey
由于前5个字节,第5个字节将汉字截取一半,所以把这个汉字去了,返回“a加b"
如果想将截一半的汉字要保留,可以将
if (i % 2 == 1)
{
// 该UCS2字符是汉字时,去掉这个截一半的汉字
if (bytes[i - 1] != 0)
i = i - 1;
// 该UCS2字符是字母或数字,则保留该字符
else
i = i + 1;
}
{
// 该UCS2字符是汉字时,去掉这个截一半的汉字
if (bytes[i - 1] != 0)
i = i - 1;
// 该UCS2字符是字母或数字,则保留该字符
else
i = i + 1;
}
改成
if (i % 2 == 1)
{
i = i + 1;
}
只是解释一下为什么最好用String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");,哈哈。
在MyEclipse中开发基于hibernate的程序时,自动生成的Session工厂就用了ThreadLocal,以保证每一个线程只有一个Session。
实际上,ThreadLocal的基本原理就是利用线程的id作为Map的key,将一个对象作为Map的value, 以保证一个线程只有一个key-value对。由于每一个线程有一个独立的对象,而且每个线程的对象必须独立,也就是说不能有其他的线程访问当前线程的对象,这样对于每个线程来说,是顺序执行的,也就不可能发生象脏数据这样的事情了。
re: Struts2教程10:国际化 银河使者 2008-08-20 15:19
正打算往下写呢,不过现在正在写这方面的书,时间有点紧,所以最近没更新blog。等写完了,会继续深入探讨struts 2。
to bigheadbird
是这样的,可能是我没写清楚。在struts 2中,如果在<package>标签中加namespace,一般需要在<s:form>标签中使用namespace指定命名空间,再用action属性指定动作名,代码如下:
<s:form action="abcd" namespace="xyz" >
... ...
</s:form>
上面的代码所对应的struts.xml中定义如下:
<package name="mypackage" namespace="xyz" extends="struts-default">
<action name="abcd" class="..."/>
</package>
如果按着上面的写法是没有任何问题的,也是Struts 2建议的方式
但要知道,<s:form>实际上就是对应的html的<form>标签,而action属性其实就是<form>的属性,因此,也可以直接将命名空间写在action属性值中,而不使用<s:form>的namespace属性。如下面代码所示:
<s:form action="mystruts/sum.action" >
<s:textfield name="operand1" label=" 操作数1"/>
<s:textfield name="operand2" label=" 操作数2" />
<s:submit value="代数和" />
</s:form>
这么做同样可以成功提交给Action类,但这么做,Struts 2会在控制台输出一个类似于下面的警告:
警告: No configuration found for the specified action: 'xyz/parent.action' in namespace: ''. Form action defaulting to 'action' attribute's literal value.
说是未找到xyz/parent.action, 这也说明Struts 2在处理时是将namespace和action属性分开的。但这个警告并不会影响程序的运行。就象我们在编写java或其他语言的程序时,编译器可能会出现一些警告信息,但仍然可以编译通过,并成功运行。
但要注意,如果不使用namespace,只使用action来表示命名空间的话,后面必须加上“.action”后缀,如果Struts 2未找到这个action,是不会自动加上.action后缀的。
实际上,还可以直接使用<form>来处理
我在后面的程序中直接使用了第二种方式,其实读者可以选择自己想用的方式,但笔者建议使用Struts 2建议的第一种方式。
没错,用javascript也是一种方法。不过我的教程只在演示struts 2关于这方面的功能,并不是为了实现而实现。 用javascript适合于所有的语言、所有的web系统。
re: AJAX从服务端获取数据的三种方法 银河使者 2008-07-28 20:34
实现多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乱码的问题非常多