2014-02-06 2 views
7

다음 액션 클래스에서 매개 변수 인터셉터를 사용하고 있습니다. Struts 2의 매개 변수 인터셉터와 함께 mutator 및 접근 자 (setter/getters)가없는 매개 변수

@Namespace("/admin_side") 
@ResultPath("/WEB-INF/content") 
@ParentPackage(value = "struts-default") 
@InterceptorRefs(@InterceptorRef(value="store", params={"operationMode", "AUTOMATIC"})) 
public final class TestAction extends ActionSupport implements Serializable, ValidationAware, Preparable 
{ 
    private static final long serialVersionUID = 1L; 

    private String param1; 
    private String param2; 

    //Getters and setters. 

    public TestAction() {} 

    @Action(value = "TestMessage", 
     results = { 
      @Result(name=ActionSupport.SUCCESS, type="redirectAction", params={"namespace", "/admin_side", "actionName", "Test"}), 
      @Result(name = ActionSupport.INPUT, location = "Test.jsp")}, 
     interceptorRefs={ 
      @InterceptorRef(value="paramsPrepareParamsStack", params={"params.acceptParamNames", "param1, param2", "params.excludeParams", "extraParam", "validation.validateAnnotatedMethodOnly", "true"}) 
     }) 
    public String insert() { 
     // Do something. Add or update a row to the database (one at a time). 
     addActionMessage("Action message"); 
     addActionError("Error message"); 
     return ActionSupport.SUCCESS; 
    } 

    @Action(value = "Test", 
    results = { 
     @Result(name = ActionSupport.SUCCESS, location = "Test.jsp"), 
     @Result(name = ActionSupport.INPUT, location = "Test.jsp")}, 
    interceptorRefs = { 
     @InterceptorRef(value = "paramsPrepareParamsStack", params = {"params.acceptParamNames", "param1, param2", "params.excludeParams", "extraParam", "validation.validateAnnotatedMethodOnly", "true", "validation.excludeMethods", "load"})}) 
    public String load() throws Exception { 
     // This method is just required to return an initial view on page load. 
     return ActionSupport.SUCCESS; 
    } 

    @Override 
    public void prepare() throws Exception {} 
} 

다음

<s:form>입니다 : 여기

<s:form namespace="/admin_side" action="Test" validate="true" id="dataForm" name="dataForm"> 
    <s:if test="hasActionMessages()"> 
     <s:actionmessage theme="jquery"/> 
    </s:if> 

    <s:if test="hasActionErrors()"> 
     <s:actionerror theme="jquery"/> 
    </s:if> 

    <s:hidden name="param1"/> 
    <s:hidden name="param2"/> 
    <s:hidden name="extraParam"/> 
    <s:submit value="Submit" action="TestMessage"/> 
</s:form> 

, extraParam 선언 결과적으로, 액션 클래스에는 세터와 게터가 없습니다되지 않은 숨겨진 양식 필드.

이 경우이 양식을 제출하면 서버 터미널에 다음 메시지가 나타납니다.

SEVERE : 개발자 알림 (false로 설정 struts.devMode는 이 메시지 비활성화) : '오류 설정 표현 클래스 actions.TestAction' ' 값 [와'extraParam 예기치 않은 예외가 에 'extraParam'을 설정 붙 잡았다 ']]

params.excludeParams 조치 클래스에서와 마찬가지로 매개 변수 extraParam을 제외하지 않습니다.

매개 변수 인터셉터를 사용하는 동안 이러한 예외를 방지 할 수 있습니까? 이러한 메시지는 동작 메시지에 불필요하게 추가되고 사용되는 경우 <s:actionmessage/>을 통해 표시됩니다 (전혀 표시되지 않아야 함). 이 paramsPrepareParamsStack가 다음 작업 클래스에 defaultStack로 대체


경우, 이러한 메시지가 표시되지 않습니다. 다음과 같이 경고합니다.

경고 : 매개 변수 [extraParam] 패턴의 excludeParams 목록에!

단지 말을하지 마십시오, 는 이러한 메시지를 해제하는 falsestruts.devMode을 설정합니다.

<interceptor-stack name="paramsPrepareParamsStack"> 
     <interceptor-ref name="exception"/> 
     <interceptor-ref name="alias"/> 
     <interceptor-ref name="i18n"/> 
     <interceptor-ref name="checkbox"/> 
     <interceptor-ref name="multiselect"/> 
     <interceptor-ref name="params"> 
      <param name="excludeParams">dojo\..*,^struts\..*</param> 
     </interceptor-ref> 
     <interceptor-ref name="servletConfig"/> 
     <interceptor-ref name="prepare"/> 
     <interceptor-ref name="chain"/> 
     <interceptor-ref name="modelDriven"/> 
     <interceptor-ref name="fileUpload"/> 
     <interceptor-ref name="staticParams"/> 
     <interceptor-ref name="actionMappingParams"/> 
     <interceptor-ref name="params"> 
      <param name="excludeParams">dojo\..*,^struts\..*</param> 
     </interceptor-ref> 
     <interceptor-ref name="conversionError"/> 
     <interceptor-ref name="validation"> 
      <param name="excludeMethods">input,back,cancel,browse</param> 
     </interceptor-ref> 
     <interceptor-ref name="workflow"> 
      <param name="excludeMethods">input,back,cancel,browse</param> 
     </interceptor-ref> 
</interceptor-stack> 

2 params 인터셉터가 있습니다

+0

매개 변수가 상속 된 이유는 무엇이라고 생각하십니까? –

+1

"* 매개 변수가 상속 되나요? *"이해가 안됩니다! – Tiny

+0

일부 구성이 있고 작업 또는 인터셉터에 대한 매개 변수가 있고 상위 패키지에서 매개 변수를 확장하면 클래스 또는 메소드에 주석을 지정하는 것과 같지 않게됩니다. –

답변

2

이미 요격 매개 변수의 인터셉터 CONFIGS에 의해 상속되지 않는다는 의견에 말한 부모 패키지는 기본 설정을 재정의하는 매개 변수 집합을 정의한 경우에만 사용할 수 있습니다. Interceptor Parameter Overriding Inheritance을 참조하십시오.

인터셉터 매개 변수의 두 가지 맵을 얻는 데 사용되는 기술도 있습니다 (Getting Interceptor Parameters in Struts2 참조).

컨벤션 플러그인은 상위 패키지에서 상속 된 XWork 패키지 구성을 만듭니다. Struts 2 Convention Plugin Define Multiple Parent Packages에 대한 내 대답을보십시오.

그렇다면 매개 변수를 세트에 추가하려면 상위 구성에서 설정된 기본 매개 변수를 무시해야합니다. interceptor 태그 또는 interceptor-stack 태그 중 하나이므로 각 interceptor-ref 태그에 대해이 작업을 수행해야합니다.

컨벤션 플러그인은 동일한 목적으로 @InterceprorRef 주석을 사용하지만 클래스에 적용 할 경우 해당 클래스의 각 동작에 적용되는주의 사항이 있습니다. 따라서 클래스 수준에서이 주석을 사용할 때는주의해야합니다. 인터셉터 스택 매개 변수를 재정의하고 있으므로 각 매개 변수 이름에 대해 스택에서 참조 된 인터셉터 이름의 접두어 다음에 접두사를 사용해야합니다. 그러나 스택에 interceptor-ref의 고유 이름이있는 경우에만 작동합니다.

당신이 paramsPrepareParamsStackparams 인터셉터의 두 개의 참조가있는 경우 다음 당신은 당신이 당신의 자신의 인터셉터 스택을 생성하지 않는 두 번째 paramsinterceptor-ref을 무시하고 인터셉터의 각 기준에 매개 변수 재 지정을 지정할 수 없습니다.

+0

감사합니다. 나중에 그것을 실천하려고 노력할 것입니다. – Tiny

1

paramsPrepareParamsStack을 살펴 수 있습니다. 액션 클래스에 excludeParams 매개 변수를 설정하면이 매개 변수는 첫 번째 params 인터셉터로 설정됩니다. 두 번째 인터셉터 매개 변수는 기본값으로 유지됩니다. 이제 두 번째 params 인터셉터 (기본값은 excludeParams)가 호출되면 주어진 예외가 발생합니다.

당신은 두 번째 인터셉터는 또한 설정 excludeParams 매개 변수의 설정을 복제하는 시도 할 수 있습니다 : 나는 정확히 말하는 게 아니에요

@InterceptorRef(value = "paramsPrepareParamsStack", params = {"params.acceptParamNames", "param1, param2", "params.excludeParams", "extraParam", "params.excludeParams", "extraParam", "validation.validateAnnotatedMethodOnly", "true", "validation.excludeMethods", "load"})}) 
+0

질문의 코드 스 니펫은 예제 일뿐입니다. 사실, 최종 사용자조차도 질문에서 언급 한 것과 같은 예외를 일으킬 수있는 악의적 인 매개 변수 (관심있는 URL의 길이에 따라)를 여러 개 제공 할 수 있으므로 'extraParam'으로 정의 된 매개 변수가 없습니다. 'params.acceptParamNames'는 나열된 매개 변수 만 받아 들여야합니다. 나머지는 ** 나타나는 질문 에서처럼 그러한 메시지를 발생시키지 않고 금지되어야합니다 **. – Tiny

+0

앞에서 언급했듯이,'paramsPrepareParamsStack'에는 2 개의'params' 인터셉터가 있습니다. 'params.acceptParamNames'를 설정하면 이것은 첫 번째 인터셉터에 대해서만 설정됩니다. 두 번째 인터셉터에 대해서도이 매개 변수를 설정하십시오. –

+0

매개 변수 인터셉터에서'params.acceptParamNames' 또는'params.excludeParams'를 두 번 지정해도 차이가 없습니다. 이 질문에서 언급 한 것처럼 예외를 막지는 못합니다. 따라서 현재 답변 수락을 고려하지 않으므로 [대답되지 않은 질문 목록] (http://stackoverflow.com/unanswered)에 나열됩니다. 나중에 고의적으로 또는 우발적으로 해결 방법을 접하게된다면 답을 업데이트하는 것을 잊지 마십시오. 아무리 많은 시간이 걸리더라도 몇 년이 걸릴 수도 있습니다. 이것은 내가 배울 수있는 유일한 곳입니다. 감사. – Tiny

1

,

샘플 코드로 다음

<s:form action="save" method="post"> 
    <s:textfield key="personBean.firstName" /> 
    <s:textfield key="personBean.lastName" /> 
    <s:textfield key="personBean.email" /> 
    <s:textfield key="personBean.phoneNumber" /> 
    <s:select key="personBean.sport" list="sports" /> 
    <s:radio key="personBean.gender" list="genders" /> 
    <s:select key="personBean.residency" list="states" listKey="stateAbbr" listValue="stateName"/> 
    <s:checkbox key="personBean.over21" /> 
    <s:checkboxlist key="personBean.carModels" list="carModelsAvailable" /> 
    <s:submit key="submit" /> 
</s:form> 

아마도이 링크가 작동하지 않을 수 있습니다.

+0

감사하지만 사실, 이해가 안됩니다. – Tiny