1.定義全局result
當多個action中都使用到了相同視圖,這時我們應該把result定義爲全局視圖。struts1中提供了全局forward,struts2中也提供了相似功能:
<package ....>
<global-results>
<result name="message">/message.jsp</result>
</global-results>
</package>
經過上面的定義後就可以在同一個包內進行全局result了。如果想在整個web應用中都進行全局轉發,這裏就得使用extends了。大概思路如下:
<package name="base" extends="struts-default">
<global-results>
<result name="message">/message.jsp</result>
</global-results>
</package>
<package name="guo" extends="base">
....
</package>
2.action中的result的各種轉發類型
result中可以配置轉發類型,常用的類型有dispatcher(默認),redirect,redirectAction,plainText。
1)dispatcher
默認就是它
2)redirect
設置result的type爲redirect,我們可以發現瀏覽器的地址欄發生了改變,他爲重定向的方式
<action name="redirect">
?<result type="redirect">
?/redirect.jsp
?</result>
</action>
在真實的需求中我們往往需要在重定向的同時傳遞參數,下面我用兩個例子來說明。
一.傳遞英文
A.action中
public class User extends ActionSupport{
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
username="guolei";
System.out.println(username);
return "redirect";
}
}
B.struts.xml中
<action name="redirect" class="action.User">
<result type="redirect" name="redirect">
/redirect.jsp?username=${username}
</result>
</action>
C.redirect.jsp中
<body>
重定向${param.username }
</body>
傳遞英文比較簡單,需要提醒自己的是不要忘記在jsp頁面中如何用EL表達式接受參數
二.傳遞中文
記住永遠不要在瀏覽器的地址欄中傳遞中文。在傳遞中文前先進行編碼
A.action中
public class User extends ActionSupport{
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
username=URLEncoder.encode("郭蕾","utf-8");//先進行編碼
System.out.println(username);
return "redirect";
}
}
B.struts.xml中
<action name="redirect" class="action.User">
<result type="redirect" name="redirect">
/redirect.jsp?username=${username}
</result>
</action>
在這裏使用了類似於el表達式的方式傳值,${username}其中username爲action中定義的
C.redirect.jsp中
<body>
重定向
<%String s=request.getParameter("username");
s=new String(s.getBytes("iso8859-1"),"utf-8");
s=URLDecoder.decode(s,"utf-8");
out.println(s);
%>
</body>
重定向中傳遞中文先進行編碼,在jsp頁面中先接受參數,然後對其進行字節分解,然後進行解碼。
3)redirectAction
他經常用於防止重複提交,比方說在增加完用戶之後要顯示列表
一.在同一個包中
<action name="redirectAction" class="action.User">
<result type="redirectAction" name="redirect">
show
</result>
</action>
把show寫爲要重定向到得action的名字
二.不在同一個包中
<package name="study1" extends="struts-default">
<action name="redirectAction" class="action.User">
<result type="redirectAction" name="redirect">
<param name="actionName">show</param>//這裏寫對應的action名字
<param name="namespace"></param>//這裏寫命名空間
</result>
</action>
</package>
4)plainText
plaintext:顯示原始文件內容,例如:當我們需要原樣顯示jsp文件源代碼 的時候,我們可以使用此類型。
<result name="source" type="plainText ">
<param name="location">/xxx.jsp</param>?
<param name="charSet">UTF-8</param><!-- 指定讀取文件的編碼 -->
</result>