【springmvc向jsp返回List,不同jsp进行遍历,不使用ajax请求和使用ajax请求的对比的若干问题的分析】

Mapper和Service/数据库等省略,请自行脑补

Controller: 使用同一个Controller做实验,只是页面的跳转不一样,返回的还是List

---------------------------------------------------------------------------------------------------------

第一种情况:不使用ajax请求,发起请求和接收返回数据的页面是同一个页面

(1)发起请求的jsp: system目录下的role.jsp

<a href="${pageContext.request.contextPath}/system/role/findRoleList">获取角色列表</a>

(2)Controller:RoleController.java

	// 获取角色列表
	@RequestMapping(value="/findRoleList", method=RequestMethod.GET)
	public ModelAndView findRoleList() {
		ModelAndView mv = new ModelAndView();
		
		List<TbRole> roleList = roleService.findRoleList();
		mv.addObject("roleList", roleList);
		
		mv.setViewName("system/role");
		return mv;
	}

(3)接收数据的jsp: system目录下的role.jsp

        <c:if test="${roleList == null }">
			<h3>很遗憾,没有查询到任何结果!</h3>
		</c:if>
		<c:if test="${roleList != null }">
			<table border="1px;" cellpadding="10px;" cellspacing="10px;">
				<tr>
					<td>角色id</td>
					<td>角色名称</td>
					<td>全部权限</td>
					<td>权限描述</td>
				</tr>
			<c:forEach items="${roleList }" var="role">
				<tr>
					<td>${role.roleid }</td>
					<td>${role.rolename }</td>
					<td>${role.authids }</td>
					<td>${role.description }</td>
				</tr>
			</c:forEach>
			</table>
		</c:if>

(4)效果图 and 结论:

  请求之前:

  

  请求之后:

  

  结论一:

  不使用ajax请求,发起请求和接收数据的页面是同一个jsp页面,能正常接收List集合,并且遍历,同时,页面呈现出刷新的现象,URL不变

 

第二种情况:不使用ajax请求,发起请求和接收返回数据的页面不是同一个页面

(1)发起请求的jsp:system下的role.jsp

<a href="${pageContext.request.contextPath}/system/role/findRoleList">获取角色列表</a>

(2)Controller:RoleController.java

	// 获取角色列表
	@RequestMapping(value="/findRoleList", method=RequestMethod.GET)
	public ModelAndView findRoleList() {
		ModelAndView mv = new ModelAndView();
		
		List<TbRole> roleList = roleService.findRoleList();
		mv.addObject("roleList", roleList);
		
		mv.setViewName("system/menu");
		return mv;
	}

(3)接收数据的jsp:system目录下的menu.jsp

   在menu.jsp页面同样的遍历这个List集合,代码一样

(4)效果图 and 结论:

  请求之前:

   

  请求之后: 

  

  结论二:

  不使用ajax请求,发起请求和接收返回数据的页面不是同一个页面,可以正常接收List集合,并且遍历,页面也同样呈现出刷新的现象,但是请求的超链接

不见了,原因是请求页面和接收数据的页面不是同一个页面,URL不变。

  

第三种情况:使用ajax请求,发起请求和接收返回数据的页面是同一个页面

(1)发起请求的jsp:system目录下的role.jsp

<a href="javascript:void(0);" onclick="findRoleListByAjax();">获取角色列表</a>
<script type="text/javascript">
	function findRoleListByAjax() {
		$.ajax({
			type: "GET",
			url: "${pageContext.request.contextPath}/system/role/findRoleList",
			cache: false,
			success: function(data) {
				alert("成功!");
			}, 
			error: function(data) {
				alert("失败!");
			}
		});
	} 
</script>

(2)Controller:

	// 获取角色列表
	@RequestMapping(value="/findRoleList", method=RequestMethod.GET)
	public ModelAndView findRoleList() {
		ModelAndView mv = new ModelAndView();
		
		List<TbRole> roleList = roleService.findRoleList();
		mv.addObject("roleList", roleList);
		
		mv.setViewName("system/role");
		return mv;
	}

(3)接收数据的jsp:role.jsp

  一样的遍历List集合

(4)效果图 and 结论:

  请求之前:

   

  请求之后:

  

  点击“确定”之后:页面显示没有查询结果!

  

  F12查看:

  

  

  结论三:

  使用ajax请求,发起请求和接收返回数据的页面是同一个页面,请求成功!但是页面没有获取到数据,后台已经正确返回了List集合,

查看请求和响应头,发现请求和响应都成功了!而且浏览器的preview中也可以看到页面遍历的List列表,但是页面就是不显示出来!同时,页面不再呈现

刷新的现象,URL不变。

  这个问题的解决方法:

   这个问题原因是使用ajax请求,返回的数据只能由ajax接收,而jsp页面不能解析,所以解决方法:

  后台返回json数据,json数据可以使用js来解析,动态拼接表单:

