二廉丽、EL 表達式及 JSTL 標簽

1.EL 表達式

1.1 EL 語法介紹

JSP EL語言定義 E L(Expression Language)

  • 作用:簡化 JSP 的腳本編寫较幌,主要是替代 JSP 腳本表達式,EL主要是作頁面輸出.
    學(xué)習(xí) EL 表達式主要的目標是編寫無腳本的 JSP少欺,因為EL表達式更看起來像標簽
  • 語法:
    ${表達式}
    注意:EL 表達式只能獲取域中的數(shù)據(jù)

1.2 EL 獲取各種類型的數(shù)據(jù)

  • 注意:EL 獲取對象中的數(shù)據(jù)要跟對象中的屬性喳瓣,不要跟字段名稱
    EL 不能再 JSP 腳本片段出現(xiàn)

  • 獲取簡單數(shù)類型

 <%
    //pageContext對象中的setAttribute 默認放于page域。
    String name = "zhangsan";
    pageContext.setAttribute("name", name);
%><br/>
el表達式:${name }<Br/>
  • 獲取引用數(shù)據(jù)類型
  // 使用Servlet 在放數(shù)據(jù)
    UserModel um = new UserModel();
        um.setName("lisi");
        um.setAge(18);
        LocalModel l = new LocalModel();
        l.setShengfen("重慶");
        l.setCity("江津");
        um.setLocal(l);
        req.setAttribute("user", um);
        req.getRequestDispatcher("/demo3.jsp").forward(req, resp)


//  在JSP 中使用 EL 來獲取數(shù)據(jù)
取對象:${user }<Br/>
用戶的名稱:${user.name }<Br/>
用戶的年齡:${user.age }<Br/>
用戶的所屬的省份:${user.local.shengfen }<Br/>
用戶的所屬的城市:${user.local.city }<Br/>
  • 如何來獲取集合數(shù)據(jù)(List),但是 EL 取不了SET 集合存儲數(shù)據(jù)赞别,下午學(xué)了 JSTL 標簽就可以取
  //  在 Servlet 放數(shù)據(jù)
    List<UserModel> users = new ArrayList<UserModel>();
        for (int i = 0; i < 3; i++) {
            UserModel u = new UserModel();
            u.setName("test" + i);
            users.add(u);
        }

        req.setAttribute("users", users);
        req.getRequestDispatcher("/demo3.jsp").forward(req, resp);

// 在 Jsp 中來取數(shù)據(jù)
取到了集合:${users }<br>
取第一個元素:${users[0]}<br/>
取第一個元素中的名稱:${users[0].name }<br/>
取第一個元素中的名稱:${users[0]["name"] }<br/>
取到了集合:${users.get(0).name}<br>
  • 獲取 Map 類型中的數(shù)據(jù)
// Servlet 放入 map 數(shù)據(jù)
Map<String, UserModel> maps = new HashMap<String, UserModel>();

        UserModel um1 = new UserModel();
        um1.setName("value1");
        UserModel um2 = new UserModel();
        um1.setName("value2");

        maps.put("um1", um1);
        maps.put("um2@", um2);
        // 放入map 對象數(shù)據(jù)
        req.setAttribute("maps", maps);

        req.getRequestDispatcher("/demo3.jsp").forward(req, resp);
// JSP el來獲取數(shù)據(jù)
<%-- 以下是集合map對象中數(shù)據(jù)取法 調(diào)用對象屬性可以使用  --%> 
map類型對象實例:${maps}<br/>
取um1key對應(yīng)的對象:${maps.um1 }<Br/>
取um1key對應(yīng)的對象:${maps["um1"] }<Br/>
取um2key對應(yīng)的對象:${maps["um2@"]}<Br/>

1.3 EL 表達式支持的運算符

  • EL 表達式支持的運算一般只是一些簡單的運算符畏陕。
  • EL 還支持三目運算符: 表達式 ?值1:值2.
  • EL 還提供一個empty 運算符:判斷對象是否為null,字符串String 是否為 " " 空串仿滔,返回true惠毁,反之 為false

1.4 EL 表達式中的11 個內(nèi)置對象

內(nèi)置對象引用名稱 內(nèi)置對象具體的類型 說明
pageScope java.util.Map Page作用域
requestScope java.util.Map request作用域
sessionScope java.util.Map session作用域
applicationScope java.util.Map application作用域
pageContext org.apache.jasper.runtime.PageContextImpl 當前頁面的pageContext
initParam java.util.Map 應(yīng)用上下文參數(shù)
cookie java.util.Map 獲取請求中的cookie
param java.util.Map 獲取請求對象中的參數(shù)
paramValues java.util.Map 獲取請求對象中參數(shù)對應(yīng)的多個值
header java.util.Map 獲取請求頭
headerValues java.util 獲取請求頭對應(yīng)的多個值

