FreeMarker 가 struts 2, JAVA, 웹 에서 의 응용 실례

12702 단어 freemarker
FreeMarker 개술
    * FreeMarker 는 템 플 릿 을 기반 으로 텍스트 출력 을 만 드 는 일반적인 도구 로 순수한 자바 로 작 성 된 템 플 릿 엔진 입 니 다.
    * Template + data model = output
FreeMarker 는 매우 우수한 템 플 릿 엔진 입 니 다. 이 템 플 릿 엔진 은 모든 장면 에 사용 할 수 있 습 니 다. FreeMarker 는 데이터 모델 의 데 이 터 를 템 플 릿 에 통합 시 켜 표준 출력 을 생 성 합 니 다. 인터페이스 개발 자 는 인터페이스 (즉 템 플 릿 파일) 에 대한 개발 만 필요 합 니 다.한편, 비 즈 니스 논리 개발 자 는 표시 할 데 이 터 를 데이터 모델 에 입력 하 는 것 만 책임 져 야 합 니 다. - FreeMarker 는 데이터 모델 과 템 플 릿 을 통합 하여 표준 출력 을 생 성 합 니 다.
FreeMarker 는 MVC 모드 의 웹 응용 에 특히 적합 합 니 다. FreeMarker 는 프로 그래 밍 능력 이 있 지만 이러한 프로 그래 밍 능력 은 매우 제한 되 어 업무 논 리 를 실현 할 수 없고 데이터 형식의 변환 기능 만 제공 할 수 있 습 니 다. 따라서 자바 프로그램 이 표시 할 데 이 터 를 준비 하고 FreeMarker 템 플 릿 엔진 으로 페이지 를 만 들 고 FreeMarker 템 플 릿 은 페이지 레이아웃 지원 을 제공 합 니 다.(장점: MVC 분 리 를 엄 격 히 실현)
또한 FreeMarker 도 웹 용기 와 무관 합 니 다. 즉, FreeMarker 는 반드시 웹 용기 에서 실행 되 어야 하 는 것 이 아 닙 니 다. FreeMarker 역시 비 웹 응용 프로그램 환경 에 응용 할 수 있 습 니 다. 또한 FreeMarker 는 HTML 페이지 만 생 성 하 는 것 이 아니 라 XML, RTF, Java 소스 코드 등 다양한 텍스트 를 생 성 할 수 있 습 니 다.
Struts 2 는 기본적으로 FreeMarker 를 템 플 릿 파일 로 사용 합 니 다. Struts 2 의 모든 테마 템 플 릿 파일 은 FreeMarker 로 작 성 됩 니 다. eclipse 의 JSP, 자바 등 템 플 릿 파일 도 FreeMarker 기술 을 사용 합 니 다.
1.
struts 2 에서 freemarker 사용 하기
일반적인 struts 2 프로필 은 일반적으로 이렇게 설정 합 니 다:
<action name=“Action1“ class=“com.abc.Action1“>
    <result>/page.jsp</result>
</action>

여기 view 는 jsp 페이지 이 고 freemarker 템 플 릿 페이지 로 변경 할 수 있 습 니 다.
<action name=”Action1″ class=”com.abc.Action1″>
    <result type=”freemarker”>/fm.ftl</result>
</action>

물론 fm. ftl 에 struts 2 라벨 을 사용 하고 싶 습 니 다. fm. ftl 페이지 에서 struts 2 라벨 에 대한 인용 을 처음 추가 해 야 합 니 다.
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />

인용 하기 전에 struts 2 - core - 2.0. x. x. jar 가방 에 있 는 META - INF/struts - tags. tld 를/WEB - INF/struts - tags. tld 로 복사 합 니 다.
기본적으로 JspTaglibs 의 인용 은 지원 되 지 않 습 니 다. 웹. xml 을 수정 하고 다음 과 같은 내용 을 추가 해 야 합 니 다.
 <servlet>
        <servlet-name>JspSupportServlet</servlet-name>
        <servlet-class>
             org.apache.struts2.views.JspSupportServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

간단 한 fm. ftl 파일 의 예:
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />
<html>
<head>
<meta http-equiv=“Content-Type“ content=“text/html; charset=GB2312“>
<title>Insert title here</title>
</head>
<body>
<@s.form action=“Action1.action“>
<@s.textfield name=“username“></@s.textfield>
<@s.textfield name=“password“></@s.textfield>
<@s.submit value=“  “/>
</@s.form>
<br/>     :${username}
</body>
</html>

메모: struts 2 는 freemarker 페이지 에서 태그 쓰기 와 jsp 페이지 의 쓰기 가 다 릅 니 다. freemarker 에 서 는 < @ s. form > 이 고 jsp 에 서 는 < s: form > 입 니 다. 잘못 쓰 지 마 세 요!
사용 할 때 중국어 에 대한 지원 이 좋 지 않 은 것 을 발 견 했 습 니 다. 표시 할 때 중국어 에 오류 가 발생 했 습 니 다. 여기 서 struts. xml 설정 파일 을 수정 합 니 다.
<constant name=”struts.i18n.encoding” value=”gb2312″ />

