用JavaBean编写SQLServer数据库连接类

下面是以SQLServer为例编写一个简单的数据库连接工具类,把它封装到web项目的(WEB-INF/classes/)目录下,在Java或JSP页面引入就可以实现了. ODBC名称:mysql; 用户名:dxaw; 密 码:123; 方法executeUpdate():对数据库更新; 方法executeQuery():通过SQL语句返回记录集; 代码如下: //类conn.db.conndb.java package conn.db; import java.sql.*; public class conndb { Connection conn; ResultSet rs; private int count; public conndb() { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (Exception ex) {} } public ResultSet executeQuery(String sql){ try { conn=DriverManager.getConnection("Jdbc:Odbc:mysql","dxaw","123"); Statement stat=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); rs=stat.executeQuery(sql); } catch (Exception ex1) { } return rs; } public void executeUpdate(String sql){ try { conn = DriverManager.getConnection("Jdbc:Odbc:mysql", "dxaw","123"); Statement stat=conn.createStatement(); stat.executeQuery(sql); } catch (Exception ex2) { } } } <淘宝热门商品:
 

198.00 元 

BENEFIT特配丰胸组合 天然丰胸食品_海量顾客反馈

 

¥:78.00 

皇冠舒友阁 顶级特效美容护肤 效果才是硬道理

皇冠热销 印疤修复液 消除深浅痘印等色印、有效改善凹凸疤痕

来源:程序员网

小小豆叮

JSP连接ORACLE数据库时注意的一些问题

一、如何去处理Clob、BLOB的大类型 CLOB可用于存放大文本数据,最多可存储4GB数据,在应用开发中比较常见.java提供的sql.Clob类与之对应.它提供两个方法来读取Clob的数据: getCharacterStream() 方法返回按unicode编码的输入流(java.io.Reader对象) getAsciiStream() 方法返回按ASCII编码的输入流(java.io.InputStream对象) 所以如果你的数据库中有可能存储中文字符的话,就要使用前一个方法. 现在举一个实际的例子,让我一步步学习如何使用CLOB. 首先,创建一个含CLOB字段的表: create table test (id INTEGER, content clob); 接下来, 我们通过JSP往这张表里插入一条记录,然后再获取显示它. 插入操作: 以上需要注意的几点是: 1)clob类型的数据不能直接insert,要先通过empty_clob()方法给它分配一个locator(同理,blob的用empty_blob()函数分配locator).然后把它select出来(此时它当然没有数据,但结果集不是空的),得到一个Clob的对象,修改该对象的内容让它满足我们的需要,再通过update方法更新该行记录. 2) 通过select修改含lob类型的记录时一定要锁定该行(通过for update关键字实现),否则oracle会报错. 3) 刚插入的记录就select for update, 会出现"违反读取顺序"错误,解决办法是将自动提交功能置为false,即不允许自动提交,然后commit它,再select,就可以了. 这就是上面那段代码里//*两行的作用. 下面,我们将刚插入的记录从数据库中读取出来并显示之: 二、编码问题 因为JAVA的开发者是老外,所以他们对中文的支持并不是太好,这一点让不少的我们感到很是头痛,也就是我们通过说的汉字编码问题吧,关于一些汉字编码的规范我就不多说了,我主要是谈谈在和oracle数据库连接时的一些小问题,不过这些小问题很是让人头痛的。 1、在插入到数据库中的中文问题要转换成编码 2、从数据库中读到中文又要转换成编码 让我们看一个编码的JAVA代码: //ECov.java import java.io.UnsupportedEncodingException; public class ECov { public static String asc2gb(String asc){ String ret; if(asc==null)return asc; try{ ret=new String(asc.getBytes("ISO8859_1"),"GB2312"); } catch(UnsupportedEncodingException e){ ret=asc; } return ret; } public static String gb2asc(String gb){ String ret; if(gb==null)return gb; try{ ret=new String(gb.getBytes("GB2312"),"ISO8859_1"); } catch(UnsupportedEncodingException e){ ret=gb; } return ret; } public static int byte2int(byte b){ return ((-1)>>>24)&b; } } 其实这段代码的意思也就是把两种方法合而为一了。 在进行数据库插入时要用ECov.gb2asc(arg),要在读时要用ECov.asc2gb(arg)。其中最关键的一点就是Oracle好像只认识ISO8859_1这种格式的编码吧(仅是我的想法)。 三、一些小细节 1、就是setAutoCommit(true or false),就是我们在sqlPlus中常用commit()的功能,如果是用true,就不要用commit(),否则还是用commit()方法的。 2、对日期类型的处理,其实他并不是想象中setDate(),getDate()那么简单的,中间有很大的漏洞。大家自己多调试就会觉得有很多的乐趣的。 3、在和数据库中最好是采用连接池技术,用标准的J2EE的环境,用简单的JNDI技术,是很好的一种方法的 <淘宝热门商品:
 

运动鞋 