2.JSTL 標簽

2.1 JSTL 概述

注意:JSTL標簽一般跟EL表達式聯(lián)合使用

  • JSTL(JSP Standard Tag Library犹芹,JSP標準標簽庫) Jsp中的技術(shù)規(guī)范
  • Apache 提供 JSP 中的 JSTL 標簽實現(xiàn)
    依賴包:taglibs-standard-impl-1.2.5.jar
    taglibs-standard-spec-1.2.5.jar
    在 JSP 中引入核心標簽庫:
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

2.2 JSTL 標簽分類

  • 國際化標簽 fmt
  • sql 標簽 sql
  • xml 標簽 xml
  • 核心標簽 core

2.2 JSTL 核心標簽應(yīng)用

  • 迭代標簽 forEach

跌代標簽: items 屬性:支持 el 表達式,定義一個需要遍歷的集合
var 屬性:跌代過程中取的每一個元素,放入到page域中鞠绰,并給這個元素取個別名<Br/>
varStatus 屬性:每次跌代元素記錄的狀態(tài)保存到一個對象中并存到page域中腰埂,給這個狀態(tài)取個別名
begin 屬性: 下標索引從0開始計算,從哪個索引值開始取數(shù)據(jù)
end 屬性:結(jié)束索引下標值

       step 屬性:設(shè)置遍歷數(shù)據(jù)的步調(diào)
  • if 標簽

test 屬性:條件蜈膨,支持el
scope 屬性:支持 el 表示把數(shù)據(jù)存到哪個域屿笼。
var 屬性: 存域中數(shù)據(jù)別個別名

3.JSP 做驗證碼

作用:防止惡意破解密碼、刷票翁巍、論壇灌水驴一,有效防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登陸嘗試

<%@ page contentType="image/jpeg" language="java" import="java.util.*,java.awt.*,java.awt.image.*,javax.imageio.*" pageEncoding="utf-8"%>  
  
<%!  
    //生成 隨機的顏色
    Color getRandColor(int fc,int bc){  
        Random random = new Random();  
        if(fc > 255){  
            fc = 255;  
        }  
        if(bc < 255){  
            bc = 255;  
        }  
        int r = fc +random.nextInt(bc-fc);  
        int g = fc +random.nextInt(bc-fc);  
        int b = fc +random.nextInt(bc-fc);  
          
          
        return new Color(r,g,b);  
    }  
%>  
  
<%   
    //設(shè)置頁面不緩存  告訴瀏覽器不緩存數(shù)據(jù)
    response.setHeader("Pragma","no-cache");  
    response.setHeader("Cache-Control","no-catch");  
    response.setDateHeader("Expires",0);  
      
    //在內(nèi)存中創(chuàng)建圖象  
    int width = 60;  
    int height = 20;  
    
    // 生成一個圖片緩存區(qū) 畫板
    BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);  
      
    //創(chuàng)建圖象   通過畫板拿到畫筆
    Graphics g = image.getGraphics();  
    //生成隨機對象  
    Random random = new Random();  
    //設(shè)置背景色  
    g.setColor(getRandColor(200,250));  
    //在畫板上畫一個矩形
    g.fillRect(0,0,width,height);  
    //設(shè)置畫筆的字體  
    g.setFont(new Font("Tines Nev Roman",Font.PLAIN,18));  
    //設(shè)置畫筆的顏色
    g.setColor(getRandColor(160,200));
    
    //隨機產(chǎn)生干擾線  
    for(int i = 0; i < 255; i++){  
        int x = random.nextInt(width);  
        int y = random.nextInt(height);  
        int xl = random.nextInt(12);  
        int yl = random.nextInt(12);  
    }  
    //隨機產(chǎn)生認證碼,4位數(shù)字  
    String sRand = "";  
    for(int i = 0; i < 4; i++){  
        String rand = String.valueOf(random.nextInt(10));  
        sRand  += rand;  
        //將認證碼顯示到圖象中  
        g.setColor(new Color(20 + random.nextInt(110),20 + random.nextInt(110),20 + random.nextInt(110)));  
        
        g.drawString(rand,13*i+6,16);  
    }  
    // 重點:產(chǎn)生的驗證碼值,要保存到session 域中
    session.setAttribute("rCode",sRand);  
    //圖像生效  
    g.dispose();  
    //輸出圖像到頁面  
    ImageIO.write(image,"JPEG",response.getOutputStream());  
    out.clear();  
    out = pageContext.pushBody();  
