2016-12-20 25 views
0

是否可以在Spring中以某种方式集成Spring bean和JSP标签。那是使用Spring bean作为JSP标签?如果是的话,这是一个好的/可怕的想法?因此,像这样将有可能:集成Spring Bean和JSP标签

@Component 
public class SomeBean extends SimpleTagSupport { 

    @Autowired 
    SomeBean someBean; 

    @Override 
    public void doTag() throws JspException, IOException { 
     getJspContext().getOut().write(someBean.doSomething()); 
    } 
} 

我将在tags.tld得到它,而不是使用创建不会someBean注入了新的实例的Spring bean做什么?或者是别的什么?

回答

2

InternalResourceViewResolver允许您将导出bean的说明用于jsp上下文。例如,如果你想揭露豆的列表,你应该在你配置视图解析器dispatcher-servlet.xml下一个方法:

... 
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/views/"/> 
     <property name="suffix" value=".jsp"/> 
     <property name="exposedContextBeanNames"> 
      <list> 
       <value>someBean</value> 
      </list> 
     </property> 
    </bean> 
    ... 

其中someBean是你想出口到JSP上下文的bean的名称。你甚至可以公开所有春豆:

... 
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/views/"/> 
     <property name="suffix" value=".jsp"/> 
     <property name="exposeContextBeansAsAttributes" value="true"/> 
    </bean> 
    ... 

这允许您访问由bean的名字去春来从JSP背景豆。

比方说你的标签的处理程序是这样的:

package com.mytags; 
public class SomeTag extends SimpleTagSupport { 

    private SomeBean bean; 

    @Override 
    public void doTag() throws JspException, IOException { 
     getJspContext().getOut().write(bean.doSomething()); 
    } 

    public SomeBean getBean(){...} 
    public void setBean(SomeBean bean){...} 
} 

然后在TLD的标签进行说明接下来方式:

... 
<tag> 
    <name>someTag</name> 
    <tag-class>com.mytags.SomeTag</tag-class> 
    <body-content>empty</body-content> 
    <attribute> 
     <name>bean</name> 
     <required>true</required> 
     <rtexprvalue>true</rtexprvalue> 
     <type>com.mybeans.SomeBean</type> 
    </attribute> 
</tag> 
... 

注意,你必须指定rtexprvaluetrue,因为你会将bean作为EL表达式传递给标签。现在你可以在JSP中使用这个标签:

<%@ taglib prefix="mytags" uri="http://mytags.com" %> 
<%@ page contentType="text/html;charset=UTF-8" language="java" %> 
<html> 
    <head> 
    <title></title> 
    </head> 
    <body> 
    <mytags:someTag bean="${someBean}"/> 
    </body> 
</html> 

但实际上它是不是好主意,右直接从标签的处理程序访问的Spring bean。标签必须知道如何显示数据,但应该从如何获取这些数据中抽象出来。更好地准备好要显示在控制器中的所有数据,并将其作为模型传递给j​​sp。

+0

谢谢你写这样一个全面的答案,正是我所期待的。 – Snickers3192