1. 개요

이 기사에서는 Java Contexts 및 Dependency Injection 기술을 활용하고 이해하기 쉬운 간단하고 직관적인 Java MVC 웹 프레임워크인 VRaptor 를 살펴보겠습니다 .

Spring과 마찬가지로 어노테이션에 크게 의존하며 Hibernate와 잘 작동합니다 .

또한 내부화 및 단위 테스트와 같은 몇 가지 유용한 플러그인과 함께 제공됩니다.

이제 VRaptor의 다양한 구성 요소를 살펴보고 샘플 프로젝트를 만들어 봅시다.

2. Maven 의존성 및 설정

시작하고 실행하는 한 가지 빠른 방법 은 공식 저장소 에서 vraptor-blank-project-distribution 을 다운로드하는 것 입니다.

빈 프로젝트는 선택한 완전한 웹 애플리케이션이 되기 위해 살을 붙일 수 있는 뼈대일 뿐입니다.

프로젝트를 다운로드하고 압축을 푼 후 디렉토리 이름을 vraptor (또는 다른 이름)로 바꿉니다.

디렉터리에는 다음이 포함되어야 합니다.

  • 소스/
  • pom.xml
  • README.md

이 프로젝트는 Maven 기반이며 애플리케이션 실행을 위한 서블릿 컨테이너를 제공하는 tomcat7 Maven 플러그인과 함께 제공됩니다.

또한 index() 메서드 하나만 있는 기본 IndexController 도 함께 제공됩니다 .

기본적으로 이 메서드로 렌더링할 뷰는 webapp/WEB-INF/jsp/index/index.jsp 에 있습니다. 이는 WEB-INF/jsp/ controller_name/method_name 규칙을 따릅니다 .

서버를 시작하기 위해 mvn tomcat7 명령 을 실행 합니다. 프로젝트의 루트에서 실행 합니다.

성공하면 http://localhost:8080 을 방문 하면 브라우저에 “ 작동합니다!! VR랩터! ".

" java.lang.LinkageError: loader 제약 조건 위반"에 직면하면 pom.xml 에서 다음 의존성을 수정해야 합니다 .

<dependency>
    <groupId>org.jboss.weld.servlet</groupId>
    <artifactId>weld-servlet-core</artifactId>
    <version>2.1.2.Final</version>
    <exclusions>
        <exclusion>
	    <groupId>org.jboss.spec.javax.el</groupId>
	    <artifactId>jboss-el-api_3.0_spec</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.jboss.weld</groupId>
    <artifactId>weld-core-impl</artifactId>
    <version>2.1.2.Final</version>
    <exclusions>
       <exclusion>
          <groupId>org.jboss.spec.javax.el</groupId>
  	  <artifactId>jboss-el-api_3.0_spec</artifactId>
       </exclusion>
    </exclusions>
</dependency>

범인은 컴파일 범위 가 있는 weld-servlet-coreweld-core-impl포함된 el-api 입니다. 이로 인해 의존성 충돌이 발생합니다.

다음 의존성이 줄을 따라 필요하므로 pom.xml 에 포함시키겠습니다 .

<dependency>
    <groupId>br.com.caelum.vraptor</groupId>
    <artifactId>vraptor-freemarker</artifactId>
    <version>4.1.0-RC3</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.8-dmr</version>
</dependency>

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.27-incubating</version>
</dependency>

vraptor-freemarker , mysql-connector-javafreemarker 아티팩트 의 최신 버전은 Maven Central에서 찾을 수 있습니다.

이제 준비가 되었으니 간단한 블로그 사이트를 구축해 보겠습니다.

3. 최대 절전 모드 지원

VRaptor는 데이터베이스와 상호 작용하기 위한 다양한 플러그인을 제공하며 그 중 하나는 Hibernate 4와 함께 작동하는 vraptor-hibernate 입니다.

플러그인은 CDI를 통해 런타임 에 Hibernate의 SessionFactory 빈을 사용할 수 있도록 합니다.

플러그인이 준비되면 표준 Hibernate 구성 파일이 필요합니다. 예는 저장소에서 찾을 수 있습니다.

VRaptor는 생산자라는 기술을 사용하여 객체를 DI 관리에 사용할 수 있도록 합니다. 이에 대한 자세한 내용은 여기 .

4. VRaptor에서 웹 경로 정의

VRaptor에서 라우트 정의는 Spring에서와 같이 단순히 @Controller 어노테이션이 달린 Java 객체인 컨트롤러에 상주합니다.

