2010-02-17 3 views
8

둘러 보았지만 Grails에서 * .html 파일을 단순히 포함하거나 렌더링하는 방법을 찾지 못했습니다. 내 응용 프로그램은 g.render 또는 <g:render> 템플릿을 html 파일로 제공해야합니다. 이를 위해 html 파일을 렌더링하려면 _foo.gsp 개의 파일로 변환해야합니다. 나는 html에 대한 직접적인 지원이 없거나 거기에있는 이유가 무엇인지에 대해 완전히 놀랐습니다.Grails에서 HTML 파일 렌더링

감사합니다.

답변

20

하나의 명백한 옵션은 HTML 파일의 이름을 foo.html에서 _foo.gsp으로 간단히 변경 한 다음 <render template="foo">을 사용하는 것입니다. 그러나 이것은 너무 분명해서 나는 당신이 이미 그것의 생각을했다고 확신합니다.

당신은 단순히 당신이 .gsp에서 같은 일을 할 경우에는 render컨트롤러 메소드

def htmlContent = new File('/bar/foo.html').text 
render text: htmlContent, contentType:"text/html", encoding:"UTF-8" 

text 매개 변수를 사용할 수있는 컨트롤러 내에서 HTML 파일을 렌더링하려면 , 당신은 태그를 쓸 수 있습니다. (테스트되지 않은) 다음과 같은 뭔가 작업을해야합니다 :

import org.springframework.web.context.request.RequestContextHolder 

class HtmlTagLib { 

    static namespace = 'html' 

    def render = {attrs -> 

    def filePath = attrs.file 

    if (!file) { 
     throwTagError("'file' attribute must be provided") 
    } 

    def htmlContent = new File(filePath).text 
    out << htmlContent 
    } 
} 

당신은 당신이 달성하려고하는 무엇

<html:render file="/bar/foo.html"/> 
+0

감사합니다 돈! 이것은 그 것처럼 보입니다 (두 번째 부분 ie). 나는 이것을 시도하고 내 결과를 여기에서 업데이트 할 것이다. – sector7

+0

돈 - 이걸 볼 수 있는지 모르겠 으면 좋겠다. 내가 게시 한 코드를 시도했지만 컴퓨터 루트 디렉토리와 관련된 파일을 지정해야하는 것처럼 보입니다. "C : /grails2.0/..."웹 루트 디렉토리에 상대적으로 작동하게하려면 어떻게해야합니까? 렌더 뷰가 현재 작동하는 것처럼 적절한 뷰 폴더 아래에있는 파일을 찾으십니까? – Ray

+1

@Ray HTML 파일을 web-app 아래에두면'g.resource'를 사용하여 검색 할 수 있습니다. –

3

사용하여 GSP에서이 태그를 호출 할 수 있습니다?

  1. 컨트롤러에서 html로 렌더링 하시겠습니까? 이 경우 사용자가해야 할 일은 사용자를 컨트롤에서 파일로 리디렉션하는 것입니다. 대신 GSP 템플릿 파일의

    redirect(uri:"/html/my.html")

  2. 사용, HTML 파일? 사실, Grails는 "컨벤션 이상의 컨벤션 (Convention over Configuration)"플랫폼이며, 이는 Grails 방식과 같은 일을해야한다는 것을 의미합니다. 파일에는 _ 및 .gsp이 필요하지만 이름은 컨트롤러와 동일한 이름을 사용할 때 더 쉽게 할 수 있습니다. 당신이하는 일에서 얻을 수있는 것은 grails을 알고 프로젝트에 들어오는 모든 개발자들이 일들이 어떻게 묶여 있고 그들이 빨리 시작하는 데 도움이되는지를 이해한다는 것입니다.

+0

실제 시나리오에서는 엄격한 규칙에 따라 작동하지 않는다고 할 수 있습니다. 프레임 워크는 적어도 HTML과 같은 가장 기본적인 요소로 작업하는 것을 지원해야합니다. 귀하의 질문에 답하기 위해, 우리는 하나의 GSP 페이지를 가지고 여러 개의 게이지가 렌더링되었습니다. 이 Gauges 각각은 순수한 _GSP_ 템플릿이지만 때때로 특정 폴더로 떨어지는 HTML 파일을 직접 렌더링해야 할 때가 있습니다. /some_folder/*.html 내가 만든 TAGLIB에서 다음과 같이 렌더링을 토글 링해야합니다. GSP 템플릿 또는 HTML 파일. 먼저 삭제하지 않는 것에 대해 사과드립니다. – sector7

+0

삭제 해 주셔서 감사합니다. 돈의 대답은 당신에게 잘 어울리는 것처럼 보입니다. 솔직히 말해서 자신의 커스텀 taglib을 보증 할만큼 충분히 구체적이지는 않습니다. – xlson

1

조금

수입 org.apache.commons.io.IOUtils

class HtmlTagLib { 

    static namespace = 'html' 

    def render = {attrs -> 

     def filePath = attrs.file 

     if (!filePath) { 
      throwTagError("'file' attribute must be provided") 
     } 
     IOUtils.copy(request.servletContext.getResourceAsStream(filePath), out); 
    } 
} 
0
Closure include = { attr -> 
     out << Holders.getServletContext().getResource(attr.file).getContent(); 
    } 

그것은 웹 응용 프로그램을 기준으로 나를 위해 잘 작동, 돈의 모범을 고정 grails 메인 애플리케이션의 폴더

+0

내가 네트워크 경로가 높은 환경에서 것이지 얻을 것이다 플러그인, 렌더링 Grails에 외부 파일을 포함 할 수 있도록 접근 방식을 수정 - 광산처럼 종료를 : '데프 includeFile = {ATTR -> URL 자원 = Holders.getServletContext() .getResource (attr.file) InputStream content = resource.getContent() 문자열 텍스트 = 내용? .text log.info "includeFile ($ attr) - 리소스 : $ resource, content.text.size() : $ { text? .size()} " out << 텍스트 } –

1

grails app (v2.4.4)에서 호스팅되는 정적 html/ajax 페이지를 작성하고 싶었지만 url이 다시 작성됩니다.

// My controller action 
def tmp() { 
    render file: 'web-app/tmp.html', contentType: 'text/html' 
} 

: 나는 '파일'과 같은 '적인 contentType'의 PARAMS로 렌더링() 메소드를 사용하여 간단하게 (참조의 용이성을 위해) 웹 응용 프로그램 /에 파일을 이동하여이 작업을 수행하고, 할 수 있었다 참고 : 나는 run-app를 사용하여 이것을 시도했지만 전쟁을 포장하지 않고 아직 Tomcat에 배치하지 않았습니다.

문서 : http://grails.github.io/grails-doc/2.4.4/ref/Controllers/render.html

0

내가 네트워크 경로가 높은 환경에서 것이지 얻을 것이다 플러그인, 렌더링 Grails에 외부 파일을 포함 할 수 있도록 @ 모모의 방법을 사용할 수 있었다 - 광산처럼 결국 :

def includeFile = { attr -> 
    URL resource = Holders.getServletContext().getResource(attr.file) 
    InputStream content = resource.getContent() 
    String text = content?.text 
    log.info "includeFile($attr) - resource: $resource, content.text.size(): ${text?.size()}" 
    out << text 
}