1. 程式人生 > >jsp&el&jstl-01

jsp&el&jstl-01

apach red double stat 判斷 incr 名稱空間 core serlvet

案例1-在頁面中展示所有商品信息,不要使用jsp的腳本
技術分析:
  jsp/el/jstl
  
jsp:
  java 服務器頁面
  作用:
    將內容的生成和信息的展示相分離
    運行在服務器端,本質上就是一個serlvet,產生的java文件和class保留在tomcat的word目錄下.
jsp腳本:
  <%..%> java代碼片段
  <%=..%> 輸出表達式 相當於out.print();
  <%!...%> 聲明成員
jsp的指令
  作用:聲明jsp頁面的一些屬性和動作
  格式:
    <[email protected]

/* */ 屬性="值" 屬性="值"%>
  jsp指令的分類:
    page:主要聲明jsp頁面的一些屬性
    include:靜態包含.
    taglib:導入標簽庫
  註意:
    一個頁面中可以出現多個指令
    指令可以放在任意位置,一般都放在jsp頁面最上面.

page指令:
  重要屬性:3個
    contentType:設置響應流的編碼,及通知瀏覽器用什麽編碼打開.設置文件的mimetype
    pageEncoding:設置頁面的編碼
    import:導入所需要的包
    contentType和pageEncoding聯系:

      若兩者都出現的時候,各自使用各自的編碼
      若只出現一者,兩個都使用出現的這個編碼
      若兩者都不出現,使用服務器默認的編碼 tomcat7使用的iso-8859-1
  了解屬性:
    language:當前jsp頁面裏面可以嵌套的語言
    buffer:設置jsp頁面的流的緩沖區的大小
    autoFlush:是否自動刷新
    extends:聲明當前jsp的頁面繼承於那個類.必須繼承的是httpservlet 及其子類
    session:設置jsp頁面是否可以使用session內置對象
    isELIgnored:是否忽略el表達式

    errorPage:當前jsp頁面出現異常的時候要跳轉到的jsp頁面
    isErrorPage:當前jsp頁面是否是一個錯誤頁面
      若值為true,可以使用jsp頁面的一個內置對象 exception
include指令:
  靜態包含,就是將其他頁面或者servlet的內容包含進來,一起進行編譯運行.生成一個java文件.
  格式:
    <[email protected] file="相對路徑或者是內部路徑" %>
  例如:
    <[email protected] file="/jsp/include/i1.jsp" %>

  路徑:
    相對路徑:
      ./或者什麽都不寫 當前路徑
      上一級路徑 ../
    絕對路徑:
      帶協議和主機的絕對路徑
      不帶協議和主機的絕對路徑
        /項目名/資源

    內部路徑:
      不帶協議和主機的絕對路徑去掉項目名
        請求轉發 靜態包含 動態包含

taglib指令:導入標簽庫
  格式:
    <[email protected] prefix="前綴名" uri="名稱空間" %>
  若導入之後
    <前綴名:標簽 .. >
  例如:
    <c:if test="">輸出內容</c:if>

jsp的內置對象:★★★(9大內置對象)
  在jsp頁面上可以直接使用的對象
  內置對象   類型
  out    JspWriter
  request   HttpServletRequest
  response   HttpServletResponse
  session   HttpSession

  exception   Throwable

  page    Servlet(this)
  config      ServletConfig
  application   ServletContext

  pageContext PageContext

  jsp的域對象:理解
    application 整個項目
    session 一次會話
    request 一次請求
    pageContext 一個頁面
  pagecontext作用:理解
    1.域對象
      xxxAttribute()
    2.操作其他域對象
      方法:
        xxxAttribute(...,int scope);
      scope取值:
        APPLICATION_SCOPE
        SESSION_SCOPE
        REQUEST_SCOPE
        PAGE_SCOPE
    3.獲取其他的內置對象
      getXxx()
      註意:
        getRequest():獲取request內置對象
    4.便捷查找,
      findAttribute(String key):
        依次從pagecontext,request,session,application四個域中,查找相應的屬性,若查找到了返回值,且結束該次查找
        若查找不到,返回一個null