이제 struts 2 에서 freemarker 를 정상적으로 사용 할 수 있 습 니 다!
자신의 인 스 턴 스:
(1) struts. xml 에 점프 추가:
 <package name="loginPackage" extends="jason-default">
     <action name="jLogin" class="JLogin">
       <result name="success" >/WEB-INF/jason/index.jsp</result>
        <result name="error">/WEB-INF/jason/login.jsp</result>
        <result name="input">/WEB-INF/jason/login.jsp</result>
        <result name="search" type="freemarker">/WEB-INF/templates/jsearch.ftl</result>
        <interceptor-ref name="jLoginStack"/>
     </action>
 </package>

(2)
ACTION 에서 설정:
Hits hits = JLuceneUtils.luceneSearch(indexPath, searchMess);
   System.out.println("----------hits.length():" + hits.length());
   for (int a = 0; a < hits.length(); a++) {
    Document doc2 = (Document) hits.doc(a);
    System.out.println(searchMess + "   :"+ doc2.get("confContext"));
    ActionContext.getContext().getSession().put("jsearch_value",
doc2.get("confContext"));
   }
   ActionContext.getContext().getSession().put("jsearch_cout", hits.length());
   ActionContext.getContext().getSession().put("jsearch_name", searchMess);

(3)
템 플 릿 파일 설정: jsearch. ftl:
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jason search result</title>
</head>
<body>
<table width="98%" border="0" align="center" cellpadding="5" cellspacing="0">
  <tr>
    <td><strong>   jason lucene     ,  ${jsearch_cout}   :</strong></td>
  </tr>
  <tr>
    <#-- freemarker  (  ,   EL  ,  ACTION      session/request/application) -->
    <td>    :${jsearch_name} ---    :${jsearch_value}</td>
  </tr>
  <tr>
    <td>
    <@s.url action="jLogin!login" id="login" />
    <a href="${login}">      </a>
    </td>
  </tr>
</table>
</body>
</html>

(4)
STRUTS 2.0 탭 을 사용 하려 면 위 와 같이 STRUTS 2.0 탭 라 이브 러 리 를 추가 해 야 합 니 다.
웹. xml 추가:
<servlet>
        <servlet-name>JspSupportServlet</servlet-name>
        <servlet-class>
             org.apache.struts2.views.JspSupportServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

jsearch. ftl 맨 앞 에 추가:
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />

2, 자바 프로그램 에서 FreeMarker 사용
FreeMarker 의 템 플 릿 은. ftl 텍스트 파일 입 니 다. 이 파일 에 FreeMarker 의 특별한 표 시 를 사 용 했 습 니 다. 이 표 시 는 동적 으로 표시 되 거나 프로그램 출력 을 제어 합 니 다. 예 를 들 어 아래 템 플 릿 파일 코드 와 같 습 니 다.
${name}, 안녕하세요! ${msg}
여기 서 ${} 과 유사 한 것 은 동적 내용 으로 '플러그 인' 이 라 고 합 니 다.
FreeMarker 를 사용 하여 데이터 모델 의 값 을 템 플 릿 파일 에 통합 하기 위해 다음 절 차 를 따라 진행 할 수 있 습 니 다.
1. Configuration 인 스 턴 스 를 만 듭 니 다. 이 인 스 턴 스 는 FreeMarker 의 템 플 릿 로드 경 로 를 관리 하고 템 플 릿 인 스 턴 스 를 생 성 합 니 다.
2. Configuration 인 스 턴 스 를 사용 하여 Template 인 스 턴 스 를 생 성 합 니 다. 지정 한 템 플 릿 파일 과 함께 들 어 갑 니 다.
3. 데이터 모델 을 채 우 면 데이터 모델 은 맵 대상 입 니 다.
4. Template 인 스 턴 스 를 호출 하 는 process 방법 으로 합병 을 완료 합 니 다.
다음은 FreeMarker 를 사용 하여 출력 을 만 드 는 자바 프로그램 입 니 다. 프로그램 소스 코드 는 다음 과 같 습 니 다.
package lee;
import java.util.*;
import java.io.*;
import freemarker.template.*;
public class HelloFreeMarker
{
    private Configuration cfg;
    public void init() throws Exception
{
        //   FreeMarker  
        //    Configuration  
        cfg = new Configuration();
        //  FreeMarker       
        cfg.setDirectoryForTemplateLoading(new File("templates"));
    }
   
public void process()throws Exception
{
        Map root = new HashMap();
        root.put("name", "FreeMarker!");
   root.put("msg" , "         FreeMarker   ");
        Template t = cfg.getTemplate("test.ftl");
        t.process(root, new OutputStreamWriter(System.out));
}
public static void main(String[] args)throws Exception
{
   HelloFreeMarker hf = new HelloFreeMarker();
   hf.init();
   hf.process();
}
}

위의 코드 는 Map 인 스 턴 스 를 만 들 었 습 니 다. 이 Map 은 템 플 릿 파일 의 데이터 모델 이 될 것 입 니 다. FreeMarker 를 사용 하려 면 freemarker. jar 파일 을 가 져 와 야 합 니 다. FreeMarker 의 홈 페이지 는?http://freemarker.sourceforge.net/, FreeMarker 는 자바 프로그램 에서 사용 할 수 있 지만 대부분 HTML 페이지 를 만 드 는 데 사 용 됩 니 다.
3, 웹 애플 리 케 이 션 에서 FreeMarker 사용
웹 애플 리 케 이 션 에서 FreeMarker 를 사용 하 는 것 은 자바 프로그램 에서 사용 하 는 것 과 크게 다 르 지 않 습 니 다. 다음은 웹 에서 사용 하 는 예 입 니 다. HTML 페이지 를 만 드 는 템 플 릿 파일 의 내용 은 다음 과 같 습 니 다.
<html>
<head>
<title>FreeMarker HelloWorld</title>
</head>
<body>
${message}
</body>
</html>

웹 애플 리 케 이 션 에서 FreeMarker 를 사용 할 때 Servlet 에 템 플 릿 과 데 이 터 를 통합 시 켜 야 합 니 다. 따라서 Servlet 은 Configuration 인 스 턴 스 를 만 들 고 템 플 릿 과 데 이 터 를 통합 하 는 것 을 책임 집 니 다. 다음은 Servlet 소스 코드 입 니 다.
package lee;
import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import freemarker.template.*;
public class HelloServlet extends HttpServlet
{
    private Configuration cfg;
    public void init()
{
        //   FreeMarker  
        //    Configuration  
        cfg = new Configuration();
        //  FreeMarker       
        cfg.setServletContextForTemplateLoading(getServletContext(), "WEB-INF/templates");
    }
   
    public void service(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
{       
        //      
        Map root = new HashMap();
        root.put("message", "Hello FreeMarker!");    
        //      
        Template t = cfg.getTemplate("test.ftl");       
        //         
        // -        charset      charset
        // -   text/html MIME-type
        response.setContentType("text/html; charset=" + t.getEncoding());
        Writer out = response.getWriter();
       
        //         ,       out 
        try
   {
            t.process(root, out);
        }
   catch (TemplateException e)
   {
            throw new ServletException("  Template       ", e);
        }
    }
}

이 Servlet 클래스 의 코드 는 일반적인 자바 프로그램 에서 FreeMarker 를 사용 하 는 것 과 대체적으로 같 습 니 다. 차이 점 은 두 가지 가 있 습 니 다. 1. FreeMarker 를 설정 하여 템 플 릿 을 불 러 오 는 방법 이 다 릅 니 다. Servlet 에서 불 러 오 는 방법 을 설정 하 는 것 은 setServlet ContextForTemplate Loading 입 니 다. 첫 번 째 매개 변 수 는 이 웹 에서 사용 하 는 Servlet Context 이 고 두 번 째 매개 변 수 는 템 플 릿 파일 의 경로 입 니 다. 2. 결 과 는 HttpSer 로 출력 해 야 합 니 다.vletResponse 에서 만 브 라 우 저 에 불 러 올 수 있 습 니 다.
Servlet 의 웹. xml 파일 을 설정 하 는 코드 는 다음 과 같 습 니 다.
<web-app>
<servlet>
   <servlet-name>hello</servlet-name>
   <servlet-class>lee.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>hello</servlet-name>
   <url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>

4, FreeMarker 의 템 플 릿 파일
위의 예 를 통 해 알 수 있 듯 이 FreeMarker 의 템 플 릿 파일 은 HTML 페이지 보다 그다지 복잡 하지 않 습 니 다. FreeMarker 템 플 릿 파일 은 주로 다음 과 같은 네 부분 으로 구성 되 어 있 습 니 다.
1. 텍스트: 직접 출력 하 는 부분
2, 주석: <\# --... -> 형식 부분, 출력 하지 않 습 니 다.
3. 플러그 인: 즉 ${...} 또는\# {...} 형식의 부분 은 출력 대신 데이터 모델 의 부분 을 사용 합 니 다.
4, FTL 명령: FreeMarker 지정, HTML 태그 와 유사, 이름 앞 에\# 를 추가, 출력 하지 않 습 니 다
다음은 FreeMarker 템 플 릿 의 예 로 상기 4 개 부분 을 포함 합 니 다.
<html><br>
<head><br>
<title>Welcome!</title><br>
</head><br>
<body><br>
<#--      --><br>
<#--        -->
<h1>Welcome ${user} !</h1><br>
<p>We have these animals:<br>
<u1><br>
<#--   FTL   -->
<#list animals as being><br>
   <li>${being.name} for ${being.price} Euros<br>
<#list><br>
<u1><br>
</body><br>
</html>

좋은 웹페이지 즐겨찾기