2012-08-16 4 views
2

우리는 스트럿츠 1.2.2를 사용하고 있으며 여기에 상황이 있습니다. 그래서 FormA와 FormB의 두 가지 형식이 있습니다. 두 개의 ActionA 및 ActionB도 있습니다.스트럿츠 1.2 - 한 동작에서 다른 동작으로 값 전달

이제 ActionA가 호출되면 FormA가 제출 된 Bean이됩니다. 모든 처리를 수행하고 양식을 저장하며 OrderId를 만들고 성공하면 ActionB로 전달합니다. 그런 다음 ActionB가 OrderId를 기반으로 FormB를 채운 후 다음 jsp로 전달합니다.

내용이 매우 다르기 때문에 두 작업이 양식을 공유하는 것을 원하지 않으며 양식이 jsp 페이지에서 나타내는 내용 만 나타내도록하고 싶습니다. 또한 모든 페이지에서 Db에 콘텐츠를 저장합니다. 흐름에는 5 페이지가 있고 한 페이지는 2 페이지 뒤에 나올 수 있습니다. 다시 돌아와서 1 페이지부터 시작하십시오. 그러나 페이지 1과 페이지 2는 DB와 표시에서 데이터를 검색해야합니다. 따라서 orderID가 존재할 경우 우리는 DB로부터 데이터를 가져 와서 해당 orderId를 기반으로 양식을 채 웁니다.

그러나 한 주문에서 다른 주문으로이 주문을 전달하는 쉬운 방법을 찾지 못했습니다.

컨트롤이 ActionB에 도달 할 때까지 완전히 새로운 요청 개체가 있으므로 ActionA의 끝에 request.setAttribute()을 사용할 수 없습니다. 나는 하나의 행동에서 다른 행동으로 진행되는 앞으로의 행동을 추측하고있다. 그러나 jsp로 전달하면 요청은 유지됩니다.

사람이 북마크 URL을 시도 할 수 있습니다 다음 해당 페이지는 단순히 세션에서 마지막으로 저장 OrderID를 데리러 것이며, 그 처리하려고으로 session.setAttribute()으로 세션에서 주문 ID를 저장하지 마십시오.

또한 공유 할 수 없으므로 formbeans에 넣을 수는 없습니다.

하나의 옵션은이를 URL에 매개 변수로 전달하는 것입니다. ActionB? OrderId = 89. 그러나 단점은 누군가가 URL에서 orderId를 변경하고 임의의 orderId에 대한 데이터를 가져올 수 있다는 것입니다. 다른 고객에게 속한 주문을 볼 수있는 권한이없는 사람을 방지하기 위해 항상 수표를 넣을 수는 있지만 현재로서는 복잡한 프로세스입니다. 또한 Struts 1.2.2에서 새로운 ActionForward 객체를 프로그래밍 방식으로 생성 한 다음 현재 경로의 끝에 "? OrderId = 89"를 명시 적으로 추가해야한다고 생각합니다.

도움이 되었습니까?

답변

2

사실 저는 세션에 넣을 것입니다. 그런 다음 ActionB에서 검색하면 즉시 삭제하십시오. 플래시 변수를 범위로

Integer orderId = session.getAttribute("myapp.OrderId"); 
session.removeAttribute("myapp.OrderID"); 

는 통상적으로 공지되어있다. Struts에는 공식 플래시 스코프가 없지만이를 시뮬레이트합니다.

ActionA가 세션에서이 변수를 설정하고 ActionB로 전달하고 ActionB가 세션에서이 변수를 가져 와서 삭제하기 때문에 기본적으로 OrderId를 다시로드 할까 걱정됩니다. 누군가 세션에서 멈추는 유일한 방법은 ActionA가 완료된 후 ActionB가 실행되기 전에 요청을 중지하는 것입니다. ActionB가 실행되기 전에는 그럴 가능성이 거의 없으며 어쨌든 ActionB를 보았을 때 제거 될 수 있습니다.

이것도 ActionB에 넣어서 OrderID가 세션에 있는지 확인하고 그렇지 않은 경우 ActionA로 전달합니다.

관련 문제