Struts1和jQuery越深研,學越多,狀況越多。最意外的是還有瀏覽器不相容的問題,原本在Google Chrome下可work的,到IE和FireFox便出錯,而且錯得都不一樣,馬的。IE問題出在CSS的問題,果如Java Script的大老道格拉斯在OSDC 2010說:IE 6 MUST DIE。我看IE8也…。

  先列出解出和FireFox的問題。原來出在Struts的RequestProcessor的類別,我在JSP使用jQuery的$.ajax去做post,其url設定為/query.do,在Google Chrome裡,印出的Log是這樣:[RequestProcessor.java:161] : Processing a 'POST' for path '/query'。

  而在FireFox的Log卻是:[RequestProcessor.java:681] : Invalid path was requested /jsp/permission/query。也就是在FireFox下,url事先加了目前的jsp的base path。目前只尋得治標方式。就是在struts_config.xml裡,除了設定/query的action之外,也設定/jsp/permission/query的action,而對映的Spring Bean也得追加相應的method,內容和@Bean(name="/query")一樣,只是變成@Bean(name="/jsp/permission/query"),而method name也要取不同名。希望下次找到治本方式,這個治標方式至少不必在前端程式加一堆瀏覽器的判斷。


  2010/4/28:治本方式是設好Context定位給其它url使用。先在common.jsp設置如下,給其它jsp去include:

<%@ taglib uri="/WEB-INF/tld/jstl/c.tld" prefix="c" %>
<c:set var="ctx" value="${pageContext.request.contextPath}"/>

  之後用到Ajax或是submit的URL,一律前綴此標籤:

$(function(){
    $("#query").click(function() {
        dataString = $("#myForm").serialize();
        $.ajax({
            url: '<c:out value="${ctx}"/>/query.do',
            type: 'POST',
            data: dataString,
            dataType: 'json',
            success: function(data, status){
                buildTable(data);
            },
            error: function(xhrInstance, status, xhrException) {
                alert("failure:" + status);
            }
        });
        return false;
    });
});

$("#myForm").attr("action", '<c:out value="${ctx}"/>/query.do');
$("#myForm").submit();

  據Google結果,原因是FireFox 3.x版禁止cross domain存取,是故才會有/jsp/permission/query的url出現。本想用<html:base>在Client解決,但還是失敗。

  接著再把link的css和引入的Java Script檔,其路徑都用這種方式前綴,終於能並用於IE8、FireFox3和Chrome 4。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Jemmy 的頭像
    Jemmy

    Jemmy Walker

    Jemmy 發表在 痞客邦 留言(0) 人氣()