jsp的動作標簽
  <jsp:forward>:請求轉發 相當於java中 request.getRequestDispatcher(..).forward(..);
  <jsp:forward page="內部路徑"></jsp:forward>
  <jsp:include>:動態包含
  就是將被包含頁面或者servlet的運行結果包含到當前頁面中.


el:
  jsp的內置表達式語言,從jsp2.0開始.
    用來替代<%=..%>
  作用:
    1.獲取域中數據 ★
    2.執行運算 ★
    3.獲取常見的web對象
    4.調用java的方法
    格式:
      ${el表達式}

  獲取域中數據:★
  註意:★
    若屬性名中出現了"."|"+"|"-"等特殊符號,需要使用scope獲取
  例如:
    ${requestScope["arr.age"] }
  獲取簡單數據
    ${pageScope|requestScope|sessionScope|applicationScope.屬性名}
    以後經常使用:
      ${屬性名}:依次從pageContext,request,session,application查找指定屬性,若查找到返回值,結束該次查找
      若查找不到,返回""
  獲取復雜數據
    獲取數組中的數據
      ${域中的名稱[index]}
    獲取list中的數據
      ${域中的名稱[index]}
    獲取map中的數據
      ${域中的名稱.鍵名}


javabean導航
  javabean:
    java語言編寫的一個可重用的組件,
    狹義上來說就是我們編寫的一個普通的java類 例如:User Person
  javabean規範:
    1.必須是一個公共的具體的類 public class
    2.提供私有的字段 private String id;//id稱之為字段
    3.提供公共訪問字段的方法 get|set|is方法
      public String getId(){..}
      一旦有公共的方法之後,get|set|is之後的內容,將首字母小寫,將這個東西稱之為bean屬性
      id就是一個bean屬性
    4.提供一個無參的構造器
    5.一般實現序列化接口 serializable

  ${域中javabean名稱.bean屬性}

執行運算:
  四則運算 關系(>..) 邏輯(&& ||)
  註意:
    +:只能進行加法運算,字符串形式數字可以進行加法運算.
    empty:判斷一個容器的長度是否為0(array set list map),還可以判斷一個對象是否為空
    ${empty 域中的對象名稱}
    三元運算符


el的內置對象(了解)
  11個
  pageScope
  requestScope
  sessionScope
  applicationScope

  param
  paramValues

  header
  haederValues

  initParam

  cookie★

  pageContext★
註意:
  除了pagecontext其余對象獲取的全是map集合

了解:和參數相關的el內置對象
  param
  paramValues

了解:和請求頭相關的el內置對象
  header
  haederValues

了解:和全局初始化參數相關的el內置對象
  initParam

cookie內置對象:
  ${cookie} 獲取map{key=Cookie}
    例如:創建cookie
      Cookie c=new Cookie("username","tom");
    通過${cookie}獲取相當於
      {username=new Cookie("username","tom")}
    相當於map的key是cookie的鍵
    map的value是當前cookie

  若項獲取名稱username的cookie的value值(獲取tom)
    ${cookie.username.value}--javabean導航
  註意:
    java中Cookie的api
      getName():獲取cookie的名稱
      getValue():獲取cookie的value值
    我們稱name和value是cookie的bean屬性

  使用cookie內置對象:
    ${cookie.給cookie起名字.value}

  例如:
    獲取jsession的值
    ${cookie.JSESSIONID.value}
  
pageContext:獲取不是map集合,相當於jsp的pageContext內置對象
  在jsp頁面中獲取項目名
  ${pageContext.request.contextPath}

jsp註釋:
  html註釋 <!-- -->
    註釋的內容只在頁面上看不到 java代碼和html源代碼都有
  java註釋
    只在java代碼中存在
  jsp註釋 <%-- --%>
    只在jsp頁面中存在,翻譯成java文件之後就沒有了

