随笔-34  评论-1965  文章-0  trackbacks-0

在当今——Web 2.0概念铺天盖地的Internet环境下,简易的AJAX集成对于一个成功的WEB框架来说是不可或缺的。因此,Struts 2其中的一个重要的功能(Feature)就是“First-class AJAX support - Add interactivity and flexibility with AJAX tags that look and feel just like standard Struts tags(大意:一流的AJAX支持——通过AJAX标志增加互动性和灵活性,而且使用这些AJAX标志与普通的Struts标志同样简单)”。

实现原理

基于不重新发明轮子的原则,Struts 2并没有开发新的AJAX框架,而是使用时下Java EE平台中比较流行的AJAX框架——Dojo和DWR。

最近在Musachy Barroso等同志的无私奉献下,开发了Struts 2的JSON插件(Plugin),极大地方便了我们输出JSON结果(Result)。

JSON插件(Plugin)

在Struts 2的showcase中的AJAX部分,JSON的结果输出是通过Freemaker模板实现。这种方法在简易性和灵活性上都比不上JSON插件,所以JSON插件值得向大家五星推荐。

下面让我们看一个JSON插件的例子。

首先到以下网址http://code.google.com/p/jsonplugin/downloads/list下载JSON插件的JAR包,并将其加入你的WebContent\WEB-INF\lib下。

接下是本例子的Action代码:

package tutorial;

import java.util.ArrayList;
import java.util.List;

import com.googlecode.jsonplugin.annotations.JSON;
import com.opensymphony.xwork2.ActionSupport;

public class JsonPluginAction extends ActionSupport {
   
private static final long serialVersionUID = -6784977600668791997L;
   
   
private int bookId;
   
private String title;
   
private double price;
   
private List<String> comments;    
   
private transient String secret1;
   
private String secret2;

   @JSON(name
="ISBN")
   
public int getBookId() {
       
return bookId;
   }


   
public void setBookId(int bookId) {
       
this.bookId = bookId;
   }


   
public List<String> getComments() {
       
return comments;
   }


   
public void setComments(List<String> comments) {
       
this.comments = comments;
   }


   
public double getPrice() {
       
return price;
   }


   
public void setPrice(double price) {
       
this.price = price;
   }


   
public String getTitle() {
       
return title;
   }

   
   
public void setTitle(String title) {
       
this.title = title;
   }


   @Override
   
public String execute() {
       bookId
= 15645912;
       title
= "Max On Java";
       price
= 0.9999d;
       comments
= new ArrayList<String>(3);
       comments.add(
"It's no bad!");
       comments.add(
"WOW!");
       comments.add(
"No comment!");
       secret1
= "You can't see me!";
       secret2
= "I am invisible!";
       
return SUCCESS;
   }

}
清单1 src/tutorial/JsonPluginAction.java

以上代码值得注意的是,通过@JSON的JAVA注释(Annotation),我们可以改变JSON结果的属性名称,另外带有transient修饰符与没有Getter方法的字段(field)都不会被串行化为JSON。

然后,我们来配置一下此Action,代码如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
>

<struts>    
   
<package name="Struts2_AJAX_DEMO" extends="json-default">
       
<action name="JsonPlugin" class="tutorial.JsonPluginAction">
           
<result type="json" />
       
</action>            
   
</package>
</struts>
清单2 src/struts.xml

上面配置文件的“package”元素和以往不同的是,它扩展了“json-default”而不是“struts-default”。“json-default”是在jsonplugin-0.11.jar包里的struts-plugin.xml中定义的。该文件同时定义了“json”的结果类型,有兴趣的朋友可以打开此文件看看。

发布运行应用程序,在浏览器中键入:http://localhost:8080/Struts2_Ajax/JsonPlugin.action,出现下载文件对话框,原因是JSON插件将HTTP响应(Response)的MIME类型设为“application/json”。把文件下载下来,用记事本打开,内容如下:

{"ISBN":15645912,"comments":["It's no bad!","WOW!","No comment!"],"price":0.9999,"title":"Max On Java"}
清单3 例子1输出的JSON串

当然这还不是一个完整的AJAX的例子,下面让我们写一个HTML文件将其完成,HTML代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
   
<title>JSON Plugin</title>
   
<script type="text/javascript">    
   
var bXmlHttpSupport = (typeof XMLHttpRequest != "undefined" || window.ActiveXObject);
     
   
if (typeof XMLHttpRequest == "undefined" && window.ActiveXObject) {
       
function XMLHttpRequest() {
           
var arrSignatures = ["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0",
                                 
"MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP",
                                 
"Microsoft.XMLHTTP"];
                             
           
for (var i=0; i < arrSignatures.length; i++) {
               
try {        
                   
var oRequest = new ActiveXObject(arrSignatures[i]);            
                   
return oRequest;        
                }
catch (oError) { /*ignore*/ }
            }          
    
           
throw new Error("MSXML is not installed on your system.");               
        }
    }    
            
   
function retrieveBook() {        
       
if(bXmlHttpSupport) {
           
var sUrl = 'JsonPlugin.action';
           
var oRequest = new XMLHttpRequest();
            oRequest.onreadystatechange
= function() {
               
if(oRequest.readyState == 4) {                    
                   
var oBook = eval('(' + oRequest.responseText + ')');
                   
var bookHolder = document.getElementById('bookHolder');
                   
var sBook = '<p><b>ISBN: </b>' + oBook.ISBN + '</p>';
                    sBook
+= ('<p><b>Title: </b>' + oBook.title + '</p>');
                    sBook
+= ('<p><b>Price: </b>$' + oBook.price + '</p>');
                    sBook
+= ('<b><i>Comments: </i></b><hr/>');
                   
for(i = 0; i < oBook.comments.length; i++) {
                        sBook
+= ('<p><b>#' + (i + 1) + ' </b>' + oBook.comments[i] + '</p>');
                    }
                    bookHolder.innerHTML
= sBook;
                }
            };
            oRequest.open('POST', sUrl);
            oRequest.send(
null);
        }
    }
   
