struct2 中获取 ServeltConfig对象的实现

来源:互联网 发布:unity3d assetstore 编辑:程序博客网 时间:2024/04/30 02:55

这是一个在实际项目中遇到的问题,问题描述如下:
系统整体架构是通过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");     }
0 0