2016-12-06 90 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()時。被觸發,調整價值。 –