【问题标题】:Spring MVC and custom tagsSpring MVC 和自定义标签
【发布时间】:2011-06-10 00:38:49
【问题描述】:

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

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

有没有更好的方法在 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();
  }
}

【问题讨论】:

  • 我知道你可能不想听到这个,但你为什么要在你的视图中执行需要 Spring bean 的操作?最好的做法是让您的视图尽可能简单。如果您还没有,我会尝试在您的控制器中执行此操作...
  • 我同意@Caps。您应该将该代码移至控制器。

标签: java spring-mvc taglib


【解决方案1】:

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

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

    现在可以在作为标签一部分的 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”上的解决方案

    【讨论】:

      【解决方案3】:

      最后的工作方式是将spring应该启动的字段声明为静态,然后启动一个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();
        }
      

      }

      【讨论】:

        猜你喜欢
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多