JSTL、EL是页面渲染比较常用的基础的技术。然而,因完成的项目大多是通过JSON或XML返回页面,然后Javascript渲染。

所以,JSTL、EL的使用语法,到现在也很不熟练,不可信手拈来。

借最近做页面的权限展现,用到他们,记录一些简单的实践。

所有数据在Servlet中设置(为了模拟实际情况),而非页面设置。

  1. package com.nicchagil.study.jstl;
  2.  
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8.  
  9. import javax.servlet.ServletException;
  10. import javax.servlet.http.HttpServlet;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13.  
  14. public class JSTLServlet extends HttpServlet {
  15. private static final long serialVersionUID = 1L;
  16.  
  17. public JSTLServlet() {
  18. }
  19.  
  20. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  21. request.setAttribute("hello", "Nick Huang!");
  22.  
  23. Function f1 = new Function("USER", "/user/main");
  24. Function f2 = new Function("ROLE", "/role/main");
  25. Function f3 = new Function("FUNCTION", "/role/main");
  26.  
  27. List<Function> fl = new ArrayList<Function>();
  28. fl.add(f1);
  29. fl.add(f2);
  30. fl.add(f3);
  31. request.setAttribute("fl", fl);
  32.  
  33. Map<String, Function> fm = new HashMap<String, Function>();
  34. fm.put("USER", f1);
  35. fm.put("ROLE", f2);
  36. fm.put("FUNCTION", f3);
  37. request.setAttribute("fm", fm);
  38.  
  39. request.getRequestDispatcher("show.jsp").forward(request, response);
  40. }
  41.  
  42. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  43. }
  44.  
  45. }

Servlet

用于测试JSTL、EL的JSP页面

  1. <%@ page language="java" contentType="text/html; charset=utf-8"
  2. pageEncoding="utf-8"%>
  3. <%@ page import="com.nicchagil.study.jstl.*"%>
  4. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  6. <html>
  7. <head>
  8. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  9. <title>c:out</title>
  10. </head>
  11. <body>
  12.  
  13. c:out<br/>
  14. 打印常量:<c:out value="${'`1234567890-=[]'}"/><br/>
  15. 打印普通字符:<c:out value="${hello}"/><br/>
  16. 打印Map的key为USER的Value:<c:out value="${fm['USER']}"/><br/>
  17. 打印Map的key为XXX的Value:<c:out value="${fm['XXX']}"/><br/>
  18.  
  19. 打印静态常量:
  20. <c:set var="F3" value="<%=Constants.F3%>"/>
  21. <c:out value="${F3}"/><br/>
  22. 打印Map的key为静态常量的Value:<c:out value="${fm[F3]}"/><br/>
  23.  
  24. <br/><br/><br/>
  25.  
  26. c:set and c:out<br/>
  27. <c:set var="salary" value="${2000*2}" scope="session"/>
  28. <c:out value="${salary}"/>
  29.  
  30. <br/><br/><br/>
  31.  
  32. c:forEach<br/>
  33. 打印List集合:<br/>
  34. <c:forEach items="${fl}" var="i" varStatus="s">
  35. Item <c:out value="${s['index']}"></c:out> : <c:out value="${i}"/><br/>
  36. </c:forEach><br/>
  37. 打印List集合字段:<br/>
  38. 1、要引入该JAVA类才能打印类细节<br/>
  39. <c:forEach items="${fl}" var="i" varStatus="s">
  40. Item <c:out value="${s['index']}"></c:out> : <c:out value="${i.functionCode}"/> - <c:out value="${i.functionURL}"/><br/>
  41. </c:forEach><br/>
  42. 打印Map集合字段:<br/>
  43. <c:forEach items="${fm}" var="i" varStatus="s">
  44. Item <c:out value="${s['index']}"></c:out> : <c:out value="${i}"/> - <c:out value="${i.key}"/> - <c:out value="${i.value.functionURL}"/><br/>
  45. </c:forEach><br/>
  46. <br/>
  47.  
  48. <br/><br/><br/>
  49.  
  50. c:choose<br/>
  51. <c:choose>
  52. <c:when test="${not empty fm[F3]}">
  53. fm[F3] is not empty
  54. </c:when>
  55. <c:otherwise>
  56. fm[F3] is not empty
  57. </c:otherwise>
  58. </c:choose>
  59. <br/>
  60. <c:choose>
  61. <c:when test="${not empty fm['xxx']}">
  62. fm['xxx'] is not empty
  63. </c:when>
  64. <c:otherwise>
  65. fm['xxx'] is empty
  66. </c:otherwise>
  67. </c:choose>
  68. </body>
  69. </html>

展现结果

  1. c:out
  2. 打印常量:`1234567890-=[]
  3. 打印普通字符:Nick Huang!
  4. 打印Map的key为USER的Value:com.nicchagil.study.jstl.Function@1c7d56b
  5. 打印Map的key为XXX的Value:
  6. 打印静态常量: ROLE
  7. 打印Map的key为静态常量的Value:com.nicchagil.study.jstl.Function@19c9f16
  8.  
  9. c:set and c:out
  10. 4000
  11.  
  12. c:forEach
  13. 打印List集合:
  14. Item 0 : com.nicchagil.study.jstl.Function@1c7d56b
  15. Item 1 : com.nicchagil.study.jstl.Function@19c9f16
  16. Item 2 : com.nicchagil.study.jstl.Function@180f545
  17.  
  18. 打印List集合字段:
  19. 1、要引入该JAVA类才能打印类细节
  20. Item 0 : USER - /user/main
  21. Item 1 : ROLE - /role/main
  22. Item 2 : FUNCTION - /role/main
  23.  
  24. 打印Map集合字段:
  25. Item 0 : FUNCTION=com.nicchagil.study.jstl.Function@180f545 - FUNCTION - /role/main
  26. Item 1 : ROLE=com.nicchagil.study.jstl.Function@19c9f16 - ROLE - /role/main
  27. Item 2 : USER=com.nicchagil.study.jstl.Function@1c7d56b - USER - /user/main
  28.  
  29. c:choose
  30. fm[F3] is not empty
  31. fm['xxx'] is empty

资料参考:

  • http://www.w3cschool.cc/jsp/jsp-jstl.html
  • http://stackoverflow.com/questions/3978551/jstl-foreach-on-enum

JSTL、EL的一些实践记录的更多相关文章

  1. Spring Boot 2 实践记录之 封装依赖及尽可能不创建静态方法以避免在 Service 和 Controller 的单元测试中使用 Powermock

    在前面的文章中(Spring Boot 2 实践记录之 Powermock 和 SpringBootTest)提到了使用 Powermock 结合 SpringBootTest.WebMvcTest ...

  2. Spring Boot 2 实践记录之 使用 ConfigurationProperties 注解将配置属性匹配至配置类的属性

    在 Spring Boot 2 实践记录之 条件装配 一文中,曾经使用 Condition 类的 ConditionContext 参数获取了配置文件中的配置属性.但那是因为 Spring 提供了将上 ...

  3. Spring Boot 2 实践记录之 MyBatis 集成的启动时警告信息问题

    按笔者 Spring Boot 2 实践记录之 MySQL + MyBatis 配置 中的方式,如果想正确运行,需要在 Mapper 类上添加 @Mapper 注解. 但是加入此注解之后,启动时会出现 ...

  4. Ionic3项目实践记录

    Ionic3首次项目实践记录 标签(空格分隔): Angular Ionic Ionic3踩坑 1. 路由懒加载(lazy load) 如果设置了懒加载,就必须全部懒加载(包括TabsPage),否则 ...

  5. k8s1.4.3安装实践记录(2)-k8s安装

    前面一篇已经安装好了ETCD.docker与flannel(k8s1.4.3安装实践记录(1)),现在可以开始安装k8s了 1.K8S 目前centos yum上的kubernetes还是1.2.0, ...

  6. ElasticSearch5.0+版本分词热更新实践记录

    前言 刚开始接触ElasticSearch的时候,版本才是2.3.4,短短的时间,现在都更新到5.0+版本了.分词和head插件好像用法也不一样了,本博客记录如何配置Elasticsearch的Hea ...

  7. 9-2、大型项目的接口自动化实践记录----递归判断两个json串是否相等

    1.已知json串构成的情况下判断 先构造一下场景,假设已经把各个数据都移除掉不对比的字段 图1 预期.实际结果,复杂接口返回多层嵌套json时,同下 图2 预期.实际结果值为:{child_json ...

  8. 9-1、大型项目的接口自动化实践记录----数据库结果、JSON对比

    上一篇写了如何从DB获取预期.实际结果,这一篇分别对不同情况说下怎么进行对比. PS:这部分在JSON对比中也适用. 1.结果只有一张表,只有一条数据 数据格式:因为返回的是dicts_list的格式 ...

  9. 8、大型项目的接口自动化实践记录----DB分别获取预期结果、实际结果

    上一篇实现数据分离升级版--从DB获取数据,以及对应的请求实现,作为一个case,还缺少了预期结果与实际结果的获取及对比.因为前面的文章已经说过接口返回值的获取及对比,所以这篇不说这块了,这篇说一下D ...

随机推荐

  1. iOS CGRectGetMaxX/Y 使用

    在iOS的界面布局中我们能够使用CGRectGetMaxX 这种方法来方便的获取当前控件的x坐标值+宽度的数值.这样便能够方便布局. 同理CGRectGetMaxY是获取y坐标值+控件高度的值,当然这 ...

  2. PHP MySQL 连接数据库

    PHP连接MySQL的小实例 <?php  /*时间:2014-09-14  *作者:葛崇  *功能:PHP连接MySQL小实例  * */ /* SQL 脚本.直接贴到命令行运行. DROP  ...

  3. 解决 jquery.form.js和springMVC上传 MultipartFile取不到信息

    前段页面: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnc ...

  4. Eclipse Source not found

      Eclipse debug模式下找不到Java源文件 CreateTime--2018年3月19日10:43:39 Author:Marydon 与MyEclipse不同,每次Eclipse导入新 ...

  5. python之函数用法iter()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法iter() #iter() #说明:对一个对象调用 iter() 就可以得到它的迭代 ...

  6. VMware Player 12.5.0 中文免费版

    VMWare Player优点:– 免费的 VMWare Player 体积仅90多MB,相比7百多MB且还要付费的 VMware Workstation 无疑更适合个人用户使用– 主界面清爽简洁,几 ...

  7. js firstChild 、nextSibling、lastChild、previousSibling、parentNode

    nextSibling下一个兄弟节点 previousSibling上一个兄弟 parentNode父亲节点 <select><option value="zs" ...

  8. HDUOJ-------2844Coins

    Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  9. Python的copy()与deepcopy()区别

    Python的copy()与deepcopy()分别对应浅拷贝和深拷贝. 它们的理论区别: deepcopy():深复制(也就是寻常意义上的复制),即将被复制对象完全再复制一遍作为独立的新个体单独存在 ...

  10. iOS设计模式:简单工厂模式

    1.简述 首先需要说明一下,简单工厂模式不属于23种GOF设计模式之一.它也称作静态工作方法模式,是工厂方法模式的特殊实现(也就是说工厂模式包含简单工厂模式).这里对简单工厂模式进行介绍,是为后面的工 ...