JSP的本質是Servlet
JSP的本質是Servlet,當用戶向指定的Serlet發送請求時,Servlet利用輸出流動態生成HTML頁面包括每一個靜態的HTML標籤和所有在HTML頁面出現的內容
JSP頁面內容包括兩部分:
- 靜態部分:html標籤,靜態的頁面內容
- 動態部分:受Java程序控制的內容,這些由Java腳本動態生成JSP頁面代碼:
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage=""%>
<html>
<head>
<title>
web
</title>
<body>
這是一個簡單的web應用<br>
現在時間爲:<% out.println(new java.util.Date());%>
</body>
</head>
</html>
JSP頁面是Servlet的一種簡化,其實還是使用了Servlet,在Web應用中每個JSP頁面都會有Servlet容器生成對應的Servlet,在Tomcat中,JSP頁面生成的Servlet放在work路徑對應的Web應用下
JSP的四種基本語法
JSP註釋
兩種註釋格式:
<%– 註釋內容 –%>
<!– 註釋內容 –>
JSP聲明
語法格式:
<%!
//聲明部分
//聲明一個方法
public String prin(){
return "這是一個聲明";
}
%>
注意:JSP頁面的聲明部分將轉換成對應的成員或成員方法,其中不能使用abstract修飾聲明部分的方法,因爲抽象方法將導致JSP對應的Servlet變成抽象類,從而無法實例化
JSP輸出表達式
用輸出的簡單表達式,相當於out.println,表達式語法後沒有分號
<%=表達式%>
JSP腳本
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage=""%>
<html>
<head>
<title>
web
</title>
<body>
Jsp腳本<br>
<%
for(int i=1;i<10;i++){
%>
腳本輸出:<%=i%> <br>
<% } %>
</body>
</head>
</html>
JSP腳本聲明的變量是局部變量,但是不可以使用private,public 等控制訪問修飾符,也不能用static,JSP腳本里不能定義方法
JSP的三個編譯指令
語法格式
<% 編譯指令名 屬性名=”屬性值”····%>
page指令
page指令各屬性的意義:
- extends:指定JSP頁面編譯所產生的Java類所繼承的父類,或所實現的接口
- import:導入包,默認導入的包有:java.lang.*,javax.servlet.*,javax.servlet.jsp.*,javax.servlet.http.*
- session:是否需要HTTP Session
- buffer:指定輸出緩衝區大小,默認8KB
- autoFlush:輸出緩衝區溢出時,是否需要強制輸出緩衝區內容
- info:設置該JSP程序的信息,在jsp中可以直接調用getServletInfo()獲取
- errorPage:指定錯誤處理頁面
- isErrorPage:設置JSP頁面是否爲錯誤處理程序
- contentType:指定文件格式和編碼字符集
- pageEncoding:指定編碼字符集
include指令
include編譯指令語法
<%@include file=”relativeURLSpec”%>
靜態的includeb編譯指令,會把目標頁面的其他編譯指令包含起來加入到本頁面,融合成一個頁面,也就是說被包含頁面的內容完全融入了包含頁面所生成的Servlet中,所以被包含頁面甚至不需要一個完整的頁面,但兩個頁面的編譯指令衝突,那麼頁面就會出錯。
JSP的七個動作指令
include指令
該指令是一個動態include指令,也用於包含某個頁面,它不會導入被include頁面的編譯指令,僅僅將導入頁面的body內容插入到本頁面
<jsp:include page="{relativeURL|<%=experssion%>}" flush="true"/>
flush屬性用於指定輸出緩存是否轉移到被導入文件中,對與JSP1.1以前版本,只能設置成flase
forward,param指令
forward用於將頁面響應轉發到另一個頁面,可以轉到HTML靜態頁面,動態的JSP頁面和轉發到容器中的Servlet
對於JSP1.0
<jsp:forward page="{relative|<%=expression%>}"/>
對於JSP1.1
<jsp:forward page="{relative|<%=expression%>}">
<jsp:param name="paramName" value="paramValue"/>
</jsp:forward>
執行forward指令時,用戶請求的地址欄依然沒有發生改變,但頁面的內容卻完全被forward目標頁的內容
param指令用於設置參數值,這個指令不能單獨使用,可以和jsp:include,jsp:forward,jsp:plugin這三個指令結合使用
useBean,setProperty,getProperty指令
都是和JavaBean相關的指令,其中useBean指令用於在JSP頁面中初始化一個Java實例,setProperty指令用於爲JavaBean實例的屬性設置;getPorperty指令用於輸出JavaBean實例屬性
package jspDemo;
public class Person {
private String name="wee";
private int age=21;
private String ad="meizhou";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAd() {
return ad;
}
public void setAd(String ad) {
this.ad = ad;
}
}
index.jsp
<%@page import="jspDemo.Person"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" errorPage="" %>
<html>
<head><title>javaBean test</title></head>
<body>
//第一種方法
<jsp:useBean id="id" class="jspDemo.Person" scope="page"/>
<jsp:setProperty name="id" property="name" value="zy"/>
<jsp:setProperty name="id" property="age" value="23"/>
<jsp:getProperty name="id" property="name"/>
<jsp:getProperty name="id" property="age"/>
<jsp:getProperty name="id" property="ad"/>
//---------------------------------------------
//第二種方法
<%
Person per = new Person();
pageContext.setAttribute("pe",per);
per.setName("hlc");
per.setAge(22);
%>
<%=per.getName()%>
<%=per.getAge()%>
<%=per.getAd() %>
</body>
</html>
JSP腳本中的內置對象
這九個內置對象都是ServletAPI接口的實例,是JSP規範對它們進行了默認初始化,可以直接使用。
application對象
application對象代表Web應用本身,使用application操作web應用相關數據,主要有兩個作用
1.在整個web應用的多個jsp,servlet之間共享數據。
2.獲取web應用配置參數
config對象
config對象代表當前jsp配置信息,但jsp頁面通常無需配置,因此就不存在配置信息,但Servlet需要在web.xml中配置參數。
獲取配置信息的方法:getInitParameter(String paramName)
<%@ page contentType="text/html; charset=utf-8" errorPage="" %>
<html>
<head><title>config</title></head>
<body>
name:的配置參數:<%=config.getInitParameter("name") %>
</body>
</html>
web.xml
<?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_3_0.xsd" version="3.0">
<display-name>config</display-name>
<servlet>
<description>JAX-RS Tools Generated - Do not modify</description>
<servlet-name>JAX-RS Servlet</servlet-name>
<jsp-file>/confitest.jsp</jsp-file>
<init-param>
<param-name>name</param-name>
<param-value>lcy</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>JAX-RS Servlet</servlet-name>
<url-pattern>/jaxrs/*</url-pattern>
</servlet-mapping>
</web-app>
jsp頁面獲取web.xml配置文件中的信息,需要通過jsp配置的路徑來訪問。
pageContext對象
pageContext可以訪問page,request,session,application範圍的變量
getAttribute(String name)獲取page範圍內的name的屬性值
getAttribute(String name ,int scope):獲取指定範圍內的name屬性,其中scope可以有:
- PageContext.PAGE_SCOPE 對應page範圍
- PageContext.REQUEST_SCOPE 對應request範圍
- PageContext.SESSION_SCOPE 對應session範圍
- PageContext.APPLICATION_SCOPE 對應application範圍
<%@ page contentType="text/html;charset=utf-8" language="java" errorPage="" %>
<html>
<head><title>pageContext</title></head>
<body>
<%
pageContext.setAttribute("page","p");
request.setAttribute("request","p");
pageContext.setAttribute("request2","p",pageContext.REQUEST_SCOPE);
session.setAttribute("session","p");
pageContext.setAttribute("session2","p",pageContext.SESSION_SCOPE);
application.setAttribute("application","p");
pageContext.setAttribute("application2","p",pageContext.APPLICATION_SCOPE);
out.println(pageContext.getAttributesScope("page")+"<br>");
out.println(pageContext.getAttributesScope("request")+"<br>");
out.println(pageContext.getAttributesScope("request2")+"<br>");
out.println(pageContext.getAttributesScope("session")+"<br>");
out.println(pageContext.getAttributesScope("session2")+"<br>");
out.println(pageContext.getAttributesScope("application")+"<br>");
out.println(pageContext.getAttributesScope("application2")+"<br>");
out.println(pageContext.getAttribute("page",pageContext.PAGE_SCOPE)+"<br>");
out.println(pageContext.getAttribute("request",pageContext.REQUEST_SCOPE)+"<br>");
out.println(pageContext.getAttribute("request2",pageContext.REQUEST_SCOPE)+"<br>");
out.println(pageContext.getAttribute("session",pageContext.SESSION_SCOPE)+"<br>");
out.println(pageContext.getAttribute("application",pageContext.APPLICATION_SCOPE)+"<br>");
%>
</body>
</html>
request對象
1.獲取請求頭/請求參數
服務器端負責解析請求頭/請求參數的就是JSP或Servlet,而JSP和Servlet取得請求參數的途徑就是request。request是HttpServletRequest的接口實例,提供了幾個方法獲取參數:
- String getParameter(String paramName):獲取paramName請求參數的值.
- Map getParameterMap():獲取所有請求參數名和參數值所組成的map對象
- Enumberation getParameterNames():獲取所有請求參數名所組成的Enumeration對象
- String[] getParameterValues(String name):parameter請求參數值,有多個值是,返回一個數組
獲取訪問請求頭
- String getHeader(String name):請求頭的值
- java.util.Enumeration < String > getHeaderNames():獲取所有請求頭的名稱
- java.util.Enumeration < String > getHeaders(String name):獲取指定請求頭的多個值
- int getIntHeader(String name):獲取指定請求頭的值,並將該值轉爲整數值。
——————————————————————————–
關注微信公衆號“閱享屋”可獲取900G IT教學視頻和JAVA、前端電子書籍