⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 baseaction.java

📁 一个javaweb开的小例子
💻 JAVA
字号:
package cn.com.pkusoft.action;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.com.pkusoft.comm.CommException;
import cn.com.pkusoft.comm.Logger;
import cn.com.pkusoft.control.BaseControl;

/**
 * 所有的ACTION类的基类,抽象类,定义了几个抽象方法。
*
 * <p>Title: </p>
 * <p>Description: 所有的ACTION类的基类,抽象类,定义了几个抽象方法。</p>
 * <p>Copyright: Copyright (c) 2003</p>
 * <p>Company:pku-soft  </p>
 * @author weiming
 * @version 1.0
 */
public abstract class BaseAction
{
    public final static String PAGE_NAME    = "PAGENAME"; //JSP的名称,主要用于表示从哪个页面过来的
    public final static String ACTION       = "ACTION";   //请求的ACTION
    public final static String DIR          = "DIR";      //请求的ACTION对应的目录名称
    public final static String EVENT        = "EVENT";    //同一个页面过来的动作,有可能不同,如删除、更新等
    public final static String DBERRORURL   = "/dberror.jsp"; //用这个变量来标识出来

    protected static BaseAction theInstance   = null;
    protected HttpServletRequest m_request    = null;   // 请求对象
    protected HttpServletResponse m_response  = null;   // 反映对象
    protected ServletContext m_servletContext = null;   // SERVLET 容器

    /**
     * 要在页面上显示的错误信息
     */
    protected List m_errorsList = new ArrayList();
    /**
     * 要跳转的下一页名称
     */
    protected String m_nextPage = "";

    /**
     * 是从什么页面过来的
     */
    protected String m_fromPage = "";

    /**
     * 是在什么事件情况下过来的
     */
    protected String m_event    = "";

    /**
     * 构造函数
     */
    public BaseAction(){
    }

    /**
     * 构造函数,设置WEB应用的相关环境变量。
     *
     * @param request HttpServletRequest
     * @param response HttpServletResponse
     * @param servletContext ServletContext
     */
    public BaseAction(HttpServletRequest request,
                      HttpServletResponse response,
                      ServletContext servletContext)
    {
        this.m_request        = request;
        this.m_response       = response;
        this.m_servletContext = servletContext;
    }

    /**
     * 初始化类实例
     */
    public void init()
    {
        //清除SESSION中的错误提示信息。
        List errorList = (List) m_request.getSession().getAttribute("PROMPT_ERRORS");
        if (errorList != null)
        {
            errorList.clear();
        }
        //清除错误提示信息成员变量。
        this.m_errorsList.clear();

        /**
         * 取得调入页面的名称,判断是从什么页面调入来。
         * 有时,一个ACTION可以对应多个页面,所以我们需要调查是从什么页面过来的,
         * 在不同的页面我们需要做不同的处理的。
         */
        m_fromPage = this.m_request.getParameter(PAGE_NAME);

        /**
         * 取得调用的事件。从一个页面调入时,也有好几种事件情况,
         * 比如是INSERT、或者UPDATE、或者CLEAR等等
         */
        m_event = this.m_request.getParameter(EVENT);


        /*
                 在这,做一些公共的作业,目前还没有,以后如果需要就在这儿填加
         */

        doInit();

        /*
                 在这,做一些公共的作业,目前还没有,以后如果需要就在这儿填加
         */

    }

    /**
     * 执行这个ACTION 的动作。
     */
    public void execute()
    {
        String pageName = this.m_request.getParameter(PAGE_NAME);
        Logger.logDebug("=============>>>>>  BaseAction: from page : " + pageName);

        String ActionName   = m_request.getParameter(ACTION);
        boolean isError     = false;
        String ErrorMessage = "";

        if (ActionName == null)
        {
            ErrorMessage = "您尚未登录!";
            isError = true;
        }
        else if (!ActionName.equals("Login") &&
                 !ActionName.equals("UpdatePassword"))
        {
            if (m_request.getSession().getAttribute("USER") == null)
            {
                ErrorMessage = "您尚未登录!";
                isError = true;
            }
            else if (pageName != null)
            {
                if (pageName.equals("INDEXJSP"))
                {

//                    String functioncode = this.m_request.getParameter(
//                        "FUNCTIONCODE");
//                    UserEntity user = (UserEntity)this.m_request.getSession().
//                        getAttribute("USER");
//                    ErrorMessage = "您没有权限查看该页!";
//                    System.out.println("++++++++" + functioncode + "++++++++" +
//                                       user.get_USER_PURVIEWCODE_S());
//                    if (user.get_USER_PURVIEWCODE_S().indexOf(functioncode) < 0)
//                    {
//                        isError = true;
//                    }
                }
            }
        }

        if (isError == true)
        {
            Map map = new HashMap();
            map.put("PRIERROR", ErrorMessage);
            m_request.getSession().setAttribute("ErrorMessage", map);

            try
            {
                this.m_servletContext.getRequestDispatcher(
                    "/error.jsp").forward(m_request, m_response);
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }
            return;
        }

        m_request.getSession().setAttribute("FromServlet", "true");

        /*
                 在这,做一些公共的作业
         */

        doExecute();

        /*
                 在这,做一些公共的作业
         */
    }

