1. 程式人生 > >解決方法|struts2執行action前加入攔截器,導致獲取不到引數

解決方法|struts2執行action前加入攔截器,導致獲取不到引數

今天學到使用ONGL表示式實現型別轉換

雖然我還是不懂ONGL表示式是啥,但抱著“先get書本例子的方法再慢慢深入學習”的想法還是跟著書本敲程式碼

結果!在結果頁面裡怎麼也獲取不到輸入的引數!

經過百度後發現,是因為我使用了自定義的攔截器,

如果在配置檔案中加入了自定義的攔截器,那預設的攔截器就不會起作用,在Action中就不能取得表單的引數這個時候,就需要顯式地呼叫預設的攔截器defaultStack(注意順序,先呼叫預設的攔截器)

下面是我的程式碼:

輸入引數的jsp:

<s:form action="load" method="post" name="myform">
<s:textfield label="使用者名稱" name="user.uname"/><br/>
<s:textfield label="年齡" name="user.uyear"/><br/>
<s:textfield label="性別" name="user.usex"/><br/>
<s:submit value="確認"></s:submit>
</s:form>

action:

package simon;
import com.opensymphony.xwork2.ActionSupport;
import simon.userBean;
public class action extends ActionSupport{
	private userBean user;
	public userBean getUser() {
		return user;
	}
	public void setUser(userBean user) {
		this.user = user;
	}	
	public String execute() {
		return "success";
	}
}

struts.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
        <constant name="struts.enable.DynamicMethodInvocation" value="true" />
        <constant name="struts.devMode" value="true" />
	<package name="nothing" extends="struts-default">
		<interceptors>
			<interceptor name="inn" class="simon.Person" />
		</interceptors>		
		<action name="load" class="simon.action">
			<result name="success">/success.jsp</result>
			<interceptor-ref name="defaultStack"/> <!--注意順序,先呼叫預設的攔截器-->
			<interceptor-ref name="inn"></interceptor-ref>
		</action>
	</package>
</struts>

結果jsp:

你輸入的內容如下:<br/>
姓名:<s:property value="user.uname" /><br/>
年齡:<s:property value="user.uyear" /><br/>
性別:<s:property value="user.usex" />

“Struts2中很多的功能是用攔截器實現的,比如:取得表單引數,檔案上傳,異常處理等

Struts2會預設呼叫預設的攔截器,預設攔截器配置在struts-default.xml中可以檢視

如果在配置檔案中加入了自定義的攔截器,那預設的攔截器就不會起作用,在Action中就不能取得表單的引數”