全名爲Java Server Pages,其根本是一個簡化的Servlet設計,實現了在Java當中使用HTML標籤。JSP是一種動態網頁技術標準,也是JavaEE的標準,JSP與Servlet同樣,是在服務器端執行的。
軟件開發三大方向:php
JDK , Tomcat, IDE
推薦:JDK1.7,Tomcat7.0,MyEclipse10
目錄 | 說明 |
---|---|
/bin | 存放各類平臺下用於啓動和中止Tomcat的命令文件 |
/conf | 存放Tomcat服務器的各類配置文件 |
/lib | 存放Tomcat服務器所需的各類JAR文件 |
/logs | 存放Tomcat的日誌文件 |
/temp | Tomcat運行時用於存放臨時文件 |
/webapps | 當發佈Web應用時 |
/work | Tomcat把由JSP生成的Servlet放於此目錄下 |
修改 Tomcat的conf/server.xml的:html
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
修改Port就能成功修改Tomcat的默認端口java
JSP 適合分佈式的,Hadoop
頁面元素組成:web
指令 | 說明 |
---|---|
page | 一般位於JSP頁面的頂端,同一個頁面能夠有多個page指令 |
include | 將一個外部文件嵌入到當前JSP文件中,同時解析這個頁面中的JSP語句 |
taglib | 使用標籤庫定義新的自定義標籤,在JSP頁面中啓用定製行爲 |
語法:數據庫
<%@ page 屬性1="屬性值" 屬性2="屬性值1,屬性值2"... 屬性n="屬性值n" %>
屬性 | 描述 | 默認值 |
---|---|---|
language | 指定JSP頁面使用的腳本語言 | Java |
import | 經過該屬性來引用腳本語言中使用到的類文件 | 無 |
contentType | 用來指定JSP頁面所採用的編碼方式 | text/html,ISO-8859-1 |
HTML 註釋express
<!-- HTML 的註釋 --> //客戶端可見,審查元素時
JSP的註釋:數組
<%-- JSP 的註釋 -- %> //客戶端不可見
JSP 腳本註釋:客戶端不可見瀏覽器
// 單行註釋 /* 多行註釋 */
語法:緩存
<% Java代碼 %>
在JSP中定義變量或者方法
語法:tomcat
<%! Java代碼%>
例子:
<%! String s = "張三"; //聲明瞭一個字符串 int add(int x, int y){ //聲明瞭一個函數,返回兩個整數的求和 return x+y } %>
JSP中執行的表達式
<%= 表達式%> // 注意表達式不以分號結束
JSP內置對象是web容器建立的一組對象,不用new關鍵字就可使用的內置對象
<% int[] value = {60,70,80} for(int i:value){ out.println(i) } %>
JSP內置對象:
JspWriter類的實例,向客戶端(瀏覽器)輸出內容經常使用的對象
經常使用方法以下:
客戶端的請求信息被封裝在Request對象中,經過它才能瞭解到客戶的需求,而後作出響應。它是HttpServletRequest類的實例。request對象具備請求域,即完成客戶端的請求以前,該對象一直有效。
<form name=「regForm」 action = 「動做」 method=「提交方式」></from>
get:以明文的方式經過URL提交數據,數據在URL中能夠看到。提交的數據量最多不超過2KB。安全性較低但效率比post方式高。適合提交數據量不大,安全性不高的數據。好比:搜索、查詢等功能。
例如結果以下:
http://localhost:8080/ServletDemo/dologin.jsp?username=12&password=12
post:將用戶提交的信息封裝在HTML HEADER內。適合提交數據量大,安全性高的用戶信息。好比:註冊,修改,上傳等功能
<h1>request 內置對象</h1> <% request.setCharacterEncoding("utf-8"); %> 用戶名:<%=request.getParameter("username")%><br> 愛好:<% String[] favorites = request.getParameterValues("favorite"); for (int i = 0; i < favorites.length; i++) { out.println(favorites[i]+"  "); } %>
request.setCharacterEncoding("utf-8」);
避免中文在客戶端顯示亂碼
經過URL提交表單,若是是中文可能還會亂碼
解決方法:配置Tomcat
tomcat的conf目錄下的 server.xml
<connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="88433" URIEncoding="utf-8" />
須要重啓Tomcat生效
如咱們在解析request時候,能夠設置默認項(密碼):
request.setAttribute("password", "123456");
而後讀取這個值
密碼:<%=request.getAttribute("password")%>
包含了響應客戶端請求的有關信息,可是在JSP中不多使用到它。它是HttpServletResponse類的實例。response對象具備頁面做用域,即訪問一個頁面時,該頁面的response對象只能對此次訪問有效,其餘頁面的response對象對當前頁面無效
區別:
- out和response.getWriter的類不同,一個是JspWriter,另外一個是java.io.PrintWriter。
- 執行原理不一樣:JspWriter至關於一個帶緩存功能的printWriter,它不是直接將數據輸出到頁面,而是將數據刷新到response的緩衝區後再輸出,response.getWriter直接輸出數據(response.print()),因此(out.print)只能在其後輸出。 (若是想要out對象強制在前輸出,能夠out以後使用flush()方法)
- out爲jsp的內置對象,刷新jsp頁面,自動初始化得到out對象,因此使用out對象是須要刷新頁面的,而response.getWriter()響應信息經過out對象輸出到網頁上,當響應結束時它自動被關閉,與jsp頁面無關,無需刷新頁面。「形象的比喻:當咱們調用response.getWriter()這個對象同時得到了網頁的畫筆,這時你就能夠經過這個畫筆在網頁上畫任何你想要顯示的東西。」
- out的print()方法和println()方法在緩衝區溢出而且沒有自動刷新時候會產生ioexception,而response.getWrite()方法的print和println中都是抑制ioexception異常的,不會有ioexception 。
請求轉發與請求重定向的區別:
- 請求重定向:客戶端行爲,response.sendRedirect(),從本質上講等同於兩次請求,前一次的請求對象不會保存,地址欄的URL地址會改變
- 請求轉發:服務器行爲,request.getRequestDispatcher().forward(req,resp);是一次請求,轉發後請求對象會保存,地址欄的URL地址不會改變
例子:辦理護照
重定向:你先去了A局,A局的人說:「這事不歸咱們管,去B局」,而後你從A退了出來,乘車去了B局
轉發:你去了A局,A局看了之後,知道這個事情應該B局管,沒有退出來,讓你坐了一會,本身倒了後面辦公室聯繫了B的人,讓他們辦好後,送了過來。
在服務器的內存中保存着不一樣用戶的session,每個用戶一個session。
若是沒有對象綁定在該名稱,返回Null
當客戶端第一次訪問某個JSP或者servlet時候,服務器會爲當前會話建立一個sessionId,每次客戶端向服務器發送請求時,都會將此SessionId攜帶過去,服務端會對此SessionId進行校驗
注意事項:注意原有會話還存在,只是這個舊的sessionId仍存在服務端,只是再也沒有客戶端會攜帶它而後交於服務端校驗
session的銷燬方式只有三種:
設置超時時間兩種方式:
<session-config> <session-timeout> 10 //分鐘 </session-timeout> </session-config>
指當前JSP頁面自己,有點像類中的this指針,它是Java.long.Object類的實例
經常使用方法(Object類的方法):
經常使用方法:
異常對象,當一個頁面在運行過程當中發生了異常,就產生這個對象。若是一個JSP頁面要應用此對象,就必須把isErrorPage設置爲true,不然沒法編譯。它其實是java.lang.Throwable的對象
經常使用方法:
須要處理異常的頁面,頁面頭要加上errorPage
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="exception.jsp" %>
Exception頁面要在page中填寫isErrorPage
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
在Servlet初始化時,JSP引擎向它傳遞信息用的,此信息包括Servlet初始化時所要用到的參數(經過屬性名和屬性值構成)以及服務器的有關信息(經過傳遞一個ServletContext對象)
經常使用方法以下:
就是符合某種特定的規範的Java類。使用Javabeans的好處是解決代碼重複編寫,減小代碼冗餘,功能區分明確,提升了代碼的維護性。
Javabean 設計原則舉例
//設計學生類 public class Students // 公有類 { private String name; //屬性私有 private int age; //屬性私有 public Students() //無參的公有構造方法 {} // getter 和 setter 方法 public void setName(String name){this.name =name;} public String getName(){return this.name} public void setAge(int age){this.age = age;} public int getAge(){return this.age;} }
JSP動做元素(acion elements)爲請求處理階段提供信息。動做元素遵循XML元素的語法,有一個包含元素名的開始標籤,能夠有屬性、可選內容、與開始標籤匹配的結束標籤。
<body> <% Users user = new Users(); user.setUsername("admin");//設置用戶名 user.setPassword("123456"); //設置密碼 %> <h1>使用普通方式建立javabean實例</h1> <hr> 用戶名:<%=user.getUsername()%><br> 密碼:<%=user.getPassword()%><br> </body>
useBeans動做 setProperty動做 getProperty動做
<jsp:useBeans>
做用:在jsp頁面中實例化或者在指定範圍內使用javabean:
<jsp:useBean id="標識符" class="java類名(包括包名.類名)" scope="做用範圍"/>
<jsp:useBean id="myUsers" class="com.po.Users" scope="page"/> <h1>使用useBean動做建立javabean實例</h1> <hr> 用戶名:<%=myUsers.getUsername()%><br> 密碼:<%=myUsers.getPassword()%><br>
做用:給已經實例化的JavaBean對象的屬性複製,一共有四種形式
<jsp:setProperty name=「JavaBean實例名」 property = 「*」 /> (與表單關聯)
<jsp:setProperty name=「JavaBean實例名」 property = 「JavaBean屬性名」 /> (與表單關聯)
<jsp:setProperty name=「JavaBean實例名」 property = 「JavaBean屬性名」 value=BeanValue「」 /> (手工設置)
<jsp:setProperty name=「JavaBean實例名」 property = 「propertyName」 param=「request對象中的參數名」 /> (與request參數關聯)
<jsp:useBean id="myUsers" class="com.po.Users" scope="page"/> <h1>setProperty動做元素</h1> <hr> <!-- 根據表單自動匹配全部的屬性 --> <%-- <jsp:setProperty name="myUsers" property="*"/> --%> <!-- 根據表單自動匹配部分的屬性 --> <%-- <jsp:setProperty name="myUsers" property="username"/> --%> <!-- 跟表單無關,經過手動複製給屬性(意味着表單填寫的無任何效果) --> <%-- <jsp:setProperty name="myUsers" property="username" value="xiaoshan"/> <jsp:setProperty name="myUsers" property="password" value="520"/> --%> <jsp:setProperty name="myUsers" property="password" param="mypass"/> 用戶名:<%=myUsers.getUsername()%><br> 密碼:<%=myUsers.getPassword()%><br>
第四種:form提交的action中設置了mypass參數
<form name="loginFrom" action="dologin.jsp?mypass=520" method="post">
做用:獲取指定JavaBean對象的屬性值
<jsp:getProperty name=「JavaBean實例名「 property=「屬性名」/>
<!-- 使用傳統表達式的方式獲取用戶名和密碼 --> 用戶名:<%=myUsers.getUsername()%><br> 密碼:<%=myUsers.getPassword()%><br> <!-- 使用 getProperty 方式獲取 --> 用戶名:<jsp:getProperty name="myUsers" property="username"/><br> 密碼:<jsp:getProperty name="myUsers" property="password"/><br>
說明:使用useBeans 的scope屬性能夠用來指定JavaBean的做用範圍
做用域 | 描述 |
---|---|
存儲在application對象中的屬性 | 能夠被同一個WEB應用程序中的全部Servlet和JSP頁面訪問 |
存儲在session對象中的屬性 | 能夠被屬於同一個會話(瀏覽器打開直到關閉稱爲一次會話,且在此期間會話不失效)的全部Servlet和JSP頁面訪問 |
存儲在request對象中的屬性 | 能夠被屬於同一個請求的全部Servlet和JSP頁面訪問(在有轉發的狀況下能夠跨頁面獲取屬性值),例如使用PageContext.forward和PageContext.include方法鏈接起來的多個Servlet和JSP頁面 |
存儲在pageContext對象中的屬性 | 僅能夠被當前JSP頁面的當前響應過程當中調用的各個組件訪問,例如,正在響應當前請求的JSP頁面和它調用的各個自定義標籤類 |
<h1>JavaBean四個做用域範圍</h1> <hr> <jsp:useBean id="myUsers" class="com.po.Users" scope="request"/> <!-- 使用 getProperty 方式獲取 --> 用戶名:<jsp:getProperty name="myUsers" property="username"/><br> 密碼:<jsp:getProperty name="myUsers" property="password"/><br> <!-- 使用 內置對象application方式獲取 --> <%-- 用戶名:<%=((Users)application.getAttribute("myUsers")).getUsername()%>><br> 密碼:<%=((Users)application.getAttribute("myUsers")).getPassword()%>><br> --%> <!-- 使用 內置對象方式session獲取 --> <%-- 用戶名:<%=((Users)application.getAttribute("myUsers")).getUsername()%>><br> 密碼:<%=((Users)application.getAttribute("myUsers")).getPassword()%>><br> --%> 用戶名:<%=((Users)request.getAttribute("myUsers")).getUsername()%>><br> 密碼:<%=((Users)request.getAttribute("myUsers")).getPassword()%>><br>
request 經過請求轉發還能夠獲取到,可是page在其餘頁面沒法獲取到
Model 1模型出現前,整個Web應用的狀況:幾乎所有由JSP頁面組成,JSP頁面接收處理客戶端請求,對請求處理後直接做出響應。
弊端:在界面層充斥着大量的業務邏輯的代碼和數據訪問層的代碼,Web程序的可擴展性和可維護性很是差。
JavaBean的出現可使JSP頁面中使用JavaBean封裝的數據或者調用JavaBean的業務邏輯代碼,這樣大大提高了程序的可維護性
Model1簡單來講就是JSP+JavaBean的開發模式
![]()
無狀態:瀏覽器發送請求給服務器的時候,服務器響應客戶端請求。可是當同一個瀏覽器再次發送請求給服務器的時候,服務器並不知道它就是剛纔那個服務器。
簡單地說,就是服務器不會記錄你,就是無狀態協議
中文名:「小甜餅」
Web服務器保存在客戶端的一系列文本信息
典型應用一:斷定註冊用戶是否已經登陸網址 (如十天內免登陸…)
典型應用二:「購物車的處理」
安全風險:容易泄漏用戶信息
建立Cookie對象:
Cookie newCookie = new Cookie(String key, Object value);
寫入Cookie對象:
response.addCookie(newCookie)
讀取Cookie對象:
Cookie[] cookies = request.getCookies();
Cookie經常使用方法:
方法名稱 | 說明 |
---|---|
void setMaxAge(int expiry) | 設置cookie的有效期,以秒爲單位 |
void setValue(String value) | 在cookie 建立後,對cookie進行賦值 |
String getName() | 獲取cookie名稱 |
String getValue() | 獲取cookie的值 |
int getMaxAge() | 獲取cookie的有效時間,以秒爲單位 |
session | cookie |
---|---|
服務器端(內存)保存用戶信息 | 客戶端(文本文件)保存用戶信息 |
session中保存的是Object類型 | cookie 保存的是String類型 |
隨會話的結束而將其存儲的數據銷燬 | cookie能夠長期保存在客戶端 |
保存重要的信息 | 保存不重要的用戶信息 |
安全性 :session 比 cookie要高
語法:
<%@ include file=「URL」%>
語法:
<jsp:include page=「URL」 flush=「true|false」/>
經常使用page和flush:
page:要包含的頁面
flush: 被包含的頁面是否從緩衝區讀取
include 指令 | jsp:include 動做 | |
---|---|---|
語法格式 | <%@ include file= 「…」 %> | <jsp:include page=「…」 > |
發生做用的時間 | 頁面轉換期間 | 請求期間 |
包含的內容 | 文件的實際內容(代碼) | 頁面的輸出(結果) |
轉換成的Servlet | 主頁面和包含頁面轉換成一個Servlet | 主頁面和包含頁面轉換爲獨立的Servlet |
編譯時間 | 較慢——資源必須被解析 | 較快 |
執行時間 | 稍快 | 較慢——每次資源必須被解析 |
語法:
<jsp:forward page=「URL」/>
等同:
request.getRequestDispatcher(「/url」).forward(request, response);
語法:
<jsp:param name=「URL」 value=「」/>
經常做爲<jsp:forward>的子標籤
案例:
<jsp:forward page="user.jsp"/> <jsp:param value="admin@123.net" name="email"/> <jsp:param value="123456" name="password"/> //修改密碼 </jsp:forward>
JSP 對象 | 怎麼得到 |
---|---|
out | resp.getWriter |
request | servlet 方法的 req參數 |
response | servlet 方法的 resp參數 |
session | req.getSession() 函數 |
application | getServletContext() 函數 |
exception | Throwable |
page | this |
pageContext | PageContext |
config | getServletConfig() |