2014-01-22 2 views
3

이 문제는 ModelDriven 및 Struts 2.3.16과 관련이 있습니다. 액션에 전달 된 액세스 매개 변수로 변경된 params 인터셉터의 동작은 ModelDriven 액션과 함께 사용할 acceptParamNames 목록을 구성해야합니다. acceptParamNames 목록이 비어 있으면 기본적으로 기본 패턴을 통해 매개 변수를 수락하여 작동합니다. 우리가Struts 2의 ModelDriven을 통한 매개 변수 전달

ModelDriven 작용이 있다고 가정 :

@Namespace("/modelDriven") 
public class ModelDrivenAction extends ActionSupport implements ModelDriven { 

    private Gangster model = new Gangster(); 

    private String name; //getter and setter 

    public Object getModel() { 
    return model; 
    } 

    @Actions({ 
    @Action(value="modelDriven", [email protected](location = "/modelDriven/modelDriven.jsp")), 
    @Action(value="modelDrivenResult", [email protected](location = "/modelDriven/modelDrivenResult.jsp")) 
    }) 
    public String execute() throws Exception { 
    model.setName(name); 
    return SUCCESS; 
    } 
} 

모델 :

public class Gangster { 
    private String name; //getter and setter 
} 

modelDriven.jsp :

<s:form id="modelDrivenForm" action="modelDrivenResult" method="POST" namespace="/modelDriven">  
    <s:textfield 
     label="Gangster Name" 
     name="[1].name"/> 
    <sj:submit cssClass="btn btn-primary" executeScripts="true" targets="div1"/> 
</s:form> 

<div id="div1"/> 

modelDrivenResult.jsp : 액션 execute 방법 저희 params 인터셉터로 채워야 name 파라미터를 얻고, 그 결과에 표시 할 모델 속성을 초기화하는에서

<s:label 
    label="Gangster Name" 
    name="name"/><br/> 

. 그러나 문제는 매개 변수가 채워지지 않는다는 것입니다. 매개 변수 name을 params 인터셉터로 채우는 방법, 그래서 액션은 값을 표시 할 수 있습니까?

답변

0

name은 모델의 속성이며 동작 클래스의 속성입니다. modelDriven 인터셉터는 값 스택 맨 위에 모델을 푸시하므로 JSP에서 사용하기 쉽습니다. 액션 객체는 모델 아래에 있습니다. 따라서 접두어 [1]을 직접 사용하여 참조 할 수 있습니다. OGNL basics을 참조하십시오.

하지만 모델 및 액션 개체에 중복 된 속성 이름이 없어도 필요하지 않습니다. name과 같은 이름이 OGNL에 의해 평가 될 때 값 스택의 맨 위에서 속성 접근 자의 스택을 검색합니다. 처음 발견 된 접근자가 실행됩니다. 따라서 모델이 값 스택 맨 위에 있으므로 모델 속성이 우선 순위를 갖습니다.

이름이 name 인 속성을 작업에 설정해야하는 경우 해당 속성의 이름을 직접 [1].name으로 지정할 수 있습니다. 그러나 이러한 매개 변수 이름은 기본 패턴 인 params 인터셉터에서 허용되지 않습니다. 그러나 이것은 유효한 OGNL 표현식입니다. 따라서 인터셉터를 통과 시키려면 허용 된 매개 변수 이름의 패턴에 추가해야합니다. OGNL도 허용되는 매개 변수의 패턴을 확인하고이 정규식 패턴이 모두 params 및 OGNL 매처 (matcher)과 일치 할 수 있기 때문에 그

@Action(value="modelDrivenResult", [email protected](location = "/modelDriven/modelDrivenResult.jsp"), 
    interceptorRefs = @InterceptorRef(value="defaultStack", params={ 
    "params.acceptParamNames", "(\\[\\d+\\]\\.)*\\w+((\\.\\w+)|(\\[\\d+\\])|(\\(\\d+\\))|(\\['\\w+'\\])|(\\('\\w+'\\)))*" 
    }) 
) 

처럼입니다.

+0

나는 struts-2.3.15.2에서 당신의 질문과 비슷한 것을 시도해 보았고 괜찮 았는데, acceptParamNames를 변경할 필요가 없었습니다. 이것은 2.3.16에 다만 새롭다 ??? –

+0

'acceptParamNames'는 인터셉터를 통과하기 위해 이전 버전에서도 변경해야하지만, 새로운 버전에서는 매개 변수가 제외되면 영향을 미치지 않습니다. [Struts 2 Acceptable Parameters] (http://stackoverflow.com/a/20267397/573032) 및 [struts 2 setter getter가없는 액션] (http://stackoverflow.com/a/16604527/573032) –

+0

@ SiddharthTrikha 이것이 2.3.15.x가 아니라는 것을 이해하지 못합니까? Struts 2.3.16 구현 및 동작이 다릅니다. –

관련 문제