2012-08-10 17 views
2

當我使用攔截器時,Action類中的值爲空。我已經刪除了攔截器,這些值來自JSP頁面。當使用攔截器時,Struts2參數在操作類中將爲null

的Login.jsp

<s:form id="loginFrm" name="loginFrm" action="LoginAction"> 
      <s:textfield key="username"/> 
      <s:password key="password"/> 
      <s:submit/> 
    </s:form> 

LoginAction.java

public class LoginAction { 

    private static Logger LOGGER = Logger.getLogger(LoginAction.class); 

    private String username; 
    private String password; 

    public String execute() throws Exception { 
     LOGGER.info("LoginAction : authenticate()"); 
     LOGGER.info("LoginAction : {[" + username + "],["+password+ "]}"); 
     return "success"; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 
} 

的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
    <display-name>Bulk Fund Switching</display-name> 
    <context-param> 
     <param-name> org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG </param-name> 
     <param-value>/WEB-INF/tiles.xml</param-value> 
    </context-param> 
    <listener> 
     <listener-class>org.apache.struts2.tiles.StrutsTilesListener </listener-class> 
    </listener> 
    <filter> 
     <filter-name>struts2</filter-name> 
     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>struts2</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    <welcome-file-list> 
     <welcome-file>jsp/Login.jsp</welcome-file> 
    </welcome-file-list> 
</web-app> 

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="false" /> 
    <constant name="struts.devMode" value="false" /> 
    <constant name="struts.custom.i18n.resources" value="BFSView,BFSMessages" /> 

    <package name="home-default" extends="struts-default" namespace="/"> 

     <result-types> 
      <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" /> 
     </result-types> 

     <interceptors> 
      <interceptor name="AuthenticationInterceptor" class="com.lv.bfs.controller.interceptor.AuthenticationInterceptor"></interceptor> 
      <interceptor-stack name="SecureStack"> 
       <interceptor-ref name="AuthenticationInterceptor" /> 
      </interceptor-stack> 
     </interceptors> 

     <action name="LoginAction" class="com.lv.bfs.controller.action.LoginAction"> 
      <result name="success">jsp/Welcome.jsp</result> 
      <result name="error">/jsp/Login.jsp</result> 
     </action> 
    </package> 
</struts> 

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="false" /> 
    <constant name="struts.devMode" value="false" /> 
    <constant name="struts.custom.i18n.resources" value="BFSView,BFSMessages" /> 

    <package name="home-default" extends="struts-default" namespace="/"> 

     <result-types> 
      <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" /> 
     </result-types> 

     <interceptors> 
      <interceptor name="AuthenticationInterceptor" class="com.lv.bfs.controller.interceptor.AuthenticationInterceptor"></interceptor> 
      <interceptor-stack name="SecureStack"> 
       <interceptor-ref name="AuthenticationInterceptor" /> 
      </interceptor-stack> 
     </interceptors> 

     <action name="LoginAction" class="com.lv.bfs.controller.action.LoginAction"> 
      <interceptor-ref name="SecureStack"></interceptor-ref> 
      <result name="success">jsp/Welcome.jsp</result> 
      <result name="error">/jsp/Login.jsp</result> 
     </action> 
    </package> 
</struts> 

AuthenticationInterceptor.java

public class AuthenticationInterceptor extends AbstractInterceptor { 

    private static Logger LOGGER = Logger.getLogger(AuthenticationInterceptor.class); 

    private static final long serialVersionUID = 1844249996954274967L; 

    public String intercept(ActionInvocation invocation) throws Exception { 
     LOGGER.info("intercept : START"); 
     return invocation.invoke(); 
    } 
} 

日誌報表(包括案件)

12:39:05,533 INFO [AuthenticationInterceptor] intercept : START 
12:39:05,533 INFO [LoginAction] LoginAction : authenticate() 
12:39:05,533 INFO [LoginAction] LoginAction : {[null],[null]} 



12:09:05,533 INFO [LoginAction] LoginAction : authenticate() 
12:09:05,533 INFO [LoginAction] LoginAction : {[admin],[admin]} 

有什麼建議嗎?

回答

3

當您爲特定操作定義攔截器堆棧時,必須爲該操作定義全部攔截器。在這種情況下,你只需要定義你的自定義攔截器,意思是「params」攔截器不會運行,所以動作屬性不會被設置。

要麼定義一個包含正常S2攔截器的新堆棧,要麼在操作配置中包含這些攔截器(或堆棧)。

+0

有關Dave的含義的示例,請參閱我對此類似問題的回答:http://stackoverflow.com/questions/6384336/struts-2-action-variables-not-populated-after-interceptors-invocation-invoke 。 – nmc 2012-08-11 00:31:08