java--jsp(Java Server Page)_2

這裏寫圖片描述

<%@ 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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章