﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-缘来如此-随笔分类-AJAX</title><link>http://www.blogjava.net/supperchen/category/30049.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 13 Mar 2008 20:01:49 GMT</lastBuildDate><pubDate>Thu, 13 Mar 2008 20:01:49 GMT</pubDate><ttl>60</ttl><item><title>js异步XMLhttpPost   防止浏览器在请求中，死掉</title><link>http://www.blogjava.net/supperchen/archive/2008/03/08/184759.html</link><dc:creator>缘来如此</dc:creator><author>缘来如此</author><pubDate>Sat, 08 Mar 2008 14:49:00 GMT</pubDate><guid>http://www.blogjava.net/supperchen/archive/2008/03/08/184759.html</guid><wfw:comment>http://www.blogjava.net/supperchen/comments/184759.html</wfw:comment><comments>http://www.blogjava.net/supperchen/archive/2008/03/08/184759.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supperchen/comments/commentRss/184759.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supperchen/services/trackbacks/184759.html</trackback:ping><description><![CDATA[
		<p>
				<span style="color: rgb(0, 0, 255);">
						<font color="#000000">在使用DHTML进行编程时比较有用，防止浏览器在请求中，死掉</font>
				</span>
		</p>
		<p>
				<span style="color: rgb(0, 0, 255);">var</span>
				<span style="color: rgb(0, 0, 0);"> xml </span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);"> GenXMLData(tableName, fieldID, </span>
				<span style="color: rgb(0, 0, 0);">""</span>
				<span style="color: rgb(0, 0, 0);">, </span>
				<span style="color: rgb(0, 0, 0);">""</span>
				<span style="color: rgb(0, 0, 0);">);<br /><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" alt="" align="top" />    </span>
				<span style="color: rgb(0, 0, 255);">var</span>
				<span style="color: rgb(0, 0, 0);"> content </span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">&lt;
table height=100% width=100%&gt;&lt;tr&gt;&lt;td&gt;&lt;div id='divDoing' style
='position:absolute; left:500px; top:136px; width:196px; height:105px; z-
index:1;'&gt;&lt;div align='center'&gt;&lt;p&gt;&lt;img src='../Images/doing.gif' width
='32' height='32'/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;正在查询、请稍候……&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">;<br /><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" alt="" align="top" />    contentTD.innerHTML </span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);"> content;<br /><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" alt="" align="top" />        </span>
				<span style="color: rgb(0, 0, 255);">var</span>
				<span style="color: rgb(0, 0, 0);"> XmlHttp</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 255);">new</span>
				<span style="color: rgb(0, 0, 0);"> ActiveXObject(</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">Microsoft.XMLHTTP</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">);<br />    XmlHttp.onreadystatechange</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 255);">function</span>
				<span style="color: rgb(0, 0, 0);">()</span>
				<span id="Codehighlighter1_478_666_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);">
				</span>
				<span id="Codehighlighter1_478_666_Open_Text">
						<span style="color: rgb(0, 0, 0);">{<br />       </span>
						<span style="color: rgb(0, 0, 255);">if</span>
						<span style="color: rgb(0, 0, 0);">(XmlHttp.readyState</span>
						<span style="color: rgb(0, 0, 0);">==</span>
						<span style="color: rgb(0, 0, 0);">4</span>
						<span style="color: rgb(0, 0, 0);">)</span>
						<span id="Codehighlighter1_507_663_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);">
						</span>
						<span id="Codehighlighter1_507_663_Open_Text">
								<span style="color: rgb(0, 0, 0);">{<br />            </span>
								<span style="color: rgb(0, 0, 255);">if</span>
								<span style="color: rgb(0, 0, 0);">(XmlHttp.status</span>
								<span style="color: rgb(0, 0, 0);">==</span>
								<span style="color: rgb(0, 0, 0);">200</span>
								<span style="color: rgb(0, 0, 0);">)<br />            </span>
								<span id="Codehighlighter1_539_616_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);">
								</span>
								<span id="Codehighlighter1_539_616_Open_Text">
										<span style="color: rgb(0, 0, 0);">{<br />              contentTD.innerHTML </span>
										<span style="color: rgb(0, 0, 0);">=</span>
										<span style="color: rgb(0, 0, 0);"> XmlHttp.responseText;<br />              firstPost </span>
										<span style="color: rgb(0, 0, 0);">=</span>
										<span style="color: rgb(0, 0, 0);"> </span>
										<span style="color: rgb(0, 0, 255);">true</span>
										<span style="color: rgb(0, 0, 0);">;<br />            }</span>
								</span>
								<span style="color: rgb(0, 0, 0);">
										<br />            </span>
								<span style="color: rgb(0, 0, 255);">else</span>
								<span style="color: rgb(0, 0, 0);">
										<br />            contentTD.innerHTML </span>
								<span style="color: rgb(0, 0, 0);">=</span>
								<span style="color: rgb(0, 0, 0);"> content ;<br />        }</span>
						</span>
						<span style="color: rgb(0, 0, 0);">
								<br />    }</span>
				</span>
				<span style="color: rgb(0, 0, 0);">
						<br />
						<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" alt="" align="top" />    XmlHttp.open(</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">post</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">,webFile,</span>
				<span style="color: rgb(0, 0, 255);">true</span>
				<span style="color: rgb(0, 0, 0);">);<br /><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" alt="" align="top" />    XmlHttp.send(xml);</span>
		</p>
