Dev/Struts

Struts1 세팅 및 기본 예제 & MVC 패턴

창문닦이 2019. 3. 18. 18:30

Struts1 세팅하기

1. 다이나믹 웹 프로젝트 생성 - struts1

2. JSTL과 JDBC 사용을 위해 라이브러리 추가

3. 라이브러리 반영

Struts1 프레임워크를 사용할수있게 해주는 라이브러리 (struts1 설치 후 압축파일의 lib에 있는 .jar파일 20개 -> 프로젝트의 라이브러리에 추가)


4. web.xml 매핑 정보 등록

라이브러리에 있는 패키지의 이름을 연결해줌

/WEB-INF/struts-config.xml 공통적으로 적용되는 환경설정

/WEB-INF/struts-config_temp.xml 개별의 프로젝트에 적용되는 환경설정 (이 두개가 환경설정)

<load-on-startup>2</load-on-startup> 스타트업할때 이걸 2번째로 찾으라는 명령어

첫번째로 찾는 것은 Annotation이므로 일반적으로 2번을 준다

마지막 uri주소에 .do가 들어갈 경우 모두 매핑하도록 설정

<servlet>

<servlet-name>action</servlet-name>

<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

<init-param>

<param-name>config</param-name>

<param-value>

/WEB-INF/struts-config.xml,

/WEB-INF/struts-config_temp.xml

</param-value>

</init-param>

<load-on-startup>2</load-on-startup>

</servlet>

 <servlet-mapping>

<servlet-name>action</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>


DB연결과 한글인코딩을 위한 필터 매핑정보 WEB.XML 등록

<!-- DBCP(DataBase Connection Pool) -->

 <resource-ref>

  <description>Oracle Datasource</description>

  <res-ref-name>jdbc/myOracle</res-ref-name>

  <res-type>javax.sql.DataSource</res-type>

  <res-auth>Container</res-auth>

</resource-ref>


 <!-- CharsetEncodingFilter -->

<filter>

<filter-name>charsetFilter</filter-name>

<filter-class>com.util.filter.CharsetEncodingFilter</filter-class>

<init-param>

<param-name>charset</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>charsetFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>


공통적으로 사용할 util 패키지와 한글 인코딩을 위한 filter 패키지 생성


struts-config.xml 파일에 정의하는 환경설정

- Form Bean Definitions

- Global Exception Definitions

- Global Forward Definitions

- Action Mapping Definitions

- Message Resources Definitions

- Plug Ins Configuration

- Validator plugin

struts-config_temp.xml 파일 생성

템플릿처럼 생성해서 복사 붙여넣기로 프로젝트마다 이름을 바꾸어 사용하면 편리하다.

경로


xml 파일 생성


struts-config_temp.xml 이게 템플릿. 각각의 path가 등록되는 것

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts-config PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"

"http://struts.apache.org/dtds/struts-config_1_3.dtd">

       

<struts-config>


///경로 작성///


</struts-config>




Struts를 활용한 작성과 출력 페이지 만들기

1. TestForm 클래스

TestDTO로 작성하는 게 일반적이나, Form으로 작성

package com.test;

import org.apache.struts.action.ActionForm;

public class TestForm extends ActionForm{

private static final long serialVersionUID = 1L;

private String userId;

private String userPwd;

private String userName;

      //Getter, Setter 작성

}

2. TestAction 클래스

TestAction은 기존에 작성하던 Servlet클래스와 동일하다.

Struts가 DTO를 관리하라고 extends Actionform 으로 명시한 것이고, Actionform 변수안에는 자동으로 데이터를 알아서 가져온다.

public class TestAction extends Action{

//execute는 실제로 사용하지 않음

//struts는 이 execute 기능보다 더 좋은 기능을 사용한다.

//if문을 다 검색하고 넘어가는 것은 속도가 느리다. 

//이 if-else if문을 분해작업을 해서 메소드로 나눈다.  

@Override

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

String uri = request.getRequestURI();

if(uri.indexOf("/test_ok.do")!=-1){

TestForm f = (TestForm)form;//자바가 넘겨주는 것이므로 object로 전달되므로 형변환 필요

request.setAttribute("vo", f);

return mapping.findForward("ok");//ok란 문자를 가지고 포워딩됨

}

return mapping.findForward("error");

}

}

3. write.jsp - 작성페이지

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

request.setCharacterEncoding("UTF-8");

String cp = request.getContextPath();

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>작성</title>

</head>

<body>

<form action="<%=cp%>/test_ok.do" method="post">

아이디 : <input type="text" name="userId"><br>

패스워드 : <input type="text" name="userPwd"><br>

이름 : <input type="text" name="userName"><br>

<input type="submit" value="전송"><br>

</form>

</body>

</html>

4. write_ok.jsp - 출력페이지

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

request.setCharacterEncoding("UTF-8");

String cp = request.getContextPath();

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>출력</title>

</head>

<body>

아이디 : ${vo.userId }<br>

패스워드 : ${vo.userPwd }<br>

이름 :${vo.userName} <br>

<a href="javascript:location.href='<%=cp %>/test.do';">돌아가기</a>

</body>

</html>

5. web.xml 매핑 정보 등록

struts-config_test.xml로 찾아갈 수 있도록 <param-value> 설정

<servlet>

<servlet-name>action</servlet-name>

<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

<init-param>

<param-name>config</param-name>

<param-value>

/WEB-INF/struts-config.xml,

/WEB-INF/struts-config_test.xml

</param-value>

</init-param>

<load-on-startup>2</load-on-startup>

</servlet>

 <servlet-mapping>

<servlet-name>action</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

6. struts-config_test.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts-config PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"

"http://struts.apache.org/dtds/struts-config_1_3.dtd">

       

<struts-config>

<!-- 객체생성 -->

<form-beans>

<form-bean name="testForm" type="com.test.TestForm"/>

</form-beans>

<!-- /test.do가 올 경우 write.jsp로 가라 -->

<action-mappings>

<action path="/test" forward="/test/write.jsp"/>

<action path="/test_ok" type="com.test.TestAction"

name="testForm" scope="request">

<!-- /test_ok가 올 경우 testForm 객체 클래스를 가지고 TestAction으로 가라 -->

포워드결과에 따라 경로설정

<forward name="ok" path="/test/write_ok.jsp" />

<forward name="error" path="/test/error.jsp" />

</action>

</action-mappings>

</struts-config>




MVC 모델 1 구조(JSP) 

모델1의 아키텍쳐

Model1 방식은 JSP page안에 java code를 작성하는 개발방식이다.

① 클라이언트 브라우저에서의 요청

② 자바빈즈

③ 디비

④ 자바빈즈 컨트롤러로 전달

클라이언트 브라우저로 응답

MVC 모델 2 구조(Servlet)  

Model2 방식은 jsp page와 java code를 분리하여 개발하는 방식이다.

MVC 는 각각 Model, View, Controller 에 해당한다. 비즈니스 로직을 처리하는 Model과 화면을 보여주는 View를 구분하여 재사용과 가독성을 높이려는 기법이다. 어플리케이션의 흐름제어나 사용자의 요청은 컨트롤러에 집중된다.

가상의 이름을 적어 찾아가라고 지정(a.do) 시 (클라이언트가 주소창에 a.do로 입력시) a.jsp로 이동시키게 하는 mapper가 필요하다.


처리과정

ⓐ 주소 요청

ⓑ 서블릿이 주소를 보고 그 창을 바로 띄우면 되는것인지 판단 (서블릿이 Controller에 해당. 분배기 개념)

ⓒ 바로 jsp를 띄우면 되는 경우 View로 이어짐 (프론트엔드를 보여줌)

ⓓ DB에 접근해야 하는 경우 자바빈즈 객체 생성. (Model은 데이터에 해당)

ⓔ 데이터베이스에 액세스해서 데이터를 읽어옴


Model : 데이터를 담고 있는 객체. 자바빈즈를 뜻한다 (DTO, DAO)

- 컨트롤러에서 request를 분석해서 알맞은 모델을 호출하면서 모델의 기능 시작

- 모델은 컨트롤러가 요청한 비즈니스로직을 처리 후 결과를 자바빈에 저장해서 컨트롤러에 전달


View : 화면처리 (JSP page), 프론트엔드. 데이터를 표현하는 객체

- MVC 패턴에서의 View역할을 하는 JSP는 비즈니스 로직과 관련된 코드가 없다는 걸 제외하고 일반 JSP 페이지와 동일

- 특징 : request나 session 기본 객체에 저장한 데이터를 사용해서 알맞은 결과를 출력.


Controller : 프로그램의 흐름을 제어하는 Servlet Class. 데이터를 컨트롤하고 Model과 View사이를 중재한다.

- 컨트롤러는 분배기 개념으로 비즈니스 로직을 알 필요가 없다

- request에 맞는 모델을 사용하여 요청한 기능을 수행하고 그 결과를 View에 전달

- Model에서 받은 결과물을 가공한 후 request나 session 기본객체의 setAttribute 메소드를 사용하여 결과값을 속성에 저장

> 저장된 값은 View에서 사용

- 처리결과를 보여주기 위한 JSP 페이지를 선택한 후 포워딩

Model1과 Model2의 비교

Model1의 장점은 개발속도가 빠르고 배우기 쉽다. 하지만 가독성이 떨어지고 재사용이 힘들다.

모든 클라이언트의 요청과 응답을 JSP가 담당하는 구조이기 때문에 단순한 페이지 작성으로 쉽게 구현 가능한 중소형 프로젝트에 적합하다.


반면 Model2클라이언트의 요청처리와 응답처리, 비즈니스 로직처리하는 부분을 모듈화 시킨 구조이다. 처리 작업의 분리로 인해 유지보수와 확장이 용이해진다.  책임구분이 명확해진다는 것은 의존성이 약해진다는 개념. 개발자와 디자이너의 역할과 책임구분이 명확해진다. 각 컴포넌트의 재사용성이 높아진다. MVC구조에 대한 이해가 필요하며 개발자의 높은 skill이 요구된다.

Struts1과 MVC 패턴 

Struts는 Controller를 ActionServlet 클래스로 구현하고 JSP 태그 라이브러리를 사용하여 View 레이어를 구현할 것을 권장 


1. 클라이언트 브라우저에서 사용자의 요청 이벤트가 발생

2. 이 발생을 컨트롤러(서블릿)에서 읽어내서 어디로 보낼지 판단(분배기 개념) action으로 보낼지 forward 할지 struts-config파일을 확인해서 분배해준다.

3. 뷰는 사용자에게 보여주는 프론트엔드 개념

4. 액션은 struts-config.xml 파일에 따라 동작한다. 또한 스트럿츠 컨트롤러의 기본 진입점으로, 모든 스트럿츠 애플리케이션 요청의 진입점이 된다.


ActionForm 추상 클래스

사용자가 GET 혹은 POST 방식으로 넘긴 파라미터들을 저장하고 분석하여 알맞은 값이 들어왔는지 여부 등을 판단(유효성 검사)하는 Java Bean. ActionForm은 있어도 되고 없어도 되며 ActionForm 에서 각 파라미터가 유효성 검사를 통과하지 않으면 Action을 호출하지 않는다.


Action 클래스

비즈니스 로직을 호출하는 부분. 실질적으로 자바 웹 서블릿과 같은 역할을 한다. 비즈니스 로직은 Action에서 직접 수행하지 말고 따로 Model 전용 클래스로 만들어서 파라미터들을 넘겨 호출만 하는 형태로 작성한다

'Dev > Struts' 카테고리의 다른 글

Struts2 세팅  (0) 2019.03.21
Struts1/iBatis - 파일 업로드 기능 구현  (0) 2019.03.21
Struts1/iBatis - 게시판 만들기  (2) 2019.03.20
iBatis(2.0) 및 log4j 세팅  (0) 2019.03.20
Struts1/JDBC - 게시판 만들기  (2) 2019.03.19