본문 바로가기

IT 스토리

Dynamic Web Applications

pom.xml 을 이용한 웹 프로젝트 세팅

New Project

Maven > Create from archetype > maven-archetype-quickstart

pom.xml


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>dynamic-web-servlet</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Dynamic web servlet</name>
  <url>http://maven.apache.org</url>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.3</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>dynamic-web-servlet</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Servlet 관련 정리

1. 프로젝트 생성

2. 서블릿 클래스 생성

public class BasicServlet extends HttpServlet {
    ...
}

3. 서블릿 배치

3.1. web.xml 을 이용한 서블릿 배치

<servlet>
    <servlet-name>서블릿 이름</servlet-name>
    <servlet-class>서블릿 클래스</servlet-class>
</servlet>

3.2. annotation 을 이용한 서블릿 배치

//@WebServlet("/basic")
public class BasicServlet extends HttpServlet {
    ...
}

4. 서블릿 매핑

4.1. web.xml 을 이용한 서블릿 매핑

<servlet>
    <servlet-name>서블릿 이름</servlet-name>
    <servlet-class>서블릿 클래스</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>서블릿 이름</servlet-name>
    <url-pattern>서블릿을 적용할 URL 패턴</url-pattern>
</servlet-mapping>

5. 서블릿 실행

5.1. web.xml 을 이용한 서블릿 실행

<servlet>
    <servlet-name>서블릿 이름</servlet-name>
    <servlet-class>서블릿 클래스</servlet-class>
    <load-on-startup>실행 순서</load-on-startup>
</servlet>

5.2. annotation 을 이용한 서블릿 실행

//@WebServlet(urlPatterns = { "/basic" }, loadOnStartup = 1)
public class BasicServlet extends HttpServlet {
    ...
}

6. 서블릿 생명주기

6.1. 서블릿 초기화

public class BasicServlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        System.out.println("init() 호출");
    }
}

7. 서블릿 초기화 파라미터

7.1. web.xml 을 이용한 서블릿 초기화 파라미터

<servlet>
    <servlet-name>서블릿 이름</servlet-name>
    <servlet-class>서블릿 클래스</servlet-class>
    <init-param>
        <param-name>파라미터 이름</param-name>
        <param-value>파라미터 값</param-value>
    </init-param>
</servlet>

7.2. annotation 을 이용한 서블릿 초기화 파라미터

//@WebServlet(urlPatterns = { "/basic" }, initParams = { @WebInitParam(name = "name", value = "value") })
public class BasicServlet extends HttpServlet {
    ...
}

8. 서블릿 리스너

8.1. 서블릿 컨텍스트 리스너

ServletContextListener 인터페이스를 사용하면 전체 웹 애플리케이션의 수명 주기와 관련된 이벤트를 수신할 수 있습니다. 웹 애플리케이션이 시작되고 종료될 때 각각 호출되는 contextInitialized() 및 contextDestroyed()의 두 가지 메서드가 있습니다.

@WebListener 없이 직접 web.xml 에 등록해서 사용

<listener>
    <listener-class>com.servlet.event.ContextListener</listener-class>
</listener>
@WebListener
public class ContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("contextInitialized() 호출");
    }
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        // Perform cleanup tasks when the application is shutting down
        System.out.println("contextDestroyed() 호출");
    }
}

8.2. 서블릿 리퀘스트 리스너

@WebListener
public class RequestListener implements ServletRequestListener {
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("requestInitialized() 호출");
    }
}

9. 서블릿 필터

9.1. 필터 매핑

<filter-mapping>
    <filter-name>필터 이름</filter-name>
    <url-pattern>필터를 적용할 URL 패턴</url-pattern>
</filter-mapping>

web.xml 을 이용한 샘플

<web-app>
    <filter>
        <filter-name>BasicFilter</filter-name>
        <filter-class>com.servlet.filter.BasicFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>BasicFilter</filter-name>
        <url-pattern>/basic</url-pattern>
    </filter-mapping>
</web-app>

annotation 을 이용한 샘플

//@WebFilter("/basic")
@WebFilter(urlPatterns = { "/basic" })
public class BasicFilter implements Filter {
    ...
}

10. 서블릿 쿠키

10.1. 쿠키 생성

CookieServlet.java

// 코드 1

11. 서블릿 세션

11.1. 세션 생성

SessionServlet.java

// 코드 1

12. 서블릿 리다이렉트

12.1. 리다이렉트

RedirectServlet.java