修改Controller:

	// 获取角色列表
	@RequestMapping(value="/findRoleList", method=RequestMethod.GET)
	@ResponseBody
	public List<TbRole> findRoleList() {
		List<TbRole> roleList = roleService.findRoleList();
		return roleList;
	}

定义一个js脚本:

<script type="text/javascript" src="${pageContext.request.contextPath}/ui/myJs/role.js"></script>
function findRoleListByAjax() {
	$.ajax({
		type : "GET",
		url : "system/role/findRoleList",
		cache : false,
		success : function(data) {
			var roleList = data;
			var roleTableStr = "";
			if (roleList == null || roleList.length <= 0) {
				roleTableStr += "<h3>很遗憾,没有查询到任何结果!</h3>";
				return false;
			}
			roleTableStr += '<table class="table table-striped">';
			roleTableStr += '<thead><tr><td style="font-weight: bold;">序号</td><td style="font-weight: bold;">权限编号</td><td style="font-weight: bold;">权限名称</td><td style="font-weight: bold;">所有权限</td><td style="font-weight: bold;">权限描述</td></tr></thead>';
			$.each(roleList, function(i) {
				roleTableStr += '<tr><td>'+(i+1)+'</td><td>'+roleList[i].roleid+'</td><td>'+roleList[i].rolename+'</td><td>'+roleList[i].authids+'</td><td>'+roleList[i].description+'</td></tr>';
			});
			roleTableStr += '</table>';
			$("#roleListDiv").html(roleTableStr);
		},
		error : function() {
			alert("请求或响应失败!");
		}
	});
}

role.jsp:

	<div id="page-wrapper">
		<a href="javascript:void(0);" onclick="findRoleListByAjax();">获取角色列表</a>
		<hr>
		<div id="roleListDiv"/>
	</div>

效果图:

  

这里顺便把删除的功能也实现了:

role.js:

// 全局roleList变量,方便不同方法调用
var roleList = [];

// 获取角色列表
function findRoleListByAjax() {
	$.ajax({
		type : "GET",
		url : "system/role/findRoleList",
		cache : false,
		success : function(data) {
			roleList = data;
			listRole();
		},
		error : function() {
			alert("请求或响应失败!");
		}
	});
}

// 根据角色id删除角色
function deleteRoleById(roleId) {
	$.ajax({
		type: "GET",
		url: "system/role/deleteRoleById",
		cache: false,
		data: {"roleId": roleId},
		dataType: "json",
		success: function(data) {
			roleList = data;
			listRole();
		},
		error: function(data) {
			if (data == null) {
				alert("删除失败!");
			}
		}
	});
}

// 角色列表, 共用的方法
function listRole() {
	var roleTableStr = "";
	if (roleList == null || roleList.length <= 0) {
		roleTableStr += "<h3>很遗憾,没有查询到任何结果!</h3>";
		return false;
	}
	roleTableStr += '<table class="table table-striped">';
	roleTableStr += '<thead><tr><td style="font-weight: bold;">序号</td><td style="font-weight: bold;">角色编号</td><td style="font-weight: bold;">角色名称</td><td style="font-weight: bold;">所有角色</td><td style="font-weight: bold;">角色描述</td><td style="font-weight: bold;">操作</td></tr></thead>';
	$.each(roleList, function(i) {
		roleTableStr += '<tr><td>'+(i+1)
				+'</td><td>'+roleList[i].roleid
				+'</td><td>'+roleList[i].rolename
				+'</td><td>'+roleList[i].authids
				+'</td><td>'+roleList[i].description
				+'</td><td><a href="#">编辑</a> | <a href="javascript:void(0);" onclick="deleteRoleById('+roleList[i].roleid+');">删除</a>'
			+'</td></tr>';
	});
	roleTableStr += '</table>';
	$("#roleListDiv").html(roleTableStr);
}

Controller:

	// 删除角色
	@RequestMapping(value="/deleteRoleById", method=RequestMethod.GET)
	@ResponseBody
	public List<TbRole> deleteRoleById(@RequestParam("roleId") Integer roleId) {
		int count = roleService.deleteRoleById(roleId);
		if (count == 1) {
			List<TbRole> roleList = roleService.findRoleList();
			return roleList;
		} 
		return null;
	}

这样的效果:

在页面点击删除超链接,URL不变,页面不会刷新,但是记录已经删除了,给用户带来良好的体验。 

 

第四种情况:使用ajax请求,发起请求和接收返回数据的页面不是同一个页面

这种方式没有讨论的意义,因为不同页面肯定会导致页面跳转,而ajax请求时页面无刷新或是在本页面上的局部刷新,所以这是一个自相矛盾的问题。 

 

posted @ 2017-06-30 09:43  半生戎马,共话桑麻、  阅读(451)  评论(0)    收藏  举报
levels of contents