</script>
</head>
<body>
   
<input type="button" value="Retrieve Book" onclick="retrieveBook()" />
   
<div id="bookHolder"></div>
</body>
</html>
清单4 WebContent/JsonPlugin.html

以上代码中,我没有使用任何的AJAX的Javascript包,而是参考《Professional Javascript For Web Developer》手工创建XHR(XMLHttpRequest),并在XHR完成后使用eval()方法将JSON字符串变为JSON对象。需要注意的是,要调用eval函数时,必须使用“(”和“)”将JSON字符串括起来,否则会出错的。

打开http://localhost:8080/Struts2_Ajax/JsonPlugin.html,点击“Retrieve Book”按钮,页面如下图所示:

图1 JsonPlugin.html页面输出
图1 JsonPlugin.html页面输出

Struts 2与Dojo

Dojo是开源Javascript工具包,它引了Widget的概念,方便了Javascript面向对象编程(OOP),改进Javascript的事件模型。在此我不打算对此进行深入的讲解,有兴趣的朋友的可以找网上找一些关于Dojo的资料学习。

Struts 2基于Dojo编写一些AJAX标志(在Dojo中称为Widget),要使用这些标志的AJAX功能,需要将标志的“theme”属性设为“ajax”。同时,亦需要将加入在<head>与</head>之间加入<s:head theme="ajax" />。当使用这些标志的AJAX功能,有些属性可能会经常用到,所以我会对这些属性稍作解释。

名称 描述
href XHR(XMLHttpRequest)请求的地址
listenTopics 监听的Dojo话题(Topic)以触发自身,如可以在可以通过发布(Publish)相应的话题,通知<s:autocompleter />重新加载其备选项(Options)
notifyTopics 完成远程调用后,发出通知,触发相应的Javascript函数或Dojo Widget
formId 需要提交到服务器的表单的ID
formFilter 过滤表单字段的Javascript函数名称
indicator 在XHR处理过程中,包含用户提示的信息的HTML元素的ID,如图片或DIV等
表1 常用的AJAX标志属性

这些标志包括:<s:a />、<s: submit />、<s:autocompleter />和<s:tree />等,下面我将分别讲解。

1、<s:a />和<s:submit />

这两个标志方便了我们的调用XHR实现AJAX,所以上面的HTML如果使用了这两标志将会变得更简单,因为我们不用再去理会繁锁的XHR创建和设定的工作。下面是示例代码:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding
="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
   
<head>
       
<title>JSON Plugin</title>
       
<s:head theme="ajax" />
       
<script type="text/javascript">                    
        dojo.addOnLoad(
function() {
            dojo.event.topic.subscribe('retrieveBook',
this, function(data, type, e){
               
if(type == 'load') {
                    showBook(data);
                }
else if(type == 'error') {
                    alert('Can not retrieve the book');
                }
            });
        });
        
       
function showBook(strBook) {
           
var oBook = eval('(' + strBook + ')');
           
var bookHolder = document.getElementById('bookHolder');
           
var sBook = '<p><b>ISBN: </b>' + oBook.ISBN + '</p>';
            sBook
+= ('<p><b>Title: </b>' + oBook.title + '</p>');
            sBook
+= ('<p><b>Price: </b>$' + oBook.price + '</p>');
            sBook
+= ('<b><i>Comments: </i></b><hr/>');
           
for(i = 0; i < oBook.comments.length; i++) {
                sBook
+= ('<p><b>#' + (i + 1) + ' </b>' + oBook.comments[i] + '</p>');
            }
            bookHolder.innerHTML
= sBook;
        }
       
</script>
   
</head>
   
<body>
       
<s:url id="bookUrl" value="/JsonPlugin.action" />
       
<s:submit href="%{bookUrl}" theme="ajax" indicator="indicator"
            value
="Retrieve Book" align="left" notifyTopics="retrieveBook" />
       
<s:a theme="ajax" href="%{bookUrl}" indicator="indicator"
            notifyTopics
="retrieveBook">Retrieve Book</s:a>
       
<img id="indicator"
            src
="${pageContext.request.contextPath}/images/indicator.gif"
            alt
="Loading" style="display:none" />
       
<div id="bookHolder"></div>
   
</body>
</html>
清单5 WebContent/LinkButton.jsp

可能上述代码还不够简洁,因为我将HTML格式化的工作都放在Javascript中完成。但如果你的XHR返回的是HTML片段,你可以简单地将<s:a />或<s:submit />的“targets”属性设为“bookHolder”即可,详情大家可以参考Struts 2 Showcase。至于返回HTML片段,可以通过Action + Freemaker完成。

2、<s:autocompleter />

Autocomplete是比较经典的AJAX应用,虽然谷歌已经停止使用这一功能,但就Autocompleter自身而言的确是很酷的。下面是一个<s:autocompleter />的例子。

首先,我要伪造一些字符串数据,代码如下:

package tutorial;

import java.util.ArrayList;
import java.util.List;