// 코드 1

13. 서블릿 포워드

ForwardServlet.java

13.1. 포워드

// 코드 1

14. 서블릿 인클루드

14.1. 인클루드

IncludeServlet.java

// 코드 1

15. 서블릿 파일 업로드

15.1. 파일 업로드

FileUploadServlet.java

// 코드 1

16. 서블릿 JSP 연동

16.1. 서블릿 JSP 연동

DataServlet.java

// 코드 1

17. 서블릿 JSP 태그 라이브러리

CustomTagHandler.java

// 코드 1

18. 서블릿 JSP EL

JSP EL(Expression Language)은 JSP 페이지의 데이터에 대한 액세스를 단순화하고 코드를 보다 간결하고 읽기 쉽게 만듭니다. 동적 데이터에 액세스하고 표시하기 위해 Java 웹 애플리케이션에서 널리 사용

19. 서블릿 JSP JSTL

UserDataServlet.java

이 예제에는 가상 데이터베이스에서 사용자 데이터(예: 이름, 성, 나이)를 가져오고 request.setAttribute()를 사용하여 데이터를 요청 속성으로 설정하는 Java 서블릿(UserDataServlet)이 있습니다. 그런 다음 서블릿은 렌더링을 위해 요청을 JSP 페이지(userdata.jsp)로 전달합니다.

JSP 페이지에서는 JSTL(JSP Standard Tag Library)을 사용하여 조건 논리를 수행합니다. <c:choose>, <c:when> 및 <c:otherwise> 태그를 사용하여 연령에 따라 사용자의 상태를 결정합니다. JSTL 태그는 조건부 로직을 보다 구조화되고 읽기 쉽게 만듭니다.

이 예를 테스트하려면:

Java 웹 애플리케이션에 UserDataServlet(이전에 제공된 서블릿 코드)을 배포합니다.
위에 제공된 내용으로 userdata.jsp 파일을 생성하고 웹 애플리케이션 디렉토리의 적절한 위치에 배치합니다.
웹 브라우저에서 UserDataServlet URL(예: http://localhost:8080/your-webapp-name/UserDataServlet)에%EC%97%90) 액세스합니다.
서블릿은 사용자 데이터를 가져와서 userdata.jsp 페이지로 전달합니다.
JSP 페이지는 연령에 따라 사용자 데이터와 사용자 상태를 표시합니다.

your-webapp-name을 웹 애플리케이션의 실제 이름으로 바꾸고 서블릿 및 JSP 파일이 웹 애플리케이션 디렉토리의 올바른 위치에 있는지 확인하십시오.

JSTL(JSP Standard Tag Library)은 반복, 조건부 렌더링 및 데이터 조작과 같은 JSP 페이지의 일반적인 작업을 단순화하는 강력한 태그 세트를 제공합니다. JSP 코드의 가독성과 유지 관리성을 향상시키기 위해 Java 웹 애플리케이션에서 널리 사용됩니다.

20. 서블릿 JSP MVC

MvcControllerServlet.java

User 클래스는 firstName, lastName 및 age와 같은 속성을 가진 User 개체를 정의하는 모델을 나타냅니다.
UserController 서블릿은 가상 데이터베이스에서 사용자 데이터(이 경우 User 개체 목록)를 가져오고 데이터를 요청 속성으로 설정하는 컨트롤러를 나타냅니다. 그런 다음 렌더링을 위해 요청을 user_list.jsp JSP 페이지로 전달합니다.
user_list.jsp JSP 페이지는 컨트롤러로부터 받은 사용자 데이터를 표시하는 보기를 나타냅니다. JSP Expression Language(EL) 및 JSTL을 사용하여 User 개체 목록을 반복하고 테이블에 사용자 정보를 표시합니다.

이 예를 테스트하려면:

Java 웹 애플리케이션에 UserController(이전에 제공된 서블릿 코드)를 배포합니다.
위에 제공된 내용으로 user_list.jsp 파일을 생성하고 웹 응용 프로그램 디렉토리의 적절한 위치에 배치합니다.
웹 브라우저에서 UserController URL(예: http://localhost:8080/your-webapp-name/UserController)에%EC%97%90) 액세스합니다.
서블릿은 사용자 데이터를 가져와서 user_list.jsp 페이지로 전달합니다.
JSP 페이지에 사용자 데이터가 테이블로 표시됩니다.

your-webapp-name을 웹 애플리케이션의 실제 이름으로 바꾸고 서블릿 및 JSP 파일이 웹 애플리케이션 디렉토리의 올바른 위치에 있는지 확인하십시오.

이 예제는 사용자 목록이 있는 간단한 MVC 패턴을 보여줍니다. 실제 애플리케이션에서 모델은 데이터베이스 또는 기타 데이터 소스와 상호 작용하고 컨트롤러는 더 복잡한 비즈니스 로직을 처리합니다.

Application Setting

프로젝트 익스플로우

프로젝트 구조

프로젝트 세팅 > 프로젝트

프로젝트 세팅 > 모듈

프로젝트 세팅 > 라이브러리

프로젝트 세팅 > Facets

프로젝트 세팅 > Artifacts

Dynamic web server setting

VM options

# active profile 설정
-Dspring.profiles.active=local
# 한글 설정 깨짐 현상 해결
-Dfile.encoding="UTF-8" -Dsun.stderr.encoding="UTF-8" -Dsun.stdout.encoding="UTF-8"

한글깨짐 해결

1. web.xml

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

2. pom.xml

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

3. server.xml

<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

4. application.properties

spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true

5. application.yml

spring:
  http:
    encoding:
      charset: UTF-8
      enabled: true
      force: true

6. @RequestMapping

@RequestMapping(value = "/test", produces = "application/json; charset=utf8")

7. @RestController

@RestController
public class TestController {
    @RequestMapping(value = "/test", produces = "application/json; charset=utf8")
    public String test() {
        return "한글";
    }
}

8. @Controller

@Controller
public class TestController {
    @RequestMapping(value = "/test", produces = "application/json; charset=utf8")
    public String test() {
        return "한글";
    }
}

9. @ResponseBody

@Controller
public class TestController {
    @RequestMapping(value = "/test", produces = "application/json; charset=utf8")
    @ResponseBody
    public String test() {
        return "한글";
    }
}

10. @RestControllerAdvice

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public String handleException(Exception e) {
        return "한글";
    }
}

11. @ControllerAdvice

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public String handleException(Exception e) {
        return "한글";
    }
}

12. @ExceptionHandler

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public String handleException(Exception e) {
        return "한글";
    }
}

13. @ExceptionHandler + @ResponseBody

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public String handleException(Exception e) {
        return "한글";
    }
}

14. @ExceptionHandler + @RestControllerAdvice

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public String handleException(Exception e) {
        return "한글";
    }
}

15. @ExceptionHandler + @ControllerAdvice

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public String handleException(Exception e) {
        return "한글";
    }
}

16. @ExceptionHandler + @ControllerAdvice + @ResponseBody

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public String handleException(Exception e) {
        return "한글";
    }
}

17. @ExceptionHandler + @RestControllerAdvice + @ResponseBody

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public String handleException(Exception e) {
        return "한글";
    }
}

18. @ExceptionHandler + @RestControllerAdvice + @ResponseBody + @ResponseStatus

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseBody
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public String handleException(Exception e) {
        return "한글";
    }
}

19. @ExceptionHandler + @ControllerAdvice + @ResponseBody + @ResponseStatus

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseBody
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public String handleException(Exception e) {
        return "한글";
    }
}

20. @ExceptionHandler + @ControllerAdvice + @ResponseStatus

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public String handleException(Exception e) {
        return "한글";
    }
}

21. @ExceptionHandler + @ControllerAdvice + @ResponseStatus + @ResponseBody

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public String handleException(Exception e) {
        return "한글";
    }
}

22. @ExceptionHandler + @RestControllerAdvice + @ResponseStatus + @ResponseBody

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public String handleException(Exception e) {
        return "한글";
    }
}

23. @ExceptionHandler + @RestControllerAdvice + @ResponseStatus + @ResponseBody + @Controller

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public String handleException(Exception e) {
        return "한글";
    }
}

24. @ExceptionHandler + @ControllerAdvice + @ResponseStatus + @ResponseBody + @Controller

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public String handleException(Exception e) {
        return "한글";
    }
}

25. @ExceptionHandler + @ControllerAdvice + @ResponseStatus + @ResponseBody + @Controller + @RestControllerAdvice

@ControllerAdvice
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public String handleException(Exception e) {
        return "한글";
    }
}

26. @ExceptionHandler + @RestControllerAdvice + @ResponseStatus + @ResponseBody + @Controller + @ControllerAdvice

@RestControllerAdvice
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public String handleException(Exception e) {
        return "한글";
    }
}