[英]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實例化的。 因此它們不是彈簧上下文的一部分,因此它們的依賴性不會被注入。
您可以:
@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.