Struts2的Action獲取ServletConfig對象的解決方案

這是一個在實際項目中遇到的問題,問題描述以下:
系統總體架構是經過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裏有以下的方法: 架構

Java代碼 複製代碼 收藏代碼
  1. public void init(ServletConfig config) throws ServletException { 
  2.     super.init(config); 

public void init(ServletConfig config) throws ServletException {
	super.init(config);
}

寫一個servlet,複寫上面的init方法,便可達到初始化ServletConfig對象的目的
例如: 框架

Java代碼 複製代碼 收藏代碼
  1. public void init(ServletConfig config) throws ServletException { 
  2.     super.init(config); 
  3.     將config設置到ServletContext中,須要的時候去get便可 
  4.     config.getServletContext().setAttribute("servletConfig", config); 
  5.     System.out.println("初始化Config對象......" + servletConfig.toString()); 

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

Java代碼 複製代碼 收藏代碼
  1. <servlet> 
  2.     <servlet-name>initServlet</servlet-name> 
  3.     <servlet-class>com.servlet.InitServlet</servlet-class
  4.     <init-param> 
  5.         <param-name>method</param-name> 
  6.         <param-value>findByPage</param-value> 
  7.     </init-param> 
  8.     <init-param> 
  9.         <param-name>pageSize</param-name> 
  10.         <param-value>15</param-value> 
  11.     </init-param> 
  12.     <load-on-startup>1</load-on-startup> 
  13. </servlet> 

<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

Java代碼 複製代碼 收藏代碼
  1. ServletConfig sconfig = (ServletConfig)request.getSession().getServletContext().getAttribute("servletConfig"); 

ServletConfig sconfig = (ServletConfig)request.getSession().getServletContext().getAttribute("servletConfig");


以上是在項目開發中遇到的一個小問題,固然你可能不會遇到這個問題,(由於我在公司本身的框架中開發,會有一些限制)但我相信這個思路會對你們遇到相似問題時有一些幫助。 code


另外,咱們甚至可讓本身的struts2的Action繼續於一個servlet,此時的Action像這樣: xml

Java代碼 複製代碼 收藏代碼
  1. public class MyAction extends MyServlet implements Action 

public class MyAction extends MyServlet implements Action

在MyServlet中作一些初始化的工做,而後實現Action接口的public String execute() throws Exception方法,這也一樣是一個struts2的Action。 只不過,struts2的初衷就是要脫離servlet容器,而若是繼承一個servlet就有點違背struts2的初衷了。 對象

相關文章
相關標籤/搜索