X-2品牌时尚鞋城【郭氏鞋坊旗下】[销售出口多余产品

 

3.20 元  

Lily's 园艺-万元赠品大派送!种球“买就送”!朱顶红已到货!

Lily's-现货!PT-01葡萄风信子album-荷兰进口种球/球根-皇冠

来源:程序员网

小小豆叮

应用实例 JSP+JavaScript打造级连菜单

<%@ page import="java.util.Date,yava.fileapp.*,java.sql.*;" contentType="text/html;charset=GB2312" pageEncoding="GB2312" %> <style> .f9{ font-size:9pt; } .bgc{ background-color:#AECAF9; color: #0033FF } .buttons{font-family:Arial; font-size:13px; font-weight:bold; background-color:#6796E4; color:white; border-top: solid 2px #AACAFB; border-bottom: solid 1px #4E7DC1; border-left: solid 1px #AECAF9; border-right: solid 1px #5679BD; padding:1px; margin:0px;} </style> <SCRIPT LANGUAGE="javascript"> <!-- function rv() { var val=""; for(i=0;i<combo_box.list2.length;i++){ val+=","+combo_box.list2[i].value; } if(val.charAt(0)==","){ val=val.substr(1,val.length); } opener.form1.frecname.value=val; self.close(); } //--> </SCRIPT> <body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0"> <jsp:useBean id="user" scope="session" class="yava.fileapp.UserBean" /> <% CDataSource ds=new CDataSource(); //数据联结Bean实例 java.sql.Connection conn=ds.getConnection(); java.sql.Statement stmt=null; java.sql.ResultSet rs=null; CDataCheck dc=new CDataCheck(); %> <% String sqlu="SELECT t1.fno, t1.fname, t2.fname AS fdept FROM tuser t1 LEFT OUTER JOIN TDept t2 ON t1.fdept = t2.fno order by t2.fname"; stmt=conn.createStatement(); rs=stmt.executeQuery(sqlu); %> <script language="Javascript"> arr = new Array(); <% int temp=0; while(rs.next()) { %> arr[<%=temp%>]=new Array("<%=rs.getString("fname")%>","<%=rs.getString("fdept")%>"); <% temp = temp + 1; } %> temp=<%=temp%> function ChangeLocation(id){ document.combo_box.city.length=0; //初始化第2级菜单的长度,下标从0开始 var i = 0; document.combo_box.city.options[0]=new Option("-------",""); for(i=0;i<temp;i++){ if(arr[i][1]==id){//如果相等,证明在第2级里面有输入第1级组织的子集,arr[总数目][部门] document.combo_box.city.options[document.combo_box.city.length] = new Option(arr[i][0], arr[i][0]); } } } </script> <form name="combo_box"> <table border="0" cellspacing="0" cellpadding="0" height="210" width="59"> <tr height="24"> <td bgcolor="#336699" class="buttons" align=center><font color=#ffffff>部门选择</font></td> <td bgcolor="#336699" class="buttons" align=center><font color=#ffffff>人名选择</font></td> <td bgcolor="#336699" class="buttons" align=center nowrap><font color=#ffffff>添加/移除</font></td> <td bgcolor="#336699" class="buttons" align=center><font color=#ffffff>最终人</font></td> </tr> <tr> <td> <select multiple id=prov name="prov" onchange="ChangeLocation(combo_box.prov.options[combo_box.prov.selectedIndex].text);" style="width:150;height:200" class="bgc"> <option value="0">请选择部门 ---></option> <% String sqld="SELECT * FROM tdept"; stmt=conn.createStatement(); rs=stmt.executeQuery(sqld); while(rs.next()) { %> <option name="<%=rs.getString("fno")%>"><%=rs.getString("fname")%></option> <% } %> </select> </td> <td> <select multiple id=city style="width:150;height:200" class="bgc"> </select> </td> <td nowrap align="center" class="bgc"> <input type="button" onClick="move(this.form.list2,this.form.city)" value="<<" class="buttons"> <input type="button" onClick="move(this.form.city,this.form.list2)" value=">>" class="buttons"> </td> <td> <select multiple size="10" name="list2" style="width:150;height:200" class="bgc"> </select> </td> </tr> <tr class="bgc"> <td colspan="4" align="center"> <input type="button" name="button1" class="buttons" value="选好了!" onclick="rv();"></td> </tr> </table> </form> <script language="JavaScript"> //人名移动 function move(fbox, tbox) { var arrFbox = new Array(); var arrTbox = new Array(); var arrLookup = new Array(); var i; for (i = 0; i < tbox.options.length; i++) { arrLookup[tbox.options[i].text] = tbox.options[i].value; arrTbox[i] = tbox.options[i].text; } var fLength = 0; var tLength = arrTbox.length; for(i = 0; i < fbox.options.length; i++) { arrLookup[fbox.options[i].text] = fbox.options[i].value; if (fbox.options[i].selected && fbox.options[i].value != "") { arrTbox[tLength] = fbox.options[i].text; tLength++; } else { arrFbox[fLength] = fbox.options[i].text; fLength++; } } arrFbox.sort(); arrTbox.sort(); fbox.length = 0; tbox.length = 0; var c; for(c = 0; c < arrFbox.length; c++) { var no = new Option(); no.value = arrLookup[arrFbox[c]]; no.text = arrFbox[c]; fbox[c] = no; } for(c = 0; c < arrTbox.length; c++) { var no = new Option(); no.value = arrLookup[arrTbox[c]]; no.text = arrTbox[c]; tbox[c] = no; } } </script> </body> <淘宝热门商品:
 

16.00 元  

减肥极品魔芋胶

 

 

【皇冠康康美美】同仁堂保健品 协和护肤品 营养品 减肥瘦身品

来源:程序员网

小小豆叮

Java IO学习基础之读写文本文件

Java的IO操作都是基于流进行操作的,为了提高读写效率一般需要进行缓冲。 简单的示例程序如下: /** * 读出1.txt中的内容,写入2.txt中 * */ import java.io.*; public class ReadWriteFile{ public static void main(String[] args){ try{ File read = new File("c:\1.txt"); File write = new File("c:\2.txt"); BufferedReader br = new BufferedReader( new FileReader(read)); BufferedWriter bw = new BufferedWriter( new FileWriter(write)); String temp = null; temp = br.readLine(); while(temp != null){ //写文件 bw.write(temp + " "); //只适用Windows系统 //继续读文件 temp = br.readLine(); } bw.close(); br.close(); }catch(FileNotFoundException e){ //文件未找到 System.out.println (e); }catch(IOException e){ System.out.println (e); } } } <淘宝热门商品:
 

 

淘宝最大 最低 女装直销╭╮

 

188.00 元  

地球都踩在脚下

T-MAC8麦迪8代 麦8 08-09赛季麦迪篮球鞋 白黑红 阿迪达斯adidas

来源:程序员网

小小豆叮

正则表达式的简单应用实例

import java.io.*; import java.util.regex.*; public class Printer { public static void main(String[] args) { System.out.println(" Please enter the input string: "); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String inputString; boolean isOK = false; try { while(!isOK) { if((inputString = reader.readLine()) != null) { if(inputString.length() > 200) { System.out.println("The string exceeds 200 characters. Please enter again! "); } else { Pattern regex = Pattern.compile("[^@#$%&*/^]+"); Matcher matcher = regex.matcher(inputString); boolean isMatched = matcher.matches(); if(!isMatched) { System.out.println("The String cant contain @,#,$,%,*,& and ^. Please enter again! "); } else { isOK = true; System.out.println(" Your input string is: " + inputString); } } } } } catch(IOException e) { e.printStackTrace(); } } } <淘宝热门商品:
 

16.00 元  

减肥极品魔芋胶

 

保健品/滋补品 

淑芳阁_苗条姿_最有效的减肥瘦身与丰胸专卖店

来源:程序员网

小小豆叮

获取JAVA路径 包括CLASSPATH外的路径

归纳一些网上取JAVA路径的方法: 注明:如果从ANT启动程序,this.getClass().getResource("")取出来的比较怪,直接用JAVA命令行调试就可成功。 得到classpath和当前类的绝对路径的一些方法 获得CLASSPATH之外路径的方法:   URL base = this.getClass().getResource(""); //先获得本类的所在位置,如/home/popeye/testjava/build/classes/net/ String path = new File(base.getFile(), "……/……/……/"+name).getCanonicalPath(); //就可以得到/home/popeye/testjava/name 下面是一些得到classpath和当前类的绝对路径的一些方法。你可能需要使用其中的一些方法来得到你需要的资源的绝对路径。 1.FileTest.class.getResource("") 得到的是当前类FileTest.class文件的URI目录。不包括自己! 如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/ 2.FileTest.class.getResource("/") 得到的是当前的classpath的绝对URI路径。 如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/ 3.Thread.currentThread().getContextClassLoader().getResource("") 得到的也是当前ClassPath的绝对URI路径。 如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/ 4.FileTest.class.getClassLoader().getResource("") 得到的也是当前ClassPath的绝对URI路径。 如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/ 5.ClassLoader.getSystemResource("") 得到的也是当前ClassPath的绝对URI路径。 如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/ 我推荐使用Thread.currentThread().getContextClassLoader().getResource("")来得到当前的classpath的绝对路径的URI表示法。 在Web应用程序中,我们一般通过ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径。这样,我们只需要提供相对于Web应用程序根目录的路径,就可以构建出定位资源的绝对路径。 注意点: 1.尽量不要使用相对于System.getProperty("user.dir")当前用户目录的相对路径。这是一颗定时炸弹,随时可能要你的命。 2.尽量使用URI形式的绝对路径资源。它可以很容易的转变为URI,URL,File对象。 3.尽量使用相对classpath的相对路径。不要使用绝对路径。使用上面ClassLoaderUtil类的public static URL getExtendResource(String relativePath)方法已经能够使用相对于classpath的相对路径定位所有位置的资源。 4.绝对不要使用硬编码的绝对路径。因为,我们完全可以使用ClassLoader类的getResource("")方法得到当前classpath的绝对路径。 使用硬编码的绝对路径是完全没有必要的!它一定会让你死的很难看!程序将无法移植! 如果你一定要指定一个绝对路径,那么使用配置文件,也比硬编码要好得多! 当然,我还是推荐你使用程序得到classpath的绝对路径来拼资源的绝对路径。 <淘宝热门商品:
 

12.00 元  

08VIVI杂志推荐 风靡韩国牛仔感七分打底裤

 

 

纤体·丽颜New Concept茶坊 纯天然美容瘦身品位花饮

来源:程序员网

小小豆叮

Jsp中的自定义标签由浅到深详细讲解

一、基本概念: 1.标签(Tag): 标签是一种XML元素,通过标签可以使JSP网页变得简洁并且易于维护,还可以方便地实现同一个JSP文件支持多种语言版本。由于标签是XML元素,所以它的名称和属性都是大小写敏感的 2.标签库(Tag library): 由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。 3.标签库描述文件(Tag Library Descriptor): 标签库描述文件是一个XML文件,这个文件提供了标签库中类和JSP中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。 4.标签处理类(Tag Handle Class): 标签处理类是一个Java类,这个类继承了TagSupport或者扩展了SimpleTag接口,通过这个类可以实现自定义JSP标签的具体功能 二、自定义JSP标签的格式: 1. <% @ taglib prefix=”someprefix” uri=”/sometaglib” %> 为了使到JSP容器能够使用标签库中的自定义行为,必须满足以下两个条件: 1.从一个指定的标签库中识别出代表这种自定义行为的标签 2.找到实现这些自定义行为的具体类 第一个必需条件-找出一个自定义行为属于那个标签库-是由标签指令的前缀(Taglib Directives Prefix)属性完成,所以在同一个页面中使用相同前缀的元素都属于这个标签库。每个标签库都定义了一个默认的前缀,用在标签库的文档中或者页面中插入自定义标签。所以,你可以使用除了诸如jsp,jspx,java,servlet,sun,sunw(它们都是在JSP白皮书中指定的保留字)之类的前缀。   uri属性满足了以上的第二个要求。为每个自定义行为找到对应的类。这个uri包含了一个字符串,容器用它来定位TLD文件。在TLD文件中可以找到标签库中所有标签处理类的名称 2. <someprefix:sometag key=”somevalue”/>  当web应用程序启动时,容器从WEB-INF文件夹的目录结构的META-INF搜索所有以.tld结尾的文件。也就是说它们会定位所有的TLD文件。对于每个TLD文件,容器会先获取标签库的URI,然后为每个TLD文件和对应的URI创建映射关系。 在JSP页面中,我们仅需通过使用带有URI属性值的标签库指令来和具体的标签库匹配 三、自定义JSP标签的处理过程: 1.在JSP中引入标签库: 2.在JSP中使用标签库标签: 3.Web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值 4.Web容器根据uri属性在web.xml找到对应的元素 5.从元素中获得对应的元素的值 6.Web容器根据元素的值从WEB-INF/目录下找到对应的.tld文件 7.从.tld文件中找到与tagname对应的元素 8.凑元素中获得对应的元素的值 9.Web容器根据元素的值创建相应的tag handle class的实例 10. Web容器调用这个实例的doStartTag/doEndTag方法完成相应的处理 四、创建和使用一个Tag Library的基本步骤: 1.创建标签的处理类(Tag Handler Class) 2.创建标签库描述文件(Tag Library Descrptor File) 3.在web.xml文件中配置元素 4.在JSP文件中引人标签库 五、TagSupport类简介: 1.处理标签的类必须扩展javax.servlet.jsp.TagSupport. 2.TagSupport类的主要属性: A.parent属性:代表嵌套了当前标签的上层标签的处理类 B.pageContex属性:代表Web应用中的javax.servlet.jsp.PageContext对象 3.JSP容器在调用doStartTag或者doEndTag方法前,会先调用setPageContext和setParent方法,设置pageContext和parent。因此在标签处理类中可以直接访问pageContext变量 4.在TagSupport的构造方法中不能访问pageContext成员变量,因为此时JSP容器还没有调用 setPageContext方法对pageContext进行初始化 六、TagSupport处理标签的方法: 1.TagSupport类提供了两个处理标签的方法: public int doStartTag() throws JspException public int doEndTag() throws JspException 2.doStartTag:但JSP容器遇到自定义标签的起始标志,就会调用doStartTag()方法。 doStartTag()方法返回一个整数值,用来决定程序的后续流程。 A.Tag.SKIP_BODY:表示…之间的内容被忽略 B.Tag.EVAL_BODY_INCLUDE:表示标签之间的内容被正常执行 3.doEndTag:但JSP容器遇到自定义标签的结束标志,就会调用doEndTag()方法。doEndTag ()方法也返回一个整数值,用来决定程序后续流程。 A.Tag.SKIP_PAGE:表示立刻停止执行网页,网页上未处理的静态内容和JSP程序均被 忽。略任何已有的输出内容立刻返回到客户的浏览器上。 B.Tag_EVAL_PAGE:表示按照正常的流程继续执行JSP网页 七、用户自定义的标签属性: 如果在标签中还包含了自定义的属性,例如: ... 那么在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法。 八、创建标签处理类的步骤: 1.创建包含JSP网页静态文本的文件(即是要替换自定义JSP标签的文本) 2.在Web应用启动时装载静态文本 3.创建标签处理类 九、如何创建包含JSP网页静态文本的文件: 1.使用java.util.Properties类来存放要替换网页中自定义JSP标签的静态文本 2.Properties类代表了一系列属性的集合,其实例既可以被保存到流中,也可以从流中加 载。这些文本以key/value的形式存放在WEB-INF目录下,例如key=value,在属性列表中 这些key/value都是String类型的 十、Properties类的常用API: 1.setProperty(String key, String value):调用Hashtable类的put方法添加属性 2.getProperty(String key):获取属性列表中key对应的属性值 3.load(InputStream in):从输入流对象InputStream中读取属性列表(Properties list) 4.store(OutputStream out,String comment):使用适当的格式将属性列表的属性对写入输 出流对象中,默认使用ISO-88590-1编码格式,以行的方式处理输入。属性的key/value之 间以”=、:”配对,以回车、换行分隔key/value对 十一、ServletContext类的常用API: 1.getContext(String uripath):返回服务器中uripath所代表的ServletContext对象 2.getInitParameter(String name):返回ServletConfig对象中name参数的值 3.getMineType(String file):返回file参数代表的文件的MIME类型 4.getRequestDispatcher(String path):返回path代表的RequestDispacher对象 5.getResourceAsStream(String path):以输入流的形式返回path对应的资源,在输入留中对象可以为任意形式的数据,path参数必须以“/”开始且相对于Context Root 十二、如何使用ServletContxt读取并保存属性文件: 1.创建java.util.Properties类对象 2.获取ServletContext对象 3.将属性文件以输入流的形式读入到某个输入流对象中 4.将输入流对象加载到Properties对象中 5.将Properties对象保存到ServletContext对象中 十三、如何在Web应用启动时装载静态文本: 1.创建继承了HttpServlet类的子类,在web.xml中配置这Servlet时设置load-on-startup属性: someclass somepackage.SomeClass1 2.在这个Servlet的init()方法中创建java.util.Properties类 3.获取当前Web应用的ServletContext对象 4.将WEB-INF目录下的属性文件读入到输入流InputStream中: InputStream in = context.getResourceAsString("WEB-INF/someproperties.properties"); 5.将输入流加载到属性对象中 ps.load(in); 6.将属性对象保存到上下文中。 context.setAttribute("attributeName",ps); 十四、如何创建标签处理类: 1.引入必需的资源: import javax.servlet.jsp.*; import javax.servlet.http.*; import java.util.*; import java.io.*; 2.继承TagSupport类并覆盖doStartTag()/doEndTag()方法 3.从ServletContext对象中获取java.util.Properties对象 4.从Properties对象中获取key对应的属性值 5.对获取的属性进行相应的处理并输出结果 十五、创建标签库描述文件(Tag Library Descriptor): 1.标签库描述文件,简称TLD,采用XML文件格式,定义了用户的标签库。TLD文件中的元素可以分成3类: A.:标签库元素 B.:标签元素 C.:标签属性元素 2.标签库元素用来设定标签库的相关信息,它的常用属性有: A.shortname: 指定Tag Library默认的前缀名(prefix) B.uri: 设定Tag Library的惟一访问表示符 3.标签元素用来定义一个标签,它的常见属性有: A.name: 设定Tag的名字 B.tagclass: 设定Tag的处理类 C.bodycontent: 设定标签的主体(body)内容 1).empty:表示标签中没有body 2).JSP:表示标签的body中可以加入JSP程序代码 3).tagdependent:表示标签中的内容由标签自己去处理 4.标签属性元素用来定义标签的属性,它的常见属性有: A.name:属性名称 B.required:属性是否必需的,默认为false C.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于的表达式 十六、在Web应用中使用标签: 1.如果Web应用中用到了自定义JSP标签,则必须在web.xml文件中加入元素,它用于声明所引用的标签所在的标签库 /sometaglib /WEB-INF/someTLD.tld 2.:设定Tag Library的惟一标示符,在Web应用中将根据它来引用Tag Libray 3.:指定和Tag Library对应的TLD文件的位置 4.在JSP文件中需要加入 5.prefix表示在JSP网页中引用这个标签库的标签时的前缀,uri用来指定Tag Library的标识符,它必须和web.xml中的属性保持一致。 <淘宝热门商品:
 

80.00 元  

托玛琳厂家直营店

托玛琳预防富贵病;脂降压降糖减肥 活效清肠杯 一馈赠佳品限量版

 

27.50 元  

兼济天下 公司运营 多家实体店 毛巾 浴巾 美容巾 浴袍 毛巾被

【皇冠信誉 专业做毛巾】外贸原单★素色绣小圆点浴巾◎加厚

来源:程序员网

小小豆叮

教你如何成为一名合格的Java初级程序员

目前,JAVA是开发人员的热宠,很多论坛都有不少热爱JAVA的开发人员,也有不少想成为JAVA程序员,但苦于不知道该如何学习,也不清楚该学些什么知识才能成为一个JAVA程序员。本人在这里抛砖引玉,和大家讨论成为一个JAVA初级程序员应该具有的知识,与大家共享。 个人认为想成为一个合格的JAVA初级程序员应该具备如下知识: 一、面向对象的知识:JAVA是一个面向对象的开发语言,因此熟悉面向对象对学习JAVA很有必要,您要了解:什么是对象,什么是类;什么是封装,什么是多态,什么是继承;什么是抽象类,什么是接口。了解了概念后,您还需要这些概念是如何体现的,如类和对象有什么区别?类是如何封装的 二、JAVA语法:如果您已经有了开发经验,恭喜您,您学习JAVA语法来将比较容易。如果您有C++等面向对象语言的开发经验,您只需简单的翻看一下介绍JAVA的相关书籍就可以了。如果您是新手,没有关系,您下些工夫,好好研究一本JAVA初级教程之类的书就可以了。 学习了JAVA语法,加上面向对象的知识,只有您用心,您就可以写出来比较好的JAVA代码了。如果您再抽出时间熟悉一下JAVA编程规范,您代码的水平就应该不俗了。 三、JSP和HTML:在我国的绝大多数公司,做JAVA程序员都少不了和JSP以及HTML打交道。因此,想成为JAVA程序员就不可避免的要熟悉JSP和HTML,您最好能知道JSP的几个内置对象,如Session,Request,Reponse,,以及常用的JSP标签,如 include,userBean等。尽管一些工具会帮您生成HTML代码,但您还是要熟悉比如title,,,,等。如果您再熟悉一下JS和CSS就更好了,那会使您制作的页面更友好。 四、WebServer:熟悉了以上三种,可以肯定的说您已经可以制作出来JSP页面了,您也可以在您的页面里使用自己开发的JAVA类 (JAVABEAN)了,但您的页面总要跑起来才能看到您要的效果,这就要求您必须熟悉一种WebServer,比如:TOMCAT,RESIN等。您要熟悉如何发布您的应用,如何利用WebServer的数据库资源等。 五、开发工具:大家都知道,开发工具可以帮助您更好更快地开发,因此熟悉几种开发工具很有必要。目前JAVA的开发工具比较流行的有JBuilder,IDEA,Eclipse,HTML的开发工具有Dreamweaver等。 六、熟悉一种框架:熟悉一种框架其实是成为JAVA程序员的一种可选知识,但目前开发B/S结构的应用的开发小组,都差不多会采用一种框架来构建自己的应用系统。框架都会有许多可重用的代码,良好的层次关系和业务控制逻辑,基于框架的开发使你可以省出很多的开发成本。目前比较流行的框架有 Struts和WAF等 <淘宝热门商品:
 

5.00 元  

好 Baby外贸童装玩具批发

(男款成人袜子)日本原价580日元 特卖 5元人民币 随机发货

 

138.00 元 

专业定做925纯银 字母项链 刻字项链 名字项链

来源:程序员网

小小豆叮

如何解决JSP页面显示乱码问题

一、JSP页面显示乱码 二、表单提交中文时出现乱码 三、数据库连接时出现乱码 大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着您,我现在把我在JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考。 一、JSP页面显示乱码 下面的显示页面(display.jsp)就出现乱码: <html> <head> <title>JSP的中文处理</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body> <% out.print("JSP的中文处理"); %> </body> </html> 对不同的WEB服务器和不同的JDK版本,处理结果就不一样。原因:服务器使用的编码方式不同和浏览器对不同的字符显示结果不同而导致的。解决办法:在JSP页面中指定编码方式(gb2312),即在页面的第一行加上: 英文代码<%@ page contentType="text/html; charset=gb2312"%> 就可以消除乱码了。完整页面如下: <%@ page contentType="text/html; charset=gb2312"%> <html> <head> <title>JSP的中文处理</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body> <% out.print("JSP的中文处理"); %> </body> </html> 二、表单提交中文时出现乱码 下面是一个提交页面(submit.jsp),代码如下: <html> <head> <title>JSP的中文处理</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body> <form name="form1" method="post" action="process.jsp"> <div align="center"> <input type="text" name="name"> <input type="submit" name="Submit" value="Submit"> </div> </form> </body> </html> 下面是处理页面(process.jsp)代码: <%@ page contentType="text/html; charset=gb2312"%> <html> <head> <title>JSP的中文处理</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body> <%=request.getParameter("name")%> </body> </html> 如果submit.jsp提交英文字符能正确显示,如果提交中文时就会出现乱码。原因:浏览器默认使用UTF-8编码方式来发送请求,而UTF-8和GB2312编码方式表示字符时不一样,这样就出现了不能识别字符。解决办法:通过request.seCharacterEncoding("gb2312")对请求进行统一编码,就实现了中文的正常显示。修改后的process.jsp代码如下: <%@ page contentType="text/html; charset=gb2312"%> <% request.seCharacterEncoding("gb2312"); %> <html> <head> <title>JSP的中文处理</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body> <%=request.getParameter("name")%> </body> </html> 三、数据库连接出现乱码 只要涉及中文的地方全部是乱码,解决办法:在数据库的数据库URL中加上useUnicode=true&characterEncoding=GBK就OK了。 四、数据库的显示乱码 在mysql4.1.0中,varchar类型,text类型就会出现中文乱码,对于varchar类型把它设为binary属性就可以解决中文问题,对于text类型就要用一个编码转换类来处理,实现如下: public String iso2gb(String qs) { try{ if (qs == null) return "NULL"; else { return new String(qs.getBytes("iso-8859-1"),"gb2312"); } } catch(Exception e){ System.err.println("iso2gb error:"+e.getMessage()); } return "NULL"; } public String gb2iso(String qs) { try { if (qs == null) return "NULL"; else { return new String(qs.getBytes("gb2312"),"iso-8859-1"); } } catch(Exception e){ System.err.println("gb2iso error:"+e.getMessage());} return "NULL"; } 字符存入数据库时用 gb2iso()函数,将字符从数据库取出时,再用 iso2gb()函数 <淘宝热门商品:
 

6.80 元  

北欧橱窗

三冠 三角形强力吸墙角架/置物架/杂物架 承重3公斤 不伤墙面0.14

 

108.00 元  

电视购物热销.夏娃之秀魔力挺,让女人都有杀人"胸"器

来源:程序员网

小小豆叮

提升JSP中页面响应速度的七大秘籍绝招

方法一:在servlet的init()方法中缓存数据 当应用服务器初始化servlet实例之后,为客户端请求提供服务之前,它会调用这个servlet的init()方法。在一个servlet的生命周期中,init()方法只会被调用一次。通过在init()方法中缓存一些静态的数据或完成一些只需要执行一次的、耗时的操作,就可大大地提高系统性能。 例如,通过在init()方法中建立一个JDBC连接池是一个最佳例子,假设我们是用jdbc2.0的DataSource接口来取得数据库连接,在通常的情况下,我们需要通过JNDI来取得具体的数据源。我们可以想象在一个具体的应用中,如果每次SQL请求都要执行一次JNDI查询的话,那系统性能将会急剧下降。解决方法是如下代码,它通过缓存DataSource,使得下一次SQL调用时仍然可以继续利用它: public class ControllerServlet extends HttpServlet{ private javax.sql.DataSource testDS = null;   public void init(ServletConfig config) throws ServletException { super.init(config);    Context ctx = null;   try{     ctx = new InitialContext();    testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS"); }catch(NamingException ne){ne.printStackTrace();} }catch(Exception e){e.printStackTrace();} }  public javax.sql.DataSource getTestDS(){   return testDS;  }  ... ... } 方法 2:禁止servlet和JSP 自动重载(auto-reloading) Servlet/JSP提供了一个实用的技术,即自动重载技术,它为开发人员提供了一个好的开发环境,当你改变servlet和JSP页面后而不必重启应用服务器。然而,这种技术在产品运行阶段对系统的资源是一个极大的损耗,因为它会给JSP引擎的类装载器(classloader)带来极大的负担。因此关闭自动重载功能对系统性能的提升是一个极大的帮助。 方法 3: 不要滥用HttpSession 在很多应用中,我们的程序需要保持客户端的状态,以便页面之间可以相互联系。但不幸的是由于HTTP具有天生无状态性,从而无法保存客户端的状态。因此一般的应用服务器都提供了session来保存客户的状态。在JSP应用服务器中,是通过HttpSession对像来实现session的功能的,但在方便的同时,它也给系统带来了不小的负担。因为每当你获得或更新session时,系统者要对它进行费时的序列化操作。你可以通过对HttpSession的以下几种处理方式来提升系统的性能。 如果没有必要,就应该关闭JSP页面中对HttpSession的缺省设置。 如果你没有明确指定的话,每个JSP页面都会缺省地创建一个HttpSession。如果你的JSP中不需要使用session的话,那可以通过如下的JSP页面指示符来禁止它: <%@ page session="false"%> 不要在HttpSession中存放大的数据对像:如果你在HttpSession中存放大的数据对像的话,每当对它进行读写时,应用服务器都将对其进行序列化,从而增加了系统的额外负担。你在HttpSession中存放的数据对像越大,那系统的性能就下降得越快。 当你不需要HttpSession时,尽快地释放它:当你不再需要session时,你可以通过调用HttpSession.invalidate()方法来释放它。尽量将session的超时时间设得短一点:在JSP应用服务器中,有一个缺省的session的超时时间。当客户在这个时间之后没有进行任何操作的话,系统会将相关的session自动从内存中释放。超时时间设得越大,系统的性能就会越低,因此最好的方法就是尽量使得它的值保持在一个较低的水平。 方法 4: 将页面输出进行压缩 压缩是解决数据冗余的一个好的方法,特别是在网络带宽不够发达的今天。有的浏览器支持gzip(GNU zip)进行来对HTML文件进行压缩,这种方法可以戏剧性地减少HTML文件的下载时间。因此,如果你将servlet或JSP页面生成的HTML页面进行压缩的话,那用户就会觉得页面浏览速度会非常快。但不幸的是,不是所有的浏览器都支持gzip压缩,但你可以通过在你的程序中检查客户的浏览器是否支持它。下面就是关于这种方法实现的一个代码片段: public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { OutputStream out = null; String encoding = request.getHeader("Accept-Encoding");   if (encoding != null && encoding.indexOf("gzip") != -1){ request.setHeader("Content-Encoding" , "gzip");   out = new GZIPOutputStream(request.getOutputStream()); }  else if (encoding != null && encoding.indexOf("comdivss") != -1){ request.setHeader("Content-Encoding" , "comdivss");   out = new ZIPOutputStream(request.getOutputStream()); }else{   out = request.getOutputStream(); }  ...  ... } 方法 5: 使用线程池 应用服务器缺省地为每个不同的客户端请求创建一个线程进行处理,并为它们分派service()方法,当service()方法调用完成后,与之相应的线程也随之撤消。由于创建和撤消线程会耗费一定的系统资源,这种缺省模式降低了系统的性能。但所幸的是我们可以通过创建一个线程池来改变这种状况。 另外,我们还要为这个线程池设置一个最小线程数和一个最大线程数。在应用服务器启动时,它会创建数量等于最小线程数的一个线程池,当客户有请求时,相应地从池从取出一个线程来进行处理,当处理完成后,再将线程重新放入到池中。如果池中的线程不够地话,系统会自动地增加池中线程的数量,但总量不能超过最大线程数。通过使用线程池,当客户端请求急剧增加时,系统的负载就会呈现的平滑的上升曲线,从而提高的系统的可伸缩性。 方法 6: 选择正确的页面包含机制 在JSP中有两种方法可以用来包含另一个页面: 1、使用include指示符 <%@ includee file=”test.jsp” %> 2、使用jsp指示符 <jsp:includee page=”test.jsp” flush=”true”/> 在实际中发现,如果使用第一种方法的话,可以使得系统性能更高。 方法 7:正确地确定javabean的生命周期 JSP的一个强大的地方就是对javabean的支持。通过在JSP页面中使用jsp:useBean标签,可以将javabean直接插入到一个JSP页面中。它的使用方法如下: <jsp:useBean id="name" scope="page|request|session|application" class="package.className" type="typeName"> </jsp:useBean> 其中scope属性指出了这个bean的生命周期。缺省的生命周期为page。如果你没有正确地选择bean的生命周期的话,它将影响系统的性能。 举例来说,如果你只想在一次请求中使用某个bean,但你却将这个bean的生命周期设置成了session,那当这次请求结束后,这个bean将仍然保留在内存中,除非session超时或用户关闭浏览器。这样会耗费一定的内存,并无谓的增加了JVM垃圾收集器的工作量。因此为bean设置正确的生命周期,并在bean的使命结束后尽快地清理它们,会使用系统性能有一个提高。 其它一些有用的方法 1、在字符串连接操作中尽量不使用“+”操作符:在java编程中,我们常常使用“+”操作符来将几个字符串连接起来,但你或许从来没有想到过它居然会对系统性能造成影响吧?由于字符串是常量,因此JVM会产生一些临时的对像。你使用的“+”越多,生成的临时对像就越多,这样也会给系统性能带来一些影响。解决的方法是用StringBuffer对像来代替“+”操作符。 2、避免使用System.out.println()方法:由于System.out.println()是一种同步调用,即在调用它时,磁盘I/O操作必须等待它的完成,因此我们要尽量避免对它的调用。但我们在调试程序时它又是一个必不可少的方便工具,为了解决这个矛盾,我建议你最好使用Log4j工具(http://Jakarta.apache.org ),它既可以方便调试,而不会产生System.out.println()这样的方法。 3、ServletOutputStream 与 PrintWriter的权衡:使用PrintWriter可能会带来一些小的开销,因为它将所有的原始输出都转换为字符流来输出,因此如果使用它来作为页面输出的话,系统要负担一个转换过程。而使用ServletOutputStream作为页面输出的话就不存在一个问题,但它是以二进制进行输出的。因此在实际应用中要权衡两者的利弊。 总结 本文的目的是通过对servlet和JSP的一些调优技术来极大地提高你的应用程序的性能,并因此提升整个J2EE应用的性能。通过这些调优技术,你可以发现其实并不是某种技术平台(比如J2EE和.NET之争)决定了你的应用程序的性能,重要是你要对这种平台有一个较为深入的了解,这样你才能从根本上对自己的应用程序做一个优化。 <淘宝热门商品:
 

¥:60.00 

燕窝饼店-皇冠信誉.纯中药美白.丰胸.减肥.排毒饼干.美丽吃出来

★燕窝饼店★燕窝全麦排毒饼干**排毒、养颜、美肤**

 

 

【皇冠康康美美】同仁堂保健品 协和护肤品 营养品 减肥瘦身品

来源:程序员网

小小豆叮

Java新手看招 常用开发工具介绍

Java的应用越来越广泛,学习Java的人也越来越多。学过程序设计的人知道,使用Basic进行程序设计,可以使用QBasic、Visual Basic等开发工具;使用C语言进行程序设计,可以使用Turbo C、Visual C++、C++ Builder等开发工具。这些开发工具集成了编辑器和编译器,是集成开发工具,很方便使用。学习Java程序设计,同样需要方便易用的开发工具。Java的开发工具很多,而且各有优缺点,初学者往往不知道有哪些常用的开发工具,或者由于面临的选择比较多而产生困惑。本文对初学者常使用的Java开发工具作一介绍,有助于初学者了解Java常用开发工具并做出选择。   要建立Java开发环境,离不开Sun的JAVA2 SDK。1998年12月Sun公司发布了Java Software Development Kit(简称JAVA2 SDK),目前的最新版本是J2sdk-1.4.2.05。可在http://Java.sun.com下载。根据运行平台的不同,下载相应的版本并设置好PATH和CLASSPATH。这个软件包提供了Java编译器、Java解释器,但没有提供Java编辑器,因此需要使用者自己选择一个方便易用的编辑器或集成开发工具。下面就介绍几种适合初学者适用的Java开发工具。   一 UltraEdit   UltraEdit是共享软件,它的官方网址是:www.ultraedit.com 。最新版本是V10.20b。它是一个功能强大的文本、HTML、程序源代码编辑器。作为源代码编辑器,它的默认配置可以对C/C , VB, HTML, Java和 Perl进行语法着色。用它设计Java程序时,可以对Java的关键词进行识别并着色,方便了Java程序设计。它具有完备的复制、粘贴、剪切、查找、替换、格式控制等编辑功能。可以在Advanced菜单的Tool Configuration 菜单项配置好Java的编译器Javac和解释器Java,直接编译运行Java程序。   配置Javac:在Command Line里输入:D:JSPj2sdkinJavac %f,这里Javac的路径要根据JDK的实际安装路径来指定,%f是指当前活动文档的全文件名。在Menu Item Name 里输入Javac ,它显示在Advanced菜单里,这样就可以直接执行它进行编译了。选中Output To List Box和Capture Output ,这样就可以在源代码下面的输出窗口里看到编译时的错误信息了。配置不带参数运行的解释器Java:在Command Line里输入:D:jspj2sdkin   Java %n,在Menu Item Name 里输入: Java filename,选中Output To List Box和Capture Output ,运行结果显示在输出窗口里。配置带参数运行的解释器Java:在Command Line里输入:d:JSPj2sdkinJava %n%modify%,在Menu Item Name 里输入:Java filename parameter,这样当执行这个菜单项的时候,会显示一个要求输入参数的对话框。UltraEdit的运行及配置示例见图1。   二 Editplus   EditPlus是共享软件,它的官方网址是:www.editplus.com。最新版本是EditPlus 2.12。EditPlus也是功能很全面的文本、HTML、程序源代码编辑器。默认的支持HTML、CSS、PHP、ASP、Perl、C/C 、Java、JavaScript和VBScript的语法着色。通过定制语法文件还可以扩展到其他程序语言。可以在Tools菜单的Configure User Tools菜单项配置用户工具,类似于UltraEdit的配置,配置好Java的编译器Javac和解释器Java后,通过EditPlus的菜单可以直接编译执行Java程序。配置及运行示例如图2所示。   三 Jcreator   Jcreator是一个用于Java程序设计的集成开发环境,具有编辑、调试、运行Java程序的功能。官方网址是:www.jcreator.com 。当前最新版本是Jcreator 3.10,它又分为LE和Pro版本。LE版本功能上受到一些限制,是免费版本。Pro版本功能最全,但这个版本是一个共享软件。这个软件比较小巧,对硬件要求不是很高,完全用C 写的,速度快、效率高。具有语法着色、代码自动完成、代码参数提示、工程向导、类向导等功能。第一次启动时提示设置Java JDK主目录及JDK JavaDoc目录,软件自动设置好类路径、编译器及解释器路径,还可以在帮助菜单中使用JDK Help。但目前这个版本对中文支持性不好。图3所示是这个软件的应用示例。   四 Eclipse   Eclipse是一个开放可扩展的集成开发环境(IDE)。它不仅可以用于Java的开发,通过开发插件,它可以构建其他的开发工具。Eclipse是开放源代码的项目,并可以免费下载。它的官方网址是:www.eclipse.org 。它的官方网站提供Releases、Stable Builds、Integration Builds和Nightly Builds下载。建议使用Releases或Stable Builds版本。   Releases版本是Eclipse开发团队发布的主要发行版本,是经过测试的稳定的版本,适合要求稳定而不需要最新改进功能的使用者选择。目前最新的Release版本是Eclipse 3.0。Stable Builds版本是对大多数使用者足够稳定的版本,由开发团队将认为比较稳定的Integration Build版本提升到Stable Build而来,适合想使用Eclipse新功能的使用者选择。对于Releases版本2.1.x,在Eclipse的官方网站上有一个语言包可以下载,这样Eclipse及其帮助都是简体中文的。用于Java开发,Eclipse与UltraEdit和Editplus两种编辑器和Jcreator IDE比较,Eclipse更专业,功能更强大 <淘宝热门商品:
 

 

【杭州商盟】快美影像中心

 

268.00 元 

绝对NO1新版mirifem魔力丰丰胸片

来源:程序员网

小小豆叮

彻底学习Java语言中的覆盖和重载的使用

override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点: 1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果; 2、覆盖的方法的返回值必须和被覆盖的方法的返回一致; 3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类; 4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。 overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点: 1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int, float), 但是不能为fun(int, int)); 2、不能通过访问权限、返回类型、抛出的异常进行重载; 3、方法的异常类型和数目不会对重载造成影响; 4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。 下面是对override和overload的测试程序,其中注释中的内容都是会产生编译错误的代码,我们将注释去掉,看看在编译时会产生什么效果。 // 对overload测试的文件:OverloadTest.java public class OverloadTest { // 下面几个方法用来验证可以通过定义不同的参数类型和参数的数目进行方法重载。 public void fun(){ System.out.println("method fun in OverloadTest, no parameter"); } public void fun(float f) { System.out.println("method fun in OverloadTest, parameter type: float"); } public void fun(int i){ System.out.println("method fun in OverloadTest, parameter type: int"); } public void fun(int i1, int i2) { System.out.println("method fun in OverloadTest, parameter type: int, int"); } // 下面的两个方法用来验证可以通过定义不同的参数顺序进行方法重载。 // 需要注意:这里的参数肯定不是相同的类型,否则的顺序的先后就毫无意义。 public void fun1(int i, float f) { System.out.println("method fun1 in OverloadTest, sequence of parameters is: int, float"); } public void fun1(float f, int i) { System.out.println("method fun1 in OverloadTest, sequence of parameters is: float, int"); } // 下面的两个方法用来验证方法抛出的异常对于重载的影响. // 无论是异常的类型还是异常的个数都不会对重载造成任何的影响。 public void fun2() throws TestException { System.out.println("fun2 in OverloadTest, exception: TestException"); } public void fun2(int i) throws TestException, TestException1 { System.out.println("fun2 in OverloadTest, exception: TestException, TestException1"); } public void fun2(float f) throws Exception { System.out.println("fun2 in OverloadTest, exception: Exception"); } // 不能通过抛出的异常类型来重载fun方法。 //public void fun(int i) throws Exception { // System.out.println("method fun in OverloadTest, parameter type: int, exception: Exception"); //} // 不能通过返回值重载fun方法。 //public boolean fun(int i) throws Exception { // System.out.println("method fun in OverloadTest, parameter type: int, exception: Exception, return: boolean"); // return true; //} private void fun3() { } // 不能通过不同的访问权限进行重载 public void fun3() { } public static void main(String[] args) { // 这里只是定义了OverloadTest的实例,所以test不会调用 // OverloadTest1中的方法。 OverloadTest test = new OverloadTest1(); // 这里定义了OverloadTest1的实例,因为OverloadTest1是OverloadTest // 的子类,所以test1会调用OverloadTest中的方法。 OverloadTest1 test1 = new OverloadTest1(); try { int i = 1, j = 2, m = 3; // 这里不会调用OverloadTest1的fun方法 // test.fun(i, m, j); test1.fun(i, j, m); test1.fun(); // 这个调用不会执行,因为fun3()在OverloadTest中访问权限是priavte //test1.fun3(); test1.fun3(i); } catch(Exception e) { } } } <淘宝热门商品:
 

4.00 元  

5钻【成都商盟】竹纤维内裤袜子毛巾超市~~收藏本店就有礼物送哦

特价 100%竹纤维毛巾 京杭丽人儿童毛巾27*48 50克/随机颜色

 

55.00 元 

您试试一箱油能否多跑100公里(5次用)

来源:程序员网

小小豆叮

Java中使用接口实现多继承和多态的方法

1.JAVA里没有多继承,一个类之能有一个父类。 而继承的表现就是多态。一个父类可以有多个子类,而在子类里可以重写父类的方法(例如方法print()),这样每个子类里重写的代码不一样,自然表现形式就不一样。这样用父类的变量去引用不同的子类,在调用这个相同的方法print()的时候得到的结果和表现形式就不一样了,这就是多态,相同的消息(也就是调用相同的方法)会有不同的结果。举例说明: //父类 public class Father{ //父类有一个打孩子方法 public void hitChild(){} } //子类1 public class Son1 extends Father{ //重写父类打孩子方法 public void hitChild(){ System.out.println("为什么打我?我做错什么了!"); } } //子类2 public class Son2 extends Father{ //重写父类打孩子方法 public void hitChild(){ System.out.println("我知道错了,别打了!"); } } //子类3 public class Son3 extends Father{ //重写父类打孩子方法 public void hitChild(){ System.out.println("我跑,你打不着!"); } } //测试类 public class Test{ public static void main(String args[]){ Father father; father = new Son1(); father.hitChild(); father = new Son2(); father.hitChild(); father = new Son3(); father.hitChild(); } } 都调用了相同的方法,出现了不同的结果!这就是多态的表现! 2.JAVA中没有多继承,而用接口实现了多继承!一个类或是可以同时实现多个接口!(就相当于C++里一个类同时继承了多个类!)例如: public class Son implements Father1,Father2,Father3{ } 接口有利于代码功能的扩展(增加新的功能)!而继承则有利于代码功能的修改(把旧的功能改成新的功能)!这里旧功能的修改和新功能的增加前提是不修改旧的功能,旧的功能仍然可以使用!旧类的代码也不做修改! 接着上面的继承举例:上面例子中的子类我们统称为一代子类 1.用继承修改旧的功能。 现在如果一代Son1的功能打孩子,也就是方法hitChild()里边的功能实现有问题,我们要把具体实现修改掉,那么我们可以重新写一个新的二代子类Son11继承自一代子类Son1,并重写其hitChild()方法。 //二代子类 public class Son11 extends Son1{ //重写父类打孩子方法 public void hitChild(){ System.out.println("我是二代子类对此方法的新实现"); } } 2.用接口实现增加新的功能。 现在类Son1已经有了‘打孩子’功能(也就是方法),而我们有了新的需求,我们需要它还要有一个新的功能‘宠孩子’(新方法pet();)。而旧的代码不能动!那么我们可以定义一个新的接口(PetInterFace),接口里定义这个方法pet()的声明。再重新写一个二代子类Son11,让它先继承类Son1,同时实现接口 PetInterFace!并实现接口里的 pet()方法! //新接口 public interface PetInterFace{ //新功能方法 public void pet(); } //二代子类 public class Son11 extends Son1 implements PetInterFace{ //实现接口方法 public void pet(){ System.out.println("父亲很爱我!"); } } 这样这个二代子类即有了老的方法,又有新的功能! <淘宝热门商品:
 

198.00 元  

野葛根丰胸胶囊 植物萃取 天然健康

 

 

【珠三角商盟】【因为专注→所以专业→天天数码世界】

来源:程序员网

小小豆叮

JAVA中浅复制与深复制概念详细解析

1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 ⑵深复制(深克隆) 被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。 2.Java的clone()方法 ⑴clone方法将对象复制了一份并返回给调用者。一般而言,clone()方法满足: ①对任何的对象x,都有x.clone() !=x//克隆对象与原对象不是同一个对象 ②对任何的对象x,都有x.clone().getClass()= =x.getClass()//克隆对象与原对象的类型一样 ③如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。 ⑵Java中对象的克隆 ①为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。 ②在派生类中覆盖基类的clone()方法,并声明为public。 ③在派生类的clone()方法中,调用super.clone()。 ④在派生类中实现Cloneable接口。 请看如下代码: class Student implements Cloneable { String name; int age; Student(String name,int age) { this.name=name; this.age=age; } public Object clone() { Object o=null; try { o=(Student)super.clone();//Object中的clone()识别出你要复制的是哪一 // 个对象。 } catch(CloneNotSupportedException e) { System.out.println(e.toString()); } return o; } } public static void main(String[] args) { Student s1=new Student("zhangsan",18); Student s2=(Student)s1.clone(); s2.name="lisi"; s2.age=20; System.out.println("name="+s1.name+","+"age="+s1.age);//修改学生2后,不影响 //学生1的值。 } 说明: ①为什么我们在派生类中覆盖Object的clone()方法时,一定要调用super.clone()呢?在运行时刻,Object中的clone()识别出你要复制的是哪一个对象,然后为此对象分配空间,并进行对象的复制,将原始对象的内容一一复制到新对象的存储空间中。 ②继承自java.lang.Object类的clone()方法是浅复制。以下代码可以证明之。 class Professor { String name; int age; Professor(String name,int age) { this.name=name; this.age=age; } } class Student implements Cloneable { String name;//常量对象。 int age; Professor p;//学生1和学生2的引用值都是一样的。 Student(String name,int age,Professor p) { this.name=name; this.age=age; this.p=p; } public Object clone() { Student o=null; try { o=(Student)super.clone(); } catch(CloneNotSupportedException e) { System.out.println(e.toString()); } o.p=(Professor)p.clone(); return o; } } public static void main(String[] args) { Professor p=new Professor("wangwu",50); Student s1=new Student("zhangsan",18,p); Student s2=(Student)s1.clone(); s2.p.name="lisi"; s2.p.age=30; System.out.println("name="+s1.p.name+","+"age="+s1.p.age);//学生1的教授 //成为lisi,age为30。 } 那应该如何实现深层次的克隆,即修改s2的教授不会影响s1的教授?代码改进如下。 改进使学生1的Professor不改变(深层次的克隆) class Professor implements Cloneable { String name; int age; Professor(String name,int age) { this.name=name; this.age=age; } public Object clone() { Object o=null; try { o=super.clone(); } catch(CloneNotSupportedException e) { System.out.println(e.toString()); } return o; } } class Student implements Cloneable { String name; int age; Professor p; Student(String name,int age,Professor p) { this.name=name; this.age=age; this.p=p; } public Object clone() { Student o=null; try { o=(Student)super.clone(); } catch(CloneNotSupportedException e) { System.out.println(e.toString()); } o.p=(Professor)p.clone(); return o; } } public static void main(String[] args) { Professor p=new Professor("wangwu",50); Student s1=new Student("zhangsan",18,p); Student s2=(Student)s1.clone(); s2.p.name="lisi"; s2.p.age=30; System.out.println("name="+s1.p.name+","+"age="+s1.p.age);//学生1的教授不改变。 } 3.利用串行化来做深复制 把对象写到流里的过程是串行化(Serilization)过程,但是在Java程序师圈子里又非常形象地称为“冷冻”或者“腌咸菜(picking)”过程;而把对象从流中读出来的并行化(Deserialization)过程则叫做“解冻”或者“回鲜(depicking)”过程。应当指出的是,写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面,因此“腌成咸菜”的只是对象的一个拷贝,Java咸菜还可以回鲜。 在Java语言里深复制一个对象,常常可以先使对象实现Serializable接口,然后把对象(实际上只是对象的一个拷贝)写到一个流里(腌成咸菜),再从流里读出来(把咸菜回鲜),便可以重建对象。 如下为深复制源代码。 public Object deepClone() { //将对象写到流里 ByteArrayOutoutStream bo=new ByteArrayOutputStream(); ObjectOutputStream oo=new ObjectOutputStream(bo); oo.writeObject(this); //从流里读出来 ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream oi=new ObjectInputStream(bi); return(oi.readObject()); } 这样做的前提是对象以及对象内部所有引用到的对象都是可串行化的,否则,就需要仔细考察那些不可串行化的对象可否设成transient,从而将之排除在复制过程之外。上例代码改进如下。 class Professor implements Serializable { String name; int age; Professor(String name,int age) { this.name=name; this.age=age; } } class Student implements Serializable { String name;//常量对象。 int age; Professor p;//学生1和学生2的引用值都是一样的。 Student(String name,int age,Professor p) { this.name=name; this.age=age; this.p=p; } public Object deepClone() throws IOException, OptionalDataException,ClassNotFoundException { //将对象写到流里 ByteArrayOutoutStream bo=new ByteArrayOutputStream(); ObjectOutputStream oo=new ObjectOutputStream(bo); oo.writeObject(this); //从流里读出来 ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream oi=new ObjectInputStream(bi); return(oi.readObject()); } } public static void main(String[] args) { Professor p=new Professor("wangwu",50); Student s1=new Student("zhangsan",18,p); Student s2=(Student)s1.deepClone(); s2.p.name="lisi"; s2.p.age=30; System.out.println("name="+s1.p.name+","+"age="+s1.p.age); //学生1的教授不改变。 } 4.参考资料 ⑴阎宏,Java与模式,电子工业出版社,2006 ⑵孙鑫Java讲座视频资料 <淘宝热门商品:
 

228.00 元 

【专柜正品 超值之选】 JACK JONES/杰

 

1.02 元  

冰之.点卡店

【112热血传奇元宝】1个*游戏交易*

来源:程序员网

小小豆叮

Java Web三层架构的配置详解

一、软件下载::   1、java   这里使用的是jdk1.4.2。   下载地址:http://dlc.sun.com/jdk/j2sdk-1_4_2_07-windows-i586-p.exe;   2、tomcat   这里的tomcat的版本是5.0的,安装版或是解压版都是可以的。   下载地址:http://apache.linuxforum.net/dis ... a-tomcat-5.0.28.exe   3、数据库   推荐使用mysql,but暂时找不到下载地址,由于此次偶们班有课程设计要用sqlserver的,所以下面实践会使用sqlserver(找张安装盘安装)   注:连接sqlserver需要三个jar文件(文件名ms开头),可从这里下载:   http://www.softhouse.com.cn/html ... 11250300001646.html   上面包括完整的配置方法   二、软件安装 :   1.双击安装jdk。装完后在我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量:   (假设你的JDK安装在c:/jdk)   JDK_HOME=C:jdk   classpath=.;%JDK_HOME%libdt.jar;%JDK_HOME%libtools.jar   在PATH(原来就已存在)中添加:%JDK_HOME%bin   这样jdk环境配置成功。   2.双击安装你的Tomcat。(建议安装在D:/tomcat)   注:tomcat5.0.x版本不需配置环境变量就可以使用,但如果需要编译Servlet则必须将tomcat的两个jar文件也放到环境变量中,具体方法如下:   在我的电脑->属性->高级->环境变量->系统变量中添加:   TOMCAT_HOME=D:tomcat   修改classpath变成:.;%JDK_HOME%libdt.jar;%JDK_HOME%libtools.jar;%TOMCAT_HOME%commonlibservlet-api.jar;%TOMCAT_HOME%commonlibjsp-api.jar;   这样已经完整安装完Tomcat了。   建议:在PATH中再添加:%JDK_HOME%bin;%TOMCAT_HOME%bin   这样做的目的是在虚拟dos中可以使用tomcat的工具   最后顺便把第一步下载回来的三个jar文件放到tomcat目录下的common/lib目录中   3.测试:   打开开始菜单中的tomcat(小猫图案)的monitor工具,点击start server,显示绿色三角形即为启动,打开浏览器在地址栏输入:http://localhost:8080/可以看到小猫图案说明已经配置成功。   4.安装数据库(sqlserver)   windows xp下必须安装个人版或开发版(个人推荐个人版)。   一直next就可以(微软的东西就是方便),这里注意到域帐户那里选择本机帐户,到验证那里选择混合验证(这点很重要,若选择系统认证以后在程序中就连接不上数据库),为你的sa用户输入一个密码(如果练习用就不用考虑安全性啦,选择“空密码”就可以)   三、正式编程:   1.建立数据库   打开开始菜单找到sqlserver的快捷方式组里面的企业管理器,点开左边的树一般有个localhost连接,如果有个绿色三角形符号证明数据库连接成功。点击邮件新建数据库,在你新建的数据库中再新建个数据表(例如叫test),数据表建立若干字段。   补充:提供另一种建表方法是使用sql脚本建表。首先创建如下文件:   test.sql   create database test   USE test   create table test   (   id int not null identity(1,1),   mark varchar(255),   name varchar(255),   sex varchar(255)   )   然后打开开始菜单中sqlserver快捷方式组中的查询分析器,点击“文件”-》“打开”,选择test.sql,点击运行即可。   2.建立tomcat虚拟目录   在任意你喜欢的地方建立一个文件夹(例如e:/wool),在文件夹中建立WEB-INF文件夹(注意必须大写),WEB-INF文件夹中再建立classes和lib两个文件夹,将第一步下载的三个jar文件(连接数据库用)放入lib文件夹中。(有人可能问:这里为何没有web.xml这个文件,不急,后面会说到)   3.配置文件与连接池   这次班里做课程设计这步难倒不少同学,我这里有最简单方法(俺老师建议去http://localhost:8080/admin中去配置,我个人觉得那样麻烦而且容易出错),好,下面介绍步骤:   首先,按下面内容建立好两个文件: wool.xml   <?xml version=1.0 encoding=utf-8?>   <Context docBase="E:wool" path="/wool" reloadable="true" workDir="E:woolWEB-INFclasses">   <Resource name="jdbc/sqlserver" type="javax.sql.DataSource"/>   <ResourceLink name="jdbc/sqlserver" global="jdbc/sqlserver" type="javax.sql.DataSource"/>   <ResourceParams name="jdbc/sqlserver">   <parameter>   <name>driverClassName</name>   <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>   </parameter>   <parameter>   <name>url</name>   <value>jdbc:microsoft:sqlserver://localhost;DatabaseName=test</value> <!--这里test是第三点中第一小点建立的数据库名-->   </parameter>   <parameter>   <name>username</name>   <value>sa</value>   </parameter>   <parameter>   <name>password</name>   <value></value>><!--安装sqlserver时用空密码的话这里什么都不用填(注意连空格都没有)-->   </parameter>   <parameter>   <name>maxActive</name>   <value>4</value>   </parameter>   <parameter>   <name>maxWait</name>   <value>5000</value>   </parameter>   <parameter>   <name>maxIdle</name>   <value>2</value>   </parameter>   </ResourceParams>   </Context> 注意:在帮同学配置的过程发现一个问题,就是上面的配置文件必须把注释部分删除才可以成功运行。暂时不了解什么原因,理论上xml文件中这样的注释是允许的,郁闷。   web.xml   connectDB   jdbc/sqlserver   javax.sql.DataSource   Container   建立完两个文件后,把wool.xml放到tomcat目录下的confCatalinalocalhost中;web.xml文件放到E:woolWEB-INF目录中。   4.写段程序测试连接   test.jsp   名字  性别  分数   将test.jsp文件放到E:wool即可。   5.启动sqlserver和tomcat,在浏览器输入:   http://localhost:8080/wool/test.jsp   四、写在最后   以上方法是偶最近帮同学配置工程训练(web三层架构)的时候使用的方法,是偶以前参考网络上大虾们的经验后觉得最好的方法。通过以上步骤,对于未做过java或者其他基于web编程的同学来说可以迅速入门(其实最主要可以完成本次烦人的工程训练)。 <淘宝热门商品:
 

5.00元  

皇冠 超细纤维毛巾|浴巾|干发帽|擦车巾|家居用品专卖

 

3C数码配件 

:麒麟光电

来源:程序员网

小小豆叮

JDBC中常用的类库和程序中具体实现方法

一、四种驱动程序概念 A、JDBC-ODBC Bridge 桥接器型的驱动程序,这类驱动程序的特色是必须在使用者端的计算机上事先安装好ODBC驱动程序,然后通过JDBC-ODBC的调用方法,进而通过ODBC来存取数据库。 作为JDK1.1后的一部分,是sun.jdbc.odbc包的一部分 Application--->JDBC-ODBC Bridge---->JDBC-ODBC Library--->ODBC Driver-->Database 适用于快速的原型系统,没有提供JDBC驱动的数据库如Access B、JDBC-Native API Bridge 也是桥接器驱动程序之一,这类驱动程序也必须先在使用者计算机上先安装好特定的驱动程序(类似ODBC),然后通过JDBC-Native API桥接器的转换,把Java API调用转换成特定驱动程序的调用方法,进而存取数据库。 利用开发商提供的本地库来直接与数据库通信。 Application--->JDBC Driver---->Native Database library---->Database 比A类性能略好。 C、JDBC-middleware 这类型的驱动程序最大的好处就是省去了在使用者计算机上安装任何驱动程序的麻烦,只需在服务器端安装好middleware,而middleware会负 责所有存取数据库必要的转换。Application--->Jdbc Driver----->java middleware--->JDBC Driver---->Database 具有最大的灵活性,通常由那些非数据库厂商提供,是四种类型中最小的。 D、Pure JDBC driver 这类型的驱动程序是最成熟的JDBC驱动程序,不但无需在使用者计算机上安装任何额外的驱动程序,也不需要在服务器端安装任何中介程序(middleware),所有存取数据库的操作,都直接由驱动程序来完成。 Application--->Jdbc driver----->database engine--->database 最高的性能,通过自己的本地协议直接与数据库引擎通信,具备在Internet装配的能力。 JAVA天堂 二、常用的JDBC类与方法 1、DriverManager类: 负责管理JDBC驱动程序。使用JDBC驱动程序之前,必须先将驱动程序加载并向DriverManager注册后才可以使用,同时提供方法来建立与数据库的连接。 方法: A、Class.forName(String driver); //加载注册驱动程序 B、Static Connection getConnection(String url,String user,String password) throws SQLException; //取得对数据库的连接 C、Static Driver getDriver(String url) throws SQLExcetion; //在已经向DriverManager注册的驱动程序中寻找一个能够打开url所指定的数据库的驱动程序 2、Connection类 负责维护JSP/JAVA数据库程序和数据库之间的联机。可以建立三个非常有用的类对象。 方法: A、Statement createStatement() throws SQLException; //建立Statement类对象 Statement createStatement(int resultSetType,int resultSetConcurrency) throws SQLException; // 建立Statement类对象 resultSetType值 TYPE_FORWARD_ONLY 结果集不可滚动 TYPE_SCROLL_INSENSITIVE 结果集可滚动,不反映数据库的变化 TYPE_SCROLL_SENSITIVE 结果集可滚动,反映数据库的变化 resultSetConcurrency值 CONCUR_READ_ONLY 不能用结果集更新数据 CONCUR_UPDATABLE 能用结果集更新数据 JDBC2.0中才支持滚动的结果集,而且可以对数据进行更新 JAVA天堂 B、DatabaseData getData() throws SQLException; //建立DatabaseData类对象 C、PreparedStatement prepareStatement(String sql) throws SQLException; //建立PreparedStatement类对象 D、boolean getAutoCommit() throws SQLException //返回Connection类对象的AutoCommit 状态 E、void setAutoCommit(boolean autoCommit) throws SQLException //设定Connection类对象的AutoCommit状态 F、void commit() throws SQLException //确定执行对数据库新增、删除或修改记录的操作 G、void rollback() throws SQLException //取消执行对数据库新增、删除或修改记录的操作 H、void close() throws SQLException //结束Connection对象对数据库的联机 I、boolean isClosed() throws SQLException //测试是否已经关闭Connection类对象对数据库的联机 3、Statement类 通过Statement类所提供的方法,可以利用标准的SQL命令,对数据库直接新增、删除或修改操作 方法: A、ResultSet executeQuery(String sql) throws SQLException //使用SELECT命令对数据库进行查询 B、int executeUpdate(String sql) throws SQLException //使用INSERTDELETEUPDATE对数据库进行新增、删除和修改操作。 C、void close() throws SQLException //结束Statement类对象对数据库的联机 4、PreparedStatement类 PreparedStatement类和Statement类的不同之处在于PreparedStatement类对象会将传入的SQL命令事先编好等待 使用,当有单一的SQL指令比多次执行时,用PreparedStatement类会比Statement类有效率 方法: A、ResultSet executeQuery() throws SQLException //使用SELECT命令对数据库进行查询 B、int executeUpdate() throws SQLException //使用INSERTDELETEUPDATE对数据库进行新增、删除和修改操作。 C、ResultSetData getData() throws SQLException //取得ResultSet类对象有关字段的相关信息 D、void setInt(int parameterIndex,int x) throws SQLException //设定整数类型数值给PreparedStatement类对象的IN参数 E、void setFloat(int parameterIndex,float x) throws SQLException //设定浮点数类型数值给PreparedStatement类对象的IN参数 F、void setNull(int parameterIndex,int sqlType) throws SQLException //设定NULL类型数值给PreparedStatement类对象的IN参数 G、void setString(int parameterIndex,String x) throws SQLException //设定字符串类型数值给PreparedStatement类对象的IN参数 H、void setDate(int parameterIndex,Date x) throws SQLException //设定日期类型数值给PreparedStatement类对象的IN参数 I、void setTime(int parameterIndex,Time x) throws SQLException //设定时间类型数值给PreparedStatement类对象的IN参数 5、DatabaseData类 DatabaseData类保存了数据库的所有特性,并且提供许多方法来取得这些信息。 方法: A、String getDatabaseProductName() throws SQLException //取得数据库名称 B、String getDatabaseProductVersion() throws SQLException //取得数据库版本代号 C、String getDriverName() throws SQLException //取得JDBC驱动程序的名称 D、String getDriverVersion() throws SQLException //取得JDBC驱动程序的版本代号 E、String getURL() throws SQLException //取得连接数据库的JDBC URL F、String getUserName() throws SQLException //取得登录数据库的使用者帐号 6、ResultSet类 负责存储查询数据库的结果。并提供一系列的方法对数据库进行新增、删除和修改操作。也负责维护一个记录指针(Cursor),记录指针指向数据表中的某个记录,通过适当的移动记录指针,可以随心所欲的存取数据库,加强程序的效率。 方法: A、boolean absolute(int row) throws SQLException //移动记录指针到指定的记录 JAVA天堂 B、void beforeFirst() throws SQLException //移动记录指针到第一笔记录之前 C、void afterLast() throws SQLException //移动记录指针到最后一笔记录之后 D、boolean first() throws SQLException //移动记录指针到第一笔记录 E、boolean last() throws SQLException //移动记录指针到最后一笔记录 F、boolean next() throws SQLException //移动记录指针到下一笔记录 G、boolean previous() throws SQLException //移动记录指针到上一笔记录 H、void deleteRow() throws SQLException //删除记录指针指向的记录 I、void moveToInsertRow() throws SQLException //移动记录指针以新增一笔记录 J、void moveToCurrentRow() throws SQLException //移动记录指针到被记忆的记录 K、void insertRow() throws SQLException //新增一笔记录到数据库中 L、void updateRow() throws SQLException //修改数据库中的一笔记录 JAVA天堂 M、void update类型(int columnIndex,类型 x) throws SQLException //修改指定字段的值 N、int get类型(int columnIndex) throws SQLException //取得指定字段的值 O、ResultSetData getData() throws SQLException //取得ResultSetData类对象 7、ResultSetData类 ResultSetData类对象保存了所有ResultSet类对象中关于字段的信息,提供许多方法来取得这些信息。 方法: A、int getColumnCount() throws SQLException //取得ResultSet类对象的字段个数 B、int getColumnDisplaySize() throws SQLException //取得ResultSet类对象的字段长度 C、String getColumnName(int column) throws SQLException //取得ResultSet类对象的字段名称 D、String getColumnTypeName(int column) throws SQLException //取得ResultSet类对象的字段类型名称 E、String getTableName(int column) throws SQLException //取得ResultSet类对象的字段所属数据表的名称 F、boolean isCaseSensitive(int column) throws SQLException //测试ResultSet类对象的字段是否区分大小写 G、boolean isReadOnly(int column) throws SQLException //测试ResultSet类对象的字段是否为只读 <淘宝热门商品:
 

88.00 元 

双皇冠热卖 日本原装 RAKU系列30倍运动硅胶

 

198.00 元 

08秋款欧洲正版G-star双排扣夹克外套 超好

来源:程序员网

小小豆叮

Java中抽象类和接口的区别

Abstractclass和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstractclass和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstractclass和interface的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行一番剖析,试图给开发者提供一个在二者之间进行选择的依据。 理解抽象类 abstractclass和interface在Java语言中都是用来进行抽象类(本文中的抽象类并非从abstractclass翻译而来,它表示的是一个抽象体,而abstractclass为Java语言中用于定义抽象类的一种方法,请读者注意区分)定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢? 在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。 在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-ClosedPrinciple),抽象类是其中的关键所在。 从语法定义层面看abstractclass和interface 在语法层面,Java语言对于abstractclass和interface给出了不同的定义方式,下面以定义一个名为Demo的抽象类为例来说明这种不同。 使用abstractclass的方式定义Demo抽象类的方式如下: abstractclassDemo{abstractvoidmethod1();abstractvoidmethod2();…} 使用interface的方式定义Demo抽象类的方式如下: interfaceDemo{voidmethod1();voidmethod2();…} 在abstractclass方式中,Demo可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是staticfinal的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的abstractclass。 从编程的角度来看,abstractclass和interface都可以用来实现"designbycontract"的思想。但是在具体的使用上面还是有一些区别的。 首先,abstractclass在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。 其次,在abstractclass的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。 在抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。因为如果后来想修改类的界面(一般通过abstractclass或者interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此)。但是如果界面是通过abstractclass来实现的,那么可能就只需要修改定义在abstractclass中的默认行为就可以了。 同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了"onerule,oneplace"原则,造成代码重复,同样不利于以后的维护。因此,在abstractclass和interface间进行选择时要非常的小心。 从设计理念层面看abstractclass和interface 上面主要从语法定义和编程的角度论述了abstractclass和interface的区别,这些层面的区别是比较低层次的、非本质的。本小节将从另一个层面:abstractclass和interface所反映出的设计理念,来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概念的本质所在。 前面已经提到过,abstarctclass在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"isa"关系,即父类和派生类在概念本质上应该是相同的(参考文献〔3〕中有关于"isa"关系的大篇幅深入的论述,有兴趣的读者可以参考)。对于interface来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。为了使论述便于理解,下面将通过一个简单的实例进行说明。 考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstractclass或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示: 使用abstractclass方式定义Door: abstractclassDoor{abstractvoidopen();abstractvoidclose();} 使用interface方式定义Door: interfaceDoor{voidopen();voidclose();} 其他具体的Door类型可以extends使用abstractclass方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstractclass和interface没有大的区别。 如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢(在本例中,主要是为了展示abstractclass和interface反映在设计理念上的区别,其他方面无关的问题都做了简化或者忽略)?下面将罗列出可能的解决方案,并从设计理念层面对这些不同的方案进行分析。 解决方案一: 简单的在Door的定义中增加一个alarm方法,如下: abstractclassDoor{abstractvoidopen();abstractvoidclose();abstractvoidalarm();} 或者 interfaceDoor{voidopen();voidclose();voidalarm();} 那么具有报警功能的AlarmDoor的定义方式如下: classAlarmDoorextendsDoor{voidopen(){…}voidclose(){…}voidalarm(){…}} 或者 classAlarmDoorimplementsDoor{voidopen(){…}voidclose(){…}voidalarm(){…}} 这种方法违反了面向对象设计中的一个核心原则ISP(InterfaceSegregationPriciple),在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变(比如:修改alarm方法的参数)而改变,反之依然。 解决方案二: 既然open、close和alarm属于两个不同的概念,根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。定义方式有:这两个概念都使用abstractclass方式定义;两个概念都使用interface方式定义;一个概念使用abstractclass方式定义,另一个概念使用interface方式定义。 显然,由于Java语言不支持多重继承,所以两个概念都使用abstractclass方式定义是不可行的。后面两种方式都是可行的,但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理。我们一一来分析、说明。 如果两个概念都使用interface方式来定义,那么就反映出两个问题:1、我们可能没有理解清楚问题领域,AlarmDoor在概念本质上到底是Door还是报警器?2、如果我们对于问题领域的理解没有问题,比如:我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的,那么我们在实现时就没有能够正确的揭示我们的设计意图,因为在这两个概念的定义上(均使用interface方式定义)反映不出上述含义。 如果我们对于问题领域的理解是:AlarmDoor在概念本质上是Door,同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢?前面已经说过,abstractclass在Java语言中表示一种继承关系,而继承关系在本质上是"isa"关系。所以对于Door这个概念,我们应该使用abstarctclass方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行为,所以报警概念可以通过interface方式定义。如下所示: abstractclassDoor{abstractvoidopen();abstractvoidclose();}interfaceAlarm{voidalarm();}classAlarmDoorextendsDoorimplementsAlarm{voidopen(){…}voidclose(){…}voidalarm(){…}} 这种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计意图。其实abstractclass表示的是"isa"关系,interface表示的是"likea"关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的,比如:如果我们认为AlarmDoor在概念本质上是报警器,同时又具有Door的功能,那么上述的定义方式就要反过来了。 <淘宝热门商品:
 

37.00 元  

深圳兴鹏电子/专业的索爱外壳配件供应商

【兴鹏电子】索爱W800外壳W800c机壳 高品质做工 比肩原装 大图

 

68.00 元  

SOCOOL时尚女包五皇冠店~美一天~每一天~批发V零售

★五皇冠-SUPER LOVER黑白奶牛个性秋时尚翻盖斜挎包-3902★

来源:程序员网

小小豆叮

Eclipse+JBoss+MySQL开发环境的设置

作为开发环境,如果采用经典配置:JBuilder+Weblogic+Oracle,自是得心应手,但价格是惊人的。此配置主要是针对大型或超大型应用,硬件要求也很高,针对国内以中小型应用为主的现况,不作推荐。 虽然国内开发者早已习惯了D版,但笔者以为还是防患于未然,应尽早加入OpenSource行列,促进国内软件业的发展。 本文所推荐的Eclipse、JBoss、MySQL均是名气很高的开源软件,并且非常实用。 1、JDK:到http://java.sun.com下载,推荐使用J2SDK1.4.X 2、JBoss:到http://www.jboss.org下载,笔者使用jboss-3.0.4_tomcat-4.0.6 3、MySQL:到http://www.mysql.com下载,笔者使用mysql-4.0.13,另须下载MySQL Control Center(图形化管理工具),到http://sourceforge.net/projects/mmmysql/下载MySQL的JDBC驱动程序,如mm.mysql-2.0.14-you-must-unjar-me.jar 4、Eclipse:到http://www.eclipse.org下载,最新版本为3.0M8,如果是新手推荐下载2.1.2和语言包(2.1.2_Translations)。到http://www.objectlearn.com/下载lomboz(此插件开发J2EE必需),需要注意的是lomboz的版本必须与eclipse版本一致,否则不正常。 环境设置(以win2000下D盘作根目录为例): 1、JDK的安装配置在此不再说明。 2、将JBoss解压到D:,将MySQL的JDBC驱程包中的mm.mysql-2.0.14-bin.jar解压到D:jboss-3.0.4_tomcat-4.0.6serverdefaultlib中,再将D:jboss-3.0.4_tomcat-4.0.docsexamplesjca目录下的mysql-service.xml拷贝到D:jboss-3.0.4_tomcat-4.0.6serverdefaultdeploy目录下找到相应段落并作如下修改: MySqlDS jdbc:mysql://localhost:3306/test org.gjt.mm.mysql.Driver root 3、安装MySQL和MySQL Control Center,到mysqlin目录中启动mysqld-nt.exe,即开启mysql服务。使用MySQL Control Center很方便地进行管理(类似SQL Server)。 4、将Eclipse(以3.0M8为例)解压到D:,再将lomboz包中plugins目录中的内容解压到D:Eclipseplugins中,启动eclipse。(1)window--preferences--lomboz,设置JDK Tools.jar,Server Definitions--Server types:JBoss 3.0--Application Server Directory:D:/jboss-3.0.4_tomcat-4.0.6;Classpath Variable:D:/jboss-3.0.4_tomcat-4.0.6(2)window--Customize Perspective--Shortcuts--New--Java,勾选lomboz J2EE Wizards <淘宝热门商品:
 

288.00 元 

【原装正品】韩国恋人1.6米大抱熊

 

12.00 元  

08VIVI杂志推荐 风靡韩国牛仔感七分打底裤

来源:程序员网

小小豆叮

用Jsp来实现文件下载功能的几种方式

1.最直接最简单的,方式是把文件地址直接放到html页面的一个链接中。这样做的缺点是把文件在服务器上的路径暴露了,并且还无法对文件下载进行其它的控制(如权限)。这个就不写示例了。 2.在服务器端把文件转换成输出流,写入到response,以response把文件带到浏览器,由浏览器来提示用户是否愿意保存文件到本地。(示例如下) <% response.setContentType(fileminitype); response.setHeader("Location",filename); response.setHeader("Cache-Control", "max-age=" + cacheTime); //filename应该是编码后的(utf-8) response.setHeader("Content-Disposition", "attachment; filename=" + filename); response.setContentLength(filelength); OutputStream outputStream = response.getOutputStream(); InputStream inputStream = new FileInputStream(filepath); byte[] buffer = new byte[1024]; int i = -1; while ((i = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, i); } outputStream.flush(); outputStream.close(); inputStream.close(); outputStream = null; %> 3.既然是JSP的话,还有一种方式就是用Applet来实现文件的下载。不过客户首先得信任你的这个Applet小程序,由这个程序来接受由servlet发送来的数据流,并写入到本地。 servlet端示例 public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType(" text/plain "); OutputStream outputStream = null; try { outputStream = res.getOutputStream(); //把文件路径为srcFile的文件写入outputStream中 popFile(srcFile, outputStream)) ; } catch (IOException e) { e.printStackTrace(); } } JApplet端示例 URLConnection con; try { //url是被调用的SERVLET的网址 如 *.do con = url.openConnection(); con.setUseCaches(false); con.setDoInput(true); con.setDoOutput(true); con.setRequestProperty("Content-Type", "application/octet-stream"); InputStream in = con.getInputStream(); ProgressMonitorInputStream pmInputStream = new ProgressMonitorInputStream (pane, "正在从服务器下载文件内容", in); ProgressMonitor pMonitor = pmInputStream.getProgressMonitor(); pMonitor.setMillisToDecideToPopup(3); pMonitor.setMillisToPopup(3); //localfilepath本地路径,localstr文件文件夹,filename本地文件名 String localfilepath = localstr + filename ; //方法saveFilsaveFilee是把输入流pmInputStream写到文件localfilepath中 if(saveFilsaveFilee(localfilepath,pmInputStream)){      openLocalFile(localfilepath); } 4.顺便把JApplet上传文件的代码也贴上来. JApplet端示例 URLConnection con; try { con = url.openConnection(); //url是被调用的SERVLET的网址 如 *.do    con.setUseCaches(false); con.setDoInput(true); con.setDoOutput(true); con.setRequestProperty("Content-Type","application/octet-stream"); OutputStream out = con.getOutputStream(); //localfilepath本地路径,localstr文件文件夹,filename本地文件名 String localfilepath = localstr + filename; //文件getOutputStream是把文件localfilepath写到输出流out中 getOutputStream(localfilepath,out); InputStream in = con.getInputStream(); return true; }catch (IOException e) { System.out.println("文件上传出错!"); e.printStackTrace(); } servlet端代码示例 public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType(" text/plain "); InputStream inputStream = null; try { inputStream = res.getInputStream(); //把输入流inputStream保存到文件路径为srcFile的文件中 writefile(srcFile, inputStream); } catch (IOException e) { e.printStackTrace(); } } // end service 总结:在文件的传输中是流的形式存在的,在硬盘上是文件的形式存在的。我们要做的只是通过HttpServletRequest和HttpServletResponse,或者是response和request来发送流和读取流。以及把文件转换成流或把流转换成文件的操作。 <淘宝热门商品:
 

 

香港恒邦充电电池/充电器专卖店

 

145.00 元 

八心八箭瑞士钻石六爪旁镶钻经典钻戒指

来源:程序员网

小小豆叮

通过JDBC连接Oracle的十大灵活技术

Java数据库连接(JDBC)API是一系列能够让Java编程人员访问数据库的接口,各个开发商的接口并不完全相同。在使用多年的Oracle公司的JDBC后,我积累了许多技巧,这些技巧能够使我们更好地发挥系统的性能和实现更多的功能。 1、在客户端软件开发中使用Thin驱动程序 在开发Java软件方面,Oracle的数据库提供了四种类型的驱动程序,二种用于应用软件、applets、servlets等客户端软件,另外二种用于数据库中的Java存储过程等服务器端软件。在客户机端软件的开发中,我们可以选择OCI驱动程序或Thin驱动程序。OCI驱动程序利用Java本地化接口(JNI),通过Oracle客户端软件与数据库进行通讯。Thin驱动程序是纯Java驱动程序,它直接与数据库进行通讯。为了获得最高的性能,Oracle建议在客户端软件的开发中使用OCI驱动程序,这似乎是正确的。但我建议使用Thin驱动程序,因为通过多次测试发现,在通常情况下,Thin驱动程序的性能都超过了OCI驱动程序。 2、关闭自动提交功能,提高系统性能 在第一次建立与数据库的连接时,在缺省情况下,连接是在自动提交模式下的。为了获得更好的性能,可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能,如下所示: conn.setAutoCommit(false); 值得注意的是,一旦关闭了自动提交功能,我们就需要通过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。 3、在动态SQL或有时间限制的命令中使用Statement对象 在执行SQL命令时,我们有二种选择:可以使用PreparedStatement对象,也可以使用Statement对象。无论多少次地使用同一个SQL命令,PreparedStatement都只对它解析和编译一次。当使用Statement对象时,每次执行一个SQL命令时,都会对它进行解析和编译。这可能会使你认为,使用PreparedStatement对象比使用Statement对象的速度更快。然而,我进行的测试表明,在客户端软件中,情况并非如此。因此,在有时间限制的SQL操作中,除非成批地处理SQL命令,我们应当考虑使用Statement对象。 此外,使用Statement对象也使得编写动态SQL命令更加简单,因为我们可以将字符串连接在一起,建立一个有效的SQL命令。因此,我认为,Statement对象可以使动态SQL命令的创建和执行变得更加简单。 4、利用helper函数对动态SQL命令进行格式化 在创建使用Statement对象执行的动态SQL命令时,我们需要处理一些格式化方面的问题。例如,如果我们想创建一个将名字OReilly插入表中的SQL命令,则必须使用二个相连的“”号替换OReilly中的“”号。完成这些工作的最好的方法是创建一个完成替换操作的helper方法,然后在连接字符串心服用公式表达一个SQL命令时,使用创建的helper方法。与此类似的是,我们可以让helper方法接受一个Date型的值,然后让它输出基于Oracle的to_date()函数的字符串表达式。 5、利用PreparedStatement对象提高数据库的总体效率 在使用PreparedStatement对象执行SQL命令时,命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个PreparedStatement对象时,它就会被再解析一次,但不会被再次编译。在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务,我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象。 6、在成批处理重复的插入或更新操作中使用PreparedStatement对象 如果成批地处理插入和更新操作,就能够显著地减少它们所需要的时间。Oracle提供的Statement和 CallableStatement并不真正地支持批处理,只有PreparedStatement对象才真正地支持批处理。我们可以使用addBatch()和executeBatch()方法选择标准的JDBC批处理,或者通过利用PreparedStatement对象的setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制,可以以如下所示的方式调用setExecuteBatch(): PreparedStatement pstmt3D null; try { ((OraclePreparedStatement) pstmt).setExecuteBatch(30); ... pstmt.executeUpdate(); } 调用setExecuteBatch()时指定的值是一个上限,当达到该值时,就会自动地引发SQL命令执行,标准的executeUpdate()方法就会被作为批处理送到数据库中。我们可以通过调用PreparedStatement类的sendBatch()方法随时传输批处理任务。 7、使用Oracle locator方法插入、更新大对象(LOB)   Oracle的PreparedStatement类不完全支持BLOB和CLOB等大对象的处理,尤其是Thin驱动程序不支持利用PreparedStatement对象的setObject()和setBinaryStream()方法设置BLOB的值,也不支持利用setCharacterStream()方法设置CLOB的值。只有locator本身中的方法才能够从数据库中获取LOB类型的值。可以使用PreparedStatement对象插入或更新LOB,但需要使用locator才能获取LOB的值。由于存在这二个问题,因此,我建议使用locator的方法来插入、更新或获取LOB的值。 8、使用SQL92语法调用存储过程 在调用存储过程时,我们可以使用SQL92或Oracle PL/SQL,由于使用Oracle PL/SQL并没有什么实际的好处,而且会给以后维护你的应用程序的开发人员带来麻烦,因此,我建议在调用存储过程时使用SQL92。 9、使用Object SQL将对象模式转移到数据库中 既然可以将Oracle的数据库作为一种面向对象的数据库来使用,就可以考虑将应用程序中的面向对象模式转到数据库中。目前的方法是创建Java bean作为伪装的数据库对象,将它们的属性映射到关系表中,然后在这些bean中添加方法。尽管这样作在Java中没有什么问题,但由于操作都是在数据库之外进行的,因此其他访问数据库的应用软件无法利用对象模式。如果利用Oracle的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作,然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式,不但Java应用程序可以使用应用软件的对象模式,其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的对象模式。 10、利用SQL完成数据库内的操作 我要向大家介绍的最重要的经验是充分利用SQL的面向集合的方法来解决数据库处理需求,而不是使用Java等过程化的编程语言。 如果编程人员要在一个表中查找许多行,结果中的每个行都会查找其他表中的数据,最后,编程人员创建了独立的UPDATE命令来成批地更新第一个表中的数据。与此类似的任务可以通过在set子句中使用多列子查询而在一个UPDATE命令中完成。当能够在单一的SQL命令中完成任务,何必要让数据在网上流来流去的?我建议用户认真学习如何最大限度地发挥SQL的功能。 <淘宝热门商品:
 

3.20 元  

Lily's 园艺-万元赠品大派送!种球“买就送”!朱顶红已到货!

Lily's-现货!PT-01葡萄风信子album-荷兰进口种球/球根-皇冠

 

110.00元  

动感娱乐中心(修身堂 减肥咖啡 瘦身咖啡 神奇咖啡)

来源:程序员网

小小豆叮

Java数据库编程中查询结果的表格式输出

江西财经大学用友软件学院:张海龙 邮箱:zhanghailong2008x@126.com Java数据库编程中查询结果的表格式输出 对新手来说,Java数据库编程存在着许多问题,下面以数据库服务器sql 2000,编程软件eclipse,jdk1.5.8为例来说明java连数据库的总过程,并把查询结果以表格的形式显示出来! 首先,你的sql2000必须打一个sp3或sq4服务包,只有这样,你的端口1433才能打开,否则就连接不上数据库服务器sql 2000;当sq3或sq4包打好了之后,你必须安装jdbc驱动程序,在它的lib子目录下包含了3 个jar文件,msbase.jar;mssqlserver.jar;msutil.jar;你必须把它们导入到你的eclipse集成开发环境中,具体安装为:在eclipse 的构建路径-----添加外部归档中选择这三个文件,把它导入到开发项目中,这样就配置好了jdbc连接数据库服务器sql 2000的环境! 解决了上述问题后,接下来的便是连接sql 2000,并且把查询结果用表格输出的问题了。下面以数据库pubs,表titles为例来讲述数据库的不格显示 package 界面;//包名,可以缺省 import java.awt.*; import javax.swing.*; public class test extends JFrame { private controls1 control;//数据库表格控件类,内集成了表格操作的全部功能 private JScrollPane scroll; public test() { this.setTitle("连接数据库"); control=new controls1("pubs","titles","sa","1");//pubs数据库名,titles表名,sa用户名,1为密码 scroll=new JScrollPane(control);//表格可以滚动 this.getContentPane().setLayout(new BorderLayout()); this.getContentPane().add(scroll,BorderLayout.CENTER); } public static void main(String[] args) { test frame=new test(); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 运行结果为 第一行黑体为字段名,下面1-18显示的是记录,外部调用就一个构造函数 controls1 control=new controls1("pubs","titles","sa","1")//pubs数据库名,titles表名,sa用户名,1为密码 下面再举一些例子来说明这个控件,还是以数据库pubs 为例,它下属有表 "titles","titleauthor","stores","sales","roysched","publishers","pub_info","jobs","employee","discounts","authors" 现在对数据库表与表格进行操作 ,其中包括对表格的插入,删除,修改,更新请看源程序 package 界面;//包名,可缺省 import java.awt.event.*; import java.awt.*; import javax.swing.*; import javax.swing.border.*; public class databaseFrame extends JFrame implements ActionListener, ItemListener { private JButton add,remove,laws,submit,update;//增加,删除,修改,提交,刷新 private String[]table={"titles","titleauthor","stores","sales","roysched","publishers","pub_info","jobs","employee","discounts","authors"};//表名 private JComboBox combox;//表名组全框 private controls1 control;//数据库控件类 private JScrollPane scroll;//表格可滚动 private String s;//选定的表名 public databaseFrame() {//构造函数 JPanel p=new JPanel(new GridLayout(6,1,10,20)); add=new JButton("增加"); remove=new JButton("删除"); laws=new JButton("修改"); submit=new JButton("提交"); update=new JButton("刷新"); combox=new JComboBox(table); p.add(combox); p.add(add); p.add(remove); p.add(laws); p.add(submit); p.add(update); p.setBorder(new LineBorder(Color.black,1)); control=new controls1("pubs","titles","sa","1"); scroll=new JScrollPane(control); this.getContentPane().setLayout(new BorderLayout()); this.getContentPane().add(p,BorderLayout.EAST); this.getContentPane().add(scroll,BorderLayout.CENTER); add.addActionListener(this); remove.addActionListener(this); laws.addActionListener(this); submit.addActionListener(this); update.addActionListener(this); combox.addItemListener(this); this.setBounds(200, 100, 600, 500); this.setTitle("数据库"); this.setVisible(false); } public void actionPerformed(ActionEvent e) { String click=e.getActionCommand(); if("增加".equals(click)){ control.addRow();//增加一行 add.setEnabled(false); remove.setEnabled(false); laws.setEnabled(false); submit.setEnabled(true); update.setEnabled(false); } else if("删除".equals(click)){ control.removeRow();//删除一行 add.setEnabled(false); remove.setEnabled(false); laws.setEnabled(false); submit.setEnabled(false); update.setEnabled(true); } else if("修改".equals(click)){ control.sqlUpdate();//修改一行 add.setEnabled(false); remove.setEnabled(false); laws.setEnabled(false); submit.setEnabled(false); update.setEnabled(true); } else if("提交".equals(click)){ control.sqlAddRow();//提交一行 submit.setEnabled(false); update.setEnabled(true); } else{ add.setEnabled(true); remove.setEnabled(true); laws.setEnabled(true); submit.setEnabled(true); update.setEnabled(true); control=new controls1("pubs",s,"sa","1");//刷新 scroll.setViewportView(control); scroll.validate(); } } public void itemStateChanged(ItemEvent e) { s=(String)e.getItem(); control=new controls1("pubs",s,"sa","1"); scroll.setViewportView(control); scroll.validate(); } public static void main(String[] args) { databaseFrame frame=new databaseFrame(); frame.setSize(600,500); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 请看运行结果 首先,我们来看控件的增加一行的功能,首先,点击增加按扭,马上调用control.addRow(),在其表格的尾部添加新的一行,运行如图所示 在其空白地方输入数据,点击提交按扭,马上调用control.sqlAddRow();如果提交成功,则弹出消息对话框成功,否则失败 再点击刷新按扭,调用构造函数 control=new controls1("pubs",s,"sa","1");重新连接表,即可得到刷新效果, 再来看表行的删除,首先选定一行记录,点击删除按扭,调用control.removeRow(),如果删除成功,则弹出对话框成功,否则失败,运行如下 再点击刷新按扭 再来看表行的的修改,先选定一行,修改了某个地方后,再点击修改按扭,调用control.sqlUpdate(),弹出对话框成功与否,再点击刷新按扭,运行如下 再点击刷新按扭,重新调用构造函数control=new controls1("pubs",s,"sa","1") Controls1的主要属性 private JLabel[] jhlabels,jvlabels;//列标签,行标签 private JTextField[][] txts;//二维文本框 private int row=0;//初始行数 private int column=0;//初始列数 private String[] chrs;//列标签名称 private GridBagLayout grid; private GridBagConstraints cons; private String database,table,username,pwd;//数据库名,表名,用户名,密码 private String sql;//sql语句 private boolean backrow,backcol; private int selectrow,selectcolumn;//选定的行与列 private Connection con; private Statement a; private ResultSet b; private JLabel newJvlabels,newJhlabels;//新增加的行与列 private JTextField[] newRowTxts,newColTxts;//新增加的文本框 主要方法: 构造函数 public controls1(String database,String table,String username,String pwd) 功能:连接数据库中的表,并以表格显示出来 参数:1,数据库名。2,表名。3,用户名。4,密码 构造函数 public controls1(String[]a,int row) 功能:生成指定行数,列数的表格,并且指定列标签的名称 参数:1,列标签名数组。2,行数 public void addColumn(String name)功能:在最后一列处添加一列,并生成列标签 参数:列标签名称 public void addColumn(String name,int selectcolumn) 功能:在指定的列位置处旁边添加一列,并生成列标签 参数:1,列标签名称。2,指定的列 public void addRow() 功能:在行的最尾端处添加一行,与public void sqlAddRow()配合使用 public void addRow(int selectrow) 功能:在指定的行的下一行添加一行,与public void sqlAddRow()配合使用 public String[] getchrs() 功能:得到列标签的名称数组 public String getDatabase() 功能:得到数据库的名称 public Dimension getMinimumSize() 功能:得到控件面板的最小尺寸 public Dimension getPerferredSize() 功能:得到控件面板的最合适尺寸 public String getnewRowText(int column) 功能:得到新生成的那一行某一列的值 参数:列位置 public String getPwd() 功能:得到密码 public int getRow() 功能:得到行数 public String getText(int row,int column) 功能 :得到指定行与列的文本值 参数:1,指定行,2,指定列 public String getUserName() 功能:得到用户名 public void mouseClicked(MouseEvent e) 功能:产生选定行或列,并以颜色的形式显现 public void removeColumn() 功能:删除选定列 public void removeRow() 功能:删除选定行 public void setDatabase(String database) 功能: 设置数据库名 参数:数据库名 public void setPwd(String pwd) 功能:设置密码 参数:密码 public void setRow(int row) 功能:设置行数 参数:行数 public void setText(String txt,int row,int column) 功能:设置指定行与列位置的文本值 参数:1,文本值。2,指定行。3,指定列 public void setUserName(String username) 功能:设置用户名 参数:用户名 public void sqlAddRow() 功能:把新生成的一行的数据写到数据库的表中 public void sqlUpdate() 功能:更新表 <淘宝热门商品:
 

¥:15.50 

暖手宝,热水袋,手套,帽子批发零售.自封袋自粘袋不干胶袋

 

128.00 元  

【广州商盟】*大学生淘宝皇冠第一店-鞋神--三人行出口剩余旗舰店

【大学生皇冠店】new balance纽巴伦378经典款 天蓝

来源:程序员网

小小豆叮

Sun JDK bug 分析

很多人都想知道 Sun JDK bug 分析数据,因为每一个开发工具/开发语言都有自己的长处和缺点,如果我们能够使用 Java 的长处,避开 Java 的缺点,则我们有可能写出好的程序,否则,我们不可能写出好的程序。这是一个浅显的道理,每一个程序员、系统分析员、项目经理、技术经理,都应该知道这个道理。   这篇文章的分析数据都来源于 Sun 网站上的公开数据。   JDK 1.4.2 的 bug 数据来自: http://java.sun.com/j2se/1.4.2/fixedbugs/fixedbugs.html 。   JDK 5.0 的 bug 数据来自: http://java.sun.com/j2se/1.5.0/fixedbugs/fixedbugs.html 。      更早版本的,比如 JDK 1.3,已经从 Sun 网站上被删除了。没有办法再进行分析了。   JDK 1.4.2 的 bug 数据饼图如下:  可以看出,前六位占据了超过半数的 bug: java/classes_awt    13.7% java/classes_swing   12.6% java/classes_2D     11.5% java/classes_net    6.3% java/classes_sound   4.1% java/classes_util    3.7% java/javadoc       3.7% java/classes_nio    3.3% javawebstart/other   3.3% java/compiler      3.0%   JDK 5.0 的 bug 数据饼图如下: 可以看出,前六位同样占据了超过半数的 bug: java/classes_swing    22.5% java/classes_2D      9.5% java/classes_awt     7.6% java/classes_lang     4.6% java/compiler       4.1% java/classes_sound    3.3% java/classes_util_i18n  2.5% java/classes_util     2.5% java/javadoc       2.4% java/classes_net     2.2%   在这两个版本中,前三位都是 Swing、AWT、2D,这说明了在图形界面(专业术语为 GUI)设计中,Sun 的软件工程师的水平仍差强人意,这可以解释。Sun 所开发的软件产品中,主要面向小型机服务器市场。这些市场对于软件的界面要求不高,基本上都是传统的 Unix service 程序。也许 Sun 的强项并不在 GUI 方面。GUI bug 在两个版本的百分比分别是 37.8 和 39.6%,都超过三分之一。      相比较其他流行的开发语言,比如 .Net,或者即使是十年前的老版本 Visual Studio,或者 Borland 的 Delphi/CBuilder 中, GUI bug 所占的分量也没有这么高。   这说明了尽管 Sun 不停地宣传 Swing 类是多么的设计巧妙,尽管每个版本的 JDK 文档中 Sun 都在新版本的新特点中提到 Java Swing/AWT/2D,我们仍然应该避免使用 Java Swing/AWT/2D。很多第一线的程序员都能明确了解使用 Java GUI 编程是一个非常糟糕的想法,但是在中国国内,还是有很多系统设计师和项目经理有这个糟糕的想法。   JDK 1.4.2 中排名第四的是 java/classes_net,在 JDK 5.0 中则是第十名。考虑到 JDK 1.4.2 相对于以前的版本,增加或者增强了 IPv6、HTTP Digest Authentication、Unconnected/Unbound Socket Support、Connected UDP Socket Support、FTP Protocol Handler、JNDI DNS SP Support in InetAddress、URLEncoder and URLDecoder Improvements、TCP Out-of-Band Data、Full V5 (RFC 1928) & V4 TCP support。由于这是一个比较大的动作, bug 比较多也属于正常范围。   两个版本中,java/classes_sound 都出现在前十,并且排名都比较中前,这说明了 Sun 在多媒体方面的技术也不尽如人意。   让我们失望的是,java/classes_util 在 JDK 1.4.2 和 5.0 中都出现在前十中。这个包的类库使用得比较普遍,每个项目经理或者产品经理都应该派专人去查一查,自己的软件中是否在 java/classes_util 的使用上,有没有避开以上 bug。   在 JDK 1.4.2 中 bug 出现在前十名的 java/classes_nio 没有出现在 JDK 5.0 中,这是一个好消息。终于有一个 Java 包可以放心使用了。   比较让我们哭笑不得是,在两个版本的前十名 bug 中,java/javadoc 和 java/compiler 都出现了。这个怎么说呢,实在是很不应该。java/javadoc 有 bug 好像对于国内的 Java 软件开发来说没有太大的影响,因为重视使用 javadoc 的并不多。至于 java/compiler ,因为 Java 编译器是 C 写的,大概是编译器很难写吧,所以会难免有些 bug。但是编译器是基本上每个 Java 程序员都用的,而且 Sun 的 Java compiler 似乎也是所有 Java compiler 中使用者最多的,Sun 需要继续努力。   JDK 5.0 中,java/compiler bug 所占百分比比 JDK 1.4.2 中提高了好几个名次,很不好的一个趋势。Sun 现在将 Java 开源,希望有助于提高这一部分的软件质量。   以上的 bug 分析,希望对大家有所帮助。 <淘宝热门商品:
 

268.00 元 

日本08超人氣減肥品 日本瘦身美白净脂素

 

 

自然美人 红酒面膜及口碑护理产品

来源:程序员网

小小豆叮