第一次写博客 记录一下学习中遇到的问题
首先说明一下项目的要求:点击一个按钮,发送一个restful风格url请求
然后在数据库中查询出相应的数据,用Map<String , String>的List泛型集合保存,将该集合保存在请求域中,名为info
显示数据的页面中,<script>标签内定义一个var,它的值就是${info}
然后,转发到显示数据的页面,用EL表达式或者java小脚本显示出上面保存的数据
我的RequestMapping是这样的:
@RequestMapping("main/version/modify/{id}")
之后,我根据url带的参数,查询出了数据集合,如下所示:
List<Map<String, String>> list = versionService.queryVersion(id);
接下来,我就执行新建了一个ModelAndView对象,用它的addObject方法保存了这个集合
当然,这边在参数的括号内写上HttpServletRequest对象,用reqeust保存也是可以的
request.setAttribute("info", list);
jsp页面中<script>标签内的var如下所示
var arr = ${info};
最后,转发到显示数据的页面,然而什么数据都没有显示
于是查看了一下js文件中保存的arr到底长啥样,然后发现问题了
var arr = [
{
apkFileName=sb-1.0.apk,
softwareName=sb,
modifyDate=2019-11-11,
valueName=预发布,
downloads=1,
appId=3,
versionNo=1.0,
versionSize=233.00
},
{
apkFileName=sb-2.0.apk,
softwareName=sb,
modifyDate=2019-11-21,
valueName=预发布,
downloads=1,
appId=3,
versionNo=2.0,
versionSize=123.00
}
];
没有错,虽然我的List泛型集合存储的全部是Map<String , String>,但是,在js文件读取这些数据的时候,显然没有把这些数据识别为字符串,证据就是这些数值连双引号都没有
而且浏览器中也提示了Uncaught SyntaxError: Unexpected number异常
这说明js文件把这些数据都识别为数字了
那么为什么会这样呢,这是因为直接把java里的集合、实体类等放到各种域里,然后让js读取,是没法直接读取的,要把这些数据转为json格式
一般来说,如果我们使用ajax请求,在拦截器的方法上加上@ResponseBody注解,同时我们还导入了处理json的jar包的话,就会自动转换,而在上面的这种情况下,我们并没有将List集合转成json格式,就直接将其保存在请求域中让js读取,自然是会出问题的
所以这边我们需要手动将List集合转为json格式,然后再将其保存在请求域中让js读取
但是…用循环来做的话实在是太繁琐,所以我们可以用jackson.jar内置的对象来处理
如果是Maven项目,导入jackson的pom.xml如下配置
<!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-core-asl -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
之后,我们在拦截请求的方法中新建一个ObjectMapper对象,它是jackson提供的一个对象,用这个对象下的writeValueAsString(Object obj)方法,就可以将List集合转为一个json格式的字符串啦
代码如下:
@RequestMapping("main/version/modify/{id}")
public String goToModifyVersion(@PathVariable String id , HttpServletRequest request){
List<Map<String, String>> list = versionService.queryVersion(id);
//新建ObjectMapper对象
ObjectMapper mapper = new ObjectMapper();
String date = null;
try {
//调用writeValueAsString()方法
date = mapper.writeValueAsString(list);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
request.setAttribute("info", date);
return "forward:/page/developer/versionmodify.jsp";
}
这样子就搞定啦~
而且,js文件中保存的arr也变成下面这样
var arr = [
{
"apkFileName":
"sb-1.0.apk",
"softwareName":"sb",
"modifyDate":"2019-11-11",
"valueName":"预发布",
"downloads":1,
"appId":3,
"versionNo":"1.0",
"versionSize":233.00
},
{
"apkFileName":
"sb-2.0.apk",
"softwareName":"sb",
"modifyDate":"2019-11-21",
"valueName":"预发布",
"downloads":1,
"appId":3,
"versionNo":"2.0",
"versionSize":123.00
}
];