2017-04-25 45 views
1

我有一个java servlet,它以数组格式将json对象发送到jsp页面。将json数组从servlet获取到javascript变量

这里是我的servlet(它的一部分):

List<HistoryLeavesScalar> returnedPastInfo = SaveDAO.getPastInformation(username); 
JSONArray jsonArray = new JSONArray(returnedPastInfo); 
String s = jsonArray.toString(); 
System.out.println("\n\n"+"JSON ARRAY is : "+s); 

HttpSession session = request.getSession(true); 
session.setAttribute("jsonArray",jsonArray); 
this.getServletContext().getRequestDispatcher("/calendar.jsp") 
.forward(request, response); 

是System.out.print是JSON是这样在我的控制台: [{ “结束日期”:“2017年4月22日“ ”REQ“: ”2017年4月19日“, ”NR“:2, ”类型“: ”CO“, ”的startDate“: ”2017年4月20日“, ”德普“:” 2017年4月19日“},{” 结束日期 “:” 2017年4月22" 日, “REQ”: “2017年4月20日”, “NR”:3, “类型”: “CM”, “的startDate”:“2017-04 -20“,”Dep“:”2017-04-19“}]

这个Json数组我想在JavaScript标记中只能看到这样的格式:(这是calendar.jsp - 它的一部分)

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
    <%@ page import="javax.servlet.jsp.jstl.core.*"%> 
    <%@ page import="javax.servlet.jsp.el.*" %> 
    <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%> 
<script type="text/javascript"> 

    var USER_DAYS = [ 
       <c:forEach items="${jsonArray}" var="jsonArray"> 


         { 
          id: '${jsonArray.nr}', 
          date: '${jsonArray.req}', 
          title: '${jsonArray.type}', 
          startDate: '${jsonArray.startDate', 
          endDate: '${jsonArray.endDate', 
          allDay: true, 
          className: 'done' 
         } 
       </c:forEach> 
    ]; 
</script> 

我不知道如何从USER_DAYS变量(javascript)中的servlet中访问来自该json的值。如何把json的值放在id,date,title,startDate,endDate中。

我不知道jstl是否在JavaScript标记中工作。我不知道如何打印这些值(无论它们是什么 - 它可以包含很多信息,全部以这种格式)。

我想提一提的是,如果我将javascript变量变成像这样的东西:它工作得很好。但是这些是我手写的值,但是现在我需要它们的动态...而且这些信息必须来自servlet到calendar.jsp。

var USER_DAYS = [ 
     { 
      id: 1, 
      date: '2017-04-05', 
      title: 'CO', 
      start: new Date(2017, 3, 5), 
      end: new Date(2017, 3, 7), 
      allDay: true, 
      className: 'done' 
     }, 

有人可以帮助我吗?

+1

在JavaScript刚刚尝试这一点。不需要任何JSP标签。直接,我们可以将模型属性分配到我们的js变量中。 var USER_DAYS ='$ {jsonArray}'; – Prasath

+0

为什么不在会话中保存's'并打印?它已经是JSON对象的正确字符串表示形式,不需要创建循环并写入破坏的JSON – BackSlash

+0

尝试使用'var USER_DAYS = JSON.parse('$ {jsonArray}');' –

回答

1

你已经拥有了它作为字符串:在会议上,而不是jsonArray

String s = jsonArray.toString(); 

商店s;

session.setAttribute("jsonArray", s); 

而且在servlet打印:

var USER_DAYS = ${jsonArray}; 

我的测试

的Java servlet(样本数据):

enter image description here

bingo.jsp

enter image description here

HTML结果:

enter image description here

渲染结果:

enter image description here

它的工作原理。

+0

你确定这应该起作用吗? –

+0

@AururRahmanMunna为什么不应该呢? – BackSlash

+0

我认为在你将'USER_DAYS'当作json对象之前,你应该首先解析它,不是吗? –

0

,你可以这样写

<script> 
    var DAYS = '${jsonArray}'; 
    if(DAYS.length > 0){ 
    var USER_DAYS = { 
      id: DAYS[0].nr, 
      date: DAYS[0].req, 
      title: DAYS[0].type, 
      startDate: new Date(DAYS[0].startDate), 
      endDate: new Date(DAYS[0].endDate), 
      allDay: true, 
      className: 'done' 
     }; 
    } 
</script> 
0

您可以分析您的jsonString的JavaScript JSON对象。然后你想改变你的json对象的一些对象键,再删除一个额外的键[e.g "Dep":"2017-04-19"],最后想在你的最终json对象中添加两个键值。

allDay: true, 
className: 'done' 

这里是将solution.set数据作为json字符串。

session.setAttribute("jsonArray",jsonArray.toString()); 

在JSP

var USER_DAYS = JSON.parse('${jsonArray}'); 

这将使名为USER_DAYS一个JSON对象。 ,最后修改您的JSON对象,

var USER_DAYS = JSON.parse('[{"endDate":"2017-04-22","req":"2017-04-19","nr":2,"type":"CO","startDate":"2017-04-20","Dep":"2017-04-19"},{"endDate":"2017-04-22","req":"2017-04-20","nr":3,"type":"CM","startDate":"2017-04-20","Dep":"2017-04-19"}]'); 
 

 
console.log('Original JSON = ' +JSON.stringify(USER_DAYS)); 
 

 
USER_DAYS.forEach(function(e) { 
 
    e.id = e.nr; 
 
    delete e.nr; 
 
    e.date = e.req; 
 
    delete e.req; 
 
    e.title=e.type; 
 
    delete e.type; 
 
    e.allDay= true; 
 
    e.className='done'; 
 
    delete e.Dep; 
 
    
 
}); 
 

 
console.log('Modified JSON = '+JSON.stringify(USER_DAYS));

JSFIDDLE