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

        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}
取um1key对应的对象:${maps.um1 }
取um1key对应的对象:${maps["um1"] }
取um2key对应的对象:${maps["um2@"]}

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域中,并给这个元素取个别名

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
    
    
文件上传:
  • 文件处理类 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 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();
        }
    }

}

你可能感兴趣的:(二、EL 表达式及 JSTL 标签)