1. 程式人生 > >jsp基礎、指令、9個內建隱含物件、jsp標籤、el表示式

jsp基礎、指令、9個內建隱含物件、jsp標籤、el表示式

jsp基礎

1、什麼是jsp 一種伺服器端的動態頁面技術
本質就是一個servlet
2、如何寫一個jsp
3、新增:
(1)html
(2)java程式碼
4、<%java程式碼 %>
jsp表示式
5、<%=java表示式 %>
6、jsp宣告
<%!生命一個變數或者一個方法 %>

7、指令

什麼是指令
指令會影響jsp的第一個階段。對應的servlet類是什麼樣子
通知容器再將jsp轉換成servlet類時做一些額外的處理(導一些包等)
指令的格式
<%@指令名 屬性=值%>
掌握3個指令
a.page指令


import屬性
pageEncoding屬性 告訴編碼方式
contentType屬性
session屬性:true false 預設是true 當這個值為false時,不能使用session隱含物件

這裡寫圖片描述

errorPage屬性:指定一個異常處理頁面的
isErrorPage屬性:true/false 預設是false 為true時,表示這是一個異常處理頁面,就可以使用exception隱含物件。為false就不能用這個exception物件了

例子,寫一個頁面,故意寫個帶異常的。然後利用 errorPage屬性和isErrorPage屬性

a2.jsp
 <body
>
<% String str = "123a"; Integer.valueOf(str); %> <%@page errorPage="a3.jsp" %> </body> a3.jsp <%@page isErrorPage="true" %> <body> This is my Error page. <br> <%=exception.getMessage() %> </body>

這裡寫圖片描述

b.include指令 包含
就只有一個屬性 file屬性
告訴容器再將jsp檔案轉成servlet類的時候,將file屬性指定的檔案的內容插入到該指令的位置
可以把員工管理的emplist.jsp改一下
發現很多檔案的頭和尾的內容是一樣的。那麼就可以把頭和尾單獨拿出來。做兩個jsp
然後用對應的位置<%@include=”xxx.jsp”%> 轉成servlet時,會直接把檔案的內容插進去

c.taglib指令
用來引入jsp標籤的

8、隱含物件

什麼是隱含物件?
為什麼可以直接使用
有哪些隱含物件
out
requst
response
session
application
exception
pageContext
config
page (用的很少,幾乎沒有)

page 是jsp例項本身 ,就是servlet例項

重點是pageContext
1、容器會為每一個jsp例項建立唯一的一個符合PageContext介面要求的物件 一個jsp對應一個pageContext
2、永續性 ,因為就是上下文嘛。這個jsp沒有被銷燬就會一直存在。
作用:
1、繫結資料 (繫結到對應的pageContext,只有對應的才能獲取)
setAttribute getAttribute removeAttribute

<body>
    <%
    pageContext.setAttribute("user", "Recar");

     %>
    <%=pageContext.getAttribute("user") %>

  </body>

這裡寫圖片描述

2.獲得其他所有的隱含物件

另一個隱含物件config

讀取初始化引數
也可以用他獲取上下文
因為也可以對jsp進行配置,就是在web.xml進行配置

<%=config.getInitParameter("user") %>

 <servlet>
  <servlet-name>a6</servlet-name>
<jsp-file>/a6.jsp</jsp-file>
  <init-param>
  <param-name>user</param-name>
  <param-value>Recar</param-value>
  </init-param>
  </servlet>
  <servlet-mapping>
  <servlet-name>a6</servlet-name>
  <url-pattern>/ddd.html</url-pattern>
  </servlet-mapping>

注意:寫的是 jsp-file 而不是 servlet-class !!!

這裡寫圖片描述

重點是 out request response session exception 還有pageContext

8、註釋:

jsp檔案中寫註釋:

1、<!--註釋內容-->
2、<%--註釋內容--%>

第一種註釋,如果註釋的內容是java程式碼,則java程式碼會執行,第二種,如果是java程式碼就會忽略。
第一種是會執行,但是被html註釋給註釋掉了。可以在原始碼中看到

第二種的話,轉成servlet就不會執行。

9、jsp標籤和el表示式

