如何将数据从Struts动作发送到javascript?

时间:2011-04-12 13:37:16

标签: java javascript struts2

我正在尝试使用Struts 2和javascript创建一个webb应用程序,我在将动作中的数据传递到我的javascript时遇到了一些麻烦。
这是我要发送/访问的列表:

List<MarkerClass> markers;  

MarkerClass定义为belove:

final class MarkerClass  
{  
    public Integer objectId;  
    public String street;  
    public String streetNumber;  
    public String zip;  
    public String city;  
    public Integer statusId;  
    public Float lattitude;  
    public Float longitude;  
}

该操作还包括标记的getter:

public List<MarkerClass> getMarkers()
{
    return markers;
}

在我的jsp文件中,我尝试过这样做:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>

<script type="text/javascript">

function initialize() 
{
    var titel = "";
    for(var i, "${markers}")
    {
        titel = titel+ "${markers[i].street}";
    }
}

浏览器用“[se.fubar.test.MarkerClass@37a4,se.fubar.test.MarkerClass@9ad97c]”替换“$ {markers}”“ 我猜测有更好更聪明的方法,但是因为我对Struts有点新意,并且在一个迁移的影响下尝试编码,答案就是我的答案。

4 个答案:

答案 0 :(得分:2)

您必须在请求或会话中设置该变量,然后使用<c:out jsp标记访问它,如此

var myVar= '<c:out value="${requestScope.myVar}"/>';

然后在你的js中使用var。

如果您在请求或会话中设置了一个对象,则必须使用get方法来访问属性的值,然后像这样使用它:

var myVar= '<c:out value="${requestScope.myObj.attribute}"/>';

(假设你的getter方法是getAttribute)

无法访问会话中的数据或直接从js请求 希望这有帮助

答案 1 :(得分:2)

你不能只在javascript函数中使用struts变量并期望它能够工作。请记住,在将页面的HTML发送到浏览器之前,会处理${...}内容。当javascript在浏览器中呈现时,您只剩下文本表示。你需要做的是(检查语法,我有一段时间没用过这个东西):

function initialize() {
    var title = "";
    <c:foreach var="marker" list="${markers}">
         title = title + "${marker.street}";
    </c:foreach>
}

无论如何都是这样的......基本上你的浏览器看到的Javascript看起来像

function initialize() {
    var title = "";
    title = title + "Street1";
    title = title + "Street2";
    title = title + "Street3";
    title = title + "Street4";
}

我希望这是有道理的,并且与你的要求有关。 顺便说一下,通常有更好的方法来实现构建动态js等功能。可能有内置的Struts 2组件可以使用吗?

答案 2 :(得分:0)

您可以将对象转换为服务器上的json(请参阅http://www.json.org/java/index.html),然后在字符串上调用eval()以获取对象的javascript表示。

答案 3 :(得分:0)

您可以尝试访问此类似内容。 但你必须使用一个循环从列表中取出每个对象,将它放在值堆栈上,然后获取它的每个对象。你可以要求ognl为你做这样的事。像

<script type="text/javascript">

function initialize() 
{
    var titel = "";
    for(var i, "${markers}")
    {
        titel = titel+ <s:property value="%{markers.get(i).street}">;
    }
}

试试吧,因为OGNL有能力访问价值堆栈上的对象