我正在尝试使用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有点新意,并且在一个迁移的影响下尝试编码,答案就是我的答案。
答案 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有能力访问价值堆栈上的对象