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
- struct2 中获取 ServeltConfig对象的实现
- Struct2中Session的获取及数据共享原理
- struct2中freemarker的用法
- Struct2获取response和request的方法
- Struct2中form表单的值无法传到Action对象中的值,解决方案之一
- Struct2拦截器的原理与实现
- struct2中map的类型的转换
- 关于struct2中result的小tip
- struct2实现文件下载
- 开发中需要加入的struct2的jar包
- struct2的xml文件中result的配置(转)
- Struct2 中 ognl表达式正确适用的地方
- 手动搭建struct2中碰到的一点问题
- 关于Struct2中<s:textfield>的回显问题
- Struct2的最大改进
- Struct2标签的使用
- Struct2标签的分类
- struct2的类型转换
- 马良建模学习笔记——软包制作十三
- Android面试题大集合
- 浏览器常用的功能
- 那一年, 我“偷看”过她的qq空间
- Android中Activity组件详解
- struct2 中获取 ServeltConfig对象的实现
- [242]Valid Anagram
- SQL增删改查语句格式参考一
- 第二章作业
- 【暑假阅读推荐书目】历史篇·中国史
- 文本框和图片在一行,图片高一头的解决办法
- Maven2的配置文件settings.xml
- Java gui设计
- SQL增删改查语句格式参考二