📄 baseaction.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 + -