这是一个在实际项目中遇到的问题,问题描述如下:
系统整体架构是通过struts2+公司自己的框架,公司自己的框架做了很多事情,为了共用这些部分,减少开发工作量,现在要在每一个请求到达struts2的action时,在action里得到一个已经初始化的ServletConfig对象,也就是请求到达的时候,ServletConfig已经初始化了,即这个struts的Action有了两重职责,一方面要处理请求转发,另一方面要完成ServletConfig对象的初始化。
那么在struts2的Action中该如何初始化ServletConfig对象呢?其实在Struts的Action中根本不可能直接初始化ServletConfig,Action已经跳出了servelt的范围,ServletConfig的初始化一定是在web应用启动的时候所做的事情。那么通过分析,能在web应用启动的时候进行初始化的方式就有好几种了:
1.直接通过一个servlet实现;
2.通过监听器实现;
3.通过继承struts2的FilterDispatcher,复写init()方法实现。
本人是通过第一种方法实现的,我们知道Servlet里有如下的方法:
Java代码
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void init(ServletConfig config) throws ServletException {
super.init(config);
}写一个servlet,复写上面的init方法,即可达到初始化ServletConfig对象的目的
例如:
Java代码
public void init(ServletConfig config) throws ServletException {
super.init(config);
将config设置到ServletContext中,需要的时候去get即可
config.getServletContext().setAttribute("servletConfig", config);
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中做如下配置
例如:
Java代码
<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>
<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对象信息:
Java代码
ServletConfig sconfig = (ServletConfig)request.getSession().getServletContext().getAttribute("servletConfig");
ServletConfig sconfig = (ServletConfig)request.getSession().getServletContext().getAttribute("servletConfig");
以上是在项目开发中遇到的一个小问题,当然你可能不会遇到这个问题,(因为我在公司自己的框架中开发,会有一些限制)但我相信这个思路会对大家遇到类似问题时有一些帮助。
另外,我们甚至可以让自己的struts2的Action继续于一个servlet,此时的Action像这样:
Java代码
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的初衷了。
分享到:
相关推荐
ServletConfig对象的试验代码
ServletContext与ServletConfig关系
注意:每个servlet有一个ServletConfig,...如果修改XML来改变一个初始化参数的值,只有当Web应用重新部署时Web应用其他部分才会看到,因为servlet只会初始化一次,在初始化时会为它提供ServletConfig和ServletContext。
(2)ServletContext对象被包含在ServletConfig对象中,开发人员在编写servlet时,可以通过 this.ServletConfig.getServletContext方法获得对ServletContext对象的引用.还可以直接通过 this.getServletContext方法...
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 20、abstract class和interface有什么区别? ...
ServletConfig getServletConfig() 返回传递到servlet的init()方法的ServletConfig对象 void service(ServletRequest request, ServletResponse response)throws ServletException,IOException 处理request对象中...
exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象 序号 方 法...
NULL 博文链接:https://shoushounihao.iteye.com/blog/1919541
ServletConfig是针对特定的Servlet的参数或属性。ServletConfig是表示单独...从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet有效,一个servlet的ServletConfig对象不能被另一个servlet访问
JSP共有以下9个内置的对象: request 用户端请求,此请求会包含来自GET/... config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。 page表示从该页面产生的一个servlet实例
博文链接:https://hotfisher.iteye.com/blog/92177
1. 手动编写java代码,实现Servlet的访问 2. 使用Eclipse创建Web Project,并创建一个Servlet继承HttpServlet...6. 使用ServletConfig对象,访问web.xml中的数据库连接信息。 7. 使用ServletContext对象,实现转发操作
很清楚的讲解了ServletContext和ServletConfig,不光有理论上的讲解,还有例子。
但在实际开发中,我们不会直接去实现Servlet接口,因为那样需要覆盖的方法太多, 我们一般创建类继承HttpServlet 实现步骤: 1)创建类继承HttpServlet类 2)覆盖doGet和doPost 3)在web.xml中进行servlet的配置。 ...
超全面javaweb教程28天第9天_6_ServletConfig介绍
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 17、abstract class和interface有什么区别? 声明方法...
如果有助于你处理应用的数据需求,你也许需要绑定对象到Session中,你可以通过一个唯一的名字绑定任何的对象到Session中,这时,你需要使用HttpSession对象。任何绑定到Session上的对象都可以被处理同一会话的...
11.3.3 ServletConfig对象 90 11.3.3.1 getServletContext方法 90 11.3.3.2 getServletName方法 91 11.3.3.3 getInitParameter方法 91 11.3.3.4 getInitParameterNames方法 92 11.3.4 container的父子关系 92 11.4 ...