【问题标题】:Resolve JSP EL within JSP EL在 JSP EL 中解析 JSP EL
【发布时间】:2016-12-06 17:55:00
【问题描述】:

我有一个 bean 变量,比如 url,它从 db 获取它的值,它也可以在 db 中传递一个动态参数。假设一个基本 url 是 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

【问题讨论】:

  • 请提供更多信息。什么是允许的,什么是不允许的?什么可以改变,什么不能?

标签: jsp dom el


【解决方案1】:

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

代码做什么,基本上是

  • 通过分隔符${}将url分成几部分,
  • 解析嵌入的 EL/占位符
  • 通过拼接生成新的url

守则:

<%@ 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 或属性文件中
  • 创建一些附加参数(名称和值)的类

好处是:

  • 少重复,
  • 将浪费更少的数据库/磁盘存储,
  • 易于维护
  • 轻松更改基本网址

【讨论】:

  • 感谢您的努力。但就我而言,我无法在 servlet 中添加处理。这都是模板代码的一部分,只需找到解决级联 EL 分辨率的方法
  • HttpSessionAttributeListener 呢?您可以将 EL-resolver-code 移到那里。当attributeAdded() 或attributeReplaced() 时。被触发,调整值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 2010-09-22
  • 1970-01-01
相关资源
最近更新 更多