這是一個在實際項目中遇到的問題,問題描述如下:
系統整體架構是通過struts2+hinernate+Spring,在action裏得到一個已經初始化的ServletConfig對象,也就是請求到達的時候,ServletConfig已經初始化了,即這個struts的Action有了兩重職責,一方面要處理請求轉發,另一方面要完成ServletConfig對象的初始化。
那麼在struts2的Action中該如何初始化ServletConfig對象呢?其實在Struts的Action中根本不可能直接初始化ServletConfig,Action已經跳出了servelt的範圍,ServletConfig的初始化一定是在web應用啓動的時候所做的事情。那麼通過分析,能在web應用啓動的時候進行初始化的方式就有好幾種了:
1.直接通過一個servlet實現;
2.通過監聽器實現;
3.通過繼承struts2的FilterDispatcher,複寫init()方法實現。
下面展示第一種方式的實現:
1、新建一個 InitServlet
package yamadv.com.Action;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class InitServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
}
public void init(ServletConfig config) throws ServletException {
super.init(config);
// 將config設置到ServletContext中,需要的時候去get即可
config.getServletContext().setAttribute("servletConfig", config);
//System.out.println("初始化Config對象......" + config.toString());
}
}
寫一個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對象......" + config.toString());
}
在初識話InitServlet的時候回執行init有servlet的生命週期得知。
然後在web.xml中配置InitServlet.java使得項目啓動的時候設置執行InitServlet的init的方法。
<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>
然後在baseAction中獲取ServletConfig.
package yamadv.com.Action;
import java.io.IOException;
import java.util.Arrays;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.hamcrest.core.Is;
import yamadv.com.util.FastjsonFilter;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public abstract class BaseAction extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request;
private HttpSession session;
private ServletConfig config;
public ServletConfig getServletConfig(){
return this.config = (ServletConfig)request.getSession().getServletContext().getAttribute("servletConfig");
}
@Override
public void setServletRequest(HttpServletRequest arg0) {
// TODO Auto-generated method stub
this.request=arg0;
this.session=this.request.getSession();//get session for client
}
public HttpServletRequest getRequest() {
return request;
}
public void setRequest(HttpServletRequest request) {
this.request = request;
}
public HttpSession getSession() {
return session;
}
public void setSession(HttpSession session) {
this.session = session;
}
/**
* 獲得response
*
* @return
*/
public HttpServletResponse getResponse() {
return ServletActionContext.getResponse();
}
/**
* 將對象轉換成JSON字符串,並響應回前臺
*
* @param object
* @param includesProperties
* 需要轉換的屬性
* @param excludesProperties
* 不需要轉換的屬性
*/
public void writeJsonByFilter(Object object, String[] includesProperties, String[] excludesProperties) {
try {
FastjsonFilter filter = new FastjsonFilter();// excludes優先於includes
if (excludesProperties != null && excludesProperties.length > 0) {
filter.getExcludes().addAll(Arrays.<String> asList(excludesProperties));
}
if (includesProperties != null && includesProperties.length > 0) {
filter.getIncludes().addAll(Arrays.<String> asList(includesProperties));
}
String json;
String User_Agent = getRequest().getHeader("User-Agent");
if (StringUtils.indexOfIgnoreCase(User_Agent, "MSIE 6") > -1) {
// 使用SerializerFeature.BrowserCompatible特性會把所有的中文都會序列化爲\\uXXXX這種格式,字節數會多一些,但是能兼容IE6
json = JSON.toJSONString(object, filter, SerializerFeature.WriteDateUseDateFormat, SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.BrowserCompatible);
} else {
// 使用SerializerFeature.WriteDateUseDateFormat特性來序列化日期格式的類型爲yyyy-MM-dd hh24:mi:ss
// 使用SerializerFeature.DisableCircularReferenceDetect特性關閉引用檢測和生成
json = JSON.toJSONString(object, filter, SerializerFeature.WriteDateUseDateFormat, SerializerFeature.DisableCircularReferenceDetect);
}
getResponse().setContentType("text/html;charset=utf-8");
getResponse().getWriter().write(json);
getResponse().getWriter().flush();
getResponse().getWriter().close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 將對象轉換成JSON字符串,並響應回前臺
*
* @param object
* @throws IOException
*/
public void writeJson(Object object) {
writeJsonByFilter(object, null, null);
}
/**
* 將對象轉換成JSON字符串,並響應回前臺
*
* @param object
* @param includesProperties
* 需要轉換的屬性
*/
public void writeJsonByIncludesProperties(Object object, String[] includesProperties) {
writeJsonByFilter(object, includesProperties, null);
}
/**
* 將對象轉換成JSON字符串,並響應回前臺
*
* @param object
* @param excludesProperties
* 不需要轉換的屬性
*/
public void writeJsonByExcludesProperties(Object object, String[] excludesProperties) {
writeJsonByFilter(object, null, excludesProperties);
}
}
關鍵代碼:
private ServletConfig config;
public ServletConfig getServletConfig(){
return this.config = (ServletConfig)request.getSession().getServletContext().getAttribute("servletConfig");
}