struct2 中獲取 ServeltConfig對象的實現

這是一個在實際項目中遇到的問題,問題描述如下:
系統整體架構是通過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"); 
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章