@Path 어노테이션은 요청 경로를 특정 컨트롤러에 매핑하는 데 사용되며 @Get, @Post, @Put, @Delete@Patch 어노테이션은 HTTP 요청 유형을 지정하는 데 사용됩니다.

경로 매핑 구성은 JAX-RS의 방식과 유사해 보이지만 공식적으로 표준을 구현하지는 않습니다.

또한 경로를 정의할 때 중괄호 안에 경로 변수를 지정할 수 있습니다.

@Get("/posts/{id}")

그런 다음 컨트롤러 메서드 내에서 id 값에 액세스할 수 있습니다.

@Get("/posts/{id}")
public void view(int id) {
    // ...
}

양식이 특정 경로에 제출되면 VRaptor는 제출된 양식 데이터로 개체를 자동으로 채울 수 있습니다.

이 기사의 다음 섹션에서 이 작업을 살펴보겠습니다.

5. 뷰와 템플릿 엔진

기본적으로 보기는 JSP를 사용하여 구현할 수 있습니다. 그러나 다른 템플릿 엔진도 사용할 수 있습니다. 이 기사에서는 Freemarker를 사용합니다.

index.ftl 을 생성 하고 기본 보기 디렉토리(src/main/resources/templates)에 저장하여 시작하겠습니다.

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>VRaptor Blank Project</title>
</head>
<body>
It works!! ${variable}
</body>
</html>

이제 뷰 렌더링을 위해 FreemarkerView 클래스 와 함께 정의된 뷰를 사용할 수 있습니다 .

@Path("/")
public void index() {
    result.include("variable", "VRaptor!");
    result.use(FreemarkerView.class).withTemplate("index");
}

Result 개체는 모델 상태를 유지합니다 . 다른 페이지, URL 또는 컨트롤러 메서드로 리디렉션하는 메서드가 있습니다. CDI를 사용하여 컨트롤러에 주입할 수 있습니다.

이 예에서 변수 는 Freemarker에 의해 해결됩니다. 따라서 index.ftl 의 ${variable} 자리 표시 자는 "VRaptor!"로 대체됩니다.

고급 사용법은 여기 에 문서화되어 있습니다 .

6. 양식 제출 처리 예시

유효성 검사를 통해 양식 제출을 처리하는 방법을 살펴보겠습니다.

@Post("/post/add")
public void add(Post post) {
    post.setAuthor(userInfo.getUser());
    validator.validate(post);
    if(validator.hasErrors()) {
        result.include("errors", validator.getErrors());
    }
    validator.onErrorRedirectTo(this).addForm();
  
    Object id = postDao.add(post);
  
    if(Objects.nonNull(id)) {
       result.include("status", "Post Added Successfully");
         result.redirectTo(IndexController.class).index();
    } else {
        result.include(
          "error", "There was an error creating the post. Try Again");
        result.redirectTo(this).addForm();
    }
}

Post 개체는 postDao.add()를 사용하여 데이터베이스에 지속되기 전에 먼저 Java bean 유효성 검사를 사용하여 유효성 검사 합니다 .

Post 개체 의 필드는 제출된 양식 데이터의 값에서 자동으로 채워집니다. 이는 보기 파일의 양식 입력 필드에 해당합니다.

입력 필드의 이름에는 소문자로 된 객체 이름이 접두사로 붙어야 합니다.

예를 들어 새 게시물 추가를 담당하는 보기에는 입력 필드가 있습니다 . Post 의 제목게시물 필드 에 해당하는 post.titlepost.post 입니다 . 각각 자바 :

<input type="text" class="form-control" placeholder="Title" 
  id="title" name="post.title" required />

<textarea rows="10" class="form-control" placeholder="Post" 
  id="post" name="post.post" required></textarea>

전체 add.ftl 파일은 소스 코드에서 찾을 수 있습니다.

양식 제출에 오류가 있는 경우 오류 메시지가 포함되고 사용자가 동일한 add() 메서드로 리디렉션됩니다.

if(validator.hasErrors()) {
    result.include("errors", validator.getErrors());
}
validator.onErrorRedirectTo(this).addForm();

7. 결론

결론적으로 VRaptor를 한눈에 살펴보고 기본 MVC 기능을 달성할 수 있는 방법을 살펴보았습니다.

설명서 에는 프레임워크와 사용 가능한 플러그인에 대한 자세한 내용이 포함되어 있습니다 .

샘플 database.sql 을 포함한 전체 소스 코드 는 Github 에서 사용할 수 있습니다 .

res – REST (eBook) (cat=REST)