    /**
     * 抽象方法,在子类中必须实现该方法。做个性的初始化
     */
    protected abstract void doInit();

    /**
     * 抽象方法,在子类中必须实现该方法。做个性的动作
     */
    protected abstract void doExecute();

    /**
     * 抽象方法,在子类中必须实现该方法。得到类的一个特定实例
     * 不过要是ACTION类有特殊的成员变量就暂时不要用这个类。以后可以考虑用
     * 工厂对象来生成一个对象。目前暂时这样
     * @return BaseAction
     */
    public abstract BaseAction getInstance();

    /**
     * 把HTTP请求对象接受过来
     * @param request HttpServletRequest
     */
    public void setRequest(HttpServletRequest request)
    {
        this.m_request = request;
    }

    /**
     * 把HTTP请求回答对象接受过来
     * @param response HttpServletResponse
     */
    public void setResponse(HttpServletResponse response)
    {
        this.m_response = response;
    }

    /**
     * 把整个容器的环境接受过来
     *
     * @param servletContext ServletContext
     */
    public void setServletContext(ServletContext servletContext)
    {
        this.m_servletContext = servletContext;
    }

    /**
     * 添加错误提示信息,到错误列表中,在页面上显示出来。
     *
     * @param message String
     */
    protected void putErrorMessage(String message)
    {
        Map errorMap = new HashMap();
        errorMap.put("msg", message);

        this.m_errorsList.add(errorMap);
    }

    /**
     * 转到下一个页面。名称最好是从根开始的页面。如 “/insure/InsureData01E.jsp”
     *
     * @param nextPage 下一个页面名称。
     * @throws CommException
     */
    public void dispatchNextPage(String nextPage) throws CommException
    {
        try
        {
            //放置错误提示信息
            this.m_request.getSession().setAttribute("PROMPT_ERRORS", this.m_errorsList);
            //转发下一页面
            this.m_request.getRequestDispatcher(nextPage).
                forward(this.m_request, this.m_response);
        }
        catch (ServletException ex)
        {
            throw new CommException(ex.getMessage());
        }
        catch (IOException ex)
        {
            Logger.logDebug("----IOException in dispatchPage(" + nextPage + ")");
            throw new CommException(ex.getMessage());
        }
    }

    /**
     * 注意:一个CASE只使用一个控制对象。
     *
     * 把这个对象放在SESSION中,一个CASE中的共享信息可以放在那个控制对象中
     *  所以,把原子业务逻辑要单独封装在一个FACADE类中,然后,在控制对象中
     *  调用业务对象(FACADE实例)的业务方法。一个FACADE的业务方法可以被几
     *  个不同的控制对象调用
     * @return BaseControl
     */
    protected BaseControl getCaseControl()
    {
        //取得在SESSION中要放置的属性名称
        String actionControlName = this.getClass().getName();

        //取得已放在SESSION中的控制对象。
        BaseControl control = (BaseControl)this.m_request.getSession()
            .getAttribute(actionControlName);

        //如果为空,表示第一次
        if (control == null)
        {
            //首先,为确保万一,在SESSION中做适当的清理工作
            this.m_request.getSession().removeAttribute(actionControlName);

            //然后创建一个对象实例,调用抽象方法,具体的实现由底层代码来实现。
            control = createControlInstance();

            //然后放置到SESSION中
            this.m_request.getSession().setAttribute(actionControlName, control);
        }

        return control;
    }

    /**
     * 在SESSION中移去控制对象,通常在结束或者退出一个用例时调用
     */
    protected void removeCaseControl()
    {
        //取得在SESSION中要放置的属性名称
        String actionControlName = this.getClass().getName();
        //在SESSION中移去这个对象
        this.m_request.getSession().removeAttribute(actionControlName);
    }

    /**
     * 创建与一个ACTION相关联的control类的实例
     *   如果没有需要实现,就直接返回NULL
     * 这个方法是第一次进入一个CASE时,ACTION来创建一个与自己对应的控制对象时调用的。
     *
     * @return BaseControl 要创建的control类的实例
     * @see getCaseControl
     */
    public abstract BaseControl createControlInstance();

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -