ActionServlet은 클라이언트의 요청이 있으면, 요청을 처리해줄 RequestProcessor를 찾아 클라이언트의 요청을 전달한다.
RequestProcessor는 클라이언트에서 전달된 파라미터를 설정 파일에 지정된 ActionForm을 생성하여 필드에 저장한다. 그리고 나서 RequestProcessor는 클라이언트의 요청 URL에 따라 Action을 선택하여 execute() 메소드를 호출한다. 이때 앞서 생성한 ActionForm을 매개 변수로 전달한다.
Action은 클라이언트의 요청을 수행하기 위해 Model 영역의 비즈니스 서비스 로직을 수행하고, 수행한 결과 값을 ActionFrom 개체나, DTO 개체를 요청 스코프, 세션 스코프 중 한 곳에 저장한다. 그리고 수행한 결과에 따라 ActionForward를 생성한 후, RequestProcessor로 리턴한다.
RequestProcessor는 Action에서 리턴한 ActionForward에 따라 View 영역의 JSP를 호출한다. JSP는 프리젠테이션 로직을 수행하고 수행 결과(주로 HTML)을 사용자에게 전달한다.
public void process(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
// 특정 래퍼로 다중 요청을 래핑한다.
request = processMultipart(request);
// 매핑을 선택하기 위한 path 컴포넌트를 정의한다.
String path = processPath(request, response);
if (path == null) {
return;
}
if (log.isInfoEnabled()) {
log.info("Processing a '" + request.getMethod() +
"' for path '" + path + "'");
}
// 현재 사용자 요청의 Locale을 결정한다.
processLocale(request, response);
// 컨텐츠 타입과 no-caching 헤더를 설정한다.
processContent(request, response);
processNoCache(request, response);
// 범용 전처리 후크(hook)
if (!processPreprocess(request, response)) {
return;
}
// 매핑을 정의한다.
ActionMapping mapping = processMapping(request, response, path);
if (mapping == null) {
return;
}
// action을 실행하는 데 요구되는 규칙이 있는지를 확인한다.
if (!processRoles(request, response, mapping)) {
return;
}
// 요청과 관련 있는 ActionForm 빈즈를 처리한다.
ActionForm form = processActionForm(request, response, mapping);
processPopulate(request, response, form, mapping);
if (!processValidate(request, response, form, mapping)) {
return;
}
// 매핑에 의해 정의된 포워드(forward)나 인클루드(include)를 처리한다.
if (!processForward(request, response, mapping)) {
return;
}
if (!processInclude(request, response, mapping)) {
return;
}
// 요청을 처리하는 Action 인스턴스를 생성하거나 얻는다.
Action action = processActionCreate(request, response, mapping);
if (action == null) {
return;
}
// Action 인스턴스 자신을 호출한다.
ActionForward forward =
processActionPerform(request, response,
action, form, mapping);
// 반환되는 ActionForward 인스턴스를 처리한다.
processActionForward(request, response, forward);
}
HttpServletResponse response)
throws IOException, ServletException {
// 특정 래퍼로 다중 요청을 래핑한다.
request = processMultipart(request);
// 매핑을 선택하기 위한 path 컴포넌트를 정의한다.
String path = processPath(request, response);
if (path == null) {
return;
}
if (log.isInfoEnabled()) {
log.info("Processing a '" + request.getMethod() +
"' for path '" + path + "'");
}
// 현재 사용자 요청의 Locale을 결정한다.
processLocale(request, response);
// 컨텐츠 타입과 no-caching 헤더를 설정한다.
processContent(request, response);
processNoCache(request, response);
// 범용 전처리 후크(hook)
if (!processPreprocess(request, response)) {
return;
}
// 매핑을 정의한다.
ActionMapping mapping = processMapping(request, response, path);
if (mapping == null) {
return;
}
// action을 실행하는 데 요구되는 규칙이 있는지를 확인한다.
if (!processRoles(request, response, mapping)) {
return;
}
// 요청과 관련 있는 ActionForm 빈즈를 처리한다.
ActionForm form = processActionForm(request, response, mapping);
processPopulate(request, response, form, mapping);
if (!processValidate(request, response, form, mapping)) {
return;
}
// 매핑에 의해 정의된 포워드(forward)나 인클루드(include)를 처리한다.
if (!processForward(request, response, mapping)) {
return;
}
if (!processInclude(request, response, mapping)) {
return;
}
// 요청을 처리하는 Action 인스턴스를 생성하거나 얻는다.
Action action = processActionCreate(request, response, mapping);
if (action == null) {
return;
}
// Action 인스턴스 자신을 호출한다.
ActionForward forward =
processActionPerform(request, response,
action, form, mapping);
// 반환되는 ActionForward 인스턴스를 처리한다.
processActionForward(request, response, forward);
}
※ 자카르타 스트럿츠 프로그래밍 참조
'FrameWork' 카테고리의 다른 글
Model 영역 (0) | 2018.10.20 |
---|---|
Struts 자동가입방지 simplecaptcha 사용하기 (0) | 2018.10.20 |
스트럿츠 프레임워크 구조 (0) | 2018.10.20 |
스트럿츠(Struts) 소개 (0) | 2018.10.20 |
MVC 디자인 패턴 (0) | 2018.10.20 |