2016-12-20 7 views
0

Можно ли как-то весной интегрировать весенние бобы и JSP-теги. Это использование Spring-компонента в качестве 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, чтобы получить его, чтобы использовать Spring боб вместо создания нового экземпляра, который не был бы someBean впрыскивается? Или что-то еще?

ответ

2

InternalResourceViewResolver позволяет использовать экспозицию для экспорта компонентов в контексте 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 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> 
    ... 

Это позволяет получить доступ к весне бобов из 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, потому что вы передадите 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> 

Но на самом деле это не хорошая идея, чтобы получить доступ к весеннему бобу прямо из обработчика тега непосредственно. Тег должен знать, как показывать данные, но должен быть отвлечен от того, как получить эти данные. Лучше подготовьте все данные, которые вы хотели бы показать в контроллере, и передайте их в качестве модели для jsp.

+0

Благодарим вас за то, что вы нашли такой всеобъемлющий ответ, именно то, что я ищу. – Snickers3192