在JSP EL中解析JSP EL

时间:2016-12-06 17:55:00

标签: jsp dom el

我有一个bean变量说url从db获取它的值,它也可以在db中传递给它的动态参数。假设一个基本网址是https://test.com/myapp.action,它也可以是https://test.com/myapp.action?userid=${user.userId}(传递动态参数),其中user.userId是另一个bean变量,现在这个url bean变量放在一个像这样的jsp

<a href="${url}"></a>

问题是它在DOM中解析为https://test.com/myapp.action?userid=${user.userId},但如果服务器会话中https://test.com/myapp.action?userid=myuser,我希望将其解析为user.userId="myuser"

1 个答案:

答案 0 :(得分:0)

您可以对servlet中的url进行一些处理,并解析嵌入的表达式 我只使用JSP进行演示。 这不是一般解决方案。它只适用于这种情况。它不会以其他方式与多个级联EL /占位符一起使用。

代码的作用基本上是

  • 按分隔符${}分割部分网址,
  • 解析嵌入式EL /占位符
  • 通过连接生成新网址

守则:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!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>JSP EL resolver</title>
</head>
<body>
<%
session.setAttribute("user.userId", "myuser");
pageContext.setAttribute("url", "https://test.com/myapp.action?userid=${user.userId}");
%>

url before preparation: <a href="${url}">${url}</a><br>

<%
String url = (String) pageContext.getAttribute("url");
String[] parts = url.split("\\$\\{|\\}");

String newUrl = parts[0];
String userEL = parts[1];

String sessionUser = session.getAttribute(userEL).toString();

pageContext.setAttribute("url", newUrl + sessionUser);
%>

url after preparation: <a href="${url}">${url}</a><br>

</body>
</html>

输出:

url before preparation: https://test.com/myapp.action?userid=${user.userId}
url after preparation: https://test.com/myapp.action?userid=myuser

这是一个解决方案,但是很脏。

更好的解决方案是:

  • 仅在DB或Property-File
  • 中存储基本路径
  • 创建一些附加参数(名称和值)的类

好处将是:

  • 少重复,
  • 减少数据库/磁盘存储空间,
  • 易于维护
  • 轻松更改基本网址