Java Spring MVC和自定义标记

Java Spring MVC和自定义标记,java,spring-mvc,taglib,Java,Spring Mvc,Taglib,我想在SpringMVC应用程序中的自定义标记库中使用Springbean。因为TagLib实例不是由spring实例化的,我不能使用dependnecy注入 我的下一个想法是通过拦截器将spring上下文添加到请求中,并从tag类中的请求中获取它 有没有更好的方法在taglibs中使用spring?春天有什么东西可以用吗?如果SpringMVC中还没有customtag支持,那么有没有办法用依赖项填充现有对象 public class MyTag extends TagSupport {

我想在SpringMVC应用程序中的自定义标记库中使用Springbean。因为TagLib实例不是由spring实例化的,我不能使用dependnecy注入

我的下一个想法是通过拦截器将spring上下文添加到请求中,并从tag类中的请求中获取它

有没有更好的方法在taglibs中使用spring?春天有什么东西可以用吗?如果SpringMVC中还没有customtag支持,那么有没有办法用依赖项填充现有对象

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

您应该更愿意将该逻辑放入控制器中。如果确实需要这样做,可以编写一个实用程序类从应用程序上下文检索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;
    }
}

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

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

控制器:

model.addAttribute("item", item);
Jsp文件:

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


如果必须自动连线,请查看我在“”上的解决方案。

最后,实现这一点的有效方法是将应由spring启动的字段声明为静态字段,并让它启动一个标记实例

public class MyTag extends TagSupport {
  private static MyObject myObject;

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

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

}

我知道您可能不想听到这句话,但您为什么要执行需要SpringBean的操作?保持视图尽可能简单是最佳做法。如果你还没有…我同意@Caps,我会尝试在你的控制器中这样做。你应该把代码移到控制器上。
public class MyTag extends TagSupport {
  private static MyObject myObject;

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

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