public final class Datas {
   
public static final List<String> NAMES;
   
static {
       NAMES
= new ArrayList<String>();
       NAMES.add(
"Alabama");
       NAMES.add(
"Alaska");
       NAMES.add(
"American Samoa");
       NAMES.add(
"Arizona");
       NAMES.add(
"Arkansas");
       NAMES.add(
"Armed Forces Europe");
       NAMES.add(
"Armed Forces Pacific");
       NAMES.add(
"Armed Forces the Americas");
       NAMES.add(
"California");
       NAMES.add(
"Colorado");
       NAMES.add(
"Connecticut");
       NAMES.add(
"Delaware");
       NAMES.add(
"District of Columbia");
       NAMES.add(
"Federated States of Micronesia");
       NAMES.add(
"Florida");
       NAMES.add(
"Georgia");
       NAMES.add(
"Guam");
       NAMES.add(
"Hawaii");
       NAMES.add(
"Idaho");
       NAMES.add(
"Illinois");
       NAMES.add(
"Indiana");
       NAMES.add(
"Iowa");
       NAMES.add(
"Kansas");
       NAMES.add(
"Kentucky");
       NAMES.add(
"Louisiana");
       NAMES.add(
"Maine");
       NAMES.add(
"Marshall Islands");
       NAMES.add(
"Maryland");
       NAMES.add(
"Massachusetts");
       NAMES.add(
"Michigan");
       NAMES.add(
"Minnesota");
       NAMES.add(
"Mississippi");
       NAMES.add(
"Missouri");
       NAMES.add(
"Montana");
       NAMES.add(
"Nebraska");
       NAMES.add(
"Nevada");
       NAMES.add(
"New Hampshire");
       NAMES.add(
"New Jersey");
       NAMES.add(
"New Mexico");
       NAMES.add(
"New York");
       NAMES.add(
"North Carolina");
       NAMES.add(
"North Dakota");
       NAMES.add(
"Northern Mariana Islands");
       NAMES.add(
"Ohio");
       NAMES.add(
"Oklahoma");
       NAMES.add(
"Oregon");
       NAMES.add(
"Pennsylvania");
       NAMES.add(
"Puerto Rico");
       NAMES.add(
"Rhode Island");
       NAMES.add(
"South Carolina");
       NAMES.add(
"South Dakota");
       NAMES.add(
"Tennessee");
       NAMES.add(
"Texas");
       NAMES.add(
"Utah");
       NAMES.add(
"Vermont");
       NAMES.add(
"Virgin Islands, U.S.");
       NAMES.add(
"Virginia");
       NAMES.add(
"Washington");
       NAMES.add(
"West Virginia");
       NAMES.add(
"Wisconsin");
       NAMES.add(
"Wyoming");
   }

}
清单6 src/tutorial/Datas.java

然后是用于获取和过滤数据的Action,代码如下:

package tutorial;

import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;

public class AutocompleterAction extends ActionSupport {
   
private static final long serialVersionUID = -8201401726773589361L;
   
   
private List<String[]> names;    
   
private String start;
   
   
public void setStart(String start) {
       
this.start = start;
   }

   
   
public List<String[]> getNames() {
       
return names;
   }


   @Override
   
public String execute() {
       names
= new ArrayList<String[]>();
       
if(start == null || "".equals(start.trim())) {
           start
= "a";
       }

       
for(String s : Datas.NAMES) {
           
if(s.toLowerCase().startsWith(start.toLowerCase())) {
               names.add(
new String[]{ s, s });
           }

       }

       
return SUCCESS;
   }

}
清单7 src/tutorial/AutocmpleterAction.java

上述Action会以JSON的形式返回以start开头的Datas.NAMES的中字符串,以下是此Action的配置:

<action name="Autocompleter" class="tutorial.AutocompleterAction">
   
<result type="json">
       
<param name="root">names</param>
   
</result>
</action>
清单8 Autocompleter Action的配置代码片段

在JSON类型结果的参数中加入“root”参数可以设定输出JSON结果的根,以上述情况为例,如果没有“root”参数,输出将为“{ "names": [ ["xxx", "xxx"]...] }”,加了之后变就会成“[ ["xxx", "xxx"]...] ”。接下来,让我们看看页面的代码:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding
="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
   
<head>
       
<title>Struts 2 AJAX - Autocompleter</title>
       
<s:head theme="ajax" />
   
</head>
   
<body>
       
<h2>
            Autocompleter
       
</h2>
       
<s:form action="autocompleterForm">
           
<s:textfield label="abc" name="abc" />
           
<tr>
               
<td class="tdLabel">
                   
<label class="label">
                        No AJAX Autocompleter:
                   
</label>
               
</td>
               
<td>
                   
<s:autocompleter theme="simple" name="user"
                        list
="@tutorial.Datas@NAMES" />
               
</td>
           
</tr>
           
<tr>
               
<td class="tdLabel">
                   
<label class="label">
                        AJAX Autocompleter:
                   
</label>
               
</td>
               
<td>
                   
<s:url id="dataUrl" value="/Autocompleter.action" />
                   
<s:autocompleter theme="ajax" name="start" href="%{dataUrl}"
                        loadOnTextChange
="true" loadMinimumCount="1" indicator="indicator"
                        autoComplete
="false" showDownArrow="false" />
                   
<img id="indicator"
                        src
="${pageContext.request.contextPath}/images/indicator.gif"
                        alt
="Loading" style="display:none" />
               
</td>
           
</tr>
       
</s:form>
   
</body>
</html>
清单9 WebContent/Autocompleter.jsp

上述页面包含两个<s:autocompleter />标志,前者使用“simple”模板,所以不具有AJAX功能,它的数据将以HTML方式输出到最终页面里;而后者则使用了“ajax”模板,每当输入框的值发生改变时,它都向URL“/Autocompleter.action”发送请求,Action根据请求中的start参数的值,返回相当的JSON,在请求完成后页面通过回调函数改变输入框的下拉提示,效果如下图所示:

图2 Autocompleter.jsp页面输出 
图2 Autocompleter.jsp页面输出

3、<s:tree />

树是是比较常用的数据结构,因为它可以很好地体现真实世界中对象之间的关系。<s:tree />的使用也相对简单,但需要说明的是——Struts 2.0.6 GA版本的<s:tree />是有BUG的,大家可以点击这个链接https://issues.apache.org/struts/browse/WW-1813了解详细的情况。这个BUG主要是在<s:tree />的通过“treeCollapsedTopic”、“treeExpandedTopic”和“treeSelectedTopic”设定的话题(Topic)都没有起作用,上述链接相应给出了解决方法,但我认为该方法太麻烦(需要自己重新编译和打包Struts 2),所以下面的例子,我将另辟徯径,请参考以下代码。

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding
="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
   
<head>
       
<title>Struts 2 AJAX - Tree</title>
       
<s:head theme="ajax" debug="true" />
       
<script type="text/javascript">
           
function treeNodeSelected(arg) {
                alert(arg.source.title
+ ' selected');
            }
            dojo.addOnLoad(
function() {                
               
var s = dojo.widget.byId('parentId').selector;                
                dojo.event.connect(s, 'select', 'treeNodeSelected');
            });
       
</script>
   
</head>
   
<body>
       
<h2>
            Tree
       
</h2>
       
<div style="float:left; margin-right: 50px;">
           
<s:tree label="parent" id="parentId" theme="ajax"
                templateCssPath
="/struts/tree.css" showRootGrid="true"
                showGrid
="true">
               
<s:treenode theme="ajax" label="child1" id="child1Id">
                   
<s:treenode theme="ajax" label="grandchild1" id="grandchild1Id" />
                   
<s:treenode theme="ajax" label="grandchild2" id="grandchild2Id" />
                   
<s:treenode theme="ajax" label="grandchild3" id="grandchild3Id" />
               
</s:treenode>
               
<s:treenode theme="ajax" label="child2" id="child2Id" />
               
<s:treenode theme="ajax" label="child3" id="child3Id" />
               
<s:treenode theme="ajax" label="child4" id="child4Id" />
               
<s:treenode theme="ajax" label="child5" id="child5Id">
                   
<s:treenode theme="ajax" label="gChild1" id="gChild1Id" />
                   
<s:treenode theme="ajax" label="gChild2" id="gChild2Id" />
               
</s:treenode>
           
</s:tree>
       
</div>
   
</body>
</html>
清单10 WebContent/Tree.jsp

因为Dojo的树控件,即使在没有设定“selector”情况下,也会自动生成一个默认的Selector,所以只要将其事件绑定到特定的事件处理函数即可。

打开http://localhost:8080/Struts2_Ajax/Tree.jsp,点击任一树节点,页面如下图所示:

图3 Tree.jsp页面输出 
图3 Tree.jsp页面输出

总结

我原本打算用一篇文章写完这个“Struts 2与AJAX”。不过在写的过程中,发现内容越来越多。如果勉强写成一篇,朋友们读起来也会很麻烦,所以我决定分开几部分,本文为第一部分。

另外,之前有的朋友建议我建一个Google的讨论组,方便大家讨论问题。我觉得这个提议非常好,一直以来都是“一人写,大家留言”,这种相对单向的方式不免有所欠缺,而且本人所知也有限,开个讨论组大家可以相互讨论,共同进步。

因为Struts2已经被创建,所以申请了“struts2cn”,有兴趣的朋友,欢迎加入。

posted on 2007-06-12 18:31 Max 阅读(81055) 评论(96)  编辑  收藏 所属分类: Struts 2.0系列

评论:
# re: Struts 2与AJAX(第一部分)[未登录] 2007-06-12 19:53 | yy
我一直在关注你的blog,在这里学到了不少关于struts2的东西,可否写一下关于struts2和ext集成的例子,谢谢!  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-12 20:34 | 海边沫沫
好文章,顶  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2007-06-13 09:19 | javaman
终于等到你发帖了!~  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-13 09:28 | 千山鸟飞绝
建议将struts2树型写得更详细一点,因为现在个人觉得struts2的树型似乎还是一次性的读取所有数据。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-13 13:27 | 有猫相伴的日子
没有说到DWR与struts2结合的例子  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-13 18:28 | divid
老兄,现在市面上好像没有struts2 book 你可以整理一下出一本.满足一下市场的需求.这可是机会呀!  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2007-06-14 09:06 | G_G
顶上
好东西  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-14 09:31 | Max
@千山鸟飞绝
可以的话,我会把它完善的。
@有猫相伴的日子
在第二部分应该会DWR与Struts 2的例子。
@divid
值得考虑,不过还没有出版商找我:-)  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-14 09:34 | Max
Struts 2.0.8 GA发布了,不过,我昨晚试了一下,似乎<s:tree />标志的BUG还没有解决。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-14 14:56 | look
请教个问题:
我页面中使用的是框架,就是左面菜单,右面页面,现在我是不知道怎么把action的值传到页面了,不知道怎么实现。请帮想个办法,谢谢!
  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-14 23:05 | Max
@look
和普通的做法一样。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-15 09:47 | look
<s:param name="objectid" value="<%=systemSetPO.getSyscode()%>"/>
我的systemSetPO.getSyscode()的值是001,但从<s:param>中的出的结果
是1,有什么办法能得到是001?谢谢  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2007-06-16 09:58 | Oliver
@Max
dojo框架的tabContainer控件不支持中文作标签的标题,有没什么办法可以解决啊,谢谢  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-17 01:33 | 甜菜侯爵
一路看来
Max的系列指南文章对我学习struts帮助实在是太大了!
真是万分感谢!

