2011-01-16 36 views
6

Tôi muốn sử dụng các loại đậu xuân trong các thẻ tag tùy chỉnh của tôi trong một ứng dụng spring-mvc. Nguyên nhân Các trường hợp TagLib không được khởi tạo vào mùa xuân, tôi không thể sử dụng tính năng tiêm phụ thuộc.Spring MVC và các thẻ tùy chỉnh

Suy nghĩ tiếp theo của tôi là thêm ngữ cảnh mùa xuân bởi một kẻ đánh chặn vào yêu cầu và nhận nó từ yêu cầu trong lớp thẻ.

Có cách nào tốt hơn để sử dụng lò xo trong thẻ taglib không? Có điều gì sẵn sàng sử dụng vào mùa xuân không? Nếu không có hỗ trợ customtag trong spring-mvc, có cách nào để điền một đối tượng exisiting với các phụ thuộc không?

public class MyTag extends TagSupport { 
    @Autowired 
    private MyObject object; 

    public void setMyObject(MyObject myObject) { 
    this.myObject = myObject; 
    } 

    public int doEndTag() { 
    ApplicationContext context = request.getAttribute("context"); 
    context.populate(this); 

    return object.doStuff(); 
    } 
} 
+0

thể trùng lặp của [Làm thế nào để tiêm đậu mùa xuân vào một jsp 2.0 SimpleTag?] (Http://stackoverflow.com/questions/1296052/how-to-inject-spring-beans-into- a-jsp-2-0-simpletag) – skaffman

+0

Tôi biết bạn có thể không muốn nghe điều này, nhưng tại sao bạn thực hiện các hoạt động đòi hỏi đậu mùa xuân trong tầm nhìn của bạn? Cách tốt nhất để giữ cho chế độ xem của bạn đơn giản nhất có thể. Tôi muốn thử và cố gắng làm điều này trong bộ điều khiển của bạn nếu bạn chưa ... – Caps

+0

Tôi đồng ý với @Caps. Bạn nên di chuyển mã đó đến Controller. –

Trả lời

3

Cuối cùng cách làm việc để làm điều này là để khai báo các trường sẽ được bắt đầu vào mùa xuân là tĩnh và để bắt đầu một Thẻ ví dụ

public class MyTag extends TagSupport { 
    private static MyObject myObject; 

    @Autowired 
    public void setMyObject(MyObject myObject) { 
    MyTag.myObject = myObject; 
    } 

    public int doEndTag() { 
    return object.doStuff(); 
    } 

}

2

Bạn nên đặt logic đó vào bộ điều khiển của mình. Nếu bạn thực sự cần phải làm điều đó, bạn có thể viết một lớp tiện ích để lấy các bean từ ngữ cảnh ứng dụng.

public class AppContextUtil implements ApplicationContextAware 
{ 
    private static final AppContextUtil instance = new AppContextUtil(); 
    private ApplicationContext applicationContext; 

    private AppContextUtil() {} 

    public static AppContextUtil getInstance() 
    { 
     return instance; 
    } 

    public <T> T getBean(Class<T> clazz) 
    { 
     return applicationContext.getBean(clazz); 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException 
    { 
     this.applicationContext = applicationContext; 
    } 
} 

Sau đó, bạn sẽ có thể lấy đậu của bạn như thế này:

AppContextUtil.getInstance().getBean(MyObject.class); 
0

Trong điều khiển của bạn, đưa đối tượng vào mô hình.

Hiện tại đối tượng có thể được tìm thấy trong đối tượng HttpRequest là một phần của thẻ của bạn.

Bộ điều khiển:

model.addAttribute("item", item); 

JSP File:

<%= ((com.content.CmsItem)(request.getAttribute("item"))).getId() %> 

Nếu bạn phải autowire, kiểm tra giải pháp của tôi trên 'is there an elegant way to inject a spring managed bean into a java custom/simple tag'

Các vấn đề liên quan