<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>JSP技術演示</title>
</head>
<body>
<h2>這是主頁</h2>
<h3>一個登陸頁面用於演示靜態包含和動態包含--用標籤</h3>
<form action="login" method="post">
姓名:<input type="text" name="name"/><br/>
<input type="submit" value="提交"/>
</form>
<a href="jsps/temp.jsp">演示jsp-forward</a> <br/>
<br/><br/>
<a href="foot">演示訪問安全目錄中的jsp頁面--這種頁面一般通過servlet轉發,這裏省略寫servlet</a> <br/>
<br/><br/><br/>
<%@include file="/jsps/foot.jsp" %>
</body>
</html>
請求轉發:
JSP通過< jsp:forward/>標籤來實現請求轉發。
轉發的目標可以是jsp,servlet或html.
注意:之前在轉請求轉發時,在轉發之後的代碼也會被執行,而jsp源組件中< jsp:forward/>在轉發以後的代碼不會被執行。因爲當你在寫了< jsp:forward/>,翻譯以後源代碼如下:
if (true) {
_jspx_page_context.forward("/index.jsp");
return;
}
中的url即可以以/開頭也可以不以/開頭,以/開頭表示絕對路徑。 如:
helloapp/dir1/source.jsp
helloapp/dir1/dir2/target.jsp
可以通過以下兩種方式從souce.jsp轉到target.jsp
< jsp:forward path=“dir2/target.jsp”/>
< jsp:forward path=“/dir1/dir2/target.jsp”/>
源組件還可以通過< jsp:param/>向目標組件添加額外的參數:
< jsp:forward page=“target.jsp”>
< jsp:param name=“name1” value=“name1”/>
< jsp:param name=“name2” value=“name2”/>
< /jsp:forward>
這裏演示jsp的轉發的目標是servlet
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<jsp:forward page="/temp"></jsp:forward>
package cn.hncu.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TempServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().println("請 先登陸,,,親");
}
}
包含:
前面已經講過< %@include file=..%>指令包含,這種包含屬於靜態包含。
還可以通過< jsp:include page=…/>包含目標頁面,這種包含屬於動態包含。
package cn.hncu.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String name=request.getParameter("name");
if(name!=null&&name.startsWith("hncu")){
System.out.println("LoginServlet-name:"+name);
request.getSession().setAttribute("name", name);
response.sendRedirect(request.getContextPath()+"/jsps/wel.jsp");
}else{
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
}
}
<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>歡迎頁面</title>
<%
/*
//安全登錄防護
if(session.getAttribute("name")==null){
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
*/
int a=100;
int b = 200;
out.println("a="+a);
%>
<!-- 用inclue指令(編譯指令)導入安全登錄防護代碼(靜態包含) -->
<!-- 靜態包含:把被包含代碼拷到當前類中形成一個新的類,執行。包含與被包含代碼是合寫在同一個類(service方法)中,其中的變量是完全共享的 -->
<%@include file="a.jsp" %>
<!-- 動態包含:用jsp:incluce標籤(操作指令)來實現,,被包含的代碼會生成一個獨立的類。包含與被包含代碼是兩個不同的類,只共享request -->
<jsp:include page="b.jsp"></jsp:include>
</head>
<body>
<h2>登陸成功頁面</h2>
<%@include file="foot.jsp" %>
</body>
</html>
這是登陸成功頁面
這是登陸失敗頁面
無論是靜態還是動態,源組件與目標組件都共享請求範圍內的數據。
通過具體示例來看它們的區別:
靜態包含:
1、使用靜態包含:
< body>
<%@include file=”aa.jsp” %>
< p>
這是源頁
< /p>
< /body>
2、兩個頁面最終只翻譯成了一個Servlet文件。甚至在源組件上定義的變量在目標組件上也可以使用。因爲翻譯它們本身就是一體的。
<%@ page language="java" import="java.util.*,java.awt.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
System.out.println(a);//因爲是靜態包含,變量是共享的,所以可以讀到包含頁的信息
//安全登錄防護
if(session.getAttribute("name")==null){
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
%>
動態包含:
1.將上例中的包含修改成< jsp:include page=“aa.jsp”/>運行時將出現一個錯誤。
2.這是因爲兩個不同的servlet之間無法訪問對方的局部變量。
<%@ page language="java" import="java.util.*,java.awt.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
//System.out.println(b);//因爲是動態包含,變量不共享,所以讀不到包含頁的信息
//安全登錄防護
if(session.getAttribute("name")==null){
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
%>
由此可見:
靜態包含發生成編譯時。
動態包含發生在運行時。
由於靜態包含最終編譯成一個Servlet文件,所以在執行時,它的執行效率要高於動態包含。
將JSP部署到web.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>cn.hncu.servlet.LoginServlet</servlet-class>
</servlet>
<!-- 配置安全目錄當中的東西,可以被外界使用-->
<servlet>
<servlet-name>foot</servlet-name>
<jsp-file>/WEB-INF/jsps/foot.jsp</jsp-file>
</servlet>
<servlet>
<servlet-name>TempServlet</servlet-name>
<servlet-class>cn.hncu.servlet.TempServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>foot</servlet-name>
<url-pattern>/foot</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>TempServlet</servlet-name>
<url-pattern>/temp</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
注意:WEB-INF中的資源是受保護的資源,這是JavaEE的規範,任何外部的程序都不能直接訪問此目錄中的任何資源。如果要向外公佈WEB-INF中的資源則必須在web.xml中配置。
安全目錄的jsp
<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<h1>安全目錄中的JSP頁面</h1>
<font color="red" size="4">安全目錄當中所有東西必須要配置路徑才能訪問,包括圖片</font><br/>
<img src="<%=request.getContextPath()%>/jsps/foot.jpg"></img>
非安全目錄的jsp頁面(不需要配置web.xml)
<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<h1>不是安全目錄中的JSP頁面</h1>
<img src="<%=request.getContextPath()%>/jsps/foot.jpg"></img>