많은 사람들이 Velocity에 대해 보거나 배웠습니다. 이름을 직역하면 속도, 속도입니다. 웹 개발에 사용되지만 기본적으로 Velocity를 사용하는 사람은 많지 않습니다. 및 Struts 관련, Velocity에 대해 어떻게 생각하시나요? 여기서 소개를 통해 Velocity의 개념을 이해하고 기술 선택의 문제를 강조하여 모든 사람이 프로젝트 개발을 선택할 때 Velocity를 고려할 수 있도록 하고 결국 모든 사람이 Velocity의 아이디어를 이해할 수 있도록 합니다. 매우 좋은 사고 방식으로 모든 사람에게 마음의 변화와 다른 사고 방식을 제공합니다.
이 기사는 여러분이 Java 개발에 대한 특정 기초를 갖고 있고 MVC, Struts 및 기타 개발 모델을 알고 있다는 사실을 기반으로 합니다.
Velocity는 Java 템플릿 엔진 기술로 Apache에서 제안되었으며 다른 엔진 기술인 Webmacro에서 파생되었습니다. 그렇다면 Velocity의 공식적인 정의는 무엇입니까? Apache는 이를 다음과 같이 정의합니다. Java 기반의 템플릿 엔진이지만 누구나 간단하고 강력한 템플릿 언어를 사용하여 Java 코드에 정의된 개체를 참조할 수 있습니다. 최신 버전은 1.4입니다. 자세한 내용은 http://jakarta.apache.org/velocity/index.html 에서 확인할 수 있습니다.
사실 직설적으로 말하면 Velocity는 MVC 아키텍처의 구현이지만 Model과 View 사이의 연결 역할에 더 중점을 둡니다. 나는 모두가 MVC의 가장 인기 있는 아키텍처인 Struts에 익숙하다고 생각합니다. IBM의 Websphere 5 이상의 관리 플랫폼 버전을 포함하여 많은 개발자들이 Struts 아키텍처를 광범위하게 사용해 왔으며 이는 MVC의 좋은 사례이며 Java를 효과적으로 줄여줍니다. 코드는 View(Jsp)에 표시되지만 Model과 View 사이의 연결은 여전히 Struts의 Taglib 기술에 의존합니다. 프런트 엔드 웹 디자이너가 Struts나 Taglib에 익숙하지 않은 경우를 상상해 보십시오. 이후 유지보수 인력도 마찬가지입니다.) 이로 인해 웹 디자이너와 프런트엔드 개발 엔지니어가 서로 협력하기가 매우 어려워질 것입니다. 실제 개발에서는 여전히 웹 디자이너 간의 작업이 필요하다는 사실이 남아 있습니다. 프론트 엔드 개발자는 여전히 어느 정도의 결합이 있을 수 있습니다. 이 문제를 최대한 해결하는 방법은 무엇입니까? Velocity 또는 이 개념을 살펴보겠습니다.
Velocity의 작동 방식을 보여주기 위해 가장 간단한 Velocity 개발 예제부터 시작하겠습니다.
1. 파일을 생성합니다. 파일 이름은 hellavelocity.vm이며 속도 템플릿(실제로는 html과 동일)이며 내용은 다음과 같습니다.
$name님이 Javayou.com에 오신 것을 환영합니다!
오늘은 $date입니다.
2. 다음 내용을 포함하는 Java 파일 HelloVelocity.java를 생성합니다.
패키지 com.javayou.velocity;
import java.io.StringWriter;
import java.util.*;
org.apache.velocity.app.VelocityEngine 가져오기;
org.apache.velocity.Template 가져오기;
org.apache.velocity.VelocityContext 가져오기;
/**
* @author Liang.xf 2004-12-14
*/
공개 클래스 HelloVelocity {
public static void main(String[] args)에서 예외가 발생합니다.
//Velocity 엔진 초기화 및 획득
VelocityEngine ve = new VelocityEngine();
ve.init();
//속도 템플릿을 가져옵니다.
템플릿 t = ve.getTemplate("hellovelocity.vm");
//속도의 컨텍스트를 가져옵니다.
VelocityContext context = new VelocityContext();
//컨텍스트에 데이터 채우기
context.put("이름", "리앙");
context.put("날짜", (new Date()).toString());
//나중에 표시하려면 목록 값을 미리 입력하세요.
목록 임시 = new ArrayList();
임시.추가("1");
임시.추가("2");
context.put("목록", 임시);
//출력 스트림
StringWriter 작가 = 새로운 StringWriter();
//출력 변환
t.merge(컨텍스트, 작성자);
System.out.println(writer.toString());
}
}
3. http://jakarta.apache.org/site/binindex.cgi 에서 Velocity 1.4 zip을 다운로드하고 압축을 풀어 Velocity-1.4.jar을 얻은 후 이를 사용하여 위의 HelloVelocity.java 클래스를 컴파일합니다.
4. 1의 hellavelocity.vm을 실행의 현재 디렉터리에 복사합니다. HelloVelocity를 실행하려면 다운로드된 speed1.4.zip, \velocity - 1.4\build\lib에서 얻을 수 있는 다른 패키지도 필요합니다. commons-collections.jar 및 logkit-1.0.1.jar이 도입된 후 클래스가 컴파일되었다고 가정하고 java -cp .\bin -Djava.ext.dirs=.\lib2 com.javayou.velocity.HelloVelocity를 실행합니다. .\ bin 디렉토리로 이동하고 필요한 클래스 패키지는 .\lib2 디렉토리에 배치됩니다. 실행 구조는 다음과 같습니다.
Javayou.com에 오신 것을 환영합니다!
오늘은 2004년 12월 14일 화요일 19:26:37 CST입니다.
위의 내용은 가장 간단한 실행 결과입니다. hellavelocity.vm 템플릿에 정의된 두 변수 $name 및 $date는 각각 context.put("name", "Liang") 및 context.put입니다. ( "date", (new Date()).toString())은 설정된 값으로 대체됩니다.
이러한 관점에서 볼 때, 비즈니스 결과를 포함한 비즈니스 프로세스 처리는 기본적으로 모두 모델 레이어에서 해결되는 반면, 뷰 레이어는 기본적으로 간단한 VTL(Velocity Template Language)을 사용하여만 표시됩니다. 이렇게 되면 Jsp가 불필요하지 않을까요? 예, 이 사용 모델은 이전 CGI 방법과 약간 비슷합니다. :) Velocity는 자동으로 코드를 출력하며, Velocity는 이와 관련하여 Turbine에서 많은 코드를 생성하는 데 매우 유용합니다.
Velocity에서 변수 정의는 "$"로 시작하며 $는 Velocity의 식별자 역할을 합니다. 문자, 숫자, 획 및 밑줄은 모두 Velocity에서 정의된 변수로 사용할 수 있습니다.
또한 $student.No, $student.Address와 같은 Velocity의 특성 변수 정의에도 주의를 기울여야 합니다. 이는 두 가지 수준의 의미를 갖습니다. 첫 번째는 학생이 해시 테이블인 경우 키 No와 키는 다음과 같습니다. 해시 테이블에서 Address 값을 추출합니다. 두 번째 유형은 호출 메소드일 수 있다는 것입니다. 즉, 위의 두 변수는 Student.getNo() 및 Student.getAddress()로 변환됩니다. Velocity는 서블릿의 Java 코드에서 반환된 값에 대한 개체를 가지며 $student.getAddress() 등과 같은 개체의 메서드를 호출할 수도 있습니다. 여기서는 예제를 제공하지 않고 자세히 설명하지 않습니다.
위의 예는 단순한 예일 뿐입니다. 물론 많은 사람들은 실제 응용 프로그램에서 일부 선택적인 표시를 만들고 List 목록 및 Velocity( 특히 VTL 템플릿 언어여야 함)도 이 기능을 지원합니다. 또한 템플릿 내부의 변수(예: Jsp의 변수)와 자동화를 달성하기 위한 매크로 생성과 같은 더 강력한 디스플레이와 같이 일반적으로 사용되는 일부 디스플레이도 지원합니다. 계속 읽어보겠습니다.
위의 예를 계속 사용하고 hellavelocity.vm 템플릿의 콘텐츠를 다음과 같이 변경합니다.
#set( $iAmVariable = "좋습니다!" )
$name님이 Javayou.com에 오신 것을 환영합니다!
오늘은 $date입니다.
$iAm변수
위의 실행 명령을 다시 실행하면 결과는 다음과 같습니다.
Javayou.com에 오신 것을 환영합니다!
오늘은 2004년 12월 14일 화요일 22:44:39 CST입니다.
좋은!
템플릿의 변수가 #set으로 시작하는 문으로 정의되어 있음을 알 수 있는데, 실행 후에는 템플릿의 $iAmVariable 변수가 정의된 값으로 변환됩니다.
좋은!
간단한 선택을 다시 살펴보겠습니다. hellavelocity.vm 템플릿의 콘텐츠를 다음과 같이 변경합니다.
#set($admin = "관리자")
#set($user = "사용자")
#if ($admin == $user)
관리자님, 환영합니다!
#또 다른
사용자를 환영합니다!
#끝
실행 명령을 실행하면 결과는 다음과 같습니다.
사용자를 환영합니다!
판단문은 아주 간단하고 #if(), #else, #end 이며 그다지 복잡하지 않다는 것을 알 수 있습니다.
계속해서 반복 데이터를 살펴보고 hellavelocity.vm 템플릿의 콘텐츠를 다음과 같이 변경해 보겠습니다.
#foreach( $list의 $product )
$제품
#끝
실행 명령을 실행하면 결과는 다음과 같습니다.
#1
#2
예제에서는 VelocityContext List에 미리 저장된 값을 나열하는 것이 편리하지 않나요? #foreach(xx의 $variable)를 사용하면 됩니다. 위의 목록이 해시 테이블로 대체되면 다음 구문을 사용할 수 있습니다.
#foreach($hashVariable.keySet()의 $key)
$key의 값: $ hashVariable.get($key)
#끝
나는 이 스크립트가 전혀 복잡하다고 생각하지 않습니다.
많은 사람들이 '자바빈이면 어떨까?'라고 묻습니다. 좋아, 빈을 추가해보자:
패키지 com.javayou.velocity;
/**
* @author Liang.xf 2004-12-14
*/
공개 수업 학생 {
//클래스의 속성은 공개라는 점에 유의하세요.
공개 문자열 번호 = "";
공개 문자열 주소 = "";
public Student(String _no, String _address) {
아니오 = _아니요;
주소 = _주소;
}
공개 문자열 getAddress() {
반송 주소;
}
공개 무효 setAddress(문자열 주소) {
this.address = 주소;
}
공개 문자열 getNo() {
아니오를 반환;
}
공공 무효 setNo(문자열 번호) {
this.no = 아니오;
}
}
이 Student는 데이터를 로드하는 데 사용되는 일반 클래스인 전체 javabean 또는 데이터 bean입니다. 그런 다음 HelloVelocity.java를 다음과 같이 수정합니다.
임시.추가("1");
임시.추가("2");
다음으로 교체:
temp.add(새 학생("123", "광저우"));
temp.add(new Student("456", "주하이"));
그런 다음 hellavelocity.vm의 내용을 다음으로 변경합니다.
#foreach($s는 $students)
<$velocityCount> 주소: $s.address
#끝
run 명령을 다시 컴파일하고 실행하면 결과는 다음과 같습니다.
<1> 주소: 광저우
<2> 주소: 주하이
이런 식으로 목록의 학생 데이터가 인쇄되면 완료됩니다! Velocity의 내장 변수 $velocityCount는 1부터 시작하는 기본 열거 시퀀스 번호를 나타냅니다. 0으로 변경될 수도 있지만 Velocity.properties에서 변경해야 합니다. org\apache\velocity \runtime\defaults 디렉터리 아래에 Velocity-1.4.jar 패키지가 있습니다.
더 복잡한 반복을 처리하는 방법은 무엇입니까? 명확하게 설명하기 위해 다음 템플릿 예를 살펴보겠습니다.
#foreach($list의 $element)
-- 내부 foreach --
#foreach($list의 $element)
$element입니다.
$velocityCount
#끝
-- 내부 foreach --
-- 외부 foreach --
$element입니다.
$velocityCount
-- 외부 foreach --
#끝
보시다시피 Velocity는 매우 강력한 기능을 지원합니다. 여기서는 자세히 설명하지 않겠습니다. 관심이 있으시면 직접 사용해 보세요.
사실 방금 좀 더 자세히 설명한 예를 생각해 보면 Velocity의 용도가 무엇인지 이미 알 수 있습니다. 그것이 Servlet + Velocity 모델입니다. 또한, 초기 Jsp 개발 모델인 Jsp+JavaBean을 기억하시나요? 여기서는 Servlet+JavaBean+Velocity로 변경했습니다. Jsp+JavaBean을 대체하고 Jsp(vm)에서 Java 코드를 더 철저하게 제거했다면 비용은 다음과 같습니다. Java 코드는 JSP에서 항상 다소 등장합니다. Java 코드 없이 수행할 수 있다고 해도 복잡한 아키텍처 시스템을 수행한 개발자는 비용도 매우 비싸고 유지 관리 측면에서 통합 개발에 일정한 어려움이 있다는 것을 알고 있습니다. 웹 디자이너와 함께 Servlet+JavaBean+Velocity 모델이 OOD 개념을 더 잘 구현한다는 것을 여기서 느낄 수 있습니다. 효율성 측면에서는 걱정할 필요가 없습니다. 이 조합은 Servlet+Jsp 방법보다 효율적입니다.
Velocity에 대해 배우려는 사람은 많겠지만 실제로 이를 프로젝트에 적용할 수 있는 사람은 많지 않을 것입니다(Jute와 같은 일부 프로젝트에서는 여전히 이를 사용합니다). 결국 Jsp에 비해 Jsp가 더 표준적이고 널리 사용됩니다. Jsp 개발을 지원하는 많은 개발 도구가 사용되었습니다. 하지만 Velocity의 기능은 Jsp와의 경쟁에만 국한되지 않습니다. 위에서 볼 수 있듯이 자동 코드 출력에서는 매우 강력합니다. 앞서 언급한 것처럼 Turbine은 Velocity를 사용하여 많은 코드를 생성할 수도 있습니다. . 코드 생성기나 다른 템플릿 생성으로 만드는 것은 매우 좋은 생각입니다.
자, Velocity에 깊이 들어가 프로젝트를 수행하려는 경우 주의해야 할 몇 가지 일반적인 문제를 살펴보겠습니다. 첫 번째는 국제화 문제입니다.
Velocity 자체는 템플릿의 국제 인코딩 변환을 지원합니다. Velocity에서 제공하는 방법을 살펴보세요.
공개 템플릿 getTemplate(Stirng 템플릿, 문자열 인코딩),
이 접근 방식으로는 완전한 국제화를 달성할 수 없을 것으로 추측됩니다.
Struts에서 국제화의 가장 간단한 개념은 Jsp에서 국제 언어 태그를 사용하는 것이며, 각 언어는 서로 다른 언어 태그 라이브러리를 사용합니다. 확장하면 실제로 수동으로 수행할 수 있습니다. 예, 약간의 수동 처리가 필요합니다.
다행스럽게도 누군가 이미 위에서 언급한 문제를 해결하고 Velocity의 도구인 MessageTool을 만들었습니다. 이 도구는 국제화된 레이블을 포함하는 변수 텍스트를 제공합니다. 이러한 방식으로 $text.get('title과 같은 레이블 코드만 작성하면 됩니다. ' ), 보다 구체적인 내용은 http://jakarta.apache.org/velocity/tools/struts/MessageTool.html 에서도 확인할 수 있습니다.
좋아요, 그것은 모두 Velocity의 도입을 기반으로 합니다. 다른 확장에 대해 이야기해 보겠습니다. 어떤 사람들은 Velocity가 표준 MVC 구조가 아니라고 말했습니다. 예, 처음에 Velocity는 Model과 View의 좋은 조합일 뿐이고 결국 MVC의 좋은 조합은 아직 나오지 않았습니다. 결성되었습니다. 다행스럽게도 Apache는 Struts와 Velocity의 결합을 기반으로 VelocityStruts를 출시했습니다. 이 부분은 이후 주제에서 소개할 수 있습니다. 다음은 Struts의 구조와 비즈니스 로직의 Action을 기반으로 합니다. 마지막으로 비즈니스 프로세스는 Velocity 기반의 디스플레이 레이어로 이동하여 Jsp를 View 레이어로 대체합니다. 우리는 또한 인용된 예제가 기본적으로 원칙과 데모에 기반을 두고 있으며 VelocityStruts의 내용을 설명할 때 웹 개발과 긴밀하게 통합되지 않는다는 것을 확인했습니다.
Velocity 사용 소개 - Java 코드
1. 먼저 객체를 초기화하세요.
VelocityContext context = new VelocityContext();
StringWriter 작가 = 새로운 StringWriter();
문자열 인코딩2 = "GBK";
2. PROPERTY_PATH = 시스템 속성 파일의 TEMPLATE_INIT_PATH (속도에 필요한 속성 파일 경로를 지정합니다.)
3. 속성의 내용
file.resource.loader.path = D:/resin/webapps/mip/files/templateupload/ (템플릿이 있는 위치)
4. 그런 다음 Velocity.init(PROPERTY_PATH)를 초기화합니다.
5. 속도의 레이블을 java context.put(key, value);에 대응시킵니다.
6. 그런 다음 Velocity.mergeTemplate(templateName, 인코딩2, context,writer) 파일을 로드합니다.
7. 마지막으로 Generator.writeToFile()을 호출하여 파일을 생성합니다.
8. writeToFile 함수는 다음과 같습니다.
FileOutputStream of = new FileOutputStream(theFile);
of.write(writer.toString().getBytes("GBK"));
// 문자열 tt =writer.toString();
of.flush();
of.close();
이 기사는 CSDN 블로그에서 가져온 것입니다. 재인쇄할 때 출처를 표시하십시오: http://blog.csdn.net/sunrui_work/archive/2009/12/18/5029982.aspx