<img src ="http://www.blogjava.net/supperchen/aggbug/184759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supperchen/" target="_blank">缘来如此</a> 2008-03-08 22:49 <a href="http://www.blogjava.net/supperchen/archive/2008/03/08/184759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2+hibernate+spring配置管理（一）——配置文件</title><link>http://www.blogjava.net/supperchen/archive/2008/03/02/183307.html</link><dc:creator>缘来如此</dc:creator><author>缘来如此</author><pubDate>Sun, 02 Mar 2008 13:12:00 GMT</pubDate><guid>http://www.blogjava.net/supperchen/archive/2008/03/02/183307.html</guid><wfw:comment>http://www.blogjava.net/supperchen/comments/183307.html</wfw:comment><comments>http://www.blogjava.net/supperchen/archive/2008/03/02/183307.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supperchen/comments/commentRss/183307.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supperchen/services/trackbacks/183307.html</trackback:ping><description><![CDATA[
		<p>虽然是简单的用户登录，但东西一点不少，基于MVC原理实现，共分DAO层，SERVICE层，ACTION层和WEB层，其中DAO和SERVICE层都有各自的接口。</p>
		<p>今天主要讲解配置文件的代码，我学习实例，喜欢从控制层出发，然后用到了哪些类或者JSP，再一一扯“蛋”扯出来。</p>
		<p>当然，还是先看web.xml
