RequestProcessor 클래스
ActionServlet의 process메소드는 아래와 같습니다.
protected void process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
RequestUtils.selectAllication(request, getServletContext());
getApplicationConfig(request).getProcessor().process(request, response);
}
이 과정이 수행된 후 다음 단계에서는 org.apache.struts.action.RequestProcessor의 process 메소드가 호출 됩니다.
-------------------------------------------
RequestProcessor의 확장 메소드
-------------------------------------------
processMultipart : 멀티파트 요청을 래핑
processPath : 매핑을 선택 하는데 사용 할 경로 컴포넌트 정의
processLocale : 만약 요청이 들어 온다면 현재 사용자의 지역을 선택
processContent : 요청안의 ContentType을 결정
processNoCache : 이 모듈이 사용 가능 하다면 요청내의 Cache가 없는 헤더를 설정
processPreprocess : 범용 전처리 훅으로서의 기능
proceeMapping : 이 요청을 위한 매핑을 정의
processRoles : 이 액션을 수행 하기 위한 특별한 Role을 검사
processActionForm : 이 매핑을 위한 ActionForm 빈을 생성 하거나 얻음
processPopulate : 요청으로부터 ActionForm 을 구성
processValidate : 요청과 연관된 ActionForm 빈을 처리
processForward : 이 매핑에 정의된 포워드를 처리
processInclude : 이 매핑에 정의된 인클루드 처리
processActionCreate : 이 요청을 처리하기 위한 Action 인스턴스를 생성 하거나 취득
processActionPerform : 이 요청을 처리하는 Action 인스턴스를 호출, ActionForward를 반환
processActionForward : 반환된 ActionForward 인스턴스를 처리
-------------------
process 메소드
-------------------
위에서 간단히 설명한 모든 확장 메소드는 모두 process 메소드에서 차례대로 호출 됩니다. process 메소드는 HttpServletRequest를 처리 하고 이에 대응 하는 HttpServletResponse 객체를 생성 합니다.
디폴트 RequestProcessor는 앞에서 정의한 확장 메소드들을 호출함으로서 이러한 작업을 수행 합니다.
응답을 생성 하기 위해 processActionForward는 일반적으로 요청을 JSP 페이지 또는 다른 리소스로 전송 합니다. 그러나 process가 종료 될 때 응답을 반드시 끝내도록 API에서 정의 합니다.
아래에 RequestProcessor 클래스의 process 메소드의 내용과 자세한 설명이 있습니다.
/* RequestProcessor의 process 메소드 */
public void process(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
/*
만약 HttpServletRequest가 POST 방식이며 contentType이 multipart/form-data인 경우
새로운 Request Wrapper를 만듭니다. 요청이 GET 방식이고 contentType이 multipart가
아니면 기본 Request를 반환하며 애플리케이션에서 다중 파일 업로딩 기능을
지원하지 않으면 multipart 기능을 고려하지 않아도 됩니다.
*/
request = processMultipart(request);
// 요청의 URI에서 경로를 추출하여 반환 합니다. 이 정보는 Action을 선택하는데 이용
String path = processPath(request, response);
if (path == null) {
return;
}
if (log.isDebugEnabled()) {
log.debug("Processing a '" + request.getMethod() +
"' for path '" + path + "'");
}
//요청의 Locale을 결정, 생성된 Locale 객체를 HttpSession에 저장
processLocale(request, response);
// 요청의 contentType(Default는 text/html)과 Encoding을 결정
processContent(request, response);
/*
nocache 속성이 true로 되어 있는지 확인하기 위해 호출됨
만약 true라면 cach되는 것을 막기 위해 response 객체에
적절한 응답헤더를 set 해야 합니다.
헤더 파라미터는 Pragma, Cache-Control, Expires등이 있습니다.
예) response.setHeader(Pragma, No-Cache);
response.setHeader(Cache-Control, No-Cache);
response.setHeader(Expires, 1);
*/
processNoCache(request, response);
/*
범용 전처리 후크로서 기본적으로 true를 반환, 하지만 이클래스의 서브 클래스는
이 메소드를 오버라이딩 해서 처리를 계속 할지의 여부를 결정하는 로직을 구현 할 수
있습니다. Action을 호출 하기전에 사용자가 유효한 세션을 가지고 있는지등을
확인 할 수 있는 좋은 위치 입니다.이 메소드가 true를 반환하면 처리를 계속하며
false인 경우 멈춥니다.
*/
if (!processPreprocess(request, response)) {
return;
}
this.processCachedMessages(request, response);
// 요청에서 사용 할 ActionMapping 객체를 생성, 매핑정보가 없으면 오류 메시지를 보낸다.
ActionMapping mapping = processMapping(request, response, path);
if (mapping == null) {
return;
}
// 사용자가 요청을 처리할 권한을 가지고 잇는지등을 검사, 기본적으로
// 자바의 표준 보안 API를 사용하며 애플리케이션 나름대로의 보안 원칙에 입각해
// 해당 부분을 구형 할 수도 있습니다. 그러기 위해서는 processRoles를 오버라이드 합니다.
// 이렇게 함으로서 애플리케이션 기반 보안을 위해 적용 가능 합니다.
// 기본적으로 isUSerInRole() 메소드를 배경으로 ACtionMapping에 의해 정의된 롤들을 실행하며
// 유저가 특정 롤안에 있으면 접근이 허용 됩니다.
// 표준 컨테이너 기반 시스템은 URL 패턴과 그 패턴에 일치하는 기소스에 접근하는 롤을 정의하도록
// 합니다.
if (!processRoles(request, response, mapping)) {
return;
}
//ActionMapping에 ActionForm이 설정되어 있는지 확인
ActionForm form = processActionForm(request, response, mapping);
// ActionForm이 매핑 설정되어 있다면 요청 파라미터로 부터 값을 가지고 와서 ActionForm 인스턴스에 저장
processPopulate(request, response, form, mapping);
//설정 파일에서 action 요소의 validate 속성이 true로 되어 있다면 ActionForm의 validate()
// 메소드를 호출
if (!processValidate(request, response, form, mapping)) {
return;
}
/*
설정 파일의 action 태그에 forward나 include 속성이 있다면 RequestDispatcher의
forward(), include() 메소드를 호출 합니다. 즉 설정 파일에 이러한 forward나
include가 설정 되어 있으면 처리는 여기까지로 종료 되고 해당 URI로 이동
*/
if (!processForward(request, response, mapping)) {
return;
}
if (!processInclude(request, response, mapping)) {
return;
}
// 요청을 처리하기 위해 Action 인스턴스를 얻거나 생성
Action action = processActionCreate(request, response, mapping);
if (action == null) {
return;
}
// 앞에서 생성한 Action인스턴스의 execute() 메소드를 호츌
ActionForward forward =
processActionPerform(request, response,
action, form, mapping);
// 위에서 생성한 ActionForward가 리턴하는 것을 처리, 해당 URL로 포워드
processForwardConfig(request, response, forward);
}
기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… | 12-27 | 1961 | ||
[채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… | 12-11 | 1440 | ||
53 | [평일주간]100%환급6건,안드로이드,자바,C#,스프링3.2,SQL,힌트/… | 03-15 | 1197 | |
52 | [주말주간]C#, ASP.NET마스터 | 01-31 | 1359 | |
51 | [평일,기업100%환급]SQL기초에서 Schema Object까지 | 01-31 | 1139 | |
50 | [평일야간]HTML5, CSS3,Ajax, jQuery마스터과정 | 01-31 | 1046 | |
49 | [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정 | 01-19 | 1359 | |
48 | [평일주간,평일야간,주말]안드로이드개발자과정 | 01-11 | 1192 | |
47 | [평일야간,주말주간]JAVA,Network&JSP&Spring,MyBatis,Hibernate | 01-03 | 1696 | |
46 | 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… | 12-27 | 1961 | |
45 | [평일야간,주말]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis… | 12-19 | 1462 | |
44 | 웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX,JavaScript) | 12-14 | 1428 | |
43 | [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… | 12-11 | 1440 | |
42 | [평일,기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 | 12-09 | 1158 | |
41 | [평일야간]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 | 12-01 | 1354 | |
40 | [기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍(평일주간(단기)… | 12-01 | 1519 | |
39 | [평일야간,주말]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝) | 12-01 | 1021 |
댓글 없음:
댓글 쓰기