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