jsp技術:day1--jsp簡單用法、靜態導入、動態導入、設置errorPage、

jsp簡介:

JSP是Java Server Page的縮寫,它是Servlet的擴展,它的作用是簡化網站的創建和維護。
JSP是HTML代碼與Java代碼的混合體。
JSP文件通常以JSP或JSPX的擴展名。
JSP擁有自己的語法。
JSP形式上像HTML,但本質上是Servlet。
JSP的出現,使得將Web開發中的HTML與業務邏輯代碼有效分離成爲可能。通常JSP只負責生成動態的HTML文檔,而業務邏輯由其他Java組件如JavaBean來實現。JSP可以通過Scriptlet來訪問這些組件。
<% %>

ContentType與pageEncoding的區別

pageEncoding是jsp文件本身的編碼 ,把jsp文件編譯成java的時候給編譯器用的 。
contentType的charset是指服務器發送給客戶端時的內容編碼 ,是瀏覽器解析網頁的時候用的
如果兩個任意設置了其中一個,另一個即會與此保持一致。但,contentType除可以設置charset外,還可以設置MIME類型,如text/html

Tomcat首次訪問JSP的過程:

這裏寫圖片描述

容器按照以下順序處理JSP請求:

1、查找與JSP文件對應的Servlet,如果已經存在,就調用它的服務方法。
2、如果與JSP對應的Servlet不存在,就解析文件系統中的JSP文件,將它翻譯成Servlet源文件,接着把Servlet源文件編譯成Servlet類,然後再去初始化並運行Servlet。
3、 以下是經過翻譯的JSP文件,可見在它的服務方法中存在以下對像
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;

JSP語法:

JSP指令。

<%@   指令名  屬性=“值”%>

JSP聲明。成員變量,或是成員方法.

<%!   …. %>

Java程序片段。不論有多少這樣的代碼塊,都將包含_jspSerivice方法中。

<% … %>

Java表達式。-快速輸出信息. _jspSerivice

底層是採用out.print(age);

<%=%>

JSP隱含對像。

pageContext.request,response,session,confing,application

注意:

1、 <% %>聲明的是局部變量而<%! %>聲明的是全局變量
2、<%@include file="" %>包含導入將要導入的jsp或其他文件採用jsp的方式翻譯後的代碼(html用out.println()封裝,Java代碼直接拷過來)拷入,只生成一個class,一個java。

通過errorPage屬性控制頁面出錯,轉向我們自己定義的錯誤頁面,而不是tomcat做的錯誤頁面

errorPage="jsps/error.jsp"

將錯誤頁面導向jsps/error.jsp
在jsps/error.jsp中我們要設置isErrorPage="true"才能使用exception對象。

用戶登錄成功與失敗

利用servlet控制登錄成功與否,在登錄成功之後,將登錄的姓名設置到session中,轉發到welcome.jsp頁面。失敗則返回登錄界面。
在welcome.jsp頁面中,利用快速輸出從session對象中拿參數,靜態包含兩個jsp文件。一個用來顯示網頁底部的信息:

<h3>©2016 Baidu 使用百度前必讀 意見反饋 京ICP證030173號 <br/>京公網安備11000002000001號</h3>
<a href="#">網站管理員</a>

一個用來防範用戶如果不輸入就提交,導致session和通過request.getParameter("name");拿到的都是空也能登錄成功。
在include.jsp中:

if(session.getAttribute("name")==null){
        response.sendRedirect(request.getContextPath()+"/index.jsp");
    }

在web.xml中配置錯誤頁面和配置session過期

配置session20分鐘過期

<servlet-mapping>之後寫:

  <session-config>
    <session-timeout>20</session-timeout>
  </session-config>

配置錯誤頁面

<servlet-mapping>之後寫:

  <error-page>
    <error-code>500</error-code>
    <location>/jsps/error.jsp</location>
  </error-page> 
  <error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/jsps/error.jsp</location>
  </error-page>

其中的<error-code>500</error-code>是網頁顯示500錯誤就導向錯誤頁面

其中的<exception-type>java.lang.Exception</exception-type>是網頁顯示java.lang.Exception即只要是java的錯誤就導向錯誤頁面

這種通過配置文件配置的優點是:

是開發更加簡單方便

這種通過配置文件配置的缺點是:

造成web.xml文件臃腫

包含:

動態包含:<jsp:forward>

轉發的目標可以是jsp,servlet或html.
注意:之前在轉請求轉發時,在轉發之後的代碼也會被執行,而jsp源組件中<jsp:forward/>在轉發以後的代碼不會被執行。因爲當你在寫了<jsp:forward/>,翻譯以後

if (true) {
        _jspx_page_context.forward("/index.jsp");
        return;
}

<jsp:forward path = url />中的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”/>

前面已經講過<%@include file=..%>指令包含,這種包含屬於靜態包含。
還可以通過<jsp:include page=…/>包含目標頁面,這種包含屬於動態包含。
無論是靜態還是動態,源組件與目標組件都共享請求範圍內的數據。
通過具體示例來看它們的區別:

使用靜態包含:

 <body>
    <%@include file="aa.jsp" %>
    <p>
    這是源頁
    </p>
  </body>

兩個頁面最終只翻譯成了一個Servlet文件。甚至在源組件上定義的變量在目標組件上也可以使用。因爲翻譯它們本身就是一體的。

動態包含:

將上例中的包含修改成運行時將出現一個錯誤。
這是因爲兩個不同的servlet之間無法訪問對方的局部變量。

由此可見:

靜態包含發生成編譯時。
動態包含發生在運行時。
由於靜態包含最終編譯成一個Servlet文件,所以在執行時,它的執行效率要高於動態包含。

本文完整代碼:

index.jsp