不知现在Google论坛是否已经建好?
我想如能进一步和一同学习struts2的朋友进行详细讨论,收获会更大。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-19 00:56 | Max
@甜菜侯爵
论坛已经建好http://groups.google.com/group/struts2cn,欢迎加入讨论。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-19 00:59 | Max
@look
这需要根据你的systemSetPO.getSyscode()返回是什么类型?可能要自己格式一下,另外,<s:param />的value属性是支持OGNL,所以应该尽量避免使用<%%>的写法。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-19 01:01 | Max
@Oliver
我会写一篇关于AJAX出现的中文问题的解决方法的文章(如果这段有空的话)。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2007-06-19 07:40 | Oliver
@Max
好的,期待后续大作  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-19 09:43 | furong
建议把树的部分写的再详细点
文中涉及到的是静态树
能不能把动态树的情况也讲一下
不胜感激!!  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-19 12:35 | look
@Max
请问在struts2.0中session是怎么用的,我现在做一个项目的登陆模块,我想把登陆信息保存住,但struts2.0中我用了SessionAware,ServletRequestAware,ServletResponseAware,但是登陆信息还不保存不住,不知道为什么?不知道您是怎么做的?把解决一下,谢谢!  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-19 22:08 | Max
@furong
好的,我会在以后的文章多提及的。
@look
这通常的做法无有区别,请参考《http://www.blogjava.net/max/archive/2006/10/25/77157.aspx》,如果你的通过SessionAware获得的Map类型的session中属性集合(假如名为att),则应用使用att.put("user", "Max");
如果是通过HttpSession session = request.getSession()得到的session,则应使用session.setAttribute("user", "Max")。
希望这对你有用。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-22 14:38 | divid
用标签<s:tree>不能显示,提示:找不到dojo?
/struts/这个目录在那啊
请老兄帮忙!  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-22 16:00 | 杨爱友
怎么才能加你为好友  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-22 22:17 | Max
@杨爱友
你可以通过Google Talk:max.m.yuan@gmail.com找到我。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-25 15:14 | jpma
为何我的工程中加入“jsonplugin-0[1].13.jar”后就tomcat就不能启动?
console中出现信息为
java.lang.UnsupportedClassVersionError: Bad version number in .class file
......
我的jdk为1.5版本,难道jsonplugin是用jdk1.6版本编译出来的?  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-25 22:45 | Max
@jpma
不是,我使用的JDK就是5.0版本,你是否安装了多个JDK,请确认你的TOMCAT所使用的JDK的版本。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-25 22:53 | Max
@divid
你可以在struts-core-2.0.6.jar或struts-core-2.0.8.jar包中的org.apache.struts2.static.dojo的路径下找到。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-06-27 10:16 | jpma
@Max
已经确定是JDK版本的问题,可能我下载的jsonplugin版本是新的吧,我安装了jre1.6后,将tomcat的“Java Virtural Machine”改为1.6的jvm.dll后问题就解决了。  回复  更多评论
  
# re: Struts 2與AJAX(第一部分) 2007-07-01 17:38 | JJ
autocompleter的例子
無法執行???
為什麼  回复  更多评论
  
# re: Struts 2與AJAX(第一部分) 2007-07-01 20:26 | JJ
請問如何在<s:autocompleter ....
的Tag裡加入JavaScript onchange()的function
???  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2007-07-02 18:36 | Sivyer
求助个问题

我用 struts2 的 ajax提交表单时,在服务端得到的值是 null
去掉 头部的 <s:head theme="ajax"> 提交正常
这是什么问题?
弄了几天了,请帮忙解决一下,先谢谢了!

下边是部分代码

<s:form action="updatePersonInfo.action" method="post" id="frm1"
namespace="/web/usersinfo">

<s:hidden name="userbase.id" />
<s:hidden name="userbase.userId" />
<s:textfield name="test"></s:textfield>
<s:textfield label="%{getText('usersbase.label.name')}"
name="userbase.name" required="true" />


提交按钮:
<s:submit theme="ajax" targets="updateResultDiv" value="ddd" formId="frm1"></s:submit>
  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-07-02 23:08 | Max
@JJ
你可以使用notifyTopics属性,如
<s:autocompleter theme="simple" name="user" list="@tutorial.Datas@NAMES" notifyTopics="/acChange"/>;
在<head></head>之间加入:
<script type="text/javascript">
dojo.addOnLoad(function() {
dojo.event.topic.subscribe('/acChange', this, function(data, type, e){
alert(data + ', ' + type + ', ' + e);
});
});
</script>
希望这对你有用。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-07-02 23:12 | Max
@Sivyer
你可以试一下在<s:submit />中加入href属性,如:
<s:submit theme="ajax" targets="updateResultDiv" value="ddd" formId="frm1" href="/web/usersinfo/updatePersonInfo.action" />。
希望这可以解决你的问题。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2007-07-13 19:19 | Stone
文章太好了 !感谢作者。
请问我现在有个问题,就是使用<s:autocompleter ....
的时候,我如果设置了list属性值,比如: <s:autocompleter list="userMap" ..... 我如果不设置notifyTopics这个属性或者我设置了notifyTopics这个属性,但是没有引入dojo.event.topic.subscribe这个js代码,当我用鼠标点右边的小蓝tab来选择列表属性时,点几下就会出现java script Error. Line :4872, object Error.
这问题我一直不知道是什么原因造成的,我看struts showcase上也有这个问题.只是showcase上如果result返回的是js文件时,才没有这个问题,但是使用list属性来initial这个tag值就出问题了。
我现在只能通过对每个autocompleter 设置notifyTopics这个属性,并且再定义一个空的dojo.event.topic.subscribe来解决这个问题。
请问还有别的解决方案么?  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2007-07-13 19:20 | Stone
另外,我使用的是struts2.0.8版本  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-07-20 10:51 | hae
个人感觉<s:autocompleter>和<s:tree>的输出样式不是很好看,
不知道是否可以自定义CSS?  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-07-25 19:00 | 明人
“在Struts 2的showcase中的AJAX部分,JSON的结果输出是通过Freemaker模板实现。”

注意,不是“Freemaker”而是“Freemarker”(我喜欢将其直译为“自由标记者”),虽然仅仅只是少了一个字母'r',但却容易造成误解,我们程序员讲究的就是严谨的治学态度。

