JSP中sendredirect失效问题与JSP中(动态include动作与静态include指令)关系
通常当应用程序中所有的页面的某些部分(例如标题、页脚和导航栏)都相同的时候,我们就可以考虑用include.具体在哪些时候
<%@ include file=" "%>,哪些时候用<jsp:include page=" " flush="true"/>.这种形式.首先要明白的是它们之间的区别.
简单来说:
动态include即<jsp:include page=" " flush="true"/>
这个过程是将你包含进来的jsp页面和原来的jsp页面在服务器端编译成多个class文件和servlet应用,所以在客户端解析这些文
件时是将这两个文件依此解析呈现出来,所以他们之间的request对象是不同的
例子:
a.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head>
<jsp:include page="b.jsp" flush="true"/>
<body> <h5>${info}</h5> <div id="d1"> <form id="courseInfoList" action="${pageContext.request.contextPath}/courses" method="post"> 课程名: <input type="text" name="courseName" /> <br> 开始日期: <input type="date" name="beginDate" /> <br> 结束日期: <input type="date" name="endDate" /> <br> 年级: <input type="text" name="grade" /> <br> 请输入课程节数:<input type="number" id="row" max="20" min="1" required="required" title="列数范围1-20"> <input type="submit" value="创建该课程信息表格" onclick="return create(row,d1);"> <br> </form> </div> </body> </html>
b.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ page import = "com.yyc.entity.*"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% User user=(User)session.getAttribute("user"); if(user!=null){%> <h5>导航栏 用户名:${user.username } <c:if test="${user.status==0}">状态:学生 年级:${user.grade }</c:if> <c:if test="${user.status==1}">状态:老师</c:if></h5> <a href = "${pageContext.servletContext.contextPath}/users/${user.userId}" >编辑用户信息</a> <a href = "${pageContext.servletContext.contextPath}/users/${user.userId}/courses" >我的课程</a> <a href = "${pageContext.servletContext.contextPath}/signIn" >退出登录</a> <c:if test="${user.status==1}"><a href = "${pageContext.servletContext.contextPath}/courses" >创建课程</a></c:if> <%}else{ response.sendRedirect(request.getContextPath()+"/signIn.jsp"); return; }%> </body> </html>
如果在a.jsp中使用<jsp:include page=" " flush="true"/>是达不到sendredirect时重定向的效果的,因为这是两个jsp页面编译成的两个servlet应用,代码内容都在服务器端执行结束,所以两个jsp编译成的servlet应用之间的变量相互不会影响,没有任何关系,只是在客户端加载为同一个页面。
静态include即<%@ include file=" "%>
这个过程是将你包含进来的jsp页面和原来的jsp页面在服务器端编译成一个class文件和servlet应用,所以在客户端解析这些文
件时是将这个文件直接解析呈现出来,所以这两个页面之间的request对象是同一个request对象
例子:a.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head>
<%@ include file="b.jsp"%>
<body> <h5>${info}</h5> <div id="d1"> <form id="courseInfoList" action="${pageContext.request.contextPath}/courses" method="post"> 课程名: <input type="text" name="courseName" /> <br> 开始日期: <input type="date" name="beginDate" /> <br> 结束日期: <input type="date" name="endDate" /> <br> 年级: <input type="text" name="grade" /> <br> 请输入课程节数:<input type="number" id="row" max="20" min="1" required="required" title="列数范围1-20"> <input type="submit" value="创建该课程信息表格" onclick="return create(row,d1);"> <br> </form> </div> </body> </html>
b.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ page import = "com.yyc.entity.*"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% User user=(User)session.getAttribute("user"); if(user!=null){%> <h5>导航栏 用户名:${user.username } <c:if test="${user.status==0}">状态:学生 年级:${user.grade }</c:if> <c:if test="${user.status==1}">状态:老师</c:if></h5> <a href = "${pageContext.servletContext.contextPath}/users/${user.userId}" >编辑用户信息</a> <a href = "${pageContext.servletContext.contextPath}/users/${user.userId}/courses" >我的课程</a> <a href = "${pageContext.servletContext.contextPath}/signIn" >退出登录</a> <c:if test="${user.status==1}"><a href = "${pageContext.servletContext.contextPath}/courses" >创建课程</a></c:if> <%}else{ response.sendRedirect(request.getContextPath()+"/signIn.jsp"); return; }%> </body> </html>如果在a.jsp中使用<@include file = "">是就可以达到sendredirect时重定向的效果的,因为这是两个jsp页面编译成的一个servlet应用,所以只有一个request对象,则在b.jsp判断完成之后如果user为空,则直接重定向到登陆界面,如果两个jsp页面中的java代码有相同名字的变量时,会出现多重定义局部变量的错误(duplicate local variable)