使用JSP模板文件加载页面数据

进行页面展示时,通过有两种方式:

一种为传统的action,从action中查找数据再传到JSP页面上用JSTL进行展示;

第二种使用ajax从action中获取数据,再到页面上用JS拼接HTML或者在后台拼接完成了通过ajax返回到前台。

两种方法的缺点都比较明显:

第一种不适合于局部刷新,更也不适合于频繁刷新,也就是ajax的优点。

第二种可以局部刷新,但是需要拼接HTML,无论在后台还是在js中拼接HTML都比较麻烦。

所以呢,可以将以上两行方法结合起来使用:

直接调转到页面,通过ajax加载数据,将action中返回的数据传递到另一个模板JSP文件中进行加载,加载完成的数据会自动返回到ajax的回调函数中。

1、展示页面(index.jsp):也就是直接请求的页面,在这个页面上显示数据。页面结构很简单,就一个div用来包装数据。

<body style="overflow:auto;">
	<h2>使用JSP模板文件加载页面数据</h2>
	<div id="tableDiv"></div>
</body>

 然后添加一个ajax方式用来请求数据:

$(function(){
	$.ajax({
		type:"post",
		async:false, 
		data:{"time":new Date().getTime()},
		dataType:"html",
		url:"tools!loadData.action",
		error:function(XMLHttpRequest, textStatus, errorThrown) {
			 //alert(XMLHttpRequest.status);
			 //alert(XMLHttpRequest.readyState);
			 //alert(textStatus);
			 alert("加载错误,错误原因:\n"+errorThrown);
		},
		success:function(data){
			//alert(data);
			var data2 = data.toString();
			if((data2+"").indexOf("fail")>-1){//说明是错误信息
				data2 = data2.replace("fail","");
			}else{
				$("#tableDiv").html(data);
			}
		}
   });
});

 这里有个注意点:就是ajax的dataType类型必须为html,写成text或者json或者xml都会报错。

2、模板页面(template.jsp):数据加载的页面,加载完成后将数据返回到index.jsp。页面结构可以随便定义。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<table cellspacing="0" cellpadding="0" border="0" width="100%" align="center" id="infoTable">
	<tr class="firstTr">
		<td>序号</td>
		<td>内容1</td>
		<td>内容2</td>
		<td>内容3</td>
		<td>内容4</td>
	</tr>    
    <c:forEach items="${table1List }" var="table1" varStatus="order">
    	<tr>
    		<td>${order.index+1}</td>
    		<td>${table1.field1 }</td>
    		<td>${table1.field2 }</td>
    		<td>${table1.field3 }</td>
    		<td>${table1.field4 }</td>
    	</tr>
    </c:forEach>
</table>

注意点: 页面中除了添加需要的page、tablib等指令,其他的都不要添加,连HTML的基本标签如html、body等都不需要添加了,要是添加了就等于在index.jsp的tableDiv中添加了一个信息页面。

3、action主要代码:

List<Table1> table1List = t1dao.findAll();
if(table1List!=null && table1List.size()>0){
	request.setAttribute("table1List", table1List);
	request.getRequestDispatcher("/template.jsp").forward(request, response);
}

关键代码是这句: request.getRequestDispatcher("/template.jsp").forward(request, response);

这句大家都很熟悉,就是页面跳转,没错就是让跳转到模板jsp页面中让它加载数据。

当然对于ajax,大家都知道一定会有一句response.getWriter().write(result);用来告知结果。在这种跳转的情况下result中的值也会被带到页面上,但是回调函数success方法返回的结果中却没有它。通过firebug的网络模式看到的“响应”结果却只有这个result还没有页面数据,这究竟是为啥我就不琢磨了。

至此,使用jsp模板文件加载数据的流程就完成了。用过之后会觉得ajax原来还有这么个怪脾气,JSP原来这么强大的!

相关推荐