程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> 在控制器組件與模型組件之間傳送數據

在控制器組件與模型組件之間傳送數據

編輯:J2EE

MVC框架中,控制器組件與模型組件需要相互傳送數據,我們可以寫個JavaBean來保存。

ParamBean這個JavaBean本質上是把數據放在hashtable中,並提供了存放和取出數據等方法。

代碼如下:

Java代碼

public class ParamBean implements Serializable {
  // 操作員用戶代碼(用於日志顯示)
  private String opr_code = "";

  // 用戶部門代碼(用於日志顯示)
  private String dep_code = "";

  // 當前操作的菜單(用於日志顯示)
  private String menu_code = "";

  // 當前操作的說明(用於日志顯示)
  private String op_desc = "";

  // 返回代碼(0表示成功)
  private int ret_code;

  // 錯誤信息
  private String err_msg = "";

  private Hashtable ht;

  private CachedRowSet crs;

  /**
   * 構造函數
   */
  public ParamBean() {
    opr_code = "";
    err_msg = "";
    ret_code = 0;
    ht = new Hashtable();
    crs = null;
  }

  /**
   * 設置信息
   */
  public void set_info(String opr_code, String dep_code, String menu_code, 
      String op_desc) {
    this.opr_code = opr_code;
    this.dep_code = dep_code;
    this.menu_code = menu_code;
    this.op_desc = op_desc;
  }

  /**
   * 添加參數到哈希表 
   */
  public void add_param(String param_name, Object param_value) {
    if (param_name == null || param_value == null)
      return;
    param_name.trim();
    if (param_name.equalsIgnoreCase(""))
      return;

    this.ht.put(param_name, param_value);
  }

  /**
   * 從參數哈希表中獲取參數
   */
  public Object get_param(String param_name) {
    if (param_name != null) {
      param_name.trim();
      if (!param_name.equalsIgnoreCase("")) {
        return ht.get(param_name);
      }
    }
    return null;
  }

  /**
   * 從參數哈希表中刪除參數
   */
  public void remove_param(String param_name) {
    if (param_name != null) {
      param_name.trim();
      if (!param_name.equalsIgnoreCase("")) {
        ht.remove(param_name);
      }
    }
  }

  /**
   * 取哈希表中的參數個數
   */
  public int get_param_count() {
    return this.ht.size();
  }

  /**
   * 清空參數(參數無須傳回客戶端)
   */
  public void clear_param() {
    this.ht.clear();
  }

  /**
   * 設置CRS 
   */
  public boolean set_crs(ResultSet rs) {
    boolean ok = false;
    try {
      crs = new CachedRowSetImpl();
      crs.populate(rs);
      ok = true;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return ok;
  }

  /**
   * 設置錯誤信息,同時置ret_code為-1 
   */
  public void setErr_msg(String err_msg) {
    this.ret_code = -1;
    this.err_msg = err_msg;
  }

  /**
   * 設置成功信息
   */
  public void setSuccess() {
    this.ret_code = 0;
    this.err_msg = "";
  }

  /**
   * 判斷操作是否成功 
   */
  public boolean success() {
    return this.ret_code == 0;
  }

  public String getDep_code() {
    return dep_code;
  }

  public void setDep_code(String dep_code) {
    this.dep_code = dep_code;
  }

  public CachedRowSet getCrs() {
    return crs;
  }

  public void setCrs(CachedRowSet crs) {
    this.crs = crs;
  }

  public Hashtable getHt() {
    return ht;
  }

  public void setHt(Hashtable ht) {
    this.ht = ht;
  }

  public String getMenu_code() {
    return menu_code;
  }

  public void setMenu_code(String menu_code) {
    this.menu_code = menu_code;
  }

  public String getOp_desc() {
    return op_desc;
  }

  public void setOp_desc(String op_desc) {
    this.op_desc = op_desc;
  }

  public String getOpr_code() {
    return opr_code;
  }

  public void setOpr_code(String opr_code) {
    this.opr_code = opr_code;
  }

  public int getRet_code() {
    return ret_code;
  }

  public void setRet_code(int ret_code) {
    this.ret_code = ret_code;
  }

  public String getErr_msg() {
    return err_msg;
  }
}


以上代碼都很好理解,主要是add_param(),set_crs()方法主要是把數據庫執行查詢後得到的ResultSet通過CachedRowSetImpl的populate方法放進CachedRowSetImpl裡,至於為什麼要放到CachedRowSetImpl裡處理,參看些jdbc編程方面的知識。(TO-DO)

寫好這個JavaBean後,在控制器組件裡可以把在前台傳進來的值通過add_param()方法放進來,如下:

Java代碼

param_bean param = new param_bean();
    String dep_code = (String)request.getSession().getAttribute("LOGIN_USER_DEP");
    param.add_param("DEP_CODE", dep_code);

在模型組件裡可以根據傳進來的這個param來取到值,進行一些數據庫的操作,如下:

Java代碼

  public param_bean loginAuth(param_bean param) throws Java.lang.Exception{
    String user_code = (String)param.get_param("USER_CODE");
    param.clear_param();
    String sql = "..";
    sqlExecQuery(param,sql);
    return param;
  }
  /**
   * 執行查詢語句的公共方法 
   * @param param 
   * @param sql 
   */
  private void sqlExecQuery(param_bean param,String sql) throws Exception{
    database_bean db = get_database();
    param.ret_code = -1;
    try{
      param.set_crs(db.execute_query(sql));
      param.ret_code = 0;
      param.err_msg = "";
      db.close();
    }catch(Exception ex){
      param.ret_code = -1;
      param.err_msg = ex.getMessage();
      ex.printStackTrace();
    }
  }

完成相應的數據庫操作後,在控制器裡進行如下判斷,並對數據庫的查詢結果放到request進行更加復雜的處理,如下:

Java代碼

      if (param.ret_code == 0) {
        request.setAttribute("PARAM_CRS", param.crs);
      } else {
        System.out.print(param.err_msg);
        throw new Exception(param.err_msg);
      }

到這裡,MVC三層結構中在在控制器組件與模型組件之間傳送數據大致介紹完成了:)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved