報表增刪改開發過程中知識整合

一.JSP+JQuery
JSP中三種彈出對話框的用法
1.對話框有三種

1:只是提醒,不能對腳本產生任何改變;
2:一般用於確認,返回 true 或者 false
3: 一個帶輸入的對話框,可以返回用戶填入的字符串,常見於某些留言本或者論壇輸入內容那裏的 插入UBB格式圖片

function ale()
{//這個基本沒有什麼說的,就是彈出一個提醒的對話框
 alert("123");
}
function firm()
{//利用對話框返回的值 (true 或者 false)
  if(confirm("確認刪除?"))
 {//如果是true 
 //相關刪除操作     
    }
else
 {
 alert("你按了取消,那就是返回false");
 }
}
function prom()
{
var name=prompt("請輸入您的名字","");//將輸入的內容賦給變量 name 
//這裏需要注意的是,prompt有兩個參數,前面是提示的話,後面是當對話框出來後,在對話框裏的默認值  
if(name)//如果返回的有內容
{ 
   alert("歡迎您:"+ name)
  }
  }

2.jquery:在提交前判斷所有的文本框是否已經被填充,然後再通過ajax提交
舉個添加例子:

function Add(){
      var flag=0;
     $("#DBForm input").each(function(){
          if ("" == $(this).val()) {
             $(this).after("<span style='color: #ff0000;'>"+ $(this).attr("name")+"不能爲空</span>");
              flag=1;
           }
     });
     if(flag==1){
            //alert("沒提交");
      }else{
       var param="listId="+listId+"&"+decodeURIComponent($('#DBForm').serialize(),true);
       alert(param);        
       $("#Composition").load("add.do",param);                                                                             
     }

3.還出現一個很奇葩的問題==||| 方法找不到、。。。。
ajax傳過來一個表,表中的一個div中有一個input文本框和input的button,在button上綁定了一個方法,用來檢查前面的那個文本框是否爲空,但每次運行都顯示沒這個方法。。。。。醉了,最後我把input的文本框和button分到兩個div居然就可以了。。。。爲什麼呢= =|||
4.長了見識:jquery和prototype.js的區別
都是js庫,算不上框架。extJS還能說是框架
prototype是基礎類庫,對javascript做了大量的擴展,而且很好的支持Ajax
jquery主要是對dom對象的遍歷和查找、事件操作、html元素、動畫css等,這些是它的強項;然後進行dom操作
等;也能很好的支持ajax和兼容瀏覽器;

數據庫:
mysql基本語句複習:
INSERT INTO tablename(列名…) VALUES(列值);
UPDATE table_anem SET column_name1 = value1, column_name2 = value2, … WHERE … ;
DELETE FROM table1 WHERE …;
幾點積累:
**1》即使id是自增長,也可在插入或者修改時對id插入或修改
2.mysql如何讓自增id歸0解決方案**
方法一: 如果曾經的數據都不需要的話,可以直接清空所有數據,並將自增字段恢復從1開始計數
truncate table 表名
法二: dbcc checkident (‘table_name’, reseed, new_reseed_value)
當前值設置爲 new_reseed_value。如果自創建表後沒有行插入該表,則在執行該句後插入的第一行將使用 new_reseed_value 作爲標識。否則,下一個插入的行將使用 new_reseed_value + 1。如果 new_reseed_value 的值小於標識列中的最大值,以後引用該表時將產生 2627 號錯誤信息
3.execute、executeUpdate、executeQuery三者的區別
execute是executeUpdate與executeQuery的綜合
boolean execute(String sql)
允許執行查詢語句、更新語句、DDL語句。
返回值爲true時,表示執行的是查詢語句,可以通過getResultSet方法獲取結果;返回值爲false時,執行的是更新語句或DDL語句,getUpdateCount方法獲取更新的記錄數量。

int executeUpdate(String sql)
執行給定 SQL 語句,該語句可能爲 INSERT、UPDATE 或 DELETE 語句,返回值是更新的記錄數量或者不返回任何內容的 SQL 語句(如 SQL DDL 語句)

ResultSet executeQuery(String sql)
執行給定的 SQL 語句,該語句返回 ResultSet 對象。
**4.mySQL字段信息
查詢某表有哪些字段:**
select COLUMN_NAME from information_schema.COLUMNS where table_name = ‘your_table_name’ and table_schema = ‘your_db_name’;

查詢mysql表字段信息的sql語句
SHOW DATABASES //列出 MySQL Server 數據庫。
SHOW TABLES [FROM db_name] //列出數據庫數據表。
SHOW CREATE TABLES tbl_name //導出數據表結構。
SHOW TABLE STATUS [FROM db_name] //列出數據表及表狀態信息。 SHOW COLUMNS FROM tbl_name [FROM db_name] //列出資料表字段
SHOW FIELDS FROM tbl_name [FROM db_name],DESCRIBE tbl_name [col_name]。 SHOW FULL COLUMNS FROM tbl_name [FROM db_name]//列出字段及詳情
SHOW FULL FIELDS FROM tbl_name [FROM db_name] //列出字段完整屬性
SHOW INDEX FROM tbl_name [FROM db_name] //列出表索引
SHOW STATUS //列出 DB Server 狀態。
SHOW VARIABLES //列出 MySQL 系統環境變量。
SHOW PROCESSLIST //列出執行命令。
SHOW GRANTS FOR user //列出某用戶權限

servlet
1.當request綁定的參數是固定的時候,不知道參數名,如何獲得所有的request綁定的參數

private void showParams(HttpServletRequest request) {
        Map map = new HashMap();
        Enumeration paramNames = request.getParameterNames();
        while (paramNames.hasMoreElements()) {
            String paramName = (String) paramNames.nextElement();

            String[] paramValues = request.getParameterValues(paramName);
            if (paramValues.length == 1) {
                String paramValue = paramValues[0];
                if (paramValue.length() != 0) {
                    map.put(paramName, paramValue);
                }
            }
        }

        Set<Map.Entry<String, String>> set = map.entrySet();
        System.out.println("------------------------------");
        for (Map.Entry entry : set) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    }

2.一堆亂碼問題
(1)在jsp頁面中alert中文出現亂碼
後臺接收數據亂碼,本來以爲是頁面編碼,但是僅僅是alert中文就出現亂碼,所以問題出在頁面本身,但是其餘地方alert中文沒有問題,最終鎖定問題出在serialize()上
原因:.serialize()自動調用了encodeURIComponent方法將數據編碼了
解決方法:調用decodeURIComponent(XXX,true);將數據解碼

decodeURIComponent($('#DBForm').serialize(),true);

2)從request獲取對象添加到數據庫中出現亂碼
出現亂碼的地方無非是jsp和servlet接收的時候,servlet通過語句向數據庫傳值
數據庫我用的編碼爲GBK,JSP頁面編碼也是GBK,有設置response和request編碼
然並沒有什麼卵用。。。。嚴重懷疑是否真的轉成了GBK編碼
查了一下,即使設置了下面三句,也經常出現亂碼
response.setContentType(“text/html;charset=utf-8”);
request.setCharacterEncoding(“utf-8”);
response.setCharacterEncoding(“utf-8”);
原因是:具體看(其實沒大看懂)http://www.cnblogs.com/_popc/p/3384030.html
ServletRequest.setCharacterEncoding方法設置的是請求消息中的實體內容的字符集編碼名稱,它隻影響getParameter方法對POST方式下的”application/x-www-form-urlencoded”編碼格式的實體內容進行URL解碼的結果,而不能影響getParameter方法對HTTP請求消息的請求行中的URL地址後的參數進行URL解碼的結果。
Tomcat中的ServletRequest對象的getParameter等方法默認採用ISO8859-1字符集編碼進行URL解碼
我想看看這些參數到底是什麼編碼,於是找了判斷編碼的方法和編碼轉換方法如下

//先熟悉所有常見字符集
  /** 7位ASCII字符,也叫作ISO646-US、Unicode字符集的基本拉丁塊      */
    public static final String US_ASCII = "US-ASCII";
    /** ISO拉丁字母表 No.1,也叫做ISO-LATIN-1     */
    public static final String ISO_8859_1 = "ISO-8859-1";
    /** 8 位 UCS 轉換格式     */
    public static final String UTF_8 = "UTF-8";
    /** 16 位 UCS 轉換格式,Big Endian(最低地址存放高位字節)字節順序     */
    public static final String UTF_16BE = "UTF-16BE";
    /** 16 位 UCS 轉換格式,Litter Endian(最高地址存放地位字節)字節順序     */
    public static final String UTF_16LE = "UTF-16LE";
    /** 16 位 UCS 轉換格式,字節順序由可選的字節順序標記來標識     */
    public static final String UTF_16 = "UTF-16";
    /** 中文超大字符集     **/
    public static final String GBK = "GBK";
    public static final String GB2312 = "GB2312";
//判斷當前字符串的編碼格式,就是用目標字符串轉換編碼後與原有字符串比較,相等的則爲該編碼,舉例如下
if(destination.equals(new String(destination.getBytes("iso8859-1"), "iso8859-1")))
{   return "iso8859-1";

  //destination=new String(destination.getBytes("iso8859-1"),"utf-8");
}
//一般來說servlet開發中對於中文參數值的處理如下就夠了
if(name.equals(new String(name.getBytes("iso8859-1"), "iso8859-1")))
        {
          name=new String(request.getParameter("name").getBytes("iso8859-1"),"utf-8");
        }