希望max兄在写出精品的同时,更能抓住细节,虽然很辛苦,但您的一举一动都会影响大批立志于java技术的后辈,可以说,在某种意义上,您已经是一面旗帜了。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-07-25 23:23 | Max
@明人
过奖了,我在发文章之前会进行一下粗略的校对,但这样的错误还是在所难免。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-07-25 23:29 | Max
@Stone
Sorry, 不太明白你的意思。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-07-28 15:46 | d
例子说的 不明不白 配置文件也 很多没帖完全 误人时间  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-07-31 10:49 | Adma
基于不重新发明轮子的原则,Struts 2并没有开发新的AJAX框架,而是使用时下Java EE平台中比较流行的AJAX框架——Dojo和DWR。

DWR 官方说的? 我怎么看文档里只说是Dojo??

The framework provides a set of tags to help you ajaxify your applications, on Dojo. Dojo 0.4 is bundled with the distribution.  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-07-31 23:34 | Max
@Adma
据我所知,Struts 2在Struts 2.0.6使用DWR实现AJAX表单校验。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-08-01 10:04 | Adma
@Max
有文档吗?给个链接,谢谢。
  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-08-10 09:01 | dxyy
请问,我的struts2中的datetimepicker这个控件怎么没有用,我按照网上的说法把代码写好了编绎运行后,我看不到这个组件.  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2007-08-22 09:57 | Stone
@Max
谢谢 Max 你的关注,我现在再去看了下我提的问题,的确没有描述清楚。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-08-23 14:27 | 甲生
我想把spring也整合进去,但是出现了问题,如下配置<package name="Struts2_AJAX_DEMO" extends="json-default"> 当extends不是
struts-default时,依赖注入不能实现,请问老大有可什么解决的的方法  回复  更多评论
  
# jsonplugin[未登录] 2007-09-12 17:34 | Daniel
Struts 2 JSON Plugin
JSON Plugin
这两个插件有什么区别呀?有没有JSON Plugin 的参考文档或api呀在哪里呢?
谢谢max大哥哥这么多好的文章  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-09-13 15:48 | why
java.lang.NoClassDefFoundError: Lorg/codehaus/plexus/PlexusContainer;
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:2232)
at java.lang.Class.getDeclaredFields(Class.java:1715)
at com.opensymphony.xwork2.inject.ContainerImpl.addInjectors(ContainerImpl.java:102)
at com.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:84)
at com.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:82)
at com.opensymphony.xwork2.inject.util.ReferenceCache$CallableCreate.call(ReferenceCache.java:155)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269)
at java.util.concurrent.FutureTask.run(FutureTask.java:123)
at com.opensymphony.xwork2.inject.util.ReferenceCache.internalCreate(ReferenceCache.java:81)
at com.opensymphony.xwork2.inject.util.ReferenceCache.get(ReferenceCache.java:121)
at com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector.<init>(ContainerImpl.java:329)
at com.opensymphony.xwork2.inject.ContainerImpl$5.create(ContainerImpl.java:299)
at com.opensymphony.xwork2.inject.ContainerImpl$5.create(ContainerImpl.java:298)
at com.opensymphony.xwork2.inject.util.ReferenceCache$CallableCreate.call(ReferenceCache.java:155)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269)
at java.util.concurrent.FutureTask.run(FutureTask.java:123)
at com.opensymphony.xwork2.inject.util.ReferenceCache.internalCreate(ReferenceCache.java:81)
at com.opensymphony.xwork2.inject.util.ReferenceCache.get(ReferenceCache.java:121)
at com.opensymphony.xwork2.inject.ContainerImpl.getConstructor(ContainerImpl.java:562)
at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:460)
at com.opensymphony.xwork2.inject.ContainerImpl$7.call(ContainerImpl.java:501)
at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:549)
at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:499)
at com.opensymphony.xwork2.config.impl.LocatableFactory.create(LocatableFactory.java:32)
at com.opensymphony.xwork2.inject.ContainerBuilder$4.create(ContainerBuilder.java:134)
at com.opensymphony.xwork2.inject.Scope$2$1.create(Scope.java:49)
at com.opensymphony.xwork2.inject.ContainerImpl$ParameterInjector.inject(ContainerImpl.java:431)
at com.opensymphony.xwork2.inject.ContainerImpl.getParameters(ContainerImpl.java:446)
at com.opensymphony.xwork2.inject.ContainerImpl.access$000(ContainerImpl.java:48)
at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.inject(ContainerImpl.java:288)
at com.opensymphony.xwork2.inject.ContainerImpl$2.call(ContainerImpl.java:117)
at com.opensymphony.xwork2.inject.ContainerImpl$2.call(ContainerImpl.java:115)
at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:542)
at com.opensymphony.xwork2.inject.ContainerImpl.injectStatics(ContainerImpl.java:114)
at com.opensymphony.xwork2.inject.ContainerBuilder.create(ContainerBuilder.java:494)
at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reload(DefaultConfiguration.java:145)
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:52)
at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:395)
at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:452)
at org.apache.struts2.dispatcher.FilterDispatcher.init(FilterDispatcher.java:201)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:223)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:304)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:77)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3600)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4193)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1013)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:718)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1013)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:442)
at org.apache.catalina.core.StandardService.start(StandardService.java:450)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:709)
at org.apache.catalina.startup.Catalina.start(Catalina.java:551)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:432)
- Error filterStart

struts2.0.1 换成sturts2.0.8出现以上问题,为什么啊..知道的说下.谢谢  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-09-17 17:15 | 独孤蟹
s:autocompleter names 里如果有中文 怎么处理啊? 我debug在action中看到中文都是乱码  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2007-09-18 14:05 | Stone
你好 ,Max, 有个autocomplete的问题一直困扰了我好久 ,我断断续续找资料大概2个月了依旧没有能找到答案。我的问题描述比较长,而且有附件什么的,这里写的不方便。我写在这个地址上:
http://www.javaeye.com/topic/100190
我在apache网站上找了bug日志,好像也没有提到这个issue,所以我想可能是我的用法不对,如果你能帮我解说一下,万分感谢。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2007-09-30 16:59 | a
@yy

关于struts2和ext的集成可以用struts2jsonplugin,很方便做grid
  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2007-10-07 13:24 | edward
自动完成,对中文没作用  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2007-10-09 17:33 | jackson
我完全按照楼主的例子做了Autocomplete,可是运行后点击三个框都没反应,也不报错,是浏览器设置的原因还是什么原因啊?  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2007-10-10 13:06 | jackson
问题解决了,犯了个不该犯的错误,原来把类Datas忘放到tomcat下了!  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-10-12 10:28 | referee
我按着你说的方法做的
jsonplugin的包放到了lib下面,struts.xml也是照写的,可是tomcat报错。

There is no result type defined for type 'json' mapped with name 'success' - result - file:/F:/cvs_root/struts/WebContent/WEB-INF/classes/struts.xml:42:34

已经设置extends="json-default",还是没有json的的resultType,请高人指点  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2007-12-19 14:25 | 网事
我按照你说的做..我遇到了个问题.给个联系方式?QQ或者是MSN  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-01-02 11:39 | javer
正准备在STRUTS2中用AJAX  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-01-05 15:25 | agoo
期待struts2和ext的集成例子出现,
感谢Max,使我在struts2中少走了很多路!
  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2008-01-07 14:55 | liu
Auto不能成功,谁能给个成功的例子啊  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-01-08 17:48 | xx
sod,sodos.jdosslss  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2008-01-18 10:38 | apple
楼主,我发生了这个异常,不知是什么原因,请帮忙解决下
Servlet.service() for servlet default threw exception
java.lang.IllegalAccessException: Class com.googlecode.jsonplugin.JSONWriter can not access a member of class org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper with modifiers "public"  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-01-18 13:13 | grttr
rewqrewqrwq  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-01-18 13:14 | grttr
yyyyyyyyyyyy  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2008-01-30 13:15 | javaman
这篇blog很早就看过了,当时看还没什么感觉
最近在研究ext的grid,用到了json ,再回来看struts2中的json,收获很大
感谢max~~~~  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-01-31 13:59 | kongguoan
我照做了您所有的例子。当我看到自动完成的这个例子的时候我异常的兴奋。但是上面都是只支持英文。。我想了很多办法都没有让它支持中文。。这个问题困扰了我1个多星期了。。希望您能帮助一下。。谢谢怎么才能让自动完成支持中文呢????  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-03-07 10:57 | sniperking
中文好像支持不是很好,试了很久,需要改Tomcat配置,
TOMCAT server.xml中 <Connector
port="8080"中加URIEncoding="UTF-8"
URIEncoding需要和页面中的<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
一致,不过好像页面上匹配有问题,找不到原因
  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-04-03 09:56 | 要鲜花
不错的东西!!!!
  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-04-03 09:57 | 要鲜花
你好!!  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-04-03 10:02 | 要鲜花1111
12334344343  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-04-03 10:11 | 要鲜花1111
22222  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-04-06 18:27 | shoru
中文是支持的!不过是在火狐里支持,在IE里就不支持了,我在start被用作数据库查询的关键字之前,对其进行了重新编码,OK了就。
String sutf8 = new String(start.getBytes("iso8859-1"),"utf8");

谁告诉我为什么在IE里不行在火狐行啊!难道是IE和火狐的默认编码不一样???  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2008-04-07 17:30 | 哈哈
困扰了我一天,不支持中文,输入中文直接就不能触发,想了好多办法都不行,郁闷  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-04-25 11:16 | 小辉
不错!max,demo写的很详细,受到不少帮忙,在此表示感谢。继续努力。
顶!!!  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-04-28 15:34 | origo
<script type="text/javascript">
dojo.addOnLoad(function() {
dojo.event.topic.subscribe('retrieveBook', this, function(data, type, e){
if(type == 'load') {
showBook(data);
} else if(type == 'error') {
alert('Can not retrieve the book');
}
});
});

function showBook(strBook) {
var oBook = eval('(' + strBook + ')');
var bookHolder = document.getElementById('bookHolder');
var sBook = '<p><b>ISBN: </b>' + oBook.ISBN + '</p>';
sBook += ('<p><b>Title: </b>' + oBook.title + '</p>');
sBook += ('<p><b>Price: </b>$' + oBook.price + '</p>');
sBook += ('<b><i>Comments: </i></b><hr/>');
for(i = 0; i < oBook.comments.length; i++) {
sBook += ('<p><b>#' + (i + 1) + ' </b>' + oBook.comments[i] + '</p>');
}
bookHolder.innerHTML = sBook;
}

尝试采用这种方式,怎么我得到的type 是before的,而且firefox debug输出
DEBUG: XMLHttpTransport error callback failed: TypeError: node has no properties

请大哥明示呀。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-04-28 15:35 | origo
用头先的javascript的方式执行正常  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-04-30 00:19 | Luckyrain
Perfect Contents!!  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-06-27 14:49 | javaflying
大侠,请教一个问题:我在使用struts2.0标签
<s:autocompleter theme="ajax" name="zxw01" href="%{userCode}"
loadOnTextChange="true" loadMinimumCount="1" indicator="indicator"
autoComplete="false" showDownArrow="false" onchange="getuserName()" theme="simple"/>
如何使用onchange事件.我上面的用法怎么不能激发这一事件!!  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-06-27 15:28 | javaflying
发现onchange事件不能激发的原因是因为与struts2.0的ajax框架发生冲突!
<s:head theme="ajax" debug="true"/>
请问楼主我两者都要用,如何解决冲突的问题!!
谢谢!!  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-09-19 13:12 | sebatinsky
能够运行,分析当中,完全看了帖子.  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-09-26 18:00 | N.J.Paul
不好意思,初学者--
<script type="text/javascript">
function show_user_details(id) {
document.frm_user.userid.value = id;
dojo.event.topic.publish("show_detail");
}
</script>
为什么我直接这样写,说publish方法找不到啊?  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-09-28 13:27 | N.J.Paul
问题已解决,JavaScript提示错误不影响程序正确执行。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-11-17 17:23 | yihaijian
太强了,谢谢你,读了你的博客收获真的非常大  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-11-21 08:41 | oasis
Max在么?任何高手都可以解答。。。
那个autocompleter实现不了啊?什么原因???急。。。谢谢////  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2008-11-27 21:34 | 初学者
使用了 json 在 action 里 不能直接 调用某个域模型了吗

是不是都要写成 很多的 字段 然后再??调用一定的业务逻辑操作?

那些字段有什么好的办法 简化吗  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2009-04-08 18:28 | ccue
function loadAjaxCommodity(commodityId) {
dojo.io.bind({
url:"../ajax/loadCommodity.action?id="+commodityId,
handle:drawTable,
method:"GET",
sync:false,
mimetype:"text/json"

});
}
为什么在IE中只发送一次请求呢  回复  更多评论
  
# TMD,这文章太棒了~![未登录] 2009-04-18 22:14 | 小毅
终于看到一篇完整的示例,完整的代码。就是要这样撒,语言口语化 简单明了 很不错!!!!!!!!!!  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2009-04-27 16:33 | 飞翔
你好 着个例子好象有点问题
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>JSON Plugin</title>
<script type="text/javascript">
var bXmlHttpSupport = (typeof XMLHttpRequest != "undefined" || window.ActiveXObject);

if (typeof XMLHttpRequest == "undefined" && window.ActiveXObject) {
function XMLHttpRequest() {
var arrSignatures = ["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP",
"Microsoft.XMLHTTP"];

for (var i=0; i < arrSignatures.length; i++) {
try {
var oRequest = new ActiveXObject(arrSignatures[i]);
return oRequest;
} catch (oError) { /*ignore*/ }
}

throw new Error("MSXML is not installed on your system.");
}
}



function retrieveBook() {
if(bXmlHttpSupport) {
var sUrl = 'JsonPlugin.action';
var oRequest = new XMLHttpRequest();
oRequest.onreadystatechange = function() {
if(oRequest.readyState==4) {
var oBook = eval('(' + oRequest.responseText + ')');
var bookHolder = document.getElementById('bookHolder');
var sBook = '<p><b>ISBN: </b>' + oBook.ISBN + '</p>';
sBook += ('<p><b>Title: </b>' + oBook.title + '</p>');
sBook += ('<p><b>Price: </b>$' + oBook.price + '</p>');
sBook += ('<b><i>Comments: </i></b><hr/>');
for(i = 0; i < oBook.comments.length; i++) {
sBook += ('<p><b>#' + (i + 1) + ' </b>' + oBook.comments[i] + '</p>');
}
bookHolder.innerHTML = sBook;
}
};
oRequest.open('POST', sUrl);
oRequest.send(null);
}
}
</script>
</head>
<body>
<input type="button" value="009Retrieve Book" onclick="retrieveBook()" />
<div id="bookHolder"></div>
</body>
</html>

运行时eval()这里通不过!!希望你调试,最好能将调试好的代码发给我,谢谢!
zhangxiong1203@163.com  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2009-06-16 10:38 | JASON
@甲生
修改JAR里的配置文件,extends=“STRUTS-DEFAULT”然后保存下,再把修改的文件覆盖到你的工程里就哦了  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2009-06-21 15:53 | qlknight
MAx你好,我最近一直在看你的例子学习struts2
但是在这个例子的时候遇到了页面编译不通这的问题,经过一翻测试感觉在用
<s:a />和<s:submit />的时候要做以个修改。
a:导入dojo包<%@ taglib prefix="sx" uri="/struts-dojo-tags" %>
b: <head><s:head/><sx:head/></head>
c:标签用<sx:a>,<sx:submint>其中不要加入theme="ajax"属性。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2009-07-23 15:08 | halley
<td>
<s:url id="dataUrl" value="autocompleter.action" />
<s:autocompleter theme="ajax" name="start" href="%{dataUrl}"
loadOnTextChange="true" loadMinimumCount="1" indicator="indicator"
autoComplete="false" showDownArrow="false" />
<img id="indicator"
src="${pageContext.request.contextPath}/ecside/images/gird/loading.gif"
alt="Loading" style="display: none" />
</td>

已经可以取到值了,页面上为什么不能显示?  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2009-11-19 11:10 | 钟艳明
突然喜欢上了struts2.0 ,发现技术的更新真是给我莫大的惊喜!  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2010-01-15 13:49 | corrine
The import com.googlecode cannot be resolved  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2010-08-23 15:08 | cosplay
突然喜欢上了struts2.0 ,发现技术的更新真是给我莫大的惊喜!  回复  更多评论
  
# re: Struts 2与AJAX(第一部分) 2010-08-23 15:09 | cosplay
以上代码中,我没有使用任何的AJAX的Javascript包,而是参考《Professional Javascript For Web Developer》手工创建XHR(XMLHttpRequest),并在XHR完成后使用eval()方法将JSON字符串变为JSON对象。需要注意的是,要调用eval函数时,必须使用“(”和“)”将JSON字符串括起来,否则会出错的。  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2013-04-17 14:35 | tang
单击节点后,不能弹出alert框,为什么,楼主  回复  更多评论
  
# re: Struts 2与AJAX(第一部分)[未登录] 2015-12-29 09:54 | 1
11  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: