struts2 Framework

박보서·2024년 2월 23일
post-thumbnail

회사에서 새로 받은 프로젝트가 스프링이 아닌 스트러츠 프레임워크를 사용하고 있었다. (두둥)
처음으로 마주하는 스트러츠.. 굉장히 오래 된 프레임워크라고 알고 있는데 한 번 파헤쳐보자~


1. Struts Framework 란?

  • Struts 는 Model(모델), View(뷰), Controller(컨트롤러) 아키텍쳐를 나타내는 MVC 모델을 기반으로 하는 프레임워크 이다.
    프론트 컨트롤러 타입 ( 모든 요청을 받아 공통 처리 실행하는 컨트롤러 ) MVC 프레임워크
  • 사용자의 요청을 처리하는 요청 기반 프레임워크를 기반으로 개발되어, 요청 핸들러와 응답 핸들러가 존재한다.
  • 개별 처리와 뷰를 호출
  • Result
    뷰 표시하는 역할로, 액션 처리 후 Result로 이동

2. Struts 동작 및 구조

** 서버 실행 시 가장 먼저 실행되는 파일은 web.xml 파일

  • 어떤 액션을 호출할 지 결정 후 액션 실행
  • Result 실행 시킨 후 최종 응답데이터를 사용자에게 반환하는 역할을 하는 컨트롤러 제공
    1) action name
    액션 id(bean)가 HelloWorld인 것을 찾음
    2) result
    해당 jsp 파일에 리절트 코드를 표출함
    -> 리절트 코드는 return 반환값을 찾아 코드값을 불러와 jsp에 표출(?)

3. struts2 흐름과 파라미터 값 전달

1) params 인터셉터
인터셉터는 액션의 호출을 동적으로 가로채는 객체로서 다양한 기능을 제공한다.
params 인터셉터는 ! 요청 파라미터와 동일한 이름을 가진 액션의 프로퍼티에 값을 저장하는 역할을 한다.

> 😍 이 부분에서 정말 많은 궁금증이 해소 됐다.. 스트러츠는 파라미터를 명시하지 않고 SSR 경우 데이터가 뷰단에서 백단까지 왔다갔다 하는데 도대체 어떻게?! 라는 의문이 들었는데 HTTP 요청이 들어왔을 때 인터셉터가 해당 클래스를 호출 전, 요청 파라미터와 동일한 이름을 가진 액션의 프로퍼티에 값을 저장해둔 것이다! 그래서 요청을 받는 메서드에서 파라미터를 명시해두지 않아도 메서드 내부에서 this.프로퍼티명 이렇게 데이터를 들고 올 수 있었던 것!!

-> setter를 통해 값을 저장하고, 값이 세팅 된 후에 해당 메소드가 호출 된 것이다.
return "success"; 를 하게 되면 result 태그 요소인 jsp 파일이 출력 페이지로서 화면에 보여진다.

2) struts.xml

<struts>
    <package name = "ch04" extends = "struts-default">
        <action name = "HelloWorld02" class = "action.HelloWorld02">
            <interceptor-ref name = "params"/>
            <result name = "success">/helloWorld.jsp</result>
        </action>
    </package>
</struts>

3) helloWorld.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>결과를 위한 JSP 페이지</title>
</head>
<body>
<h1>
${message}
</h1>
</body>
</html>

4) HelloWorld02.java

public class HelloWorld02 implements Action {
   
    // HelloWorld02 액션에서도 HelloWorld 액션에서와 마찬가지로
    // set / get 메소드를 갖는 필드를 추가할 수 있다.
    // 스트럿츠 2의 액션은 자바 빈의 규칙을 따르기 때문에 필드에 대한 직접 접근하지 못하도록
    // private 멤버로 지정하고, 이를 public 멤버로 선언된 메소드를 사용하도록 한다.
    private String message;
    private String name = "Angel";
   
    // message 필드는 getter만 존재하므로 이 값을 외부에서 사용하기만 하고 변경하지 못하는
    // read only 프로퍼티가 된다.
    public String getMessage() {

        return message;
    }
   
    // 반면 name 필드는 외부에서 사용하기만 하고 변경하지는 못하도록 하기 위해서 setter만 정의해 둔다.
    public void setName(String name) {
       
        this.name = name;
    }
   
    @Override
    public String execute() throws Exception {
       
        this.message = "Hello, " + name + "!";
       
        return SUCCESS;
    }

참고)

https://webcache.googleusercontent.com/search?q=cache%3Ahttps%3A%2F%2Fdev-jwblog.tistory.com%2F87&rlz=1C1YTUH_koKR1076KR1076&oq=cache%3Ahttps%3A%2F%2Fdev-jwblog.tistory.com%2F87&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIGCAEQRRg60gEHNzgzajBqNKgCALACAA&sourceid=chrome&ie=UTF-8

https://webcache.googleusercontent.com/search?q=cache%3Ahttps%3A%2F%2Fwickedmagic.tistory.com%2F170&rlz=1C1YTUH_koKR1076KR1076&oq=cache%3Ahttps%3A%2F%2Fwickedmagic.tistory.com%2F170&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIGCAEQRRg60gEHNjIzajBqNKgCALACAA&sourceid=chrome&ie=UTF-8

profile
? -> ! 보서의 지식 채굴 여정기

0개의 댓글