%>  
  • 介紹 google 驗證碼組件 kaptcha
    filters-2.0.235.jar
    kaptcha-0.0.9.jar

4.文件上傳

4.1 文件上傳開發(fā)步驟:

  • 導(dǎo)包
    commons-fileupload-1.3.2.jar
    commons-io-1.4.jar
  • 開發(fā)上傳頁面 JSP
    <!-- 開發(fā)上傳的表單灶壶,表單的提交方式必須為 post
    表單的編碼方式需要改為:enctype = multipart/form-data -->
    <form action="" method="post" enctype="multipart/form-data">
        文件上傳:<input type="file" name="imagFile"/><Br/>
        <input type="submit" value="上傳"/>
    </form>
  • 文件處理類 Servlet
package com.xingxue.jsp.util;

import java.io.File;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class FileUtil {

    public static void handlerFile(HttpServletRequest request) {
        // Create a factory for disk-based file items
        // 創(chuàng)建一個針對 磁盤文件的條目的工廠肝断,該工程用于創(chuàng)建文件的條目
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // 獲取應(yīng)用的上下文對象 ServletContext.
        ServletContext servletContext = request.getServletContext();
        // 通過該對象ServletContext 獲取臨時目錄,可以獲取到上傳文件的臨時保存路徑
        // javax.servlet.context.tempdir 臨時目錄的常量
        File repositoryDoc = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
        // 設(shè)置 工廠的倉庫位置
        factory.setRepository(repositoryDoc);
        // ServletFileUpload 該類用于處理上傳文件(提取數(shù)據(jù))
        ServletFileUpload upload = new ServletFileUpload(factory);
        try {
            // 處理請求
            List<FileItem> items = upload.parseRequest(request);
            for (FileItem fileItem : items) {
                // isFormFiled是用于判斷是否是文本數(shù)據(jù)驰凛,如果是文本數(shù)據(jù)胸懈,返回true
                if (!fileItem.isFormField()) {
                    String filename = fileItem.getName();
                    // 為了重復(fù)提交相同名稱的文件,所有文件的名稱要生產(chǎn)一個唯一的值
                    filename = System.nanoTime() + filename.substring(filename.lastIndexOf("."));
                    // 獲取上傳文件的 格式
                    // String contentType = fileItem.getContentType();
                    // 創(chuàng)建一個新文件 來保存臨時文件
                    // 創(chuàng)建新文件 統(tǒng)一放于upload 文件夾中
                    // 1.獲取文件 upload 路徑
                    File newFileDoc = new File(servletContext.getRealPath("/WEB-INF/upload"));
                    // 如果沒有uplaod 文件夾洒嗤,就創(chuàng)建
                    if (!newFileDoc.exists()) {
                        newFileDoc.mkdirs();
                    }
                    // 2.創(chuàng)建 新文件來準備要保存上傳的臨時文件 newFile 文件有數(shù)據(jù)沒箫荡?
                    File newFile = new File(newFileDoc, filename);
                    fileItem.write(newFile);
                    fileItem.delete();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市渔隶,隨后出現(xiàn)的幾起案子羔挡,更是在濱河造成了極大的恐慌,老刑警劉巖间唉,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绞灼,死亡現(xiàn)場離奇詭異,居然都是意外死亡呈野,警方通過查閱死者的電腦和手機低矮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來被冒,“玉大人军掂,你說我怎么就攤上這事∽虻浚” “怎么了蝗锥?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長率触。 經(jīng)常有香客問我终议,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任穴张,我火速辦了婚禮细燎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘皂甘。我一直安慰自己玻驻,他們只是感情好,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布偿枕。 她就那樣靜靜地躺著击狮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪益老。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天寸莫,我揣著相機與錄音捺萌,去河邊找鬼。 笑死膘茎,一個胖子當著我的面吹牛桃纯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播披坏,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼态坦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了棒拂?” 一聲冷哼從身側(cè)響起伞梯,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帚屉,沒想到半個月后谜诫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡攻旦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年喻旷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牢屋。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡且预,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烙无,到底是詐尸還是另有隱情锋谐,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布皱炉,位于F島的核電站怀估,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜多搀,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一歧蕉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧康铭,春花似錦惯退、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至夷野,卻和暖如春懊蒸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悯搔。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工骑丸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人妒貌。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓通危,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灌曙。 傳聞我的和親對象是個殘疾皇子菊碟,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容