........

//編碼集轉換
/**
     * 字符串編碼轉換的實現方法
     * @param str    待轉換的字符串
     * @param oldCharset    源字符集
     * @param newCharset    目標字符集
     */
    public String changeCharset(String str, String oldCharset, String newCharset) throws UnsupportedEncodingException {
        if(str != null) {
            //用源字符編碼解碼字符串
            byte[] bs = str.getBytes(oldCharset);
            return new String(bs, newCharset);
        }
        return null;
    }

**(3)綜合來說爲避免亂碼,應從如下幾方面考慮:
@1數據庫方面:**
  一是安裝mysql時,其中會有一個步驟選擇編碼方式,此時選擇gbk
  二是在安裝玩mysql之後,手動修改其配置文件,如下:
  (1)修改 MySql安裝目錄下面的my.ini(MySQL Server Instance Configuration 文件)。 設置
default-character-set=gbk(注意,有2處)
  (2)修改data目錄中相應數據庫目錄下的db.opt配置文件
default-character-set=gbk
default-collation=gbk_chinese_ci
三,數據庫使用
set names ‘gbk’;
(等價於mysql> SET character_set_client=’gbk’;
  mysql> SET character_set_connection=’gbk’
  mysql> SET character_set_results=’gbk’)
  重啓數據庫,關閉控制檯窗口重新登錄數據庫即可。
@2程序與數據庫連接時:
jdbc:mysql://localhost:3306/demo改爲jdbc:mysql://localhost:3306/demo? useUnicode=true&characterEncoding=GBK
@3servlet中:
response.setContentType(“text/html;charset=GBK”);
request.setCharacterEncoding(“GBK”);
response.setCharacterEncoding(“GBK”);
所有的獲取參數,都判斷編碼並進行編碼轉換爲GBK
@4.JSP頁面
<%@ page contentType=”text/html;charset=GBK”%>
對於序列化參數中的中文,如輸入表單的中文序列化後亂碼,調用decodeURIComponent(XXX,true)解決
@5.文件本身的編碼以及網頁瀏覽器編碼
3.
servlet中的請求轉發主要有三種方式:(參考http://xiaxia0402.iteye.com/blog/1129287
1、 forward:是指轉發,將當前request和response對象保存,交給指定的url處理。並沒有表示頁面的跳轉,所以地址欄的地址不會發生改變。
request.getRequestDispatcher(“/success.html”).forward(request, response);

2、 redirect:是指重定向,包含兩次瀏覽器請求,瀏覽器根據url請求一個新的頁面,所有的業務處理都轉到下一個頁面,地址欄的地址會變發生改變。
response.sendRedirect(request.getContextPath()+”/fail.html”);
ndRedirect方法中在要跳轉的頁面url前必須加上當前web程序路徑名,通過request.getContextPath()可以得到

3、 include:意爲包含,即包含url中的內容,進一步理解爲,將url中的內容包含進當前的servlet當中來,並用當前servlet的request和respose來執行url中的內容處理業務.所以不會發生頁面的跳轉,地址欄地址不會發生改變。
request.getRequestDispatcher(“/success.html”).include(request, response);
include與forward的區別在於輸出的內容,include包含本身servlet與跳轉頁面內容的結果,而forward不包含本身servlet的內容。

Java部分
在Java中如何遍歷Map對象
有一份超詳細講解http://blog.csdn.net/tjcyjd/article/details/11111401
在for-each循環中使用entries來遍歷

Map<Integer, Integer> map = new HashMap<Integer, Integer>();  

for (Map.Entry<Integer, Integer> entry : map.entrySet()) {  

    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());  

}  

在for-each循環中遍歷keys或values。
如果只需要map中的鍵或者值,可以通過keySet或values來實現遍歷,而不是用entrySet。

Map<Integer, Integer> map = new HashMap<Integer, Integer>();

//遍歷map中的鍵

for (Integer key : map.keySet()) {

    System.out.println("Key = " + key);

}

//遍歷map中的值

for (Integer value : map.values()) {

    System.out.println("Value = " + value);

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章