(1)什麼是jsp標籤:
jsp標籤用來替換jsp檔案中的java程式碼,因為直接在jsp檔案寫java程式碼不方便jsp檔案的維護(比如,將jsp檔案交給美工去修改就很不方便),所以,sun制定了jsp標籤技術規範。
可以將jsp標籤看做是一個佔位符,容器遇到jsp標籤之後,會依據標籤名找到標籤類,然後呼叫執行標籤類中的程式碼。
使用jsp標籤有兩個好處;
jsp檔案很好維護、可以將標籤複用。(把一些常用的程式碼封裝成jsp標籤)
(2)什麼是el表示式
是一套簡單的運算規則,用於給jsp標籤的屬性賦值,也可以直接輸出。

(3)el表示式的使用
1)訪問bean的屬性
javabean :規範
有屬性,有對應的get,set方法就可以叫bean
比如一個類Employee
屬性:name、salary、age、getName、等
a、方式一:
${user.name}
如何執行的
容器會依次從pageContext,request,response,session,application中查詢繫結名為”user”的物件。找到該物件後,會呼叫該物件的”getName”方法,最後輸出。
注意:
會將null轉換成”null”輸出
找不到物件也會輸出””
程式碼:

先寫了一個類 User.java

package bean;

public class User {
    private String name;
    private int age;
    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;
    }

}
<body>

 <%@page import="bean.*" %>
<%
User user = new User();
user.setName("Recar");
user.setAge(20);
request.setAttribute("user", user);

 %>


name:${user.name}
<%
//正常寫法,不用el表示式
/* User user1 = (User)request.getAttribute("user");
out.print(user1.getName()); */
 %> 

這裡寫圖片描述

如果在session上也綁定了一個user。還是這麼寫。還是會顯示request的。因為是按查詢順序的。

如果想指定查詢範圍:
pageScope,requestScope,sessionScope,applicationScope
指定:即 ${sessionScope.user.name}

b、方式二
${user[“name”]} 等價於 user.name

這裡寫圖片描述

具有第一種方式不具有的特性:
[]中可以寫一個繫結名

<% 
request.setAttribute("str", "age");
%>
<br>
str: ${user[str]} 
!!!

先給request繫結str 值是age
那麼user[]中寫的str ,是繫結的名字。會查詢str。找到,然後把str替換成其值。也就是age 。也就變成了 user[“age”]
所以就返回了bean中的age值

這裡寫圖片描述

[]中還可以出現從0開始的下標,用於訪問陣列中的某個元素。

先給bean類中增加一個數組

private String[] interest;
    public String[] getInterest() {
        return interest;
    }
    public void setInterest(String[] interest) {
        this.interest = interest;
    }

然後在jsp中設定user的屬性-陣列
user.setInterest(new String[]{“cooking”,”learning”});

然後在後面用表示式獲取
interest:${user.interest[0]}

獲取的就是陣列interest的第一個元素

這裡寫圖片描述

1)比如${user.card.id}
就是先查詢繫結的user,然後呼叫getCard(),返回的物件再次呼叫getId()方法

2)進行一些簡單的運算
運算的結果可以給jsp標籤的屬性賦值,也可以直接輸出
a.算術運算 + - * /
算術運算 ${1+1}
這裡寫圖片描述

但是隻能求和,不能做連線運算就是說 “2”+”4” 運算完是6

b.關係運算 > >= < <= == !=
關係運算 ${2>1}

<%
request.setAttribute("str1", "abc");
 %>
 ${"abc"==str1}

str1 是繫結名,所以可以直接寫~

這裡寫圖片描述

c.邏輯運算 && || !
邏輯:${1<2&&2>3}

d.empty運算
用來判斷集合是否為空,或者是否是一個空字串。
先建立一個集合 List 然後繫結到request。
後面是先查詢list1,然後判斷是否為空empty,空就是true

<%
  List list1 = new ArrayList();
  request.setAttribute("list1", list1);
   %>
 empty:${empty list1}

這裡寫圖片描述

還有 null 也是返回true

 null       ${empty null }

或者找不到也是返回true

 找不到      ${empty aaa}

這裡寫圖片描述

3)讀取請求引數值

比如 e3.jsp?username=Recar
a.${param.username}等價於request.Parameter(“username”)
b.${paramValues.city}等價於request.getParameterValues(“city”)
如:  username:${param.username}

這裡寫圖片描述

city:${paramValues.city[0]}

這裡寫圖片描述