JSP(Java Server Page)和Servlet是JavaEE的兩個基本成員,二者本質相同,JSP最終也是要被編譯成Servlet之后才能運行。
1、Web應用和web.xml文件
web應用的文件結構如下:
<webDemo>
|-WEB-INF
| |- classes
| |-lib
| |-web.xml
|-<xx.jsp>
2 Jsp的四中基本語法
- JSP注釋:
<%-- 注釋內容 --%>
- JSP聲明:
<%!申明部分 %>
聲明部分可以使用private,public等訪問控制符修飾,但是不能使用abstract。
- 輸出JSP表達式:
<%= 表達式 %>
- JSP腳本:
<% 腳本 %>
在腳本部分可以申明變量,但是不能使用訪問控制符來修飾。
3 Jsp中的2個編譯指令
1.page指令
<%@ 編譯指令名 屬性名=“屬性值”
屬性值包含如下:
language:默認java,無需設置
extends:JSP編譯產生的Java類要繼承的父類或者接口
import:用來導入包,java.lang.,javax.servlet.,javax.servlet.jsp.,javax.servlet.http.都已經默認導入
session:是否需要session
buffer:緩沖區大小,默認8K
autoFlush:當緩沖區即將溢出的時候,是否需要強制輸出緩沖區內容
info:說明,可以通過getServletInfo()來調用
errorPage:錯誤處理頁面
contentType:生成網頁的文件格式和編碼字符集
2.include指令
<%@include file ="filename"%>
4 Jsp中的7個動作指令
1.forward
<jsp:forward page="result.jsp">
<jsp:param name="aa" value="bb"/>
</jsp:forward>
使用forward指令后瀏覽器地址不會發生變化,并且不會丟失請求的參數。
2.include
<jsp:include page="result.jsp">
<jsp:param name="aa" value="bb"/>
</jsp:forward>
動態include導入和上面的靜態include導入的方法不同之處在于:
- 靜態導入是將兩個頁面融合成一個servlet
- 靜態導入時候編譯指令會琪作用
- 動態包含還可以增加額外參數
可以發現,include和forward的很相似,區別只是在于include是局部的引入
3.useBean setProperty getProperty指令
這三個都是和JavaBean相關的指令
<jsp:useBean id="p1" class="kevin.Person" scope="page"/>
<jsp:setProperty name="p1" property="name" value="kevin"/>
<jsp:getProperty name="p1" property="name"/>
scope范圍有以下四個:
- page:該頁有效
- request:本次請求有效
- session:本次session有效
- application:應用中一直有效
4.plugin
用于下載服務端的JavaBean或者Applet到客戶端執行
5.param
<jsp:param name="" value = ""/>
5 JSP腳本中的9個內置對象
這9個內置對象都是Servlet API的接口的實例,只是JSP規范對他們進行了默認初始化
5.1 application
application有兩個作用:
(1)讓jsp與Servlet之間共享參數
<!-- 設置 -->
<% application.setAttribute("counter",String.valueOf(++i)); %>
<!-- 讀取 -->
<%= application.getAttribute("counter") %>
//在Servlet里面共享
ServletContext sc = getServletConfig().getServletContext();
out.println(sc.getAttribute("counter"))
(2)獲得Web應用配置參數
需要的參數都在web.xml中給出
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<%
String driver = application.getInitParameter("driver");
5.2 config
jsp頁面通常無需配置,在servlet中比較多用到
5.3 exception
編譯指令page的isErrorPage的屬性為true時,才可以使用
<% exception.getClass() %>
<% exception.getMessage() %>
5.3 out
頁面輸出流,直接調用out.println()
5.4 page
相當于this,通常沒有太大作用
5.5 pageContext
代表頁面上下文,可以訪問page,request,session,application范圍的變量
getAttribute(String name, int scope)
scope可以是:PAGE_SCOPE,REQUEST_SCOPE, SESSION_SCOPE, APPLICATION_SCOPE
還可以通過pageContext來獲取其他內置對象。
5.6 request
request中封裝著一次用戶請求,并且所有的請求參數都被封裝在request中
(1)獲取請求頭/請求參數
<%
//有中文等非西歐字符必須先指定編碼
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
//針對多選框等多個值得
String[] color = request.getParameterValues("color");
(2)操作request范圍的屬性
request.setAttribute("name","value");
request.getAttribute("name");
(3)執行forward和include
getRequestDispatcher("/a.jsp").include(request,response);
getRequestDispatcher("/a.jsp").forward(request,response);
5.7 response
response代表服務器對客戶端的響應
大部分情況下使用out生成響應更簡單,但是有些時候則必須使用response
(1)響應生成非字符響應
response.getOutputStream()
(2)重定向
response.sendRedirect("xx.jsp")
重定向會更改URL,并且會丟失所有參數
(3)增加cookie
Cookie c = new Cookie("username",name);
c.setMaxAge(24*3600);
response.addCookie(c);
下面是訪問cookie的代碼
Cookie[] cookies = request.getCookies();
for (Cookie c:cookies)
{
if(c.getNames.equals("username")){
out.println(c.getValue());
}
}
//如果用到了中文,則需要使用java.net.URLEncoder進行編解碼
5.8 session
session是一個非常有用的對象,代表用戶的一次會話,session的屬性值可以是任何可序列號的Java對象
session.getAttribute("name");
session.setAttribute("name","value");