报表增删改开发过程中知识整合

来源:互联网 发布:php文件管理插件 简洁 编辑:程序博客网 时间:2024/04/16 18:13

一.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);}
0 0