2010-02-17 45 views
8

Tôi đã xem xét xung quanh nhưng không thể tìm thấy cách đơn giản bao gồm hoặc hiển thị các tệp * .html trong Grails. Ứng dụng của tôi cần có các mẫu g.render hoặc <g:render> được phân phối dưới dạng tệp html. Đối với điều này, như chúng ta biết, các tệp html phải được chuyển đổi thành _foo.gsp tệp để được hiển thị. Tôi hoàn toàn ngạc nhiên là tại sao không có hỗ trợ trực tiếp cho html hoặc có một?Hiển thị các tệp HTML trong Grails

Cảm ơn!

Trả lời

20

Một tùy chọn hiển nhiên là chỉ cần đổi tên các tệp HTML của bạn từ foo.html thành _foo.gsp và sau đó sử dụng <render template="foo">. Tuy nhiên, điều này rõ ràng đến mức tôi chắc chắn bạn đã nghĩ về nó.

Nếu bạn đơn giản chỉ muốn làm cho một file HTML từ bên trong một bộ điều khiển bạn có thể sử dụng text tham số của phương pháp renderkhiển

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

Nếu bạn muốn làm điều tương tự từ bên trong một .gsp , bạn có thể viết một thẻ. Một cái gì đó như sau (chưa được kiểm tra) nên làm việc:

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 
    } 
} 

Bạn có thể gọi thẻ này từ một GSP sử dụng

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

Cảm ơn Don! Điều này có vẻ như nó (phần thứ hai tức là.). Tôi sẽ thử và cập nhật kết quả của tôi tại đây. – sector7

+0

Đừng - không biết nếu bạn sẽ thấy điều này, hy vọng như vậy. Tôi đã thử mã mà bạn đã đăng, nhưng có vẻ như tôi phải chỉ định một tệp có liên quan đến thư mục gốc của máy tính của tôi, ví dụ: "C: /grails2.0/..." Làm cách nào để làm cho nó hoạt động liên quan đến thư mục webroot của tôi, như chế độ xem kết xuất hiện đang hoạt động, tìm kiếm tệp trong thư mục chế độ xem thích hợp? – Ray

+1

@Ray Nếu bạn đặt các tệp HTML trong ứng dụng web, bạn có thể truy xuất chúng bằng cách sử dụng 'g.resource' –

3

nó là gì bạn đang cố gắng để thực hiện?

  1. Render html từ bộ điều khiển? Trong trường hợp đó, tất cả những gì bạn cần làm là chuyển hướng người dùng đến tệp từ kiểm soát của bạn.

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

  2. Sử dụng html file thay vì GSP mẫu-file? Thing là, Grails là một "Công ước về cấu hình" -nền tảng và điều đó có nghĩa là bạn sẽ phải làm một số điều "cách Grails". Các tập tin cần _ và .gsp nhưng tên có thể là bất cứ điều gì bạn thích ngay cả khi nó dễ dàng hơn khi bạn sử dụng cùng tên với bộ điều khiển. Những gì bạn đạt được từ việc đó là kiến ​​thức rằng mọi nhà phát triển biết grails và đi vào dự án của bạn sẽ hiểu cách mọi thứ được gắn kết với nhau và điều đó sẽ giúp họ bắt đầu nhanh chóng.

+0

Trong kịch bản thế giới thực, tôi có thể nói, mọi thứ không hoạt động theo các Công ước cứng nhắc. Một Framework nên ít nhất hỗ trợ làm việc với các yếu tố cơ bản nhất của nó - HTML trong trường hợp này. Trả lời câu hỏi của bạn, chúng tôi có một trang GSP duy nhất trong đó nhiều Đồng hồ được hiển thị. Mỗi Gauges là các mẫu _GSP_ thuần túy NHƯNG mỗi lần một khi chúng cần phải trực tiếp hiển thị các tệp HTML được thả vào một thư mục cụ thể /some_folder/*.html Trong TAGLIB mà tôi đã tạo, chúng ta cần chuyển đổi giữa hiển thị từ Mẫu GSP hoặc tệp HTML. Xin lỗi vì không xóa thông tin này trước tiên. – sector7

+0

Cảm ơn bạn đã xóa thông tin đó. Câu trả lời của Don có vẻ thích hợp cho bạn và thành thực mà nhu cầu của bạn là đủ cụ thể để đảm bảo taglib tùy chỉnh của riêng nó. – xlson

1

Little bit cố định ví dụ của Don, hoạt động tốt đối với tôi

nhập khẩu 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(); 
    } 

Nó là tương đối so với ứng dụng web thư mục ứng dụng chính grails của bạn

+0

tôi đã sửa đổi cách tiếp cận của bạn để cho phép bao gồm các tệp bên ngoài cho plugin kết xuất grails, nơi đường dẫn mạng sẽ bị xâm nhập trong môi trường cao hơn - tôi đã kết thúc như sau: 'def includeFile = {attr -> URL resource = Holders.getServletContext() .getResource (attr.file) InputStream content = resource.getContent() Chuỗi văn bản = nội dung? .tiếp theo log.info "includeFile ($ attr) - tài nguyên: $ resource, content.text.size(): $ { văn bản? .size()} " ra << văn bản }' –

1

Tôi muốn viết các trang html/ajax tĩnh được lưu trữ trong ứng dụng grails (v2.4.4), nhưng sử dụng bộ điều khiển cho url viết lại. Tôi đã có thể thực hiện điều này bằng cách di chuyển các tập tin vào web-app/(để dễ tham khảo), và chỉ đơn giản là sử dụng phương pháp render() với 'file' và 'contentType' params, chẳng hạn như:

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

Lưu ý: Tôi chỉ thử điều này bằng cách sử dụng ứng dụng chạy và chưa đóng gói một cuộc chiến và được triển khai cho tomcat.

Đốc: http://grails.github.io/grails-doc/2.4.4/ref/Controllers/render.html

0

tôi đã có thể sử dụng phương pháp @ momo để cho phép bao gồm các tập tin bên ngoài cho grails render plugin, nơi đường dẫn mạng sẽ bị hỏng trong môi trường cao hơn - tôi đã kết thúc như:

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 
} 
Các vấn đề liên quan