1. 문제 제기
struts2에서 ModelDriven <modey> 인터페이스가 구현되면 전달 된 매개 변수를 모델에 주입 할 수 있고 모델을 동작에 사용할 수 있지만 동일한 동작에 사용해야하는 두 가지 모델이 있으면 어떻게해야합니까? 예를 들어, 이전 섹션에서는 온라인 결제 기능을 완료했지만 결제는 아직 끝나지 않았습니다. 우리는 제 3 자로부터 정보 피드백을 받아야합니다. 예를 들어, 성공적인 결제 후에는 지불 인에게 이메일과 문자 메시지를 보내야합니다. 따라서 우리는 또한 지불에서 제 3 자로부터 전달 된 매개 변수를 얻어야합니다. 제 3 자에서 전달 된 매개 변수는 우리가 통과 한 매개 변수와 다르기 때문에 해당 매개 변수를 받으려면 모델 (BackData)을 작성해야합니다. 따라서 문제는 당사의 지불이 다음과 같이 작성되었습니다. 공개 클래스 지불은 Baseeaction <SendData>를 확장합니다. 그렇다면 어떻게 행동으로 다른 모델을 받고 다르게 처리해야합니까?
솔루션이 있습니다 (실제로 솔루션이라고 할 수는 없습니다 ... 전혀 해결되지 않기 때문에 ...) 모델을 작성한 다음 SendData와 BackData를 상속하는 것이지만 문제는이 두 모델이 전혀 할 일이 없다는 것입니다. 왜 같은 모델을 상속해야합니까? 따라서이 솔루션은 실제로 위의 문제를 피하고 있습니다.
이 문제는 SpringMVC에서 잘 해결되었습니다 (SpringMVC는 실제로 학습을 시작하지 않았습니다. 무언가 잘못을 말하면 수정하십시오!) SpringMVC의 각 방법은 모델에 해당하기 때문에 각 동작이 모델에 해당하기 때문에 편리합니다. 나는 동일한 동작으로 두 가지 방법을 쓸 수 있으며 다른 방법은 다른 모델을 다룹니다.
2. 문제에 대한 해결책
Struts2는 또한이 문제에 대한 해결책을 제공합니다.
struts2는 이전에 언급 된 요청, 세션, 응용 프로그램 등과 같은 ActionContext에 많은 맵을 저장합니다. 요청의 모든 요청 매개 변수를 저장하는 매개 변수도 있습니다. 우리의 행동이 ParameterAware 인터페이스를 구현하는 한, 우리는이 매개 변수를 얻을 수 있습니다. 이것은 ModelDriven과 동일합니다. ModelDriven <mode> 인터페이스를 구현하면 작업에서 모델을 얻을 수 있습니다. 즉, 모델을 정의하고 세트 메소드를 구현할 수 있습니다.
자, 이제 문제를 해결하기 쉽습니다. 결제 매개 변수와 반환 된 매개 변수는 다릅니다. 즉, Payacition을 두 번 입력하는 매개 변수는 다릅니다. 즉, 매개 변수에 설치된 데이터는 다릅니다. 행동에서 매개 변수를 선택하는 한 (매개 변수는 두 개의 다른 요청 요청과 구별 될 수 있음) 판단으로 매개 변수 (sendData 또는 백다타)를 수신하는 데 어떤 모델을 사용해야하는지 알 것입니다. 지불로 코드를 다시 작성해 봅시다.
@Controller ( "Payaction")@scope ( "프로토 타입") 공개 클래스 지불은 Baseeaction <bood> 구현 ParameterAware {// SendData를 위에서 상속받은 BASEECIP에 기록 할 수 없음을 참고하십시오. 객체를 써야합니다. 나중에, 우리는 어떤 것을 사용해야하는지 // 맵을 정의하기 위해 맵을 정의 할 것입니다. @override public void setparameters (map <string, string []> 매개 변수) {this.parameters = 매개 변수; } / *Struts-default.xml 기사에서 ServletConfig 인터셉터는 ModelDriven 전에 실행되므로 모델을 주입하면 요청 매개 변수를 이미 사용할 수 있으므로 GetModel () 메소드에서 매개 변수를 사용하여 매개 변수에 의해 사용되는 요청을 결정할 수 있습니다. 반환하지 않음 //이 방법 으로이 매개 변수를 사용하여 지불 또는 반환되는지를 결정할 수 있습니다. } else {model = new backData (); } 반환 모델; } // yibao 공개 문자열로 데이터를 전송하는 메소드 gobank () {// 해당 전송 모델 : sendData sendData sendData = (sendData) 모델; // 데이터 전송 논리는 이전 섹션에서 구현되었습니다 ...} // 반환 된 데이터 수신 방법 public void backbank () {// 해당 수신 모델 : BackData BackData BackData = (BackData) 모델; // 반환 된 데이터 처리의 논리 ... 나중에 구현됩니다. // struts2의 지식 지점 직접 다중 모델 요청}}}3. Struts2 처리 흐름
위의 원리를 이해하는 데 더 도움이 될 struts2의 실행 프로세스를 분석 해 봅시다. 스트럿 처리 흐름 :
1) 요청을 얻은 후 먼저 액션의 프록시를 작성한 다음 프록시를 만들 때 동작을 만듭니다.
2) 18 개의 인터셉터를 실행 한 다음 인터셉터가 성공적으로 실행 된 후 작업 방법을 호출하십시오.
3) 동작 방법이 실행 된 후 18 개의 인터셉터가 호출됩니다. 따라서이 과정에 따르면, 우리는 다음을 알고 있습니다. 먼저 액션을 만들고 인터셉터를 실행 한 다음 (첫 번째 ServletConfig를 실행 한 다음 ServletConfig 인터셉터가 ModelDriven 앞에 장착되어 있기 때문에 모델 드라이브를 실행). 따라서 위 코드에서는 getModel () 메소드의 ParametErmap의 데이터를 사용하여 판단 할 수 있습니다.
다음 간단한 타이밍 다이어그램을 사용하여 위의 처리 흐름을 직관적으로 표현하십시오.
이것은 struts2 직관의 처리 흐름을 보여 주므로 위의 처리 다중 모델 요청을 쉽게 이해할 수 있습니다. 이 시점에서, 여러 모델 요청을 처리하기위한 struts2 방법의 일부가 분석되었습니다. 다음은이 프로젝트의 작은 논리입니다.
4. 데이터 수신 방법을 향상시킵니다
이것의 논리는 논리의 구현, 즉 리턴 된 데이터를 처리하는 것입니다. 여기에 논리는 주로 다음과 같습니다. 주문 상태 업데이트 (지불, 배송 등), 이메일 보내기, 문자 메시지 보내기 등. 우리는 먼저 주문 상태를 완료하고, 이메일을 보내고, 주제에 문자 메시지를 보내 며, 나중에 작성합니다.
먼저 Backbank () 메소드를 향상시킵니다.
public void backbank () {backData backData = (backData) 모델; System.out.println (모델); 부울 isok = payservice.checkbackdata (backdata); if (isok) {// 1. 주문 상태를 업데이트하면 매개 변수는 데이터베이스의 상황에 따라 Forderservice.upDatestatusByid (integer.valueof (201605006), 2)에 따라 전송됩니다. // 2. 사용자 이메일 주소 // 3에 따라 이메일을 보내십시오. 휴대 전화 문자 메시지 System.out.println ( "---- 성공 !! -----"); } else {system.out.println ( "---- 거짓 !!! -----"); }}그런 다음 Payservice에서 CheckBackData (BackData) 메소드를 완료합니다 (논리는 기본적으로 섹션 21과 동일).
@Service ( "PayService") Public Class PayserviceImpl은 Payservice {// 관련없는 코드/*********************************************************************************************************************************************************************************************** // {// 암호화 검증을 준비하려면 문자열을 추가하십시오. StringBuffer infoBuffer = new StringBuffer (); infobuffer.append (backData.getp1_merid ()); infobuffer.append (backData.getr0_cmd ()); infobuffer.append (backData.getr1_code ()); infobuffer.append (backData.getr2_trxId ()); infobuffer.append (backData.getr3_amt ()); infobuffer.append (backData.getr4_cur ()); infobuffer.append (backData.getr5_pid ()); infobuffer.append (backData.getr6_order ()); infobuffer.append (backData.getr7_uid ()); infobuffer.append (backData.getr8_mp ()); infobuffer.append (backData.getr9_btype ()); return infobuffer.toString (); } // 반환 된 데이터를 암호화하여 보낸 암호 텍스트와 비교하십시오. 괜찮다면 데이터가 변조되지 않았 음을 의미합니다. public boolean checkbackdata (backdata backdata) {문자열 joinparam = this.joinbackdataparam (backdata); // 자신의 암호 텍스트 문자열을 가져옵니다. // ciphertext를 반환 md5.equals를 통해 전송 된 암호 텍스트와 비교합니다 (backData.gethmac ()); }}마지막으로 Forderservice에서 updatestatusByid 메소드를 완료합니다.
// Forderservice 인터페이스 공용 인터페이스 ForderService 확장베이스 서비스 <forder> {// 다른 관련없는 코드를 생략합니다 ... // 순서 번호에 따라 주문 상태를 업데이트합니다. public void updatestatusByid (int id, int sid);} // forderServiceplplpplp <forderService plorever <forderserviceplply "). implements forderservice {// 다른 관련없는 코드를 생략 @override public void void updatestatusbyid (int id, int sid) {String Hql = "업데이트 forder f set f.status.id = : sid where f.id = : id"; getSession (). Createquery (HQL) .setInteger ( "sid", sid) .setInteger ( "id", id) .executeUpdate (); }}이렇게하면 고객이 지불 한 후 주문 상태가 업데이트 될 수 있습니다.
원본 링크 : http://blog.csdn.net/eson_15/article/details/51465067
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.