${s}指取page、requst、session、application四個範圍內的屬性attributejavascript
1、若是想要使用el表達式或者是${}取出來,在這四個域中必需要set進去:html
(1)使用request.setAttributejava
<% String str = "abc"; request.setAttribute("s",str); %>
(2)使用<c:set var="s" value="abc" scope="page|request"/>json
這樣,在頁面能夠使用${s}或${requstScope.s}取出session
若是僅僅是這樣作,而沒有在request等域中set進去,那麼是取不到值的:app
<!--只是在jsp翻譯而得的類中service方法中定義一個局部變量而已--> <% String str = "abc"; %>
2、更簡單的寫法:jsp
能夠在JSP頁面定義變量,使用<%%>取出便可,例如:google
<%
String id = request.getParameter("id");
int val = 999;
%>
<%=id%>
<%=val%>spa
項目代碼JSP:翻譯
<body> <% String myHost = (String)request.getAttribute("requestHost") ; if(myHost == null || myHost.equals("localhost:8080")){ myHost = "e.test"; }; request.setAttribute("myHost",myHost); request.setAttribute("queryParam","1"); %> <span> <a onclick="window.location='https://${myHost}/test/login'" href="javascript:void(0);" > 快捷登陸 </a> </span> </body>
須要注意的是使用EL表達式能夠順利取出,由於EL表達式會依次從幾個域中取值,直到取到值爲止,可是使用struts2的標籤<s:>取值不能夠,除非
指定JSP頁面的做用域,例如:
<s:if test='#queryParam=="1"'><!-- 這麼寫會發現永遠顯示bbb -- > aaa </s:if> <s:else> bbb </s:else> <s:if test='%{#request.queryParam=="1"}'><!-- 這麼寫會發現能夠正確取到queryParam,由於指定了做用域爲request-- > aaa </s:if> <s:else> bbb </s:else> <s:textfield name="queryParam"/><!-- 不能取到值 -- > <s:textfield name="%{#request.queryParam}"/><!-- 能夠取到值 -- > <s:textfield name="#request.roleTypeFlag"/><!-- 能夠取到值,不須要寫%{} -- > ${ queryParam} <!-- 能夠取到值 -- >
IE中的問題:
在IE中,若是在循環<s:iterator value="consumptions" var="obj" status="l">中獲取被循環的consumptions的總長度,會獲取不到,能夠這麼作:
(1)在JSP頁面定義變量,而後放入請求域中(在struts2中保存在值域中的值,爲何能夠在請求域request中取到,可是在session中取不到,不明白原理...):
<%
java.util.ArrayList consumptions = (java.util.ArrayList)request.getAttribute("consumptions");//這裏須要寫全類名,覺得java.util在jsp頁面沒有引入
System.out.println(consumptions.size());//獲取consumptions集合的長度
System.out.println("獲取的consumptions的長度..."+request.getAttribute("consumptions.size"));//這麼寫也能夠獲取consumptions的長度
request.setAttribute("size",consumptions.size());
request.setAttribute("size",request.getAttribute("consumptions.size"));
%>
(2)在循環中,利用el表達式獲取請求域request中的值
<s:iterator value="consumptions" var="obj" status="l"> <!-- 這麼寫能夠正確的獲取到 --> ${size} <!-- 這麼寫在IE中獲取的集合爲空[],獲取集合的長度爲0,可是在google中能夠正確獲取到 --> <s:property value="consumptions.size"/> </s:iterator>
在JSP頁面循環輸出<tr><th><td></td></th></tr>
值棧中object的operationerDepEn 屬性中保存的值爲:"{"計劃":"2013-2018","實際":"2013-2018"}";
//operationerDepEn 爲值棧中object對象的屬性,有getOperationerDepEn()方法 //該屬性類型爲字符串,保存的時候是保存JSON格式的字符串 <% String operationerDepEn = (String)request.getAttribute("object.operationerDepEn"); Map<String,String> map = null; //判斷是否有值,而且含有"{",若是有,表示保存的時候保存的值是JSON字符串格式 if(operationerDepEn != null && operationerDepEn.indexOf("{") != -1){ map = (Map)JSON.parse(operationerDepEn); //把JSON格式的字符串轉化爲Map } if(map != null){ for(String key:map.keySet()){ //循環輸出多個tr out.println("<tr><th>"+key+"</th><td>"+map.get(key)+"</td></tr>"); } } %>
JSP頂部引入java類:
<%@ page import="com.alibaba.fastjson.JSON" %>
<%@ page import="java.util.Map" %>
頁面顯示效果: