Spring MVC和自定义标签

时间:2011-01-16 15:41:52

标签: java spring-mvc taglib

我想在spring-mvc应用程序中的自定义taglibs中使用spring-beans。原因TagLib-Instances没有被spring实例化,我不能使用dependnecy-injection。

我的下一个想法是通过拦截器将spring-context添加到请求中,并在tag-class中从请求中获取它。

有没有更好的方法在taglibs中使用spring?春天有什么东西可以随时使用吗?如果spring-mvc中还没有customtag-support,是否有办法用依赖项填充现有对象?

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();
  }
}

3 个答案:

答案 0 :(得分:3)

最后,执行此操作的方法是将spring应该由spring启动的字段声明为static,然后启动一个Tag-instance

public class MyTag extends TagSupport {
  private static MyObject myObject;

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

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

}

答案 1 :(得分:2)

您应该更喜欢将该逻辑放入控制器中。如果你真的需要这样做,你可以编写一个实用程序类来从应用程序上下文中检索bean。

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

然后你就可以像这样检索你的bean:

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

答案 2 :(得分:0)

在控制器中,将对象放入模型中。

现在可以在作为标记一部分的HttpRequest对象中找到该对象。

控制器:

model.addAttribute("item", item);

Jsp文件:

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

如果您必须自动装配,请在“is there an elegant way to inject a spring managed bean into a java custom/simple tag

上查看我的解决方案