728x90

 

스트러츠2 가이드 문서 : http://struts.apache.org/2.x/docs/guides.html

 

 

--------------------------------------------------------------------------------------------------------------------------------

 

 

<기본 설정 필요 파일>

* Apache Struts 2.3.15 GA :  http://struts.apache.org/

==> Apache Struts 2.3.15 GA 압축 파일 내의 아래의 5가지 Jar 파일을 WEB-INF/lib 폴더에 추가
- struts2-core-x.x.x.jar : Struts 2 
 Core library.
- xwork-core-x.x.x.jar : 
웹 워크와 통합
- ognl-x.x.x.jar : OGNL , Struts2
를 위한 EL 이다.
- commons-logging-x.x.x.jar : log4j 
와 같은 로깅을 위한 라이브러리.
- freemarker-x.x.x.jar : UI 
태크 템플릿을 위한 것.

 

 

  • web.xml : 웹 애플리케이션의 배치스크립터(DD). Struts2가 요청을 수렴할 수 있도록 DD에 필터 등록.
  • struts-default.xml : 프레임워크 코어 라이브러리인 struts2-core-버전.jar미리 정의 되어 있는 파일.  Struts.xml의 설정을 상당히 줄이도록, 모든 디폴트값들이 설정되어있음.
  • struts.xml : 웹 애플리케이션내의 처리 흐름을 설정하는 파일

 

--------------------------------------------------------------------------------------------------------------------------------

 

 

1. web.xml

- web.xml은 URL 확장자에 따라 FilterDispatcher에 의해서 액션을 실행하기 위한 환경을 구축한다. 
  즉, 모든 사용자의 요청은 FilterDispatcher Class 를 거쳐간다. 해당 파일은 WEB-INF 폴더 내에 위치해야함.

 

<!-- 스트럿츠는 필터가 서블릿보다 먼저 동작하여 요청을 받는다  -->
<filter>
    <filter-name>struts</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
    
<!-- 모든요청을 필터가 받는다. -->
<filter-mapping>
    <filter-name>struts</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 

2. struts.xml

- struts.xml은 실행 후 결과를 처리할Result 와 매핑을 설정한다. 해당파일은 프로젝트/src 폴더(Java Resources) 내에 위치한다.

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
    
<struts>
  <!-- 1.기본연결 -->
  <package name="tutorial" extends="struts-default">
  	<action name="helloWorld" class="tutorial.HelloWorld">
  		<result name="success">/helloWorld.jsp</result>
  	</action>
  </package>
  
   <!--<include file="struts-test.xml"/>  -->
   
</struts>

 

1) <include />

Struts1에서는 하나의 struts-config.xml 파일만 지원했지만 Struts2에서는 여러개의 설정파일을 역할별로
나눠서 설정할 수 있음. 그리고  요소를 이용해 하나의 설정파일에 포함 시킴.
파일의 위치는 ClassPath상의 경로.

 

2) <constant />
이 요소는 상수를 설정할 때 쓰입니다. 상수는 Struts2의 작동 방식을 결정짓는 값 입니다.
상수의 설정은 struts.xml 뿐만 아니라 struts.properties, web.xml 등.. 에서도 할 수 있습니다.
<constant /> 요소의 속성은 다음과 같습니다.

- name : 상수의 이름을 지정 합니다.
- value : 상수의 값을 지정 합니다.

설정 가능한 상수는 struts2-core-버전.jar 의 org.apache.struts2 패키지의 default.properties 파일에 나와 있는데 자세한 상수 설정에 대해서는 Struts2 상수설정 에서 다루겠습니다.

3) <package />
패키지는 result, interceptor, action 등을 논리적인 단위로 그룹화 하는데 사용 합니다.
struts.xml 파일 설정중에 대부분의 설정은 패키지 안에서 이루어 집니다.


4) <interceptors />
Interceptor는 AOP와 같은 개념으로 액션 실행 전후로 실행되는 모듈입니다.
파라미터값을 자동으로 저장, 로깅, 파일 업로드, 유효성 검사, 보안 등 다양한 Interceptor가 존재 합니다.
이 모든 Intercpetor는 struts-default.xml 파일에 모두 정의가 되어 있습니다. 
따라서 <interceptors /> 요소는 <interceptor-stack /> 요소를 이용해 사용자 정의 스택을 구성할 경우를 
제외 하고는 사용할 일이 없으며 단지<interceptor-ref /> 요소를 이용해 가져다 쓰기만 하면 됩니다.
다음은 struts-dafault.xml에 정의된 <interceptors /> 요소중 일부분 입니다.

 

 

 

 

Reference

https://firedev.tistory.com/entry/Struts-스트러츠2-설정-strutsxml-interceptor

https://kimseunghyun76.tistory.com/295

https://gusfree.tistory.com/1029

 

728x90
728x90

https://mangkyu.tistory.com/14

https://dahyeee.tistory.com/entry/Servlet-Servlet%EC%9D%B4%EB%9E%80

해당 블로그 글이 굉장히 정리가 잘 되어 있습니다.

아래는 그것에 대한 복습작성이오니 해당 글로 가시는 편이 좋습니다.

 

 

-------------------------------------------------------------------------------------------------------------------

1. Servlet(서블릿)이란?

1) 정의

- 자바를 사용하여 Web을 만들기 위해 필요한 기술.

  즉, 클라이언트가 특정 요청을 하면, 그에 대한 결과를 다시 전송해 주는 역할을 하는 자바 프로그램.

  따라서 자바로 구현된 *CGI.

*CGI(Common Gateway Interface): 웹서버가 외부 프로그램을 실행시키는 표준화된 방법

 

 

2) Servlet의 특징

- 클라이언트의 요청에 대해 동적으로 작동하는 Web Application Component

- 확장자는 .java

- jsp와 마찬가지로 클라이언트의 요청에 의해 작동, html로 요청에 응답한다. (java 코드 속에 html이 존재함)

- Java Thread를 이용하여 동작 - 따라서 요청이 많이 들어와도 부하가 적다는 장점 존재.

- MVC 패턴에서 Controller로 이용됨

- Http 프로토콜 서비스를 지원하는 javax.serHTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받음. *UDP보다 속도가 느림. 

  즉 항상 extends HttpServlet 해야함

- HTML 변경 시 Servlet을 재컴파일해야 하는 단점 존재

 

*UDP 참고 - https://namu.wiki/w/UDP

 

[ Servlet 동작 방식 ]

 

 

   1) 사용자(클라이언트)가 URL을 클릭하면 HTTP Request를 Servlet Conatiner로 전송

   2) HTTP Request를 전송받은 Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성

   3) web.xml은 사용자가 요청한 URL을 분석하여 어느 서블릿에 대해 요청을 한 것인지 찾음

   4) 해당 서블릿에서 service메소드를 호출한 후 클리아언트의 POST, GET여부에 따라 doGet() 또는 doPost()를 호출

   5) doGet() or doPost() 메소드는 동적 페이지를 생성한 후 HttpServletResponse객체에 응답을 보냄

   6) 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킴

 

 

 

2. Servlet Container(서블릿 컨테이너)

1) 정의

- 서블릿을 관리해주는 컨테이너. 

- 서블릿이 어떠한 역할을 수행하는 정의서라면, 서블릿 컨테이너는 그 정의서를 보고 수행한다고 볼 수 있음.

- 서블릿 컨테이너는 클라이언트의 요청(Request)을 받아주고 응답(Response)할 수 있게, 웹서버와 소켓을 만들어 통신함.

- 서블릿 컨테이너의 대표적인 예로 톰캣(Apache Tomcat)이 존재함. 톰캣은 웹서버와 통신하여 JSP(Java Server Page)와 Servlet이 작동하는 환경을 제공해줌.

 

2) 특징, 역할

(1) 웹서버와의 통신 지원

(2) 서블릿 생명주기(Life Cycle) 관리

(3) 멀티쓰레드 지원 및 관리

(4) 선언적 보안 관리

 

 

3) 생명주기

 

---------------------------------------------------------------------------------------------------------------------

+ WAS와 Servlet Contatiner의 차이는 무엇? (https://sharryhong.github.io/2017/06/03/java-servlet/)

- WAS(Web Application Server) = HTTP Server + Servlet Container
톰캣 서버는 엄밀히 말하면 WAS로, 두 기능(Http Server, Servlet Container)을 탑재하고 있음.

그러나 대체로 HTTP Server는 좀 더 성능이 뛰어난 Apache 등으로 대체해서 사용함.

HTTP Server에서는 웹 애플리케이션의 정적 자원(Static Resource) 즉, HTML, CSS, JavaScript, gif등 변하지 않는 자원을 클라이언트 요청에 따라 그대로 읽어서 전달해줌.

반면 Servlet Container는 웹 애플리케이션의 동적 자원(Dynamic Resource) 즉, JSP, Servlet등을 생성함.

---------------------------------------------------------------------------------------------------------------------

3. JSP(Java Server Page)

1) 정의

- Java 코드가 들어있는 HTML 코드

- 서블릿은 자바코드 속에 HTML이 들어가있는 형태인데, JSP는 반대로 HTML 소스코드 속에 자바 소스코드가 들어가있는 구조를 가짐.

 

2) 동작구조

 

 

 

 

3) 개발 디렉토리 구조 (https://okjsp.tistory.com/1165643259)

 

웹 애플리케이션은 서블릿 스펙에 따라서 디렉토리가 정해진 규칙을 가짐

(1) 서비스와 관련된 디렉토리 구조

/WEB-INF/ 브라우저를 통해서 접근이 불가능한 웹 애플리케이션 핵심정보들을 포함하고 있는 디렉토리

/WEB-INF/classes/ 
패키지에 따른 디렉토리별 class파일과 properties 파일이 위치하는 곳

/WEB-INF/lib/
 웹 애플리케이션에서 사용되는 jar 파일이 존재하는 곳

/META-INF/context.xml 톰캣에서 사용되는 manager를 통한 배포용 웹 애플리케이션 Context정보 파일
브라우저를 통해서 접근 가능한 리소스들은 그 외의 디렉토리에 놓으면 된다.
특히 브라우저의 JVM 위에서 돌아가는 애플릿 class와 관련 jar 들은 /WEB-INF/ 밖에 위치해야 한다.
이 디렉토리들을 묶어서 Context 라고 얘기한다.

 

(2) 개발용 디렉토리 구조는 java 파일이라는 특징 때문에 다음과 같이 구성

/src 패키지에 따른 디렉토리별 java 파일과 properties 파일이 존재하는 곳

/WebContent/ 앞에 언급한 브라우저를 통해서 접근 가능한 리소스들. 웹 애플리케이션의 컨텍스트 루트 디렉토리에 해당.

/WebContent/WEB-INF/ 앞에 언급했던 /WEB-INF/ 디렉토리와 같은 성격

/build/classes /src 하위 자바파일의 컴파일된 class 들이 놓이는 곳. properties 파일은 자동 복사되는 곳.

 

개발 디렉토리와 WAS의 서비스되는 디렉토리의 매핑 즉 자연스런 연결은 빌드 툴인 ant를 통하거나 Eclipse같은 IDE에서 자동으로 해준다.


이클립스의 경우 Servers 라는 프로젝트가 웹 프로젝트와 별개로 생성이 된다. 여기에서 설정되는 서버의 세팅은 기본적으로 설치된 세팅과 별도로 운영된다. 즉 톰캣이 설치된 디렉토리의 conf 에 있는 설정과는 별개로 Servers하위의 서버별 server.xml 의 파일에 설정된 내용으로 동작이 된다는 뜻이다.
<%= request.getRealPath("/") %> 를 통해서 확인해 보면 이클립스에서 운영하는 디렉토리가 완전히 엉뚱한 곳에 존재함을 알 수 있다. 웹 프로젝트에서 파일을 변경하면 자동으로 파일이 해당 위치로 복사된다.

 

 

+

 

https://www.journaldev.com/1854/java-web-application-tutorial-for-beginners

Java Web Applications are packaged as Web Archive (WAR) and it has a defined structure. You can export above dynamic web project as WAR file and unzip it to check the hierarchy. It will be something like below image.

 

 1) Java Resource - src 폴더 : 이 폴더에 java 파일들을 배치. 해당 폴더안에 있는 java파일만 컴파일을 수행함.

     src는 소스컴파일을 수행하며 실행은 webContent에서 실행 됨

  2) WebContent : 컴파일되지 않아도 되는 파일들을 배치.

    * META-INF 폴더 : 읽어야하는 자원에 대한 정보를 가지고 있는 파일을 배치.

    * Web-INF 폴더 : 프로젝트의 환경 설정 파일을 배치. Web.xml 파일이 반드시 위치해야함(다른 폴더에 있으면 설정파일의 역할을 하지 못함)

 

(출처: https://blog.naver.com/tkddlf4209/220539643154)

 

4. Mapping(맵핑)

1) 정의

- Url 경로를 간단하게 표현하는 방법 (+보안)

 

2) 방법

(1) web.xml에서 서블릿 맵핑 정의

<servlet-name> : 임의의 이름 지정

<servlet-class> : 매핑할 클래스 파일명을 패키지명을 포함하여 입력

<url-pattern> : servlet-class를 매핑할 임의의 이름을 입력한다. ('/'로 시작해야함!!)


(2) Annotation 이용

-java코드에 직접 @WebServlet("/맵핑명") 등으로 입력하여 맵핑

 

 

 

Reference

https://mangkyu.tistory.com/14

https://dahyeee.tistory.com/entry/Servlet-Servlet이란

https://okjsp.tistory.com/1165643259

https://www.journaldev.com/1854/java-web-application-tutorial-for-beginners

 

 

728x90

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

[Eclipse] getter / setter 단축키  (0) 2019.10.14
[Struts2] struts.xml 설정하기  (0) 2019.10.10
Struts2, Spring MVC  (0) 2019.10.10
Server Setting  (0) 2019.10.08
REST API  (0) 2018.10.02
728x90

 

해당현상

 

 

해결책: Manifest.xml의 <intent-filter> 사이에 아래의 코드 추가

<action android:name="android.intent.action.VIEW" />

 

<예시>

- 기존

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 <application
        android:name="경로.MyApp"
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:largeHeap="true">
        <activity
            android:name="경로.LogInActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar"
            android:windowSoftInputMode="stateHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
</application>
cs

 

 

- 변경

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 <application
        android:name="경로.MyApp"
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:largeHeap="true">
        <activity
            android:name="경로.LogInActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar"
            android:windowSoftInputMode="stateHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.VIEW" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
</application>
cs

 

 

 

Reference

https://stackoverflow.com/questions/34367875/android-adding-at-least-one-activity-with-an-action-view-intent-filter-after-u

728x90
728x90

현재 팀에서 유지보수를 오래하고 있는 프로젝트가 Struts2 기반이라고 한다.

주된 업무가 안드로이드 개발이다보니, 이에 대한 개념이 명확하지 않아서 찾아보는 중.

 

 

1. Struts2 vs. Spring MVC?

Struts2는 Web MVC Framework다.

따라서 Spring MVC Framework는 동급으로, Spring Framework와는 동급이 아니다.

 

Spring의 개념에 대한 정리는

https://sthwin.blog.me/221271008423

 

 

Spring MVC의 장점 - 1) 확장성이 유연, 2) MVC 모델의 명확한 분리

https://gmlwjd9405.github.io/2018/12/20/spring-mvc-framework.html

 

[SpringMVC] Spring MVC Framework란 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

2. Struts2란?

Apache에서 개발한 Struts2는 Struts1에 기반을 두고 있지 않고, WebWork Framework에 기반한다.

개별처리 액션을 별도의 Action class를 상속해야하는 1과 달리, 2에서는 POJO로 작성할 수 있음.

 

-----------------------------------------------------------------------------------------------------------------------------------

POJO란?

Plain Old Java Object, 즉 간단히 표현하면 Java Bean.

순수하게 setter, getter 메소드로만 이루어진 Value Object성 Bean을 의미한다. 

 

이는 별도의 클래스 상속, 인터페이스 구현, 어노테이션 사용 등을 강제하지 않기 때문에,

특정한 라이브러리나 컨테이너의 기술에 종속적이지 않고, 가장 일반적인 형태로 코드를 작성할 수 있다는 장점이 있다.

-----------------------------------------------------------------------------------------------------------------------------------

 

 

 

Reference

https://blog.naver.com/skykbc/221438813505

https://heeestorys.tistory.com/447

https://joonyon.tistory.com/18

 

 

 

728x90

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

[Eclipse] getter / setter 단축키  (0) 2019.10.14
[Struts2] struts.xml 설정하기  (0) 2019.10.10
[웹 개발 기초] Servlet, Servlet Container, JSP 개발 디렉토리 구조, Mapping  (0) 2019.10.10
Server Setting  (0) 2019.10.08
REST API  (0) 2018.10.02

+ Recent posts