這是一個在實際項目中遇到的問題,問題描述以下:
系統總體架構是經過struts2+公司本身的框架,公司本身的框架作了不少事情,爲了共用這些部分,減小開發工做量,如今要在每個請求到達struts2的action時,在action裏獲得一個已經初始化的ServletConfig對象,也就是請求到達的時候,ServletConfig已經初始化了,即這個struts的Action有了兩重職責,一方面要處理請求轉發,另外一方面要完成ServletConfig對象的初始化。 java
那麼在struts2的Action中該如何初始化ServletConfig對象呢?其實在Struts的Action中根本不可能直接初始化ServletConfig,Action已經跳出了servelt的範圍,ServletConfig的初始化必定是在web應用啓動的時候所作的事情。那麼經過分析,能在web應用啓動的時候進行初始化的方式就有好幾種了:
1.直接經過一個servlet實現;
2.經過監聽器實現;
3.經過繼承struts2的FilterDispatcher,複寫init()方法實現。 web
本人是經過第一種方法實現的,咱們知道Servlet裏有以下的方法: 架構
public void init(ServletConfig config) throws ServletException { super.init(config); }
寫一個servlet,複寫上面的init方法,便可達到初始化ServletConfig對象的目的
例如: 框架
public void init(ServletConfig config) throws ServletException { super.init(config); 將config設置到ServletContext中,須要的時候去get便可 config.getServletContext().setAttribute("servletConfig", config); System.out.println("初始化Config對象......" + servletConfig.toString()); }
並在web.xml中作以下配置
例如: spa
<servlet> <servlet-name>initServlet</servlet-name> <servlet-class>com.servlet.InitServlet</servlet-class> <init-param> <param-name>method</param-name> <param-value>findByPage</param-value> </init-param> <init-param> <param-name>pageSize</param-name> <param-value>15</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
在web應用啓動的時候,ServletConfig對象就進行了初始化,並將其初始化信息放置在了ServletContext中,在須要ServletConfig對象信息時,咱們就能夠在struts2的Action中經過以下的代碼獲得servletConfig對象信息: .net
ServletConfig sconfig = (ServletConfig)request.getSession().getServletContext().getAttribute("servletConfig");
以上是在項目開發中遇到的一個小問題,固然你可能不會遇到這個問題,(由於我在公司本身的框架中開發,會有一些限制)但我相信這個思路會對你們遇到相似問題時有一些幫助。 code
另外,咱們甚至可讓本身的struts2的Action繼續於一個servlet,此時的Action像這樣: xml
public class MyAction extends MyServlet implements Action
在MyServlet中作一些初始化的工做,而後實現Action接口的public String execute() throws Exception方法,這也一樣是一個struts2的Action。 只不過,struts2的初衷就是要脫離servlet容器,而若是繼承一個servlet就有點違背struts2的初衷了。 對象