JSP中sendredirect失效问题与JSP中(动态include标签与静态include指令)关系

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)


猜你喜欢

转载自blog.csdn.net/qq_34608620/article/details/80639414