- EL表达式是不能嵌套的,即不能写成${ ${} }或${xxx.[xxx.xxx]}
- 当你的**是Map时,可以写成${**[xxx.xxx]}
- 其余的单个属性直接${xxx}
- 对象中的属性${xxx.xxx},如果对象中又有对象依此类推类似Struts2中ONGL(对象导航图)
- 顺便写个自己学习中遇到的案例问题,结合上面及其他各位大神的博客最终解决
以SSH案例来说,在我的Action中定义了两个map集合,使用Strust2的Prepareable拦截器接口,此处为初始化gradeMap和departmentMap集合,
实现这个接口的prepare()方法,这个方法会在action类的所有方法执行前执行,另外我们也可以按照它的规则来写一些其它形式的prepare方法,
例如aciton中有一个方法叫input(),那么我们可以实现一个prepareInput方法,这样在input()执行前,会执行prepareInput()方法。
public class EmployeeAction extends ActionSupport implements Preparable { private Employee employee; private String department_id; private static Map<String, String> gradeMap; private static Map<String, String> departmentMap; private static String str; @Autowired private EmployeeService employeeService; @Autowired private DepartmentService departmentService; HttpServletRequest request = ServletActionContext.getRequest(); @Override public void prepare() throws Exception { gradeMap = new HashMap<>(); gradeMap.put("1", "总经理"); gradeMap.put("2", "项目经理"); gradeMap.put("3", "高级开发工程师"); gradeMap.put("4", "中级开发工程师"); gradeMap.put("5", "初级开发工程师"); departmentMap = new HashMap<>(); departmentMap.put("1", "财务部"); departmentMap.put("2", "人事部"); departmentMap.put("3", "运维部"); departmentMap.put("4", "测试部"); departmentMap.put("5", "开发部"); departmentMap.put("6", "技术部"); }
public String XXX(){
...
request.setAttribute("gradeMap", gradeMap);
request.setAttribute("departmentMap", departmentMap);
}
}
对于这Employee员工类,在查看员工列表信息时,通过service层调用持久层查到的员工列表,将其放入域对象,在页面中使用jstl标签的
<c:forEach items="${emps }" var="emp">来进行遍历。由于EL不能嵌套使用,所以具体做法如下jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> <%@ page import="java.util.Map"%> <%@ page import="java.util.*"%> <% Map<String, String> departmentMap = (Map<String, String>) request.getAttribute("departmentMap"); Map<String, String> gradeMap = (Map<String, String>) request.getAttribute("gradeMap"); System.out.println(request.getAttribute("str")); %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>员工列表</title> </head> <body> <table> <thead> <tr> <td>员工名</td> <td>员工邮件</td> <td>员工薪水</td> <td>入职时间</td> <td>员工密码</td> <td>员工级别</td> <td>所属部门</td> </tr> </thead> <tbody> <c:forEach items="${emps }" var="emp"> <c:set value="${emp.grade}" var="gradekey" scope="request" /> <c:set value="${emp.department.id}" var="departkey" scope="request" /> <tr> <td>${emp.name }</td> <td>${emp.email }</td> <td>${emp.salary }</td> <td>${emp.hiredate }</td> <td>${emp.pwd }</td>
<%-- 之前竟然煞笔的使用 ${gradeMap['${emp.grade}']}之类的写法根本取不到,但是如果key是具体的String或者Integer则可以取到
${gradeMap['1']} -->总经理 总之具体情况具体对待
--%>
<td> <% out.print(gradeMap.get(request.getAttribute("gradekey"))); %> </td> <td> <% out.print(departmentMap.get(String.valueOf((request.getAttribute("departkey"))))); %> </td> </tr> </c:forEach> </tbody> </table> </body> </html>
对action中初始化的map集合使用 <c:set value="${emp.grade}" var="gradekey" scope="request" /> 标签 使用out内置对象将其取出