</p>
		<table border="0" cellpadding="2" cellspacing="2" height="1186" width="996">
				<tbody>
						<tr>
								<td>
										<ol>
												<li>&lt;?xml version="1.0" encoding="UTF-8"?&gt;  </li>
												<li>&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"  </li>
												<li>         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;  </li>
												<li>    &lt;!-- Spring ApplicationContext配置文件的路径�,可使用通配符，多个路径用�1,号分隔,此参数用于后面的Spring-Context loader --&gt;  </li>
												<li>    &lt;context-param&gt;  </li>
												<li>        &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;  </li>
												<li>        &lt;param-value&gt;classpath*:spring/*.xml&lt;/param-value&gt;  </li>
												<li>    &lt;/context-param&gt;  </li>
												<li>  </li>
												<li>       </li>
												<li>    &lt;!-- 著名 Character Encoding filter --&gt;  </li>
												<li>    &lt;filter&gt;  </li>
												<li>        &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;  </li>
												<li>        &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt;  </li>
												<li>        &lt;init-param&gt;  </li>
												<li>            &lt;param-name&gt;encoding&lt;/param-name&gt;  </li>
												<li>            &lt;param-value&gt;UTF-8&lt;/param-value&gt;  </li>
												<li>        &lt;/init-param&gt;  </li>
												<li>    &lt;/filter&gt;  </li>
												<li>    &lt;!--Hibernate Open Session in View Filter--&gt;  </li>
												<li>    &lt;filter&gt;  </li>
												<li>        &lt;filter-name&gt;hibernateFilter&lt;/filter-name&gt;  </li>
												<li>        &lt;filter-class&gt;org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&lt;/filter-class&gt;  </li>
												<li>    &lt;/filter&gt;  </li>
												<li>    &lt;!-- ExtremeTable 导出Excel和Pdf的Filter --&gt;  </li>
												<li>    &lt;filter&gt;  </li>
												<li>        &lt;filter-name&gt;eXtremeExport&lt;/filter-name&gt;  </li>
												<li>        &lt;filter-class&gt;org.extremecomponents.table.filter.ExportFilter&lt;/filter-class&gt;  </li>
												<li>    &lt;/filter&gt;  </li>
												<li>    &lt;filter-mapping&gt;  </li>
												<li>        &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;  </li>
												<li>        &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;  </li>
												<li>    &lt;/filter-mapping&gt;  </li>
												<li>    &lt;filter-mapping&gt;  </li>
												<li>        &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;  </li>
												<li>        &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;  </li>
												<li>    &lt;/filter-mapping&gt;  </li>
												<li>    &lt;filter-mapping&gt;  </li>
												<li>        &lt;filter-name&gt;hibernateFilter&lt;/filter-name&gt;  </li>
												<li>        &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;  </li>
												<li>    &lt;/filter-mapping&gt;  </li>
												<li>  </li>
												<li>  </li>
												<li>    &lt;!--Spring ApplicationContext 载入 --&gt;  </li>
												<li>    &lt;listener&gt;  </li>
												<li>        &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;  </li>
												<li>    &lt;/listener&gt;  </li>
												<li>  </li>
												<li>    &lt;!-- Spring 刷新Introspector防止内存泄露 --&gt;  </li>
												<li>    &lt;listener&gt;  </li>
												<li>        &lt;listener-class&gt;org.springframework.web.util.IntrospectorCleanupListener&lt;/listener-class&gt;  </li>
												<li>    &lt;/listener&gt;  </li>
												<li>  </li>
												<li>       </li>
												<li>    &lt;!-- session超时定义,单位为分钟 --&gt;  </li>
												<li>    &lt;session-config&gt;  </li>
												<li>        &lt;session-timeout&gt;10&lt;/session-timeout&gt;  </li>
												<li>    &lt;/session-config&gt;  </li>
												<li>  </li>
												<li>&lt;/web-app&gt; <br /></li>
										</ol>
								</td>
						</tr>
				</tbody>
		</table>
东西很简单，无非是配置一些过滤器呀，监听器的。主要讲一下openSessionInViewFilter吧，假设在你的应用中
Hibernate是通过spring
来管理它的session.如果在你的应用中没有使用OpenSessionInViewFilter或者
OpenSessionInViewInterceptor。session会在transaction结束后关闭，此时会抛出session is
close 的异常。关于这方面的知识，值得大家去找一下相关资料仔细阅读。
strut2.xm<br /><table border="0" cellpadding="2" cellspacing="2" width="500"><tbody><tr><td> 
            <ol><li>"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    </li><li>        "http://struts.apache.org/dtds/struts-2.0.dtd"&gt;     </li><li>&lt;struts &gt;     </li><li>    &lt;include file ="struts-default.xml"/&gt;        </li><li>        </li><li>    &lt;package name ="default" extends ="struts-default"&gt;     </li><li>        &lt;action name="login" method="login" class="userAction"&gt;   </li><li>            &lt;result&gt;/login_success.jspresult&gt;   </li><li>            &lt;result name="input"&gt;/login.jspresult&gt;   </li><li>        action&gt;   </li><li>package&gt;   </li><li>        </li><li>struts&gt;   </li></ol></td></tr></tbody></table>
可能注意到了，这里的Action交给SPRING来管理了。所以我们看一下application.xml的代码吧<br /><table border="0" cellpadding="2" cellspacing="2" width="500"><tbody><tr><td><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><li><span><span><span>&lt;xml version="1.0" encoding="UTF-8"?&gt; </span></span></span>   <br /></li><li>&lt;beans&gt;       </li><li>    &lt;bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"&gt;          </li><li>        &lt;property name="driverClass" value="oracle.jdbc.driver.OracleDriver" /&gt;          </li><li>        &lt;property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:oracleDB" /&gt;          </li><li>        &lt;property name="user" value="xxx" /&gt;          </li><li>        &lt;property name="password" value="xxx" /&gt;               </li><li>                    </li><li>        &lt;property name="minPoolSize" value="3" /&gt;        </li><li>                 </li><li>        &lt;property name="maxPoolSize" value="30" /&gt;        </li><li>                       </li><li>        &lt;property name="maxIdleTime" value="1800" /&gt;        </li><li>                       </li><li>        &lt;property name="acquireIncrement" value="3" /&gt;         </li><li>        &lt;property name="maxStatements" value="0" /&gt;          </li><li>        &lt;property name="initialPoolSize" value="3" /&gt;          </li><li>               </li><li>        &lt;property name="idleConnectionTestPeriod" value="60" /&gt;          </li><li>               </li><li>        &lt;property name="acquireRetryAttempts" value="30" /&gt;          </li><li>        &lt;property name="breakAfterAcquireFailure" value="true" /&gt;              </li><li>        &lt;property name="testConnectionOnCheckout" value="false" /&gt;          </li><li>    bean&gt;       </li><li>           </li><li>    &lt;bean id="sessionFactory"      </li><li>        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;       </li><li>        &lt;property name="dataSource"&gt;       </li><li>            &lt;ref bean="dataSource" /&gt;       </li><li>        property&gt;       </li><li>        &lt;property name="hibernateProperties"&gt;       </li><li>            &lt;props&gt;       </li><li>                &lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.Oracle9Dialectprop&gt;       </li><li>                &lt;prop key="hibernate.show_sql"&gt;trueprop&gt;       </li><li>                &lt;prop key="hibernate.generate_statistics"&gt;trueprop&gt;       </li><li>                &lt;prop key="hibernate.connection.release_mode"&gt;autoprop&gt;       </li><li>                &lt;prop key="hibernate.autoReconnect"&gt;trueprop&gt;                    </li><li>            props&gt;       </li><li>        property&gt;       </li><li>        &lt;property name="mappingDirectoryLocations"&gt;        </li><li>        &lt;list&gt;       </li><li>            &lt;value&gt;       </li><li>                classpath:com/caitong/pingou/bean       </li><li>            value&gt;       </li><li>        list&gt;                                </li><li>        property&gt;       </li><li>    bean&gt;        </li><li>           </li><li>    &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;           </li><li>          &lt;property name="sessionFactory"&gt;           </li><li>              &lt;ref bean="sessionFactory"/&gt;           </li><li>          property&gt;           </li><li>    bean&gt;         </li><li>               </li><li>    &lt;bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"&gt;           </li><li>        &lt;property name="transactionManager" ref="transactionManager"/&gt;           </li><li>        &lt;property name="transactionAttributes"&gt;         </li><li>            &lt;props&gt;         </li><li>                       </li><li>                &lt;prop key="add*"&gt;PROPAGATION_REQUIREDprop&gt;         </li><li>                &lt;prop key="find*"&gt;PROPAGATION_REQUIRED,readOnlyprop&gt;         </li><li>            props&gt;         </li><li>        property&gt;         </li><li>    bean&gt;           </li><li>                  </li><li>   &lt;bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"&gt;           </li><li>        &lt;property name="beanNames"&gt;         </li><li>            &lt;value&gt;*Servicevalue&gt;         </li><li>        property&gt;         </li><li>        &lt;property name="interceptorNames"&gt;           </li><li>            &lt;list&gt;           </li><li>                &lt;value&gt;transactionInterceptorvalue&gt;           </li><li>                           </li><li>            list&gt;           </li><li>        property&gt;           </li><li>    bean&gt;           </li><li>           </li><li>    &lt;bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"&gt;           </li><li>          &lt;property name="transactionInterceptor" ref="transactionInterceptor"/&gt;           </li><li>    bean&gt;         </li><li>           </li><li>    &lt;bean id="baseDAO" class="com.caitong.pingou.dao.impl.BaseDAO" abstract="true"&gt;       </li><li>        &lt;property name="sessionFactory"&gt;       </li><li>            &lt;ref bean="sessionFactory"/&gt;       </li><li>        property&gt;       </li><li>    bean&gt;       </li><li>    &lt;bean id="userDAO"        </li><li>        class="com.caitong.pingou.dao.impl.UserDAO" parent="baseDAO"&gt;       </li><li>    bean&gt;       </li><li>           </li><li>    &lt;bean id="userService" class="com.caitong.pingou.service.impl.UserService"        </li><li>        autowire="byName"&gt;       </li><li>    bean&gt;       </li><li>           </li><li>    &lt;bean id="userAction" class="com.caitong.pingou.action.UserAction"             </li><li>        autowire="byName"&gt;       </li><li>    bean&gt;       </li><li>beans&gt;     </li></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></td></tr></tbody></table><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span>应
该说SPRING太强大了，以至于一个配置文件可以解决任何一件事情。简单介绍一下这个配置文件吧，例子用的是c3p0的数据库链接池，
hibernate的配置文件也都集成在这里了，如果细心的读者，可能注意到了事务管理模块。是的，本例的事务管理是由spring来管理，而且集中在
service层<br /><table border="0" cellpadding="2" cellspacing="2" width="500"><tbody><tr><td><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span>&lt;property name="beanNames"&gt;     
            <li>            &lt;value&gt;*Servicevalue&gt;      </li></span><li>        property&gt;  <br /></li></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></td></tr></tbody></table></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><p>有人可能提出问题，为什么非得要放在service层，而不是dao层，应该说，事务管理有一个不成文的规定，尽量将问题放在上层处理。<br />
然后每个类由SPRING来管理，并且autowire="byName"来寻找依赖注入的bean。</p><p>所有的xml文件都已经配置完了，其实最重要也是这个，XML文件将是框架的一个趋势，掌握了它，其实你已经打开了这个框架的门。</p></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br /><br /><img src ="http://www.blogjava.net/supperchen/aggbug/183307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supperchen/" target="_blank">缘来如此</a> 2008-03-02 21:12 <a href="http://www.blogjava.net/supperchen/archive/2008/03/02/183307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ajax乱码解决方案</title><link>http://www.blogjava.net/supperchen/archive/2007/11/01/157458.html</link><dc:creator>缘来如此</dc:creator><author>缘来如此</author><pubDate>Thu, 01 Nov 2007 05:02:00 GMT</pubDate><guid>http://www.blogjava.net/supperchen/archive/2007/11/01/157458.html</guid><wfw:comment>http://www.blogjava.net/supperchen/comments/157458.html</wfw:comment><comments>http://www.blogjava.net/supperchen/archive/2007/11/01/157458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supperchen/comments/commentRss/157458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supperchen/services/trackbacks/157458.html</trackback:ping><description><![CDATA[ 
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">1</span><span style="font-size: 10pt; font-family: 宋体;">、编码</span><span style="font-size: 10pt; font-family: Verdana;"> <br />
      </span><span style="font-size: 10pt; font-family: 宋体;">编码比较常用的有：</span><span style="font-size: 10pt; font-family: Verdana;"> UTF-8</span><span style="font-size: 10pt; font-family: 宋体;">，</span><span style="font-size: 10pt; font-family: Verdana;"> GBK</span><span style="font-size: 10pt; font-family: 宋体;">，</span><span style="font-size: 10pt; font-family: Verdana;"> GB2312</span><span style="font-size: 10pt; font-family: 宋体;">，</span><span style="font-size: 10pt; font-family: Verdana;"> ISO-8859-1</span><span style="font-size: 10pt; font-family: 宋体;">，除了</span><span style="font-size: 10pt; font-family: Verdana;"> iso-8859-1</span><span style="font-size: 10pt; font-family: 宋体;">之外的其它三个编码都能很好的支持中文，但它们都兼容</span><span style="font-size: 10pt; font-family: Verdana;"> ISO-8859-1</span><span style="font-size: 10pt; font-family: 宋体;">的编码（就是说无论编码怎么改变，只要是</span><span style="font-size: 10pt; font-family: Verdana;"> ISO-8859-1</span><span style="font-size: 10pt; font-family: 宋体;">中的字符，永远不会出现乱码）。</span><span style="font-size: 10pt; font-family: Verdana;"><br />
      </span><span style="font-size: 10pt; font-family: 宋体;">这四种编码中，</span><span style="font-size: 10pt; font-family: Verdana;"> GB2312</span><span style="font-size: 10pt; font-family: 宋体;">是中国规定的汉字编码，也可以说是简体中文的字符集编码</span><span style="font-size: 10pt; font-family: Verdana;">;</span><span style="font-size: 10pt; font-family: Verdana;">GBK </span><span style="font-size: 10pt; font-family: 宋体;">是</span><span style="font-size: 10pt; font-family: Verdana;"> GB2312</span><span style="font-size: 10pt; font-family: 宋体;">的扩展</span><span style="font-size: 10pt; font-family: Verdana;"> ,</span><span style="font-size: 10pt; font-family: 宋体;">除了兼容</span><span style="font-size: 10pt; font-family: Verdana;">GB2312</span><span style="font-size: 10pt; font-family: 宋体;">外，它还能显示繁体中文，还有日文的假名</span><span style="font-size: 10pt; font-family: Verdana;">;</span><span style="font-size: 10pt; font-family: 宋体;">而</span><span style="font-size: 10pt; font-family: Verdana;"> UTF-8</span><span style="font-size: 10pt; font-family: 宋体;">虽然也支持中文，但却</span><span style="font-size: 10pt; font-family: 宋体;">与</span><span style="font-size: 10pt; font-family: Verdana;">GB</span><span style="font-size: 10pt; font-family: 宋体;">码不兼容（编码值不同）</span><span style="font-size: 10pt; font-family: 宋体;">。</span><span style="font-size: 10pt; font-family: Verdana;">UTF-8</span><span style="font-size: 10pt; font-family: 宋体;">使用的是可变长的</span><span style="font-size: 10pt; font-family: Verdana;"> UNICODE</span><span style="font-size: 10pt; font-family: 宋体;">编码，编码可能是</span><span style="font-size: 10pt; font-family: Verdana;"> 1</span><span style="font-size: 10pt; font-family: 宋体;">位</span><span style="font-size: 10pt; font-family: Verdana;"> 16</span><span style="font-size: 10pt; font-family: 宋体;">进制（即</span><span style="font-size: 10pt; font-family: Verdana;"> ISO-8859-1</span><span style="font-size: 10pt; font-family: 宋体;">中的字符，其编码也是相同的）也有可能是</span><span style="font-size: 10pt; font-family: Verdana;"> 2</span><span style="font-size: 10pt; font-family: 宋体;">位或</span><span style="font-size: 10pt; font-family: Verdana;"> 3</span><span style="font-size: 10pt; font-family: 宋体;">位的</span><span style="font-size: 10pt; font-family: Verdana;"> 16</span><span style="font-size: 10pt; font-family: 宋体;">进制。</span><span style="font-size: 10pt; font-family: Verdana;"> UTF-8</span><span style="font-size: 10pt; font-family: 宋体;">的优点是：</span><span style="font-size: 10pt; font-family: Verdana;">1</span><span style="font-size: 10pt; font-family: 宋体;">、</span><span style="font-size: 10pt; font-family: 宋体;">与</span><span style="font-size: 10pt; font-family: Verdana;">CPU</span><span style="font-size: 10pt; font-family: 宋体;">字节顺序无关</span><span style="font-size: 10pt; font-family: Verdana;"> , </span><span style="font-size: 10pt; font-family: 宋体;">可以在不同平台之间交流。</span><span style="font-size: 10pt; font-family: Verdana;"> 2</span><span style="font-size: 10pt; font-family: 宋体;">、容错能力高</span><span style="font-size: 10pt; font-family: Verdana;"> , </span><span style="font-size: 10pt; font-family: 宋体;">任何一个字节损坏后</span><span style="font-size: 10pt; font-family: Verdana;"> , </span><span style="font-size: 10pt; font-family: 宋体;">最多只会导致一个编码码位损失</span><span style="font-size: 10pt; font-family: Verdana;"> , </span><span style="font-size: 10pt; font-family: 宋体;">不会链锁错误</span><span style="font-size: 10pt; font-family: Verdana;"> (</span><span style="font-size: 10pt; font-family: 宋体;">如</span><span style="font-size: 10pt; font-family: Verdana;"> GB</span><span style="font-size: 10pt; font-family: 宋体;">码错一个字节就会整行乱码</span><span style="font-size: 10pt; font-family: Verdana;"> )</span><span style="font-size: 10pt; font-family: 宋体;">，所以在国际化处理中基本都是建议使用</span><span style="font-size: 10pt; font-family: Verdana;"> UTF-8</span><span style="font-size: 10pt; font-family: 宋体;">作为编码。</span></p><p><span style="font-size: 10pt; font-family: Verdana;">2</span><span style="font-size: 10pt; font-family: 宋体;">、文件的编码</span><span style="font-size: 10pt; font-family: Verdana;"><br />
      </span><span style="font-size: 10pt; font-family: 宋体;">文件编码最常使用的有两种：</span><span style="font-size: 10pt; font-family: Verdana;">ANSI</span><span style="font-size: 10pt; font-family: 宋体;">和</span><span style="font-size: 10pt; font-family: Verdana;">UTF-8</span><span style="font-size: 10pt; font-family: 宋体;">，光看名字估计你都可以猜到了，</span><span style="font-size: 10pt; font-family: Verdana;">ANSI</span><span style="font-size: 10pt; font-family: 宋体;">就是我们保存文件时使用的默认编码，而</span><span style="font-size: 10pt; font-family: Verdana;">UTF-8</span><span style="font-size: 10pt; font-family: 宋体;">则需自己设置。对于编码的改变，我使用的工具是</span><span style="font-size: 10pt; font-family: Verdana;">NOTEPAD</span><span style="font-size: 10pt; font-family: 宋体;">和</span><span style="font-size: 10pt; font-family: Verdana;">ECLIPSE</span><span style="font-size: 10pt; font-family: 宋体;">，</span><span style="font-size: 10pt; font-family: Verdana;">NOTEPAD</span><span style="font-size: 10pt; font-family: 宋体;">使用最简单，只要打开文件后在另存为中选择相应的编码就行了，而且它对编码的支持非常好</span><span style="font-size: 10pt; font-family: Verdana;">;</span><span style="font-size: 10pt; font-family: 宋体;">而在</span><span style="font-size: 10pt; font-family: Verdana;">ECLIPSE</span><span style="font-size: 10pt; font-family: 宋体;">中，只要稍微设置一下就行了，打开首选项，然后选择：常规</span><span style="font-size: 10pt; font-family: Verdana;">-&gt;</span><span style="font-size: 10pt; font-family: 宋体;">内容类型</span><span style="font-size: 10pt; font-family: Verdana;">(ContentType)</span><span style="font-size: 10pt; font-family: 宋体;">，在右边选中你想改变保存编码的文件类型，然后在下方的缺省编码中改变其值，最后点击更新（</span><span style="font-size: 10pt; font-family: Verdana;">UPDATE</span><span style="font-size: 10pt; font-family: 宋体;">）按钮即可。</span></p><p style="text-align: center;" align="center"><span style="font-size: 10.5pt; font-family: 宋体;"> <br />
而在其它的编辑器中，默认保存的内容都是GB2312或者GBK（NOTEPAD中对应ANSI）.而根据前面所说的UTF-8和GBK,GB2312等的编码值是不同的这一点，可以知道，如果文件使用了UTF-8，那么字符编码就必须使用UTF-8，否则编码值的不同就可能造成乱码。而这也就是为什么那么多的人使用了UTF-8编码后还会产生乱码的根本原因。（JS和JSP都是这个道理）<br />
3、JSP,STRUTS等的中文乱码解决方案</span><span style="font-size: 10pt; font-family: Verdana;">     </span><span style="font-size: 10pt; font-family: 宋体;">其实解决的方法只有一个：</span></p><div style="border: 0.75pt solid rgb(204, 204, 204); padding: 3pt 4pt 3pt 3pt; background: rgb(238, 238, 238) none repeat scroll 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="border: medium none ; padding: 0cm;"><span style="font-size: 10pt; font-family: 宋体;"><span style="color: black;"> request.setCharacterEncoding(encoding);</span></span></p></div><p><span style="font-size: 10.5pt; font-family: 宋体;">   方法只有一种，但处理方式就多种多样了，初学者会在JSP页面上直接使用，而有经验的程序员会使用过滤器。而现在所要说的方法也是过滤器。这里以统一使用UTF-8作为编码作为例子说明。具体过程就不多说了，网上有很多教程。偷懒一点的，到TOMCAT中复制就行了。在TOMCAT的目录下的"webapps"jsp-examples"WEB-INF"classes"filters"找到SetCharacterEncodingFilter.java 这个类，放到你的程序中并配置好映射路径。配置好后基本上你的乱码问题就解决了。但要映射路径中需要注意的就是不能使用 '*'</span></p><div style="border: 0.75pt solid rgb(204, 204, 204); padding: 3pt 4pt 3pt 3pt; background: rgb(238, 238, 238) none repeat scroll 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="border: medium none ; padding: 0cm;"><span style="font-size: 10pt; font-family: 宋体;"><span style="color: black;">  </span><span style="color: blue;">&lt;</span><span style="color: maroon;">filter-mapping</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
    </span><span style="color: blue;">&lt;</span><span style="color: maroon;">filter-name</span><span style="color: blue;">&gt;</span><span style="color: black;">Set Character Encoding</span><span style="color: blue;">&lt;/</span><span style="color: maroon;">filter-name</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
    </span><span style="color: blue;">&lt;</span><span style="color: maroon;">servlet-name</span><span style="color: blue;">&gt;</span><span style="color: black;">*</span><span style="color: blue;">&lt;/</span><span style="color: maroon;">servlet-name</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
  </span><span style="color: blue;">&lt;/</span><span style="color: maroon;">filter-mapping</span><span style="color: blue;">&gt;</span></span></p></div><p><span style="font-size: 10.5pt; font-family: 宋体;">像上面这样配置的话(可能也是网上大多教程的做法，想当年也是害苦了我)，可能你只有JSP的乱码解决了，要解决STRUTS的乱码需要映射 *.do 或者 servletActionName。然后在初始化参数中设置encoding的值就行了。</span></p><div style="border: 0.75pt solid rgb(204, 204, 204); padding: 3pt 4pt 3pt 3pt; background: rgb(238, 238, 238) none repeat scroll 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="border: medium none ; padding: 0cm;"><span style="font-size: 10pt; font-family: 宋体;"><span style="color: blue;">&lt;</span><span style="color: maroon;">init-param</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
      </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param-name</span><span style="color: blue;">&gt;</span><span style="color: black;">encoding</span><span style="color: blue;">&lt;/</span><span style="color: maroon;">param-name</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
      </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param-value</span><span style="color: blue;">&gt;</span><span style="color: black;">UTF-8</span><span style="color: blue;">&lt;/</span><span style="color: maroon;">param-value</span><span style="color: blue;">&gt;</span><span style="color: black;"><br /></span><span style="color: blue;">&lt;/</span><span style="color: maroon;">init-param</span><span style="color: blue;">&gt;</span></span></p></div><p><span style="font-size: 10.5pt; font-family: 宋体;">当然，最重要的是要记得根据前面所说的方法，改变你所使用的编辑器保存文件的编码要与使用的字符编码一致。<br />
而在JSP内容中，还是使用如网上教程所说的那种技俩，在所有页面的页首加入：</span></p><div style="border: 0.75pt solid rgb(204, 204, 204); padding: 3pt 4pt 3pt 3pt; background: rgb(238, 238, 238) none repeat scroll 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="border: medium none ; padding: 0cm;"><span style="font-size: 10pt; font-family: 宋体;"><span style="color: gray;">&lt;%</span><span style="color: black;">@ page language</span><span style="color: gray;">=</span><span style="color: black;">"java" contentType</span><span style="color: gray;">=</span><span style="color: black;">"</span><strong><span style="color: black;">text</span></strong><span style="color: gray;">/</span><span style="color: black;">html; charset</span><span style="color: gray;">=</span><span style="color: black;">UTF</span><span style="color: gray;">-</span><strong><span style="color: maroon;">8</span></strong><span style="color: black;">"<br />
    pageEncoding</span><span style="color: gray;">=</span><span style="color: black;">"UTF</span><span style="color: gray;">-</span><strong><span style="color: maroon;">8</span></strong><span style="color: black;">"</span><span style="color: gray;">%&gt;</span></span></p></div><p><span style="font-family: 宋体;">至此，相信JSP,ACTION都不太可能出现乱码了。<br />
4、资源文件的乱码解决方案<br />
      资源文件谁都知道是国际化支持不可或缺的一部分，如果资源文件都出现乱码了那还了得？其实资源文件的乱码是很好解决的，其原因也是因为使用了UTF-8做为JSP编码后，没有相应地改变资源文件的文件编码造成的，所以只要对资源文件保存的编码进行更正后，乱码问题也就解决了。当然，你的中文要使用 native2ascii 命令进行正确的转换。<br />
5、调用JS时，JS内容乱码的解决方案。<br />
     其实JS的乱码还是跟文件的编码有关系的，如果JS中有中文的话，那JS文件保存的编码就必须跟调用此JS的页面编码相同，否则，你的所有中文都要从JSP页面传给JS才会显示正常。可以看出对于调用JS出现的乱码是最容易解决的.</span></p><p><span style="font-family: 宋体;">6、AJAX提交数据乱码，返回数据乱码的解决方案</span></p><p><span style="font-family: 宋体;">     万变不离其宗，AJAX的乱码问题自然跟编码有关了，其实很多人跟我一样想到了对文件编码进行设置，并且在接数据时设置了requet的编码，在返回的数据时设置了response的编码一切都以为会很顺利，可是这一切都是徒劳无功的，讨厌的乱码再一次出现在你眼前。在你试了N多种方法，包括JS自身的escape,unescape方法后，你发现乱码仍然猖狂地出现在屏幕上。<br />
    其实在试过这N多方法后，很多人都没发现，解决的方法其实很简单，而且其答案就在我们之前处理的JSP乱码之中。让我们先看一下AJAX的经典请求代码</span></p><div style="border: 0.75pt solid rgb(204, 204, 204); padding: 3pt 4pt 3pt 3pt; background: rgb(238, 238, 238) none repeat scroll 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="border: medium none ; padding: 0cm;"><span style="font-size: 10pt; font-family: 宋体;"><span style="color: black;">xmlhttp.open( "post", url, async );<br />
xmlhttp.setRequestHeader( "Content-Type", "text/html" );<br />
xmlhttp.send( params );</span></span></p></div><p><span style="font-size: 10pt; font-family: 宋体;">通过前面的说明，不知道你现在看出端倪了没有。不知道是受了网上教程的影响还是其它方面影响，setRequestHeader并是万年不变的，也没人想过去改它，而问题就正好出在这个地方。回想一个JSP页面内容的编码设置，其中有这么一节： </span></p><div style="border: 0.75pt solid rgb(204, 204, 204); padding: 3pt 4pt 3pt 3pt; background: rgb(238, 238, 238) none repeat scroll 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="border: medium none ; padding: 0cm;"><span style="font-size: 10pt; font-family: 宋体;"><span style="color: black;">contentType="text/html; charset=UTF-8"</span></span></p></div><p><span style="font-size: 10pt; font-family: 宋体;">现在知道问题了吧，所以我们要把第二句代码改为：</span></p><div style="border: 0.75pt solid rgb(204, 204, 204); padding: 3pt 4pt 3pt 3pt; background: rgb(238, 238, 238) none repeat scroll 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="border: medium none ; padding: 0cm;"><span style="font-size: 10pt; font-family: 宋体;"><span style="color: black;">xmlhttp.setRequestHeader( "Content-Type", "text/html;charset=UTF-8" ); </span></span></p></div><p><span style="font-size: 10pt; font-family: 宋体;">最后别忘了在返回数据时也设置上：</span></p><div style="border: 0.75pt solid rgb(204, 204, 204); padding: 3pt 4pt 3pt 3pt; background: rgb(238, 238, 238) none repeat scroll 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="border: medium none ; padding: 0cm;"><span style="font-size: 10pt; font-family: 宋体;"><span style="color: black;">response.setContentType( "text/xml" );<br />
response.setCharacterEncoding( "UTF-8" );</span></span></p></div><p><span style="font-size: 10pt; font-family: 宋体;">如果要问为什么的话，其实我们可以把xmlhttp看成是一个临时页面，它由浏览器动态生成，主要作用是在后台获得请求的数据（可以看成是一个高级的iframe）。所以对于普通页面设置的编码，对它也要同样设置。而在servlet中返回数据为什么要设置contentType和encoding其道理也是一样的。众所周知，jsp的最后形态就是servlet，而jsp页首设置的那个内容其实也就是让生成的servlet中生成这么两句话：</span></p><div style="border: 0.75pt solid rgb(204, 204, 204); padding: 3pt 4pt 3pt 3pt; background: rgb(238, 238, 238) none repeat scroll 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="border: medium none ; padding: 0cm;"><span style="font-size: 10pt; font-family: 宋体;"><span style="color: black;">response.setContentType( "text/html" );<br />
response.setCharacterEncoding( "UTF-8" );</span></span></p></div><p><span style="font-size: 10pt; font-family: 宋体;">而pageEncoding则是跟jvm说明了这个页面的内容要使用什么编码保存（这跟之后生成的CLASS有关系）。所以在servlet设置response的编码也是理所当然的了。 </span></p><p style="text-indent: 24pt;"><span style="font-size: 10pt; font-family: 宋体;">response.setContentType("text/xml;charset=UTF-8"); </span></p><p style="text-indent: 24pt;"><span style="font-size: 10pt; font-family: 宋体;">response.setHeader("Pragma",   "no-cache");   //HTTP   1.0   </span></p><p style="text-indent: 24pt;"><span style="font-size: 10pt; font-family: 宋体;">response.setDateHeader("Expires",   0);   //prevents   caching   at   the   proxy   server   </span></p><p style="text-indent: 24pt;"><span style="font-size: 10pt; font-family: 宋体;">PrintWriter out = response.getWriter(); </span></p><p style="text-indent: 24pt;"><span style="font-size: 10pt; font-family: 宋体;">out.write(outXML); </span></p><p style="text-indent: 24pt;"><span style="font-size: 10pt; font-family: 宋体;">out.flush(); </span></p><p style="text-indent: 24pt;"><span style="font-size: 10pt; font-family: 宋体;">out.close(); </span></p><p style="text-indent: 24pt;"><span style="font-size: 10pt; font-family: 宋体;">OK！这样向客户端写的数据中的中文也是UTF-8编码了，客户端js脚本获取到request.responseXML也好，responseText也好，里面的数据都不会有乱码了</span></p><img src ="http://www.blogjava.net/supperchen/aggbug/157458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supperchen/" target="_blank">缘来如此</a> 2007-11-01 13:02 <a href="http://www.blogjava.net/supperchen/archive/2007/11/01/157458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>