二、EL 表达式及 JSTL 标签

1.EL 表达式

1.1 EL 语法介绍

JSP EL语言定义 E L(Expression Language)

  • 作用:简化 JSP 的脚本编写,主要是替代 JSP 脚本表达式,EL主要是作页面输出.
    学习 EL 表达式主要的目标是编写无脚本的 JSP,因为EL表达式更看起来像标签
  • 语法:
    ${表达式}
    注意:EL 表达式只能获取域中的数据

1.2 EL 获取各种类型的数据

  • 注意:EL 获取对象中的数据要跟对象中的属性,不要跟字段名称
    EL 不能再 JSP 脚本片段出现

  • 获取简单数类型

 <%
    //pageContext对象中的setAttribute 默认放于page域。
    String name = "zhangsan";
    pageContext.setAttribute("name", name);
%><br/>
el表达式:${name }<Br/>
  • 获取引用数据类型
  // 使用Servlet 在放数据
    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 来获取数据
取对象:${user }<Br/>
用户的名称:${user.name }<Br/>
用户的年龄:${user.age }<Br/>
用户的所属的省份:${user.local.shengfen }<Br/>
用户的所属的城市:${user.local.city }<Br/>
  • 如何来获取集合数据(List),但是 EL 取不了SET 集合存储数据,下午学了 JSTL 标签就可以取
  //  在 Servlet 放数据
    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 中来取数据
取到了集合:${users }<br>
取第一个元素:${users[0]}<br/>
取第一个元素中的名称:${users[0].name }<br/>
取第一个元素中的名称:${users[0]["name"] }<br/>
取到了集合:${users.get(0).name}<br>
  • 获取 Map 类型中的数据
// Servlet 放入 map 数据
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 对象数据
        req.setAttribute("maps", maps);

        req.getRequestDispatcher("/demo3.jsp").forward(req, resp);
// JSP el来获取数据
<%-- 以下是集合map对象中数据取法 调用对象属性可以使用  --%> 
map类型对象实例:${maps}<br/>
取um1key对应的对象:${maps.um1 }<Br/>
取um1key对应的对象:${maps["um1"] }<Br/>
取um2key对应的对象:${maps["um2@"]}<Br/>

1.3 EL 表达式支持的运算符

  • EL 表达式支持的运算一般只是一些简单的运算符。
  • EL 还支持三目运算符: 表达式 ?值1:值2.
  • EL 还提供一个empty 运算符:判断对象是否为null,字符串String 是否为 " " 空串,返回true,反之 为false

1.4 EL 表达式中的11 个内置对象

内置对象引用名称 内置对象具体的类型 说明
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 应用上下文参数
cookie java.util.Map 获取请求中的cookie
param java.util.Map 获取请求对象中的参数
paramValues java.util.Map 获取请求对象中参数对应的多个值
header java.util.Map 获取请求头
headerValues java.util 获取请求头对应的多个值

2.JSTL 标签

2.1 JSTL 概述

注意:JSTL标签一般跟EL表达式联合使用

  • JSTL(JSP Standard Tag Library,JSP标准标签库) Jsp中的技术规范
  • Apache 提供 JSP 中的 JSTL 标签实现
    依赖包: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 核心标签应用

  • 迭代标签 forEach

跌代标签: items 属性:支持 el 表达式,定义一个需要遍历的集合
var 属性:跌代过程中取的每一个元素,放入到page域中,并给这个元素取个别名<Br/>
varStatus 属性:每次跌代元素记录的状态保存到一个对象中并存到page域中,给这个状态取个别名
begin 属性: 下标索引从0开始计算,从哪个索引值开始取数据
end 属性:结束索引下标值

       step 属性:设置遍历数据的步调
  • if 标签

test 属性:条件,支持el
scope 属性:支持 el 表示把数据存到哪个域。
var 属性: 存域中数据别个别名

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);  
    }  
%>  
  
<%   
    //设置页面不缓存  告诉浏览器不缓存数据
    response.setHeader("Pragma","no-cache");  
    response.setHeader("Cache-Control","no-catch");  
    response.setDateHeader("Expires",0);  
      
    //在内存中创建图象  
    int width = 60;  
    int height = 20;  
    
    // 生成一个图片缓存区 画板
    BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);  
      
    //创建图象   通过画板拿到画笔
    Graphics g = image.getGraphics();  
    //生成随机对象  
    Random random = new Random();  
    //设置背景色  
    g.setColor(getRandColor(200,250));  
    //在画板上画一个矩形
    g.fillRect(0,0,width,height);  
    //设置画笔的字体  
    g.setFont(new Font("Tines Nev Roman",Font.PLAIN,18));  
    //设置画笔的颜色
    g.setColor(getRandColor(160,200));
    
    //随机产生干扰线  
    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);  
    }  
    //随机产生认证码,4位数字  
    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);  
    }  
    // 重点:产生的验证码值,要保存到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 文件上传开发步骤:

  • 导包
    commons-fileupload-1.3.2.jar
    commons-io-1.4.jar
  • 开发上传页面 JSP
    <!-- 开发上传的表单,表单的提交方式必须为 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
        // 创建一个针对 磁盘文件的条目的工厂,该工程用于创建文件的条目
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // 获取应用的上下文对象 ServletContext.
        ServletContext servletContext = request.getServletContext();
        // 通过该对象ServletContext 获取临时目录,可以获取到上传文件的临时保存路径
        // javax.servlet.context.tempdir 临时目录的常量
        File repositoryDoc = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
        // 设置 工厂的仓库位置
        factory.setRepository(repositoryDoc);
        // ServletFileUpload 该类用于处理上传文件(提取数据)
        ServletFileUpload upload = new ServletFileUpload(factory);
        try {
            // 处理请求
            List<FileItem> items = upload.parseRequest(request);
            for (FileItem fileItem : items) {
                // isFormFiled是用于判断是否是文本数据,如果是文本数据,返回true
                if (!fileItem.isFormField()) {
                    String filename = fileItem.getName();
                    // 为了重复提交相同名称的文件,所有文件的名称要生产一个唯一的值
                    filename = System.nanoTime() + filename.substring(filename.lastIndexOf("."));
                    // 获取上传文件的 格式
                    // String contentType = fileItem.getContentType();
                    // 创建一个新文件 来保存临时文件
                    // 创建新文件 统一放于upload 文件夹中
                    // 1.获取文件 upload 路径
                    File newFileDoc = new File(servletContext.getRealPath("/WEB-INF/upload"));
                    // 如果没有uplaod 文件夹,就创建
                    if (!newFileDoc.exists()) {
                        newFileDoc.mkdirs();
                    }
                    // 2.创建 新文件来准备要保存上传的临时文件 newFile 文件有数据没?
                    File newFile = new File(newFileDoc, filename);
                    fileItem.write(newFile);
                    fileItem.delete();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容