最近由於項目須要,用到了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>
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>