2016-12-06 120 views
0

我有一个bean变量,如url,它从db获取它的值,它也可以在db中传递一个动态参数。说,如果一个基本URL是https://test.com/myapp.action它也可以是如https://test.com/myapp.action?userid=${user.userId}(与通过动态参数),其中user.userId是另一个bean变量现在这个url豆变量被放置在一个jsp这样在JSP中解决JSP EL EL

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

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

+0

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

回答

0

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

代码做什么,基本上是

  • 分裂由分隔符零件链接${}
  • 解决嵌入式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 /磁盘存储将被浪费,
  • 易于维护
  • 容易改变的基础URL
+0

感谢您的努力。但在我的情况下,我不能添加在servlet中的前进。这是模板代码的所有部分,并且只需要找到解决级联EL分辨率的方法 – Rizstien

+0

HttpSessionAttributeListener怎么样?您可以在那里移动EL解析器代码。当attributeAdded()或attributeReplaced()时。被触发,调整价值。 –