jstl:
  jsp標準的標簽庫語言
    apache的
  用來替代java腳本
  使用步驟:
    1.導入jar包 (jstl.jar和standard.jar)
    2.在頁面上導入標簽庫
      <[email protected] prefix="" uri=""%>

    例如:
      <[email protected] prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
jstl的分類:
  core:核心類庫 ★
  fmt:格式化|國際化
  xml:過時了
  sql:過時了
  函數庫:很少使用


core:掌握
  ★c:if
  ★c:forEach

  c:set 往域中設置值
  c:choose c:when c:otherwise 分支

  ★c:if 判斷
    <c:if test="${el表達式}">滿足的時候輸出的內容</c:if>
    例如:
      <c:if test="${3>4 }">
        3大於4
      </c:if>


      <c:if test="${3<=4 }">
        3不大於4
      </c:if>

  ★c:forEach 循環
    格式1:
      <c:forEach begin="從那裏開始" end="到那裏結束" step="步長" var="給變量起個名字" varStatus="循環狀態變量">
        ${i }--${vs.count }--${vs.current }<br>
      </c:forEach>

    varStatus:用來記錄循環的狀態
      常用的屬性:
        count:記錄次數
        current:當前遍歷的內容
    例如:
      <c:forEach begin="1" end="20" step="2" var="i" varStatus="vs">
        ${i }--${vs.count }--${vs.current }<br>
      </c:forEach>

    格式2:
      <c:forEach items="${el獲取域中的容器}" var="n">
        ${n }
      </c:forEach>

    例如:
      //遍歷list
      <c:forEach items="${list }" var="n">
        ${n }
      </c:forEach>

      //遍歷map
      <c:forEach items="${map }" var="en">
        ${en.key }-- ${en.value }<br/>
      </c:forEach>


案例1-步驟分析:
  1.數據庫和表
    create database day12;
    use day12;
    create table product(
    id int primary key auto_increment,
    pname varchar(20),
    price double,
    pdesc varchar(20)
    );

    insert into product values (null,‘電視機‘,3200,‘液晶曲面大電視‘);
    insert into product values (null,‘韭菜盒子‘,3,‘味重請小心食用‘);
    insert into product values (null,‘益達‘,10,‘韭菜伴侶‘);
    insert into product values (null,‘十三香‘,12,‘守義牌‘);

  新建一個項目
  導入jar包:
  驅動 dbutils c3p0 jstl
  導入c3p0配置文件 和工具類
  實體類:
  private int id;
  private String pname;
  private double price;
  private String pdesc;
2.index.jsp中添加一個連接
  <a href="/day1201/findAll">展示所有商品</a>
3.FindAllServlet:
  調用ProductService.findAll() 返回一個集合 List<Product>
  將list放入request域中
  請求轉發到product_list.jsp
4.ProductService.findAll() 調用dao.findAll()
5.dao.findAll() 使用beanListHandler()
6.在product_list.jsp展示所有商品
  使用 c:forEach
  使用javabean導航獲取裏面的數據
/////////////////////////////
案例2-重寫登錄案例
需求:
在頁面上填寫用戶名和密碼及驗證碼,點擊提交,先校驗驗證碼是否一致.若一致後再去找數據庫.順便記住用戶名
技術:
表單
驗證碼
servlet
request
session
cookie
步驟分析:
1.數據庫和表
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20)
);
2.創建一個項目
包結構
jar包
工具類和配置文件
3.表單 login.jsp
4.表單提交 loginServlet
loginServlet:
獲取驗證碼(從前臺傳過來和session中)
判斷兩個驗證碼是否一致
若不一致:
填寫錯誤信息,請求轉發到login.jsp
若一致:獲取用戶名和密碼
調用userService的getuserbyusernameandpassword 返回值 User user
判斷user是否為空
若為空:填寫錯誤信息,請求轉發到login.jsp
若不為空:
繼續判斷是否勾選了記住用戶名
若勾選:
創建cookie 將用戶名放入cookie寫回瀏覽器
將user對象放入session中
頁面重定向 index.jsp 展示 xxx:歡迎回來

jsp&el&jstl-01