簡體   English   中英

在JSP中自動裝配Spring Beans的最簡潔方法是什么?

[英]What is the cleanest way to autowire Spring Beans in a JSP?

我們目前正在為一個舊的webapp添加一些新功能,它只使用了JSP而沒有任何框架。 我們最近添加了Spring,我們希望在修改后的JSP中自動裝配bean,而不是重寫所有內容以使用SpringMVC,Struts2或Tapestry5。

我們按類型使用自動裝配,因此它導致在JSP中獲得這樣的代碼,而之前獲取Web應用程序上下文(作為“wap”):

MyDao myDao = (MyDao) wap.getBeansOfType(MyDao.class).values().toArray()[0];

我們不想使用這樣的代碼,而是直接在我們的JSP中自動注入我們的bean,就像在使用@Autowired注釋的業務bean中那樣。

事實上,我們正在尋找在JSP中注入bean的最簡潔方法。 你用什么 ?

您可以使用Spring的ContextExposingHttpServletRequest

HttpServletRequest裝飾器,通過在訪問屬性后通過延遲檢查,使給定WebApplicationContext中的所有Spring bean可作為請求屬性訪問。

這將需要您的控制器代碼將原始HttpServletRequest包裝在ContextExposingHttpServletRequest ,然后將轉發給JSP。 它可以公開特定的命名bean,也可以暴露上下文中的每個bean。

當然,這只是將問題從您的JSP轉移到您的控制器代碼,但這可能是一個更易於管理的問題。

你不能直接使用@Autowired ,因為你的jsps和servlet都是由servlet conainer實例化的。 因此它們不是彈簧上下文的一部分,因此它們的依賴性不會被注入。

您可以:

  1. 將所有代碼移動到純servlet而不是jsps - 只在jsps中保留表示。
  2. 在servlet上使用@Configurable (並添加一個javaagent,如鏈接文檔中所述)

另一種方法是手動使servlet成為當前上下文的一部分。 這在jsps和servlet中都是可能的:

public void init() {
    WebApplicationContext ctx = WebApplicationContextUtils
         .getRequiredWebApplicationContext(getServletContext());

    AutowireCapableBeanFactory bf = ctx.getAutowireCapableBeanFactory();

    bf.autowireBean(this);
}

這將解析@Autowired注釋的依賴項。

現在,我不確定servlet容器是否需要使用一個servlet類的實例。 如果沒有,你最好將上面的代碼放在依賴的getter方法中( getDao() ),如果@Autowired屬性為null (即容器使用另一個servlet類的實例) - 執行以上操作。


總而言之, 真的考慮使用Web框架(您列出的任何一個)。 在jsps中使用邏輯是完全錯誤的,難以支持,難以閱讀等。

如何覆蓋jspInit()方法並添加自動裝配支持:

<%@ page import="com.example.ExampleService"%>
<%@ page import="org.springframework.beans.factory.annotation.Value"%>
<%@ page import="org.springframework.beans.factory.annotation.Autowired"%>
<%@ page import="org.springframework.web.context.support.SpringBeanAutowiringSupport"%>
<%!
    public void jspInit() 
    {
        SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
        getServletContext());
    }

    @Value("${example.property}")
    private String someField;

    @Autowired
    private ExampleService exampleService;
%>

<% final Object data = exampleService.getSomething(someField); %>

我懷疑有一種干凈的方式將依賴項注入JSP。

我認為干凈的解決方案是開始重構代碼,以便使用SpringMVC或您引用的替代方法之一從JSP中獲取業務邏輯。

從一個或多個簡約控制器開始,這些控制器只是將注入的bean作為屬性傳遞給JSPs; @skaffman的回答給出了一種方法,或者你可以更有選擇性地做到這一點。 然后逐步將代碼從JSP遷移到控制器中。

這不是自動裝配的,但Spring可以將您的bean名稱公開到請求上下文中,您只需要在viewResolver中配置它。

來自: https//raibledesigns.com/rd/entry/spring_mvc_jstlview_and_exposecontextbeansasattributes

<bean id="viewResolver" 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="exposeContextBeansAsAttributes" value="true"/>
    <property name="prefix" value="/"/>
    <property name="suffix" value=".jsp"/>
</bean>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM