2015-04-07 21 views
6

Tôi có một dự án Spring MVC sử dụng Gạch Apache. Tôi đã thực hiện để tiêu đề có thể được đọc từ một nguồn tin như thế này:Hỗ trợ tiêu đề động và được dịch trong Gạch Apache

<tiles-definitions>  
    <definition name="some-definition" extends="public.base"> 
     <put-attribute name="title" value="some-definition.title" cascade="true" /> 
    </definition> 
</tiles-definitions> 

Và trong file template của tôi (được định nghĩa bởi public.base), tôi thực hiện như sau:

<title><spring:message text="" code="${title}" /></title> 

Bây giờ các công trình vĩ đại này cho các tiêu đề được dịch tĩnh, nhưng tôi cũng muốn hỗ trợ các tiêu đề động, ví dụ để hiển thị tên công ty. Tôi có thể làm như sau:

<tiles-definitions>  
    <definition name="some-definition" extends="public.base"> 
     <put-attribute name="title" expression="${company.name}" /> 
    </definition> 
</tiles-definitions> 

Và sau đó chỉ cần xuất tiêu đề trong mẫu của tôi như sau: <c:out value="${title}" />. Tuy nhiên, vấn đề là mã của tôi bị ngắt vì giá trị của thuộc tính title không còn là khóa thông báo nữa. Tôi muốn có thể hỗ trợ các tình huống sau:

  1. Tiêu đề tĩnh, ví dụ: "Giới thiệu về chúng tôi"
  2. Tiêu đề hoàn toàn động, ví dụ: "$ {company.name}"
  3. Tiêu đề động với nội dung đã dịch, ví dụ: "Chào mừng bạn đến với $ {company.name}"

Lý tưởng nhất, tôi có thể sử dụng ngôn ngữ biểu thức trong nguồn tin nhắn của mình, nhưng tôi không thể làm việc đó. Tôi đã thử nghiệm khá nhiều với các giải pháp khác nhau, nhưng tôi dường như không thể tìm thấy một giải pháp tốt. Nếu tôi có thể sử dụng ngôn ngữ biểu hiện trong nguồn tin nhắn của tôi, thì điều này sẽ dễ dàng. Ví dụ, nó sẽ có thể làm như sau bằng cách nào đó?

some-definition.title = Hello there, ${company.name} 

Và trong mẫu của tôi:

<spring:message text="" code="some-definition.title" var="test" /> 
<c:out value="${test}" /> 

ở trên không hoạt động, vì nó kết quả đầu ra ${company.name} chứ không phải là nội dung thực tế của biến. Có cách nào để làm một việc như thế này không? Hoặc có cách nào khác để tôi có thể hỗ trợ các kịch bản mà tôi liệt kê ở trên không?

Tôi đã nghĩ về việc tạo thẻ JSTL tùy chỉnh nơi tôi sẽ phân tích biểu thức chuỗi trong mã Java đơn giản (chuỗi đã được dịch), nhưng tôi nhận ra rằng tôi có thể phải chỉ định rõ ràng đối tượng gốc cho biến thay thế "để làm việc, as documented here. Sau đó, nó không có vẻ như một giải pháp năng động như vậy.

Có cách nào để tôi có thể thực hiện tác vụ này không? Bất kỳ sự giúp đỡ nào cũng được đánh giá cao!

+0

Xin chào Andy, tôi đã sử dụng Thymeleaf (với Gạch) và câu hỏi của bạn nhắc tôi lần đầu tiên tôi phải xử lý các tin nhắn: http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf. html # messages –

+0

Cảm ơn bạn đã liên kết, @PatrickLC. Bạn đúng rằng đây là cách bạn thường làm điều đó, và tôi đã làm như vậy trong quá khứ. Tuy nhiên, tôi vẫn không chắc chắn làm thế nào để làm điều này trong trường hợp sử dụng cụ thể của tôi mà không cần phải thông qua một cách rõ ràng các thông số khi dịch văn bản. Nó thậm chí không thể làm được những gì tôi muốn, tôi không chắc chắn. – Andy0708

Trả lời

0

việc bản địa hóa các định nghĩa ô có giúp ích gì không? ref http://tiles.apache.org/framework/tutorial/advanced/l10n.html

nếu không tôi sẽ xem xét một ViewPreparer mở rộng các thông điệp mùa xuân cho bạn.

+1

Định nghĩa ô được bản địa hóa giúp ích nếu tiêu đề của tôi không chứa nội dung động. Tôi đã suy nghĩ về việc cố gắng thực hiện một ViewPreparer trước đây, và nó có thể là con đường để đi. Cám ơn bạn đã đóng góp ý kiến! – Andy0708

0

Định nghĩa ô có thể xác định thuộc tính được gọi là 'controllerClass'. Lớp này sẽ triển khai thực hiện giao diện org.apache.struts.tiles.Controller và phương thức execute() được ghi đè của nó được gọi trước khi định nghĩa ô được hiển thị.

Phương thức thực thi có quyền truy cập đọc/ghi vào cặp tên-giá trị thuộc tính tile và cũng là đối tượng HttpServletRequest.Bạn có thể tra cứu thuộc tính của mình và thay đổi giá trị động hoặc thay thế giá trị đó bằng giá trị bán tĩnh từ tệp thuộc tính.

<definition name="some-definition" extends="public.base" controllerClass="pkgName.CustomController"> 
     <put-attribute name="title" expression="${company.name}" /> 
    </definition> 

Và sau đó trong lớp CustomController của bạn, bạn có thể thay đổi các thuộc tính

public class CustomController implements Controller{ 
     public void execute(ComponentContext tileContext, 
      HttpServletRequest request, HttpServletResponse response, 
      ServletContext servletContext) throws ServletException, IOException {  
      String attrName = (String)tileContext.getAttribute("title"); 
      String attrVal = request.getAttribute("pageTitle"); //get a dynamic value or else retrieve from a resource bundle 
      tileContext.putAttribute(attrName,attrVal); 
    } 

    public void perform(ComponentContext tileContext, 
      HttpServletRequest request, HttpServletResponse response, 
      ServletContext servletContext) throws ServletException, IOException { 
     execute(tileContext, request, response, servletContext); 
    } 
} 
0

Bạn không thể sử dụng gạch cho điều này, Juste của bạn mùa xuân-Model:

Trong điều khiển:

@RequestMapping(value = { "/page1" }, method = RequestMethod.GET) 
public String page1() { 
    model.addAttribute("titre_page", messageSource.getMessage("home.hello", null,null) 
} 

Trong layout.jsp:

... 
<title>${titre_page}</title> 
... 
<tiles:insertAttribute name="body" /> 
.... 
Các vấn đề liên quan