JSP --學習

最近由於項目須要,用到了jsp技術,所以學習下html

1..JSP簡介java

1.1 全稱java server pages,它是一種動態網頁開發技術。web

1.2 基於它開發的web應用能夠跨平臺(Linux/Windows)使用。spring

1.3 使用jsp標籤在HTML網頁中插入java代碼,標籤一般以<%開頭,以%>結束。數據庫

2.JSP結構apache

網絡服務器須要一個容器來處理JSP頁面,該容器負責截獲對JSP頁面的請求。經常使用的容器是Apache系列的Tomcat。json

3.JSP處理流程後端

3.1 客戶端經過瀏覽器向服務器發送一個http請求。--發請求api

3.2 web服務器識別出這是一個對jsp網頁的請求,並將該請求傳遞給jsp容器。--識別xx.jsp文件數組

3.3 jsp容器從磁盤中載入JSP文件,而後將他們轉換成servlet,並將全部的JSP元素轉換成java。 --轉換成xx_servlet.java文件

3.4 jsp容器將servlet編譯成可執行類,並將原始請求傳遞給servlet引擎。--編譯成xx_servlet.class

3.5 WEB服務器調用servlet引擎,載入執行servlet類。-- 容器中執行servlet

3.6 WEB服務器以靜態HTML網頁形式將HTTP response返回到客戶端瀏覽器中。--返回給客戶端

3.7 瀏覽器處理HTTP response中動態產生的HTML文件(相似處理靜態網頁同樣)。

4.JSP生命週期

4.1 JSP編譯

瀏覽器請求JSP頁面時,JSP引擎首先會檢查是否須要編譯這個文件,若是這個文件沒有被編譯過,或是上次編譯後被更改過,則須要編譯這個JSP文件。

編譯過程三個步驟

1>解析JSP文件

2>將JSP文件轉換成servlet

3>編譯servlet

4.2 JSP初始化

容器載入JSP文件後,它會調用jspInit()方法。

通常來講程序只會初始化一次,servlet也是如此。一般狀況下咱們能夠在jspInit()方法中初始化數據庫鏈接、打開文件和建立查詢等。

4.3 JSP執行

這個階段完成了JSP生命週期中全部與請求相關的交互行爲。

當JSP網頁完成初始化後,JSP引擎調用jspService()方法,該方法須要一個httpServletRequest對象和httpServletResponse對象做爲參數,該方法在每一個request中被調用一次並負責產生與之相對應的response,還負責產生http方法的迴應,如get、post等等。

4.4 JSP清理

好比釋放數據庫鏈接或者關閉文件夾等。

5 JSP語法

5.1 jsp是一種腳本語言,語法格式以下:

<% 代碼片斷 %>

5.2 任何文本、HTML標籤、jsp元素都應該寫在腳本程序的外面

以下示例

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html> <head> <title>第一個JSP程序</title> </head> <body> <% out.println("Hello World!"); %> </body> </html>

5.3 JSP聲明

JSP聲明語法格式以下

<% ! 聲明1;聲明2;……%>

程序示例

<%! int i = 0; %> <%! int a,b,c; %> <%! UserInfo userInfo = new UserInfo('lxl','0','29')%>

5.4 JSP表達式

一個JSP表達式中包含的腳本語言表達式,先被轉換成String,再插入到表達式出現的地方。

JSP表達式的語法格式以下

<%= 表達式 %>

程序示例

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html> <head> <title>第一個JSP程序</title> </head> <body> <p> Today's date:<%= (new java.util.Date()).toLocaleString()%> </p> </body> </html>

運行後獲得以下結果

Today's date:2016-3-23 15:46:01

5.5 JSP註釋

JSP註釋語法格式以下

<%!-- JSP註釋 --%>

5.6 JSP指令

JSP指令用來設置與整個JSP頁面相關的屬性。

JSP指令語法格式以下

<%@ 指令 屬性="value" %>

經常使用的三種指令標籤

<%@ page 屬性= ...... %> 定義頁面的依賴屬性,好比頁面的編碼格式 <%@ include 屬性= ...... %> 定義包含其餘文件 <%@ taglib 屬性= ...... %> 定義引入標籤庫