<%@ 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>
      <h1>演示jsp技術</h1>
      <%
        String name = "小明";
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        session.setAttribute("name", "小米");

       %>
       <h2>------我是文字分割線1111111111111------</h2>
       <%
            out.print("<br/>name:"+name);
            out.println("<br/>sessionName:"+session.getAttribute("name"));
        %>
        <%!
            //加了“!”號後,就把變量聲明成index_jsp類的成員變量
           String className = "English";
           public int sum(int n){
                int s=0;
                for(int i=1;i<=n;i++){
                    s+=i;
                }
                return s;
           }
         %>
         <h2>------我是文字分割線2222222222222------</h2>
         <%
            out.print("<br/>className:"+className);
            out.print("<br/>sum:"+sum(100));
          %>
        <h2>------從這裏開始導入包含頁------靜態包含:共享一個request和一個response對象和局部變量</h2>
        <!-- 靜態包含是將下面的代碼(採用jsp方式翻譯後的java代碼:
            html:採用out.println()封裝
            java:原樣 )插入到當前_jspService()中對應的位置 -->
        <%@include file="jsps/a.jsp"%>
        <h2>------從這裏結束導入包含頁------</h2>
        <hr/>
        <h2>------演示快速輸出------</h2>
        <%=className %><!-- 底層是將className封裝成了out.println(className); -->
        <br>

        <h1>以下演示登錄後的歡迎界面</h1>
        <h2>登錄界面</h2>
        <form action="ForwardServlet" method="post">
            Name:<input type="text" name="name" /><br/><br/>
            <input type="submit" value="登錄" />
        </form>         

        <br>
        <br>
        <hr/>
        <div>-----------我是傳說中的分割線----------------------------</div>
        <h1>以下演示動態包含</h1>
        <h2>動態包含可以共享request和response,但不能共享局部變量,生成兩個獨立的jsp類</h2>
        <br>
        <jsp:include page="/jsps/b.jsp"></jsp:include>
        <br>
        <br>
        <br>
        <br>


  </body>
</html>

index2.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" errorPage="jsps/error.jsp"%>
<%--這是jsp的註釋--//上面的errorPage屬性的作用,如果本頁面出錯了就轉到 jsps/error.jsp頁面去--%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
     <h1>演示jsp技術中的errorPage,isErrorPage</h1>

     <%
        int a = 100/0;//除數爲0,會導致一個錯誤.由於上面設了errorPage屬性,因此瀏覽器會轉向顯示error.jsp頁面
      %>
  </body>
</html>

index3.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
     <h1>演示jsp技術中的jsp:forward標籤</h1>
     <jsp:forward page="index.jsp"></jsp:forward>
     <h2>因爲上面jsp:forward了,所以這裏不會顯示,頁面已經轉發到其他地方去了</h2>
     <br/>
     <br/>
     <br/>
     <br/>
     <br/>
  </body>
</html>

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>ForwardServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.ForwardServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ForwardServlet</servlet-name>
    <url-pattern>/ForwardServlet</url-pattern>
  </servlet-mapping>
  <!-- 配置session20分鐘過期 -->
  <session-config>
    <session-timeout>20</session-timeout>
  </session-config>
  <!-- 配置錯誤頁面  優點:可以是開發更簡單;缺點:造成web.xml臃腫
  <error-page>
    <error-code>500</error-code>
    <location>/jsps/error.jsp</location>
  </error-page> 
  <error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/jsps/error.jsp</location>
  </error-page>
  -->
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

a.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

 <h1>演示jsp的靜態包含技術</h1>
 <h2>-----我是文字分割線aaaaaaaaaaaaa-------</h2>
 <%
    out.println("<br/>name:"+name);//局部變量,可以訪問到
    out.println("<br/>className:"+className);//全局變量,可以訪問到
    out.println("<br/>sum:"+sum(100));//全局方法,可以訪問到
  %>

b.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>這是被動態導入的頁面</title>

  </head>

  <body>
    <h1>這是被jsp:include(動態導入)的頁面</h1>
    <%
       out.println("傳的發哦聖誕節佛愛的金佛大方几哦啊的較深的發生大佛");
     %>
  </body>
</html>

error.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isErrorPage="true"%>
<%--這是jsp的註釋--//上面的errorPage屬性的作用,如果本頁面出錯了就轉到 jsps/error.jsp頁面去--%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
     <h1>這是我自己想要的errorPage頁面</h1>
     <%
        out.print("<br/>"+exception.getMessage());
      %>
  </body>
</html>

foot.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<h3>©2016 Baidu 使用百度前必讀 意見反饋 京ICP證030173號 <br/>京公網安備11000002000001號</h3>
<a href="#">網站管理員</a>

include.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%
    //所有安全資源都添加這個安全登錄控制
    if(session.getAttribute("name")==null){
        response.sendRedirect(request.getContextPath()+"/index.jsp");
    }
%>

welcome.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <!-- 防範空值即用戶不輸入直接提交 -->
    <%@include file="/jsps/include.jsp" %>
  </head>

  <body>
        <h1>歡迎進入城院</h1>
        <%=session.getAttribute("name") %><br/>
        <%@include file="/jsps/foot.jsp" %>
  </body>
</html>

ForwardServlet

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 ForwardServlet 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.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("utf-8");
        PrintWriter out = response.getWriter();
        String name = request.getParameter("name");
        if (name.startsWith("hncu")) {//假如是hncu開頭就認爲登錄成功,真的登錄要去數據庫中找
            request.getSession().setAttribute("name", name);
            response.sendRedirect(request.getContextPath()+"/jsps/welcome.jsp");
        }else{
            response.sendRedirect(request.getContextPath()+"/index.jsp");

        }
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章