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-core 및 weld-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-java 및 freemarker 아티팩트 의 최신 버전은 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.title 및 post.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 에서 사용할 수 있습니다 .