集成弹簧豆和JSP标签



是否可以在弹簧中以某种方式集成弹簧豆和JSP标签。那是使用弹簧豆作为JSP标签吗?如果是这样,这是一个好/可怕的主意?因此,这样的事情是可能的:

@Component
public class SomeBean extends SimpleTagSupport {
    @Autowired
    SomeBean someBean;
    @Override
    public void doTag() throws JspException, IOException {
        getJspContext().getOut().write(someBean.doSomething());
    }
}

我在tags.tld中要做什么才能使其使用弹簧bean,而不是创建一个不会注入某个bebean的新实例?还是其他东西?

InternalResourceViewResolver允许您使用exposition将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的名称。您甚至可以露出 all 春季豆:

   ...
   <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>
...

请注意,您必须将rtexprvalue指定为true,因为您将以EL表达式将bean传递到标签中。现在您可以在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>

但实际上,直接从Tag的处理程序访问Spring Bean并不是一个好主意。标签必须知道如何显示数据,但应从如何获取此数据中抽象出来。最好准备您想在控制器中显示的所有数据,并将其作为模型传递给JSP。

最新更新