5.7 JSP控制流語句

JSP提供對java語言的全面支持,咱們能夠在JSP程序中使用java api、使用控制語句等。

示例以下

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%-- 該部分註釋在網頁中不會被顯示--%> <%! int day = 3; %>

<!DOCTYPE html>

<html> <head> <title>第一個JSP程序</title> </head> <body> <% if (day == 3) { %> <p> Today is 3</p> <% } else { %> <p> Today is not 3 </p> <% } %> </body> </html>

5.8 JSP運算符

JSP支持全部java邏輯和算術運算符。

6 JSP指令

JSP指令用來設置整個JSP頁面相關的屬性,如網頁編碼格式等。

語法格式以下:

<%@ 指令 屬性="value" %>

指令能夠有多個屬性,它們以鍵值對的形式存在,並用逗號隔開。

jsp三種指令標籤

6.1 page指令

page指令爲容器提供當前頁面的使用說明,一個jsp頁面能夠包含多個page指令。

page指令經常使用屬性

contentType 指定當前JSP頁面的MIME類型和字符編碼

errorPage 指定當JSP頁面發生異常時須要轉向的錯誤處理頁面

import 導入要使用的Java類

info 定義JSP頁面的描述信息

language 定義JSP頁面所用的腳本語言,默認是Java

6.2 include指令

jsp經過include指令來包含其餘文件,被包含的文件能夠是jsp文件、HTML文件、文本文件等。

6.3 taglib指令

jsp api容許用戶自定義標籤。taglib指令能夠引入一個自定義的標籤庫。

7 jsp動做元素

jsp動做元素是在請求處理階段起做用,它是用xml語法寫成的。

7.1 利用jsp動做元素能夠完成以下操做:

1>動態的插入文件

2>重用javaBean組件

3>重定向展現頁面

4>生成html代碼

動做元素語法以下:

<jsp:action_name attribute="value" />

經常使用的動做元素以下

jsp:include 引入文件

jsp:useBean 實例化一個javaBean

jsp:setProperty 設置某個javaBean屬性

jsp:getProperty 輸出某個javaBean屬性

jsp:forward 將請求轉入另外一個新的頁面

jsp:element 定義動態的xml元素

jsp:attribute 設置xml元素屬性

jsp:body 設置xml元素內容

jsp:text 在jsp頁面中寫入文本模板

常見的屬性以下

全部的動做元素都要有兩個屬性:id屬性和scope屬性

id屬性:動做元素的惟一標識

scope屬性:標識動做元素的生命週期

jsp:include示例以下

在工程中定義date.jsp文件,以下

<p> Today's date: <%= (new java.util.Date()).toLocaleString()%></p>

在MyJsp.jsp中調用上述文件,注意date.jsp和MyJsp.jsp文件均放在服務器的根目錄下,在能夠這樣直接引用。

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<body> This is my JSP page. <br>

<jsp:include page="date.jsp" flush="true" />

</body> </html>

運行出的效果以下

8 jsp隱式對象

jsp隱式對象是jsp容器爲每一個頁面提供的java對象,開發者能夠直接使用它(即不須要聲明)。

常見jsp支持的隱式對象

對象 描述

request httpServletRequest類的實例對象

response httpServletResponse類的實例對象

session httpSession類的實例對象

application ServletContext類的實例對象,與應用上下文有關

config ServletConfig類的實例對象

經常使用對象描述

8.1.request對象

它是javax.servlet.http.HttpServletRequest 類的實例,每當客戶端有一次http請求時,web容器會實例化一個request對象來表明這個請求。

request對象提供了一系列方法來獲取http頭部信息。

8.2.response對象

它是javax.servlet.http.HttpServletResponse類的實例,當服務器建立request對象時,同時會產生響應這個客戶端的response對象。

8.3.session對象

它用來跟蹤客戶端請求過來的會話。

8.4.application對象

它是javax.servlet.ServletContext 類的實例,它在jsp頁面初始化時被建立,隨着jspDestroy()方法法的調用被移除。

9 jsp客戶端請求

當瀏覽器請求一個網頁時,它會向服務器發送許多頭部消息,常見的頭部消息以下:

頭部消息 描述

Accept-Charset 指定瀏覽器使用的字符集,例如ISO-8859-1

Accept-Encoding 指定編碼類型

Accept-Language 指定客戶端語言

Authorization 在訪問受密碼保護的網頁時識別不一樣的用戶

Connection 代表客戶端是否能夠處理HTTP持久鏈接。持久鏈接容許客戶端或瀏覽器在一個請求中獲取多個 文件。Keep-Alive 表示啓用持久鏈接

Content-Length 僅適用於POST請求,表示 POST 數據的字節數

Cookie 返回先前發送給瀏覽器的cookies至服務器

Host 指出原始URL中的主機名和端口號

User-Agent 用來區分不一樣瀏覽器或客戶端發送的請求,並對不一樣類型的瀏覽器返回不一樣的內容

10 jsp服務器響應

response響應主要是將jsp容器處理後的結果返回給客戶端,能夠經過response變量設置http的狀態和向客戶端發送數據。

狀態行包含HTTP版本信息(如:HTTP/1.1)、狀態碼(如:200)、狀態碼信息(如:OK)。常見頭部信息以下:

響應頭 描述

Connection 瀏覽器是否要使用持久的HTTP鏈接。close值 命令瀏覽器不使用持久HTTP鏈接,而keep-alive 意味着使用持久化鏈接。

Content-Encoding 指定傳輸時頁面的編碼規則

Content-Language 表述文檔所使用的語言

Content-Length 代表響應的字節數。只有在瀏覽器使用持久化 (keep-alive) HTTP 鏈接時纔有用

Content-Type 代表類容類型,例如:application/json;charset=utf-8

11 JSP表單處理

11.1 讀取表單數據

getParameter() 該方法能夠獲取單個表單參數的值

getParameterValues() 接收數組變量(即名字同樣,值有多個),例如:checkbox類型

getParameterNames() 該方法能夠獲取全部變量的名稱,該方法返回類型是Emumeration

getInputStream() 獲取來自客戶端的二進制數據流

示例以下:

1.MyJsp.jsp文件以下,即 接收文件

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<body> This is my JSP page. <br>

<jsp:include page="date.jsp" flush="true" />

<p>
    one parameter:<%= request.getParameter("one")%>
</p>
<p>
    two parameter:<%= request.getParameter("two")%>
</p>

</body> </html>

2.使用URL的GET方法實例

http://localhost:8080/wxm_cms/MyJsp.jsp?one=lixianl&two=29

3.運行效果以下

4.使用表單的GET方法實例

4.1 首先寫一個html文件,命名爲ceshi.html,類容以下

<html> <body> <form action="MyJsp.jsp" method="GET"> one: <input type="text" name="one"> <br /> two: <input type="text" name="two" /> <input type="submit" value="Submit" /> </form> </body> </html>

4.2 將MyJsp.jsp文件與ceshi.html文件都放在<tomcat安裝目錄>/webapps/ROOT目錄下,個人目錄以下

D:\tomcat7\apache-tomcat-7.0.63\webapps\ROOT

4.3 啓動tomcat

4.4 在瀏覽器輸入

http://localhost:8080/ceshi.html

出現以下頁面

在輸入框裏輸入 lxl 30,點擊submit,出現以下界面,注意查看地址欄參數

5.使用表單的POST方法實例

5.1 只須要修改ceshi.html文件,修改form的提交方式爲POST,文件以下

<html> <body> <form action="MyJsp.jsp" method="POST"> one: <input type="text" name="one"> <br /> two: <input type="text" name="two" /> <input type="submit" value="Submit" /> </form> </body> </html>

5.2 測試方法同 4同樣

6 傳遞checkbox數據到jsp程序

複選框checkbox能夠傳遞一個或多個數據,修改ceshi.html代碼以下

<html> <body> <form action="MyJsp.jsp" method="POST" target="_blank"> <input type="checkbox" name="A" /> A <input type="checkbox" name="B" /> B <input type="checkbox" name="C" /> C <input type="checkbox" name="D" /> D <input type="submit" value="Submit" /> </form> </body> </html>

修改MyJsp.jsp代碼以下

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<body> This is my JSP page. <br>

<jsp:include page="date.jsp" flush="true" />

<p>
    one:<%= request.getParameter("A")%>
</p>
<p>
    two:<%= request.getParameter("B")%>
</p>
<p>
    three:<%= request.getParameter("C")%>
</p>
<p>
    four:<%= request.getParameter("D")%>
</p>

</body> </html>

我點擊B、C兩項,截圖以下

運行結果以下

12 jsp過濾器

jsp過濾器其實是一個java類,它的做用

1.前臺訪問後端時,攔截一些非法的訪問

2.前臺訪問成功,根據權限(或其餘條件)返回給客戶端部分信息

過濾器通常設置在web.xml文件中,而後映射servlet、jsp文件的名字。我作過的項目一個實例

過濾字符編碼格式 utf-8,

若是須要多重過濾,則只須要順序的寫上過濾條件便可。

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

<filter>  
    <filter-name>CharacterEncodingFilter</filter-name>  
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
    <init-param>  
        <param-name>encoding</param-name>  
        <param-value>UTF-8</param-value>  
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>  
</filter>  

<filter-mapping>  
    <filter-name>CharacterEncodingFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>  

<servlet>
    <servlet-name>pets</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>pets</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>     

<context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>pets.root</param-value>
</context-param>

<!-- Log4j 配置 -->
<context-param>
    <param-name>log4jRefreshInterval</param-name>
    <param-value>10000</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

</web-app>

  1. JSP Cookies處理

13.1 Cookies通常用於安全系驗證,服務器一般採用以下方式來識別 再次訪問的客戶端

1>客戶端第一次請求服務器時,服務器返回一系列cookies給客戶端

2>客戶端將返回的cookies信息保存在本地

3>客戶端再次訪問服務器時,須要將cookies信息一塊兒發送給服務器,服務器經過這些cookies信息來識別該客戶端是否是上次訪問的客戶端。

13.2 cookies解析

cookies信息一般設置在http請求的頭部中。

設置cookie通常是三個步驟

1>建立一個cookies對象

Cookie cookie = new Cookie("key","value");

2>設置有效期

cookie.setMaxAge(602424);

3>將cookie添加到http響應頭中

response.addCookie(cookie);

14 jsp 頁面重定向

當咱們須要從一個頁面跳往另一個頁面時,就須要用到jsp的重定向了。

重定向有兩種方法

方法1

使用response.sendRedirect()

示例以下

<%@ page import="java.io.,java.util., javax.servlet.*" %>

<html> <head> <title>test direction</title> </head> <body>

<% //方法1:使用response.sendRedirect();方法 response.sendRedirect("http://www.qq.com/"); %>

</body> </html>

方法2

咱們一般使用setStatus()和setHeader()方法來實現重定向。

<%@ page import="java.io.,java.util., javax.servlet.*" %>

<html> <head> <title>test direction</title> </head> <body>

<!-- <% //方法2:使用response.setStatus()和response.setHeader()方法 String site = new String("http://www.baidu.com"); response.setStatus(response.SC_MOVED_TEMPORARILY); response.setHeader("Location",site); %> -->

<!-- <% //方法2:使用response.setStatus()和response.setHeader()方法 response.setStatus(response.SC_MOVED_TEMPORARILY); response.setHeader("Location","index.jsp"); %> -->

</body> </html>

15 jsp點擊量統計

用途:記錄某個頁面被訪問的次數

實現:能夠利用getAttribute()和setAttribute()方法來實現

實例

<%@ page import="java.util.*" %>

<html> <head> <title>Applcation object in JSP</title> </head> <body>

<% Integer hitCounts = (Integer)Applcation.getAttribute("hit");

if(hitCounts == null || hitCounts == 0)
  {

     out.println("首次訪問");
     hitsCount = 1;
  }else
  {
      out.println("再次訪問");
      hitsCount += 1;
  }

  //設值
  application.setAttribute("hit", hitCounts);

%>

</body> </html>

相關文章
相關標籤/搜索