zoukankan      html  css  js  c++  java
  • Struts通过加载插件的形式初始化系统常量以及其他信息

    一:通过插件的形式加载系统中定义的常量:

    思路:首先定义一个常量类存放系统常量,或者定义一个xml或properties文件中然后进行读取,

    然后把相应的常量放入map中

    最后编写插件类,加载map类

    最后把插件类放入struts-config.xml中启动的时候进行加载

    这样在其他页面中就可以随意访问了。


    1:首先定义在常量类中定义一些常量:

    package com.topwqp.common.constants;
    
    public class Globals {
       public static  final  String  AUTHOR = "topwqp";
       public static  final  String  PLUGINTEST = "puginTest";
    }
    


    2:把常量放在map中,

    package com.topwqp.common.constants;
    
    import java.util.HashMap;
    import java.util.Map;
    
    
    public class Constants {
    	private Map  globals;
    	
    	public Constants(){
    		globals = new HashMap();
    		globals.put("AUTHOR", Globals.AUTHOR);
    		globals.put("PLUGINTEST", Globals.PLUGINTEST);
    	}
    
    	public Map getGlobals() {
    		return globals;
    	}
    
    	public void setGlobals(Map globals) {
    		this.globals = globals;
    	}
    	
    }


    3:编写对应的插件类:

    插件类需要实现PlugIn接口关于这个接口的介绍在下面

    package com.topwqp.plugin;
    
    import javax.servlet.ServletException;
    
    import org.apache.struts.action.ActionServlet;
    import org.apache.struts.action.PlugIn;
    import org.apache.struts.config.ModuleConfig;
    
    import com.topwqp.common.constants.Constants;
    
    public class ConstantsPlugin implements PlugIn{
    
    	@Override
    	public void destroy() {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void init(ActionServlet servlet, ModuleConfig config)
    			throws ServletException {
    		System.out.println("load constans success. then you  can access constans.......");
    		// TODO Auto-generated method stub
    		Constants  constants = new Constants();
    		servlet.getServletContext().setAttribute("Constants", constants);
    		
    	}
    
    }
    


    关于PlugIn接口的源码如下:意思就是需要实现init() 其中init方法用于系统启动的一些设置在这个方法中进行编写,

    deploy方法是系统关闭时候的一些操作在这个方法中进行设置。

    源码如下:

    /*
     * $Id: PlugIn.java 471754 2006-11-06 14:55:09Z husted $
     *
     * Licensed to the Apache Software Foundation (ASF) under one
     * or more contributor license agreements.  See the NOTICE file
     * distributed with this work for additional information
     * regarding copyright ownership.  The ASF licenses this file
     * to you under the Apache License, Version 2.0 (the
     * "License"); you may not use this file except in compliance
     * with the License.  You may obtain a copy of the License at
     *
     *  http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing,
     * software distributed under the License is distributed on an
     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     * KIND, either express or implied.  See the License for the
     * specific language governing permissions and limitations
     * under the License.
     */
    package org.apache.struts.action;
    
    import org.apache.struts.config.ModuleConfig;
    
    import javax.servlet.ServletException;
    
    /**
     * <p>A <strong>PlugIn</strong> is a configuration wrapper for a
     * module-specific resource or service that needs to be notified about
     * application startup and application shutdown events (corresponding to when
     * the container calls <code>init</code> and <code>destroy</code> on the
     * corresponding {@link ActionServlet} instance). <code>PlugIn</code> objects
     * can be configured in the <code>struts-config.xml</code> file, without the
     * need to subclass {@link ActionServlet} simply to perform application
     * lifecycle activities.</p>
     *
     * <p>Implementations of this interface must supply a zero-argument
     * constructor for use by {@link ActionServlet}. Configuration can be
     * accomplished by providing standard JavaBeans property setter methods, which
     * will all have been called before the <code>init()</code> method is
     * invoked.</p>
     *
     * <p>This interface can be applied to any class, including an Action
     * subclass. </p>
     *
     * @version $Rev: 471754 $ $Date: 2005-05-14 01:09:32 -0400 (Sat, 14 May 2005)
     *          $
     * @since Struts 1.1
     */
    public interface PlugIn {
        /**
         * <p>Receive notification that our owning module is being shut down.</p>
         */
        void destroy();
    
        /**
         * <p>Receive notification that the specified module is being started
         * up.</p>
         *
         * @param servlet ActionServlet that is managing all the modules in this
         *                web application
         * @param config  ModuleConfig for the module with which this plug-in is
         *                associated
         * @throws ServletException if this <code>PlugIn</code> cannot be
         *                          successfully initialized
         */
        void init(ActionServlet servlet, ModuleConfig config)
            throws ServletException;
    }
    


    然后把编写的插件类在struts-config.xml中进行配置即可,当application在tomcat中启动 时候,首先加载web.xml的文件,web.xml中有相应的初始化设置加载指定的文件:

    及struts-config.xml文件:

    当然struts允许同时加载多个文件如下我的web.xml的配置如下:

    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>
            org.apache.struts.action.ActionServlet
        </servlet-class>
        <init-param>
            <param-name>config</param-name>
            <param-value>
             /WEB-INF/struts-config.xml, /WEB-INF/struts-config-1.xml, /WEB-INF/struts-config-2.xml
            </param-value>
        </init-param>
        
        <init-param>
            <param-name>config/admin</param-name>
            <param-value>
             /WEB-INF/struts-config-admin.xml
            </param-value>
        </init-param>
        <init-param>
            <param-name>config/common</param-name>
            <param-value>
             /WEB-INF/struts-config-common.xml
            </param-value>
        </init-param>
        
        <load-on-startup>1</load-on-startup>
      </servlet>
        
      <servlet-mapping>
           <servlet-name>action</servlet-name>
           <url-pattern>*.do</url-pattern>
      </servlet-mapping>

    把编写的插件配置在struts-config.xml中即可:

     <plug-in className="com.topwqp.plugin.ConstantsPlugin"></plug-in>


    在对应的jsp页面中访问:

    <p>
    Field name: AUTHOR<br />
    Field value: <bean:write name="Constants" 
    property="globals(AUTHOR)"/><br />
    </p>
    <p>
    Field name: PluginTest<br />
    Field value: <c:out value="${Constants.globals.PLUGINTEST}"/><br />
    </p>



    2:创建一个插件记录应用的启动时间以及已经运行了多久

    思路:定义时间追踪类,该类中有应用的启动时间,以及方法获取距离启动时间多久,然后在插件中放入这个类的实例,最后在jsp页面中进行显示即可。
    1:定义时间类:
    package com.topwqp.plugin;
    
    import java.util.Date;
    
    public class TimeTracker {
    	private long  startUpTimeMillis;
    	private Date startupOn;
    	
    	public TimeTracker (){
    		startUpTimeMillis = System.currentTimeMillis();
    		startupOn = new Date();
    	}
    	
    	//  how long the application  have started up;
    	public  long getUptime(){
    		return System.currentTimeMillis() - startUpTimeMillis;
    	}
    	// get  the  application  startup time
    	public  Date getStartupOn(){
    		return startupOn;
    	}
    
    }
    这个类中有个默认的构造方法,当对象创建的时候对应的启动时间就产生了,
    有一个getUptime方法,用去动态生成距离启动时间的毫秒数。

    2:创建对应的插件类:
    package com.topwqp.plugin;
    
    import javax.servlet.ServletException;
    
    import org.apache.struts.action.ActionServlet;
    import org.apache.struts.action.PlugIn;
    import org.apache.struts.config.ModuleConfig;
    
    public class TimeTrackerPlugin implements PlugIn{
    	
    	private String contextKey ;
    	
    	public void  setContextKey(String contextKey){
    		this.contextKey = contextKey;
    	}
    
    	@Override
    	public void destroy() {
    		// TODO Auto-generated method stub
    		System.out.println("do nothing............");
    	}
    
    	@Override
    	public void init(ActionServlet servlet, ModuleConfig config)
    			throws ServletException {
    		// TODO Auto-generated method stub
    		servlet.getServletContext().setAttribute(contextKey, new TimeTracker());
    		
    	}
    
    }
    


    3:在struts-config.xml中配置插件:
     <plug-in className="com.topwqp.plugin.TimeTrackerPlugin">
          <set-property property="contextKey" value="timeTracker"/>
        </plug-in>



    4:在jsp页面中获取对应的时间:
    <h4> 系统启动日期: since 
    <bean:write name="timeTracker" 
    property="startupOn" 
    format="MM/dd/yyyy HH:mm"/>
    <br> 
    已经运行时间:for
    <bean:write name="timeTracker" 
    property="uptime"/> milliseconds!
    </h4>


    然后启动应用访问即可:

    两个插件的访问页面显示效果:


  • 相关阅读:
    java.lang.OutOfMemoryError: GC overhead limit exceeded
    Ural 1146 Maximum Sum(DP)
    [算法系列之四]优先级队列
    Python源代码--整数对象(PyIntObject)的内存池
    3星|何帆《猜测与偏见》:社科书评集
    4星|《认识经济》:全面系统的经济学普及读物,鸿篇巨制,价格超贵
    3星|《东方启动点》:民营企业家们的故事,故事多分析概括少
    2星|《大师的管理课》:畅销书作家们的35篇励志散文
    3.5星|《蓝海战略2》:实施蓝海战略的具体工具与方法。案例牵强且偏老旧
    2星|《读懂华为30年》:基于公开资料的整理和肤浅的发挥
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3073115.html
Copyright © 2011-2022 走看看