适合BS模式项目的录入页面

说明:
当焦点不在表格内的input时,回车键复制最后一行,delete删除键最后一行
选择checkbox,可以进行复制,删除
双击表格会出现菜单,自动收集该列已存在数据,选中自动填充 这里是亮点
数据发送采用ajax(自定义的一个ajax类,blog已发布过)一行一行的发送
兼容IE6和Firefox1.5 符合W3C
本表格一切功能都是为了减少输入录入工作,适合大项目开放使用

 程序代码

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="MSThemeCompatible" content="No">
<title>无标题文档</title>
<script type="text/JavaScript">
<!--
//页面初始化///
beginListen();
//页面初始化///
//ajax类///
function Ajax(url,recvT,stringS,resultF) {
 this.url = url;
 this.stringS = stringS;
 this.xmlHttp = this.createXMLHttpRequest();
 if (this.xmlHttp == null) {
  alert("erro");
return;
}
 var objxml = this.xmlHttp;
 objxml.onreadystatechange = function (){Ajax.handleStateChange(objxml,recvT,resultF)};
}

Ajax.prototype.createXMLHttpRequest = function() {
try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {}
try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
try { return new XMLHttpRequest(); } catch(e) {}
return null;
}

Ajax.prototype.createQueryString = function () {
 var queryString = this.stringS;
 return queryString;
}

Ajax.prototype.get = function () {
 url = this.url;
 var queryString = url+"?timeStamp=" + new Date().getTime() + "&" + this.createQueryString();
 this.xmlHttp.open("GET",queryString,true);
 this.xmlHttp.send(null);
}

Ajax.prototype.post = function() {
 url = this.url;
 var url = url + "?timeStamp=" + new Date().getTime();
 var queryString = this.createQueryString();
 this.xmlHttp.open("POST",url,true);
 this.xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
 this.xmlHttp.send(queryString);
}
 
Ajax.handleStateChange = function (xmlHttp,recvT,resultF) {
 if (xmlHttp.readyState == 4) {
  if (xmlHttp.status == 200) {
  resultF(recvT?xmlHttp.responseXML:xmlHttp.responseText);
  } else {
  alert("您所请求的页面有异常。");
  }
 }
}
//ajax类///

//处理鼠标事件///
//表格变色
var toBeColor = "#F8F9FC";
var backColor = "#FFFFFF";
function onChangTrColor(obj) {
 obj.parentNode.style.backgroundColor = toBeColor;
 obj.style.backgroundColor = toBeColor;
 var inputs = obj.parentNode.parentNode.getElementsByTagName("input");
 for (var i = 0; i < inputs.length; i++ ){
  inputs[i].style.backgroundColor = toBeColor;
  inputs[i].parentNode.style.backgroundColor = toBeColor;
 }
}

function outChangTrColor(obj) {
 obj.parentNode.style.backgroundColor = backColor;
 obj.style.backgroundColor = backColor;
 var inputs = obj.parentNode.parentNode.getElementsByTagName("input");
 for (var i = 0; i < inputs.length; i++ ){
  inputs[i].style.backgroundColor = backColor;
  inputs[i].parentNode.style.backgroundColor = backColor;
 }
}

//处理鼠标事件///

//处理页面操作///
//复制所选
function copySelect(){
 var checkboxs = document.getElementsByName("checkbox");
 for (var i=0; i<checkboxs.length; i++) {
  if(checkboxs[i].checked == true){
  checkboxs[i].checked = false;
  copyTr(checkboxs[i]);
  checkboxs[i].checked = true;
  }
 }
}

function copyTr(obj) {
 var tbody = document.getElementById("tbData").getElementsByTagName("tbody")[0];
 var Str = obj.parentNode.parentNode;
 var tr = Str.cloneNode(true);
 tbody.appendChild(tr);
}

//删除所选
function delSelect(){
 var checkboxs = document.getElementsByName("checkbox");
 var table = document.getElementById("tbData");
 var tr = table.getElementsByTagName("tr");
 for (var i=0; i<checkboxs.length; i++) {
  if(tr.length==2){
  checkboxs[i].checked = false;
  return;
  }
  if(checkboxs[i].checked==true){
  removeTr(checkboxs[i]);
  i=-1;
  }
 }
}

function removeTr(obj) {
 var sTr = obj.parentNode.parentNode;
 sTr.parentNode.removeChild(sTr);
}

//全选按钮
function selectAll() {
 var checkboxs = document.getElementsByName("checkbox");
 var mark = true;
 for (var i=0; i<checkboxs.length; i++) {
  if (checkboxs[i].checked==false){mark = false}
 }
 if (mark){
  for (var i=0; i<checkboxs.length; i++) {
   checkboxs[i].checked = false;
  }
 }else{
  for (var i=0; i<checkboxs.length; i++) {
   checkboxs[i].checked = true;
  }
 }
}

//处理页面操作///

//处理键盘操作///
//键盘事件
function beginListen(){
 if(document.addEventListener){
 document.addEventListener("keydown",keyDown,true);
 }else{
 document.attachEvent("onkeydown",keyDown);
 }
}
function stopListen(){
 document.detachEvent("onkeydown",keyDown);
}

//处理键盘事件
function keyDown(event){
 if(event.keyCode==13){addTr()}
 if(event.keyCode==46){delTr()}
}

//增加表格
function addTr() {
 var tbody = document.getElementById("tbData").getElementsByTagName("tbody")[0];
 var sTr = tbody.getElementsByTagName("tr")[0];
 var tr = sTr.cloneNode(true);
 tbody.appendChild(tr);
}

//增加表格
function addTr() {
 var tbody = document.getElementById("tbData").getElementsByTagName("tbody")[0];
 var trs = tbody.getElementsByTagName("tr");
 var sTr = trs[trs.length-1];
 var tr = sTr.cloneNode(true);
 tbody.appendChild(tr);
}

//删除表格
function delTr() {
 var table = document.getElementById("tbData");
 var tr = table.getElementsByTagName("tr");
 if(tr.length==2){return;}
 var lastTr = tr[tr.length-1];
 lastTr.parentNode.removeChild(lastTr);
}


//处理键盘操作///

//处理按钮事件///
//自动填充
var currentObj;
function showDiv(event,obj) {
 var eX = event.clientX;
 var eY = event.clientY;
 var sY = document.body.parentNode.scrollTop;
 var dY = eY + sY;
 var divShowInput = document.getElementById("divShowInput");
 divShowInput.style.top = dY + "px";
 divShowInput.style.left = eX+"px";
 divShowInput.style.display = "block";
 currentObj = obj;
 智能菜单
 fixMenu();
 //判断焦点位置
 var tds = obj.parentNode.parentNode.getElementsByTagName("td");
 var tdOrder;
 for (var i = 0; i < tds.length; i++ ){
  if(tds[i] === obj.parentNode){
   tdOrder = i;
  }
 }
 //填充标题标题
 var tdTitleTr = document.getElementById("tbData").getElementsByTagName("tr")[0];
 var tdTitle = tdTitleTr.getElementsByTagName("td")[tdOrder];
 document.getElementById("barTitle").innerHTML = tdTitle.innerHTML;
 //收集表格信息//判断重复
 var trs = obj.parentNode.parentNode.parentNode.getElementsByTagName("tr");
 var autoFillP = document.getElementById("autoFillP");
 var bankM = true;
 for (var i = 0; i < trs.length; i++ ){
  var inputValue = trs[i].getElementsByTagName("td")[tdOrder].getElementsByTagName("input")[0].value;
  if (inputValue != "") {
   bankM = false;
   var menus = autoFillP.getElementsByTagName("a");
   if(menus.length > 0) {
   var beliveM = true;
    for (var j = 0; j < menus.length; j++ ){
     if(menus[j].firstChild.nodeValue == inputValue) {
      beliveM = false;
     }
    }
    if(beliveM){
     var Svalue = document.createElement("a");
     Svalue.setAttribute("href","javascript:void 0");
     Svalue.onclick = function () {fillInput(this)};
     var Stext = document.createTextNode(inputValue);
     Svalue.appendChild(Stext);
     autoFillP.appendChild(Svalue);
    }
   }else{
    var Svalue = document.createElement("a");
    Svalue.setAttribute("href","javascript:void 0");
    Svalue.onclick = function () {fillInput(this)};
    var Stext = document.createTextNode(inputValue);
    Svalue.appendChild(Stext);
    autoFillP.appendChild(Svalue);
   }
  }
 }
 if(bankM) {
  var Svalue = document.createElement("a");
  Svalue.setAttribute("href","javascript:void 0");
  var Stext = document.createTextNode("数据空");
  Svalue.appendChild(Stext);
  autoFillP.appendChild(Svalue);
 }
}

function fillInput(obj) {
 currentObj.value = obj.innerHTML;
 var divShowInput = document.getElementById("divShowInput");
 divShowInput.style.display = "none";
}

function clearInput() {
 currentObj.value = "";
 var divShowInput = document.getElementById("divShowInput");
 divShowInput.style.display = "none";
}

function hideDiv(obj) {
 obj.parentNode.style.display = "none";
}

//删除智能菜单已有数据
function fixMenu() {
 var autoFillP = document.getElementById("autoFillP");
 var values = autoFillP.getElementsByTagName("a");
 for (var i = values.length-1; i >= 0; i-- ){
  autoFillP.removeChild(values[i]);
 }
}
//处理按钮事件///

//数据发送///

//数据发送///
function sendData() {
 var sendName = new Array("ok","A1","A2","A3","A4","A5","A6","A7","A8","A9","A10","A11");
 var trs = document.getElementById("tbData").getElementsByTagName("tbody")[0].getElementsByTagName("tr");
 for (var i = 0; i < trs.length; i++) {
  var sendValue = new Array();
  var values = trs[i].getElementsByTagName("input");
  var postString = sendName[1] + "=" + values[1].value;;
  for (var j = 2; j < values.length; j++) {
   postString = postString + "&" + sendName[j] + "=" + values[j].value;
  }
  var SendAjax = new Ajax("isave.asp",0,postString,sendok);
  SendAjax.post();
  function sendok(revData){
   alert(revData);
  }
 }
}

 

//数据发送///


//-->
</script>
<style type="text/css">
<!--
body {
 font-family: Arial, Helvetica, sans-serif;
 font-size: 12px;
 background-color: #E9EDF7;
}
#tbBackground {
 background-color:#FFFFFF;
 text-align:center;
}
#tbData {
 background-color:#DDE3EC;
}
#tbData td {
 background-color:#FFFFFF;
}
#tbData input {
 width:50px;
 border:none;
}
#tbData .checkbox {
 width:15px;
}

#tbData thead {
}

#tbTopOpt a{
 display:block;
 width:80px;
 padding:5px;
 background-color:#F8F9FC;
 border:solid 1px #999999;
 color:#000000;
 text-decoration: none;
}
#tbTopOpt a:hover{
 background-color:#DDE3EC;
}
#tbBomOpt a{
 display:block;
 width:80px;
 padding:5px;
 background-color:#F8F9FC;
 border:solid 1px #999999;
 color:#000000;
 text-decoration: none;
}
#tbBomOpt a:hover{
 background-color:#DDE3EC;
}
#tbData a{
 color:#000000;
 text-decoration: none;
}

#divShowInput {
 position:absolute;
 top:30px;
 left:350px;
 z-index:10;
 background-color:#F8F9FC;
 display:none;
 border:solid 1px #DDE3EC;
 width:100px;
 overflow:hidden;
}
#divShowInput a {
 display:block;
 background-color:#F8F9FC;
 color:#000000;
 text-decoration: none;
 text-align:center;
 width:auto;
}
#divShowInput a:hover {
 background-color:#DDE3EC;
 border-left:solid 2px #FF0000;
 border-right:solid 2px #FF0000;
 color:#FF0000;
}

#divShowInput p {
 cursor:hand;
 margin:0;
 padding:0;
 background-color:#F8F9FC;
 text-align:center;
 border-bottom:double #DDE3EC;
}
-->
</style>
</head>

<body>
<div id="divShowInput">
 <p id="barTitle" onClick="hideDiv(this)"></p>
 <p id="defComP" onClick="hideDiv(this)">
 <a xx=void 0" onClick="clearInput()">清空</a>
 </p>
 <p id="autoFillP">
 <a xx=void 0" onClick="fillInput(this)">Llinzzi</a>
 <a xx=void 0" onClick="fillInput(this)">Huanhuan</a>
 <a xx=void 0" onClick="fillInput(this)">Tom.com</a>
 <a xx=void 0" onClick="fillInput(this)">超级长的长长长长长长</a>
 </p>
</div>
<table id="tbBackground" width="760" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td><table id="tbTopOpt" width="700" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td height="40" width="125"><a xx=void 0" onClick="copySelect()">复制所选</a></td>
<td width="537"><a xx=void 0" onClick="delSelect()">删除所选</a></td>
<td width="38"> </td>
</tr>
</table></td>
</tr>
<tr>
<td><table id="tbData" width="750" border="0" align="center" cellpadding="0" cellspacing="1">
 <thead>
<tr>
<td height="25" ><a xx=void 0" onClick="selectAll();">全选</a></td>
<td>A1</td>
<td>A2</td>
<td>A3</td>
<td>A4</td>
<td>A5</td>
<td>A6</td>
<td>A7</td>
<td>A8</td>
<td>A9</td>
<td>A10</td>
<td>A11</td>
</tr>
  </thead>
  <tbody>
<tr>
<td><input class="checkbox" type="checkbox" name="checkbox" value="checkbox"></td>
<td><input name="A1" type="text" onFocus="stopListen()" onBlur="beginListen()" onDblClick="showDiv(event,this)" onMouseOver="onChangTrColor(this)" onMouseOut="outChangTrColor(this)"></td>
<td><input name="A2" type="text" onFocus="stopListen()" onBlur="beginListen()" onDblClick="showDiv(event,this)" onMouseOver="onChangTrColor(this)" onMouseOut="outChangTrColor(this)"></td>
<td><input name="A3" type="text" onFocus="stopListen()" onBlur="beginListen()" onDblClick="showDiv(event,this)" onMouseOver="onChangTrColor(this)" onMouseOut="outChangTrColor(this)"></td>
<td><input name="A4" type="text" onFocus="stopListen()" onBlur="beginListen()" onDblClick="showDiv(event,this)" onMouseOver="onChangTrColor(this)" onMouseOut="outChangTrColor(this)"></td>
<td><input name="A5" type="text" onFocus="stopListen()" onBlur="beginListen()" onDblClick="showDiv(event,this)" onMouseOver="onChangTrColor(this)" onMouseOut="outChangTrColor(this)"></td>
<td><input name="A6" type="text" onFocus="stopListen()" onBlur="beginListen()" onDblClick="showDiv(event,this)" onMouseOver="onChangTrColor(this)" onMouseOut="outChangTrColor(this)"></td>
<td><input name="A7" type="text" onFocus="stopListen()" onBlur="beginListen()" onDblClick="showDiv(event,this)" onMouseOver="onChangTrColor(this)" onMouseOut="outChangTrColor(this)"></td>
<td><input name="A8" type="text" onFocus="stopListen()" onBlur="beginListen()" onDblClick="showDiv(event,this)" onMouseOver="onChangTrColor(this)" onMouseOut="outChangTrColor(this)"></td>
<td><input name="A9" type="text" onFocus="stopListen()" onBlur="beginListen()" onDblClick="showDiv(event,this)" onMouseOver="onChangTrColor(this)" onMouseOut="outChangTrColor(this)"></td>
<td><input name="A10" type="text" onFocus="stopListen()" onBlur="beginListen()" onDblClick="showDiv(event,this)" onMouseOver="onChangTrColor(this)" onMouseOut="outChangTrColor(this)"></td>
<td><input name="A11" type="text" onFocus="stopListen()" onBlur="beginListen()" onDblClick="showDiv(event,this)" onMouseOver="onChangTrColor(this)" onMouseOut="outChangTrColor(this)"></td>
</tr>
  </tbody>
</table></td>
</tr>
<tr>
<td><table width="700" border="0" align="center" cellpadding="0" cellspacing="0" id="tbBomOpt">
<tr>
<td height="40" width="125"><a xx=void 0" onClick="copySelect()">复制所选</a></td>
<td width="537"><a xx=void 0" onClick="delSelect()">删除所选</a></td>
<td width="537"><a xx=void 0" onClick="sendData()">提交</a></td>
<td width="38"> </td>
</tr>
</table></td>
</tr>
</table>
</body>
</html>

8:12 | 添加评论 | 阅读评论 (1) | 固定链接 | 引用通告 (0) | 记录它
5月11日
hibernate+ webwork+ spring添删改查示例
  (本故事除了部分点明道姓并具有故事详细发生的具体时间点地等部分情节以外,其它内容纯属虚构,若有雷同,纯属巧合。)
 
  看本文的朋友请先看上一篇文章:玩玩Spring之struts+hibernate+spring添删改查示例,否则会看不懂滴(的)。

  该示例程序的运行效果先睹为快:
  http://www.easyjf.com/html/bbs/20060510/1512699849613700.htm?ejid=1141219960424115
 
  新同学:听说Struts有很多致命的技术缺陷啊,是吗?
  大牛:恩,专家都说了。
  新同学:听说J2EE程序员很讲究艺术及高雅,能举个例子吗?
  大牛:对啊,MVC中webwork就是高雅啊,用他写起程序来真是赏心悦目,华丽得真是没法容易。
 
  主演:webwork
  配角:struts、jsp、hibernate、spring等
  
  借着吹spring的风,今天笔者给大家介绍一种很多人都非常欣赏的轻量极、高雅的J2EE组合,那就是hibernate+ webwork+ spring。说介绍不准确,应该还只是一个简单的演示,毕竟webwork的赞歌已经有很多人唱过了,这里就不重复(主要还是因为唱不出来,惭愧!)。我只希望能通过简单的代码,让大家去体会webwork的高雅、过人之处。
 
  同样是上一篇中有关一个用户表“添删改查”的例子,这里只是把Web层改成使用webwork实现,下面我们直接介绍Web开发部分,其它部分的开发请照搬前面一篇的例子,新人可以结合上个例子中的Struts部分进行看。

1、写Action

  webwork跟Struts乃至其它的MVC框架一样,都有一个处理Web请求的Action,我们来看看本例子中这个Action的内容。下面是UserManageAction.java的全部代码:
 

package com.easyjf.webwork.action;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import com.easyjf.example.business.IUser;
import com.easyjf.example.business.IUserService;
import com.easyjf.util.CommUtil;
import com.easyjf.web.tools.IPageList;
import com.easyjf.web.tools.ListQuery;
import com.easyjf.web.tools.PageList;
import com.opensymphony.webwork.interceptor.ParameterAware;
import com.opensymphony.xwork.ActionSupport;
import com.opensymphony.xwork.Preparable;
public class UserManageAction extends ActionSupport implements ParameterAware,Preparable {
private List allUser;
private IUserService userService;
private IUser user;
private Map parameters;
//用户查询
public String query() throws Exception {
 String[] temp=(String[])parameters.get("page");
 int currentPage=CommUtil.null2Int(temp!=null?temp[0]:"0");
 temp=(String[])parameters.get("pageSize");
 int pageSize=CommUtil.null2Int(temp!=null?temp[0]:"0");
 if(currentPage<1)currentPage=1;
 if(pageSize<1)pageSize=10;
 String scope="1=1";
 Collection paras=new ArrayList();
 temp=(String[])parameters.get("orderType");
 String orderType=CommUtil.null2String(temp!=null?temp[0]:"");
 temp=(String[])parameters.get("orderField");
 String orderField=CommUtil.null2String(temp!=null?temp[0]:"");
 temp=(String[])parameters.get("queryUserName");
 String userName=CommUtil.null2String(temp!=null?temp[0]:"");
 temp=(String[])parameters.get("queryTel");
 String tel=CommUtil.null2String(temp!=null?temp[0]:"");   
 if(!userName.equals(""))
 {
  scope+=" and userName like ?";
  paras.add("%"+userName+"%");
 }
 if(!tel.equals(""))
 {
  scope+=" and tel like ?";
  paras.add("%"+tel+"%");
 } 
 if(orderField.equals(""))//默认按用户名排序
 {
 orderField="userName";
 orderType="desc";   
 }
 if(!orderField.equals(""))
 {
 scope +=" order by "+orderField;
 if(!orderType.equals(""))scope+=" "+orderType;
 }
 IPageList pList=new PageList(new ListQuery(userService.query(scope,paras)));
 pList.doList(pageSize,currentPage,"","");
 if(pList!=null){
  this.parameters.put("list",pList.getResult());
  this.parameters.put("pages",new Integer(pList.getPages()));
  this.parameters.put("rows",new Integer(pList.getRowCount()));
  this.parameters.put("page",new Integer(pList.getCurrentPage())); 
  this.parameters.put("gotoPageHTML",CommUtil.showPageHtml(pList.getCurrentPage(),pList.getPages()));
  }
 this.parameters.put("orderType",orderType);
 this.parameters.put("orderField",orderField);
    this.allUser = userService.query(scope,paras);
    return execute();
}
//添加或修改用户
public String  edit() throws Exception
{
 return execute();
}
//删除用户
public String  del() throws Exception
{
    if(user!=null && userService.del(this.user))
    {
     this.parameters.put("msg","数据删除成功!");     
    }
    else
    {
     this.parameters.put("msg","数据修改失败");
    }
 return query();
}
//保存用户信息
public String  save() throws Exception
{
 IUser  obj=this.getUser();
 boolean ret=false;
 if(obj!=null){
 if((obj.getCid()!=null)&&(!obj.getCid().equals("")))ret=userService.update(user);
 else ret=userService.save(user);
 }
    if(ret)
    {
     this.parameters.put("msg","数据操作成功!");     
    }
    else
    {
     this.parameters.put("msg","数据操作失败");
    }
 return query();
}
public IUserService getUserService() {
 return userService;
}
public List getAllUser() {
 return allUser;
}
public IUser getUser() {
 return user;
}
public void setUser(IUser user) {
 this.user = user;
}
public void setUserService(IUserService userService)
{
 this.userService=userService;
}
public void setParameters(Map parameters) {
 this.parameters=parameters;
}
public Map getParameters() {
 return parameters;
}
public void prepare() throws Exception {
 this.form2Obj();
}
//根据页面参数创建IUser对象
private void form2Obj() {
 String[] temp=(String[])parameters.get("cid");
 String cid=temp!=null?temp[0]:"";
 IUser user=null;
 if(cid!=null && (!cid.equals("")))user=userService.read(cid);
 if(user==null)user=userService.newUser();
 setUser(user);
}
}
 
 
2、写页面文件

  xwork支持多种页面模板,可以是JSP,也可以是Freemarker等,这里我们使用的是大家比较熟悉的JSP作模板。页面同样分为userEdit.jsp以及userList.jsp两个,模板中使用了一些wework的标签,(还好没有全部搞成标签,呵呵!),大家注意观察以<ww: 开头的标签写法就OK了,可以对照Struts的标签看一下。这两个页面从我们这个示例的完整源代码中可以得到,完整示例源码下载地址:
 
  http://www.easyjf.com/html/bbs/20060510/1512699849613700.htm?ejid=1141219960424115
 
3、配置xwork.xml
 

  可以理解成struts中的struts-config.xml文件,当然等你真正熟悉他以后,发现他的配置文件中的玩艺及技术含量都要比Struts牛的多。下面是xwork.xml文件的全部内容:

  <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" "http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">
<xwork>  
 <include file="webwork-default.xml"/>  
     <package name="userManage"  extends="webwork-default" namespace="/userManage">       
        <action name="query" class="com.easyjf.webwork.action.UserManageAction" method="query">
            <result>/userList.jsp</result>
            <interceptor-ref name="params" />
            <interceptor-ref name="basicStack"/>
        </action>
        <action name="edit" class="com.easyjf.webwork.action.UserManageAction" method="edit">
            <result>/userEdit.jsp</result> 
    <interceptor-ref name="params" />      
            <interceptor-ref name="basicStack"/>
        </action>
        <action name="save" class="com.easyjf.webwork.action.UserManageAction" method="save">
            <result name="input">/userEdit.jsp</result>
             <result>/userList.jsp</result>
        </action>
        <action name="del" class="com.easyjf.webwork.action.UserManageAction" method="del">           
             <result>/userList.jsp</result>
        </action>
    </package>
</xwork>
 
 
4、修改web.xml文件

  以Struts类似,同样需要修改web.xml文件,才能让webwork处理指定的请求。下面是本例中的web.xml文件的全部内容:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <filter>
        <filter-name>webwork</filter-name>
        <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>webwork</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

  通过上面的配置,使得所有的请求都会交给webwork处理。
 
  好,现在一个完整的webwork示例程序就完了。不知webwork新朋友注意到没,webwork中没有了ActionForm Bean,配置文件也相对比较清晰明了,Action中的方法不再有类似public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)这样一大串让人看起来就不爽的参数,其干净得一个参数也没有。大家可以闭上眼睛摸着脑门再体会一下Webwork的Action的写法,是不是要简洁、华丽、优雅得多。
 
  当然,那么多技术牛人在支持webwork,并不是单看中这个Action的简洁,webwork本身还有很多东西,还包括AJAX支持,报表集成,强大的验证系统以及IOC等,其中有很多是Spring也有的东西,仅从技术的角度来看,笔者也认为他确实能称上是数一数二的。
 
  当然,本人不是webwork的粉丝,因此其它MVC框架的粉丝这里不要PK我,Struts的朋友就更不应该了,因为webwork开发团队与struts团队已经合并了,合并后的作品Apache Struts Action 2.0也即将出来了。Tapestry 、JSF的粉丝看到这里也别纳闷,有竞争才有技术进步嘛。
  
  好,今天就先玩到这里。由于笔者对webwork只是粗浅的看了一下,因此也许还不能完全通过这个示例表述出webwork的原意。还请webwork的超级粉丝或专家来帮忙补充一下,若发现不足的地方,请不吝批评指教。

  本示例的全部源码下载地址:
  http://www.easyjf.com/html/bbs/20060510/1512699849613700.htm?ejid=1141219960424115
 

  本示例的运行效果图:

  http://www.easyjf.com/html/bbs/20060510/1512699849613700.htm?ejid=1141219960424115
  
  (备注:由于笔者不想拐弯抹角浪费大家玩的时间,有些“表白”难免过于直接,还请不喜欢Spring或者过分喜欢Spring的同行多多见谅! 本文中的“我们”,仅指与笔者有着同样成长经历的80后人,对于文章提到的观点,多数皆属于笔者个人观点,不代表任何人。
  本文作者:EasyJF开源团队   大峡 版权归EasyJF开源团队所有,欢迎转载,转载请保留作者版权声明,谢谢!)
 

关于玩玩Spring系列,玩的过程及结果将会不定期在以下三个网站全球同步公布:
1.EasyJF开源团队官方网站,网址:http://www.easyjf.com
2.笔者的Blog,网址:http://www.blogjava.net/daxia/
3.Java研究组织(JR) ,网址:http://www.javaresearch.org
欢迎更多跟我一样爱玩的哥哥姐姐弟弟妹妹一起来玩。
7:24 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它
4月30日
java实现精确的四舍五入
java代码: 


源文件Arith.java:
import java.math.BigDecimal;

/**
* 由于Javaμ募虻ダ嘈筒荒芄痪·的对浮点数进行运算,这个工具类提供精
* 确的浮点数运算,包括加减乘除和四舍五入。
*/

public class Arith{
    //默认除法运算精度
   private static final int DEF_DIV_SCALE = 10;
    //这个类不能实例化

   private Arith(){
    }

    /**
     * 提供精确μ募ó法运算。
     * @param v1 被加数
     * @param v2 加数
     * @return 两个参数的和
     */
    public static double add(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).doubleValue();

    }

    /**
     * 提供精确μ募?法运算。
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */

    public static double sub(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 提供精确的乘法运算。
     * @param v1 被乘数
     * @param v2 乘数
     * @return 两个参数的积
     */
    public static double mul(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).doubleValue();
    }

    /**
     * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
     * 小数点以后10位,以后的数字四舍五入。
     * @param v1 被除数
     * @param v2 除数
     * @return 两个参数的商
     */
    public static double div(double v1,double v2){
        return div(v1,v2,DEF_DIV_SCALE);
    }

    /**
     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
     * 定精度,以后的数字四舍五入。
     * @param v1 被除数
     * @param v2 除数
     * @param scale 表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    public static double div(double v1,double v2,int scale){
        if(scale<0){
            throw new IllegalArgumentException(
                "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 提供精确的小数位四舍五入处理。
     * @param v 需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的?峁?
     */
    public static double round(double v,int scale){
        if(scale<0){
            throw new IllegalArgumentException(
                "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(v));
        BigDecimal one = new BigDecimal("1");
        return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
};
 

2:30 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它
4月28日
设计之初的一些思考
设计oo的时候,你要分析需求,设计各个模块的通信接口,这个过程,同样需要经验,同样需要摸索,同样没有一踀而就的捷径。

但是,oo设计的时候又要避免过度,一些时候,在是否通过接口预留灵活性,提取容易变化的部分,或者是尽量简单之间,还是有冲突的。你需要做一个艰难的猜测和抉择。
而一旦抉择作出,以后如果发现事情进展不如所愿,那么改动接口的代价相当的大。 

OO的关键是需求。
所谓"refactor",不过也是强调需求,让你不要自作聪明地瞎假设需求而复杂化设计。时刻着眼于当前的需求。这样,一旦需求变更,所浪费的力气可以保证最小,而且,船小才好调头嘛。
如果需求分析的不好,一切就歇菜了,虽然因为一些比如ioc之类的设计方法能让你不至于推到重来,但是需求仍然是重中之重。

那些什么上下文没有,上来就说“怎么用OO来做一个人骑车呀?”,“是人.骑(车)呀?还是车.被骑(人)?”纯粹是没头没脑地瞎掰。

而CO的关键则是组合子和组合规则的设计。这些组合方法必须非常精巧,尽量正交。组合子的设计既要简单(越简单才越容易被组合),还要完整。
比如说,对整数这个组合子,我们有+-*等组合方法,这样只要有了0,1这两个组合子,我们就可以构造出整个整数世界。
可是,精巧的组合子设计也不是那么容易的。需要有一点点数学的感觉和严密的逻辑思维基础。
 
而如果使用co,在设计简单的各个组合子的时候,你会以一种非常渐进式的方式来发现:哦,原来的组合子设计不够正交,有这个地方可以抽出来,好,抽出来,把波及到的几个组合子的设计修改一下。

因为组合子都非常简单,这个变化的波及范围一般来说相当小。

 

细节封装。这个封装不是一般OO意义上的封装,而是说:把要实现的接口细节封装起来,让客户通过预定义好的组合方式来扩展,而不是象oo那样让用户实现实现这个接口来扩展。
10:44 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它
JDBC连接数据库经验集萃
Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序。然而各个开发商的接口并不完全相同,所以开发环境的变化会带来一定的配置变化。本文主要集合了不同数据库的连接方式。
一、连接各种数据库方式速查表
下面罗列了各种数据库使用JDBC连接的方式,可以作为一个手册使用。

1、Oracle8/8i/9i数据库(thin模式)
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID
String user="test";
String password="test";
Connection conn= DriverManager.getConnection(url,user,password);

2、DB2数据库
Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
String url="jdbc:db2://localhost:5000/sample"; //sample为你的数据库名
String user="admin";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);

3、Sql Server7.0/2000数据库
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";
//mydb为数据库
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);

4、Sybase数据库
Class.forName("com.sybase.jdbc.SybDriver").newInstance();
String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDB为你的数据库名
Properties sysProps = System.getProperties();
SysProps.put("user","userid");
SysProps.put("password","user_password");
Connection conn= DriverManager.getConnection(url, SysProps);

5、Informix数据库
Class.forName("com.informix.jdbc.IfxDriver").newInstance();
String url =
"jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;
user=testuser;password=testpassword"; //myDB为数据库名
Connection conn= DriverManager.getConnection(url);

6、MySQL数据库
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//myDB为数据库名
Connection conn= DriverManager.getConnection(url);

7、PostgreSQL数据库
Class.forName("org.postgresql.Driver").newInstance();
String url ="jdbc:postgresql://localhost/myDB" //myDB为数据库名
String user="myuser";
String password="mypassword";
Connection conn= DriverManager.getConnection(url,user,password);


8、access数据库直连用ODBC的
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;
String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");
Connection conn = DriverManager.getConnection(url,"","");
Statement stmtNew=conn.createStatement() ;

 

二、JDBC连接MySql方式
下面是使用JDBC连接MySql的一个小的教程

1、查找驱动程序
MySQL目前提供的java驱动程序为Connection/J,可以从MySQL官方网站下载,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驱动程序为纯java驱动程序,不需做其他配置。

2、动态指定classpath
如果需要执行时动态指定classpath,就在执行时采用-cp方式。否则将上面的.jar文件加入到classpath环境变量中。

3、加载驱动程序
try{
Class.forName(com.mysql.jdbc.Driver);
System.out.println(Success loading Mysql Driver!);
}catch(Exception e)
{
System.out.println(Error loading Mysql Driver!);
e.printStackTrace();
}

4、设置连接的url
jdbc:mysql://localhost/databasename[?pa=va][&pa=va]

三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧,这些技巧能够使我们更好地发挥系统的性能和实现更多的功能(系转载)。

  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命令时,我们需要处理一些格式化方面的问题。例如,如果我们想创建一个将名字O'Reilly插入表中的SQL命令,则必须使用二个相连的“''”号替换O'Reilly中的“'”号。完成这些工作的最好的方法是创建一个完成替换操作的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的功能。

 

二、JDBC连接MySql方式
下面是使用JDBC连接MySql的一个小的教程

1、查找驱动程序
MySQL目前提供的java驱动程序为Connection/J,可以从MySQL官方网站下载,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驱动程序为纯java驱动程序,不需做其他配置。

2、动态指定classpath
如果需要执行时动态指定classpath,就在执行时采用-cp方式。否则将上面的.jar文件加入到classpath环境变量中。

3、加载驱动程序
try{
Class.forName(com.mysql.jdbc.Driver);
System.out.println(Success loading Mysql Driver!);
}catch(Exception e)
{
System.out.println(Error loading Mysql Driver!);
e.printStackTrace();
}

4、设置连接的url
jdbc:mysql://localhost/databasename[?pa=va][&pa=va]

三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧,这些技巧能够使我们更好地发挥系统的性能和实现更多的功能(系转载)。

  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命令时,我们需要处理一些格式化方面的问题。例如,如果我们想创建一个将名字O'Reilly插入表中的SQL命令,则必须使用二个相连的“''”号替换O'Reilly中的“'”号。完成这些工作的最好的方法是创建一个完成替换操作的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的功能。

 

1、查找驱动程序
MySQL目前提供的java驱动程序为Connection/J,可以从MySQL官方网站下载,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驱动程序为纯java驱动程序,不需做其他配置。

2、动态指定classpath
如果需要执行时动态指定classpath,就在执行时采用-cp方式。否则将上面的.jar文件加入到classpath环境变量中。

3、加载驱动程序
try{
Class.forName(com.mysql.jdbc.Driver);
System.out.println(Success loading Mysql Driver!);
}catch(Exception e)
{
System.out.println(Error loading Mysql Driver!);
e.printStackTrace();
}

4、设置连接的url
jdbc:mysql://localhost/databasename[?pa=va][&pa=va]

三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧,这些技巧能够使我们更好地发挥系统的性能和实现更多的功能(系转载)。

  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命令时,我们需要处理一些格式化方面的问题。例如,如果我们想创建一个将名字O'Reilly插入表中的SQL命令,则必须使用二个相连的“''”号替换O'Reilly中的“'”号。完成这些工作的最好的方法是创建一个完成替换操作的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的功能。
10:13 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它
ORACLE函数大全
2004-09-16
常用oracle函数
SQL中的单记录函数
1.ASCII
返回与指定的字符对应的十进制数;
SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual;
A A ZERO SPACE
--------- --------- --------- ---------
65 97 48 32


2.CHR
给出整数,返回对应的字符;
SQL> select chr(54740) zhao,chr(65) chr65 from dual;

ZH C
-- -
赵 A

3.CONCAT
连接两个字符串;
SQL> select concat('010-','88888888')||'转23' 高乾竞电话 from dual;

高乾竞电话
----------------
010-88888888转23

4.INITCAP
返回字符串并将字符串的第一个字母变为大写;
SQL> select initcap('smith') upp from dual;

UPP
-----
Smith


5.INSTR(C1,C2,I,J)
在一个字符串中搜索指定的字符,返回发现指定的字符的位置;
C1 被搜索的字符串
C2 希望搜索的字符串
I 搜索的开始位置,默认为1
J 出现的位置,默认为1
SQL> select instr('oracle traning','ra',1,2) instring from dual;

INSTRING
---------
9


6.LENGTH
返回字符串的长度;
SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst;

NAME LENGTH(NAME) ADDR LENGTH(ADDR) SAL LENGTH(TO_CHAR(SAL))
------ ------------ ---------------- ------------ --------- --------------------
高乾竞 3 北京市海锭区 6 9999.99 7

 

7.LOWER
返回字符串,并将所有的字符小写
SQL> select lower('AaBbCcDd')AaBbCcDd from dual;

AABBCCDD
--------
aabbccdd


8.UPPER
返回字符串,并将所有的字符大写
SQL> select upper('AaBbCcDd') upper from dual;

UPPER
--------
AABBCCDD

 

9.RPAD和LPAD(粘贴字符)
RPAD 在列的右边粘贴字符
LPAD 在列的左边粘贴字符
SQL> select lpad(rpad('gao',10,'*'),17,'*')from dual;

LPAD(RPAD('GAO',1
-----------------
*******gao*******
不够字符则用*来填满


10.LTRIM和RTRIM
LTRIM 删除左边出现的字符串
RTRIM 删除右边出现的字符串
SQL> select ltrim(rtrim(' gao qian jing ',' '),' ') from dual;

LTRIM(RTRIM('
-------------
gao qian jing


11.SUBSTR(string,start,count)
取子字符串,从start开始,取count个
SQL> select substr('13088888888',3, from dual;

SUBSTR('
--------
08888888


12.REPLACE('string','s1','s2')
string 希望被替换的字符或变量
s1 被替换的字符串
s2 要替换的字符串
SQL> select replace('he love you','he','i') from dual;

REPLACE('H
----------
i love you


13.SOUNDEX
返回一个与给定的字符串读音相同的字符串
SQL> create table table1(xm varchar();
SQL> insert into table1 values('weather');
SQL> insert into table1 values('wether');
SQL> insert into table1 values('gao');

SQL> select xm from table1 where soundex(xm)=soundex('weather');

XM
--------
weather
wether


14.TRIM('s' from 'string')
LEADING 剪掉前面的字符
TRAILING 剪掉后面的字符
如果不指定,默认为空格符

15.ABS
返回指定值的绝对值
SQL> select abs(100),abs(-100) from dual;

ABS(100) ABS(-100)
--------- ---------
100 100


16.ACOS
给出反余弦的值
SQL> select acos(-1) from dual;

ACOS(-1)
---------
3.1415927


17.ASIN
给出反正弦的值
SQL> select asin(0.5) from dual;

ASIN(0.5)
---------
.52359878


18.ATAN
返回一个数字的反正切值
SQL> select atan(1) from dual;

ATAN(1)
---------
.78539816


19.CEIL
返回大于或等于给出数字的最小整数
SQL> select ceil(3.1415927) from dual;

CEIL(3.1415927)
---------------
4


20.COS
返回一个给定数字的余弦
SQL> select cos(-3.1415927) from dual;

COS(-3.1415927)
---------------
-1


21.COSH
返回一个数字反余弦值
SQL> select cosh(20) from dual;

COSH(20)
---------
242582598


22.EXP
返回一个数字e的n次方根
SQL> select exp(2),exp(1) from dual;

EXP(2) EXP(1)
--------- ---------
7.3890561 2.7182818


23.FLOOR
对给定的数字取整数
SQL> select floor(2345.67) from dual;

FLOOR(2345.67)
--------------
2345


24.LN
返回一个数字的对数值
SQL> select ln(1),ln(2),ln(2.7182818) from dual;

LN(1) LN(2) LN(2.7182818)
--------- --------- -------------
0 .69314718 .99999999


25.LOG(n1,n2)
返回一个以n1为底n2的对数
SQL> select log(2,1),log(2,4) from dual;

LOG(2,1) LOG(2,4)
--------- ---------
0 2


26.MOD(n1,n2)
返回一个n1除以n2的余数
SQL> select mod(10,3),mod(3,3),mod(2,3) from dual;

MOD(10,3) MOD(3,3) MOD(2,3)
--------- --------- ---------
1 0 2


27.POWER
返回n1的n2次方根
SQL> select power(2,10),power(3,3) from dual;

POWER(2,10) POWER(3,3)
----------- ----------
1024 27


28.ROUND和TRUNC
按照指定的精度进行舍入
SQL> select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual;

ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5)
----------- ------------ ----------- ------------
56 -55 55 -55


29.SIGN
取数字n的符号,大于0返回1,小于0返回-1,等于0返回0
SQL> select sign(123),sign(-100),sign(0) from dual;

SIGN(123) SIGN(-100) SIGN(0)
--------- ---------- ---------
1 -1 0


30.SIN
返回一个数字的正弦值
SQL> select sin(1.57079) from dual;

SIN(1.57079)
------------
1


31.SIGH
返回双曲正弦的值
SQL> select sin(20),sinh(20) from dual;

SIN(20) SINH(20)
--------- ---------
.91294525 242582598


32.SQRT
返回数字n的根
SQL> select sqrt(64),sqrt(10) from dual;

SQRT(64) SQRT(10)
--------- ---------
8 3.1622777


33.TAN
返回数字的正切值
SQL> select tan(20),tan(10) from dual;

TAN(20) TAN(10)
--------- ---------
2.2371609 .64836083


34.TANH
返回数字n的双曲正切值
SQL> select tanh(20),tan(20) from dual;

TANH(20) TAN(20)
--------- ---------
1 2.2371609

 

35.TRUNC
按照指定的精度截取一个数
SQL> select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual;

TRUNC1 TRUNC(124.16666,2)
--------- ------------------
100 124.16

 

36.ADD_MONTHS
增加或减去月份
SQL> select to_char(add_months(to_date('199912','yyyymm'),2),'yyyymm') from dual;

TO_CHA
------
200002
SQL> select to_char(add_months(to_date('199912','yyyymm'),-2),'yyyymm') from dual;

TO_CHA
------
199910


37.LAST_DAY
返回日期的最后一天
SQL> select to_char(sysdate,'yyyy.mm.dd'),to_char((sysdate)+1,'yyyy.mm.dd') from dual;

TO_CHAR(SY TO_CHAR((S
---------- ----------
2004.05.09 2004.05.10
SQL> select last_day(sysdate) from dual;

LAST_DAY(S
----------
31-5月 -04


38.MONTHS_BETWEEN(date2,date1)
给出date2-date1的月份
SQL> select months_between('19-12月-1999','19-3月-1999') mon_between from dual;

MON_BETWEEN
-----------
9
SQL>selectmonths_between(to_date('2000.05.20','yyyy.mm.dd'),to_date('2005.05.20','yyyy.mm.dd')) mon_betw from dual;

MON_BETW
---------
-60


39.NEW_TIME(date,'this','that')
给出在this时区=other时区的日期和时间
SQL> select to_char(sysdate,'yyyy.mm.dd hh24:mi:ss') bj_time,to_char(new_time
2 (sysdate,'PDT','GMT'),'yyyy.mm.dd hh24:mi:ss') los_angles from dual;

BJ_TIME LOS_ANGLES
------------------- -------------------
2004.05.09 11:05:32 2004.05.09 18:05:32


40.NEXT_DAY(date,'day')
给出日期date和星期x之后计算下一个星期的日期
SQL> select next_day('18-5月-2001','星期五') next_day from dual;

NEXT_DAY
----------
25-5月 -01

 

41.SYSDATE
用来得到系统的当前日期
SQL> select to_char(sysdate,'dd-mm-yyyy day') from dual;

TO_CHAR(SYSDATE,'
-----------------
09-05-2004 星期日
trunc(date,fmt)按照给出的要求将日期截断,如果fmt='mi'表示保留分,截断秒
SQL> select to_char(trunc(sysdate,'hh'),'yyyy.mm.dd hh24:mi:ss') hh,
2 to_char(trunc(sysdate,'mi'),'yyyy.mm.dd hh24:mi:ss') hhmm from dual;

HH HHMM
------------------- -------------------
2004.05.09 11:00:00 2004.05.09 11:17:00

 

42.CHARTOROWID
将字符数据类型转换为ROWID类型
SQL> select rowid,rowidtochar(rowid),ename from scott.emp;

ROWID ROWIDTOCHAR(ROWID) ENAME
------------------ ------------------ ----------
AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITH
AAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLEN
AAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARD
AAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES


43.CONVERT(c,dset,sset)
将源字符串 sset从一个语言字符集转换到另一个目的dset字符集
SQL> select convert('strutz','we8hp','f7dec') "conversion" from dual;

conver
------
strutz


44.HEXTORAW
将一个十六进制构成的字符串转换为二进制


45.RAWTOHEXT
将一个二进制构成的字符串转换为十六进制

 

46.ROWIDTOCHAR
将ROWID数据类型转换为字符类型

 

47.TO_CHAR(date,'format')
SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2004/05/09 21:14:41

 

48.TO_DATE(string,'format')
将字符串转化为ORACLE中的一个日期


49.TO_MULTI_BYTE
将字符串中的单字节字符转化为多字节字符
SQL> select to_multi_byte('高') from dual;

TO
--


50.TO_NUMBER
将给出的字符转换为数字
SQL> select to_number('1999') year from dual;

YEAR
---------
1999


51.BFILENAME(dir,file)
指定一个外部二进制文件
SQL>insert into file_tb1 values(bfilename('lob_dir1','image1.gif'));


52.CONVERT('x','desc','source')
将x字段或变量的源source转换为desc
SQL> select sid,serial#,username,decode(command,
2 0,'none',
3 2,'insert',
4 3,
5 'select',
6 6,'update',
7 7,'delete',
8 8,'drop',
9 'other') cmd from v$session where type!='background';

SID SERIAL# USERNAME CMD
--------- --------- ------------------------------ ------
1 1 none
2 1 none
3 1 none
4 1 none
5 1 none
6 1 none
7 1275 none
8 1275 none
9 20 GAO select
10 40 GAO none


53.DUMP(s,fmt,start,length)
DUMP函数以fmt指定的内部数字格式返回一个VARCHAR2类型的值
SQL> col global_name for a30
SQL> col dump_string for a50
SQL> set lin 200
SQL> select global_name,dump(global_name,1017,8,5) dump_string from global_name;

GLOBAL_NAME DUMP_STRING
------------------------------ --------------------------------------------------
ORACLE.WORLD Typ=1 Len=12 CharacterSet=ZHS16GBK: W,O,R,L,D


54.EMPTY_BLOB()和EMPTY_CLOB()
这两个函数都是用来对大数据类型字段进行初始化操作的函数

55.GREATEST
返回一组表达式中的最大值,即比较字符的编码大小.
SQL> select greatest('AA','AB','AC') from dual;

GR
--
AC
SQL> select greatest('啊','安','天') from dual;

GR
--


56.LEAST
返回一组表达式中的最小值
SQL> select least('啊','安','天') from dual;

LE
--


57.UID
返回标识当前用户的唯一整数
SQL> show user
USER 为"GAO"
SQL> select username,user_id from dba_users where user_id=uid;

USERNAME USER_ID
------------------------------ ---------
GAO 25

 

58.USER
返回当前用户的名字
SQL> select user from dual;

USER
------------------------------
GAO


59.USEREVN
返回当前用户环境的信息,opt可以是:
ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE
ISDBA 查看当前用户是否是DBA如果是则返回true
SQL> select userenv('isdba') from dual;

USEREN
------
FALSE
SQL> select userenv('isdba') from dual;

USEREN
------
TRUE
SESSION
返回会话标志
SQL> select userenv('sessionid') from dual;

USERENV('SESSIONID')
--------------------
152
ENTRYID
返回会话人口标志
SQL> select userenv('entryid') from dual;

USERENV('ENTRYID')
------------------
0
INSTANCE
返回当前INSTANCE的标志
SQL> select userenv('instance') from dual;

USERENV('INSTANCE')
-------------------
1
LANGUAGE
返回当前环境变量
SQL> select userenv('language') from dual;

USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
LANG
返回当前环境的语言的缩写
SQL> select userenv('lang') from dual;

USERENV('LANG')
----------------------------------------------------
ZHS
TERMINAL
返回用户的终端或机器的标志
SQL> select userenv('terminal') from dual;

USERENV('TERMINA
----------------
GAO
VSIZE(X)
返回X的大小(字节)数
SQL> select vsize(user),user from dual;

VSIZE(USER) USER
----------- ------------------------------
6 SYSTEM

 

60.AVG(DISTINCT|ALL)
all表示对所有的值求平均值,distinct只对不同的值求平均值
SQLWKS> create table table3(xm varchar(,sal number(7,2));
语句已处理。
SQLWKS> insert into table3 values('gao',1111.11);
SQLWKS> insert into table3 values('gao',1111.11);
SQLWKS> insert into table3 values('zhu',5555.55);
SQLWKS> commit;

SQL> select avg(distinct sal) from gao.table3;

AVG(DISTINCTSAL)
----------------
3333.33

SQL> select avg(all sal) from gao.table3;

AVG(ALLSAL)
-----------
2592.59


61.MAX(DISTINCT|ALL)
求最大值,ALL表示对所有的值求最大值,DISTINCT表示对不同的值求最大值,相同的只取一次
SQL> select max(distinct sal) from scott.emp;

MAX(DISTINCTSAL)
----------------
5000


62.MIN(DISTINCT|ALL)
求最小值,ALL表示对所有的值求最小值,DISTINCT表示对不同的值求最小值,相同的只取一次
SQL> select min(all sal) from gao.table3;

MIN(ALLSAL)
-----------
1111.11


63.STDDEV(distinct|all)
求标准差,ALL表示对所有的值求标准差,DISTINCT表示只对不同的值求标准差
SQL> select stddev(sal) from scott.emp;

STDDEV(SAL)
-----------
1182.5032

SQL> select stddev(distinct sal) from scott.emp;

STDDEV(DISTINCTSAL)
-------------------
1229.951

 

64.VARIANCE(DISTINCT|ALL)
求协方差

SQL> select variance(sal) from scott.emp;

VARIANCE(SAL)
-------------
1398313.9


65.GROUP BY
主要用来对一组数进行统计
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno;

DEPTNO COUNT(*) SUM(SAL)
--------- --------- ---------
10 3 8750
20 5 10875
30 6 9400

 

66.HAVING
对分组统计再加限制条件
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno having count(*)>=5;

DEPTNO COUNT(*) SUM(SAL)
--------- --------- ---------
20 5 10875
30 6 9400
SQL> select deptno,count(*),sum(sal) from scott.emp having count(*)>=5 group by deptno ;

DEPTNO COUNT(*) SUM(SAL)
--------- --------- ---------
20 5 10875
30 6 9400


67.ORDER BY
用于对查询到的结果进行排序输出
SQL> select deptno,ename,sal from scott.emp order by deptno,sal desc;

DEPTNO ENAME SAL
--------- ---------- ---------
10 KING 5000
10 CLARK 2450
10 MILLER 1300
20 SCOTT 3000
20 FORD 3000
20 JONES 2975
20 ADAMS 1100
20 SMITH 800
30 BLAKE 2850
30 ALLEN 1600
30 TURNER 1500
30 WARD 1250
30 MARTIN 1250
30 JAMES 950


  * SQL Group Function
*
s (num can be a column or ex

pression)          


  (null values are ign
*
ored, default between distin

ct and all is all)      


  ********************
***************
****************************

****************


  AVG([distinct or all] num)   
-- average value

  COUNT(distinct or all] num)  
-- number of values

  MAX([distinct or all
] num)   -- maximum value


  MAX([distinct or all] num)   
-- minimum value

  STDDEV([distinct or
all] num)  -- standard devi
ation

  SUM([distinct or all
] num)   -- sum of values


  VARIANCE([distinct o
r all] num) -- variance of v
alues

   
  ********************************
***********************
************************


  * Miscellaneaous Functions :  
*
                       


  ********************
***************
****************************

****************


  DECODE(expr, srch1,
return1 [,srch2, return2...]
, default]

      -- if no search matches t
he expression then the default is returned,

      -- otherwise,
the first search that match
es will cause

      -- the corres
ponding return value to be r
eturned

  DUMP(column_name [,fmt [,start_p
os [, length]]])

     -- returns an
column
internal oracle format, used

for getting info about a


     -- format options : 8 = oc
tal, 10 = decimel, 16 = hex, 17 = characters

     -- return type
codes : 1 = varchar2, 2 = n
umber, 8 = long, 12 = date,

     --  23 = raw,
24 = long raw, 69 = rowid,
96 = char, 106 = mlslabel

  GREATEST(expr [,expr2 [, expr3...]]
     -- returns the largest val
ue of all expressions

  LEAST(expr [,expr2 [, expr3...]]
     -- returns the
smallest value of all expre
ssions

  NVL(expr1 ,expr2
     -- if expr1 is not null, i
t is returned, otherwise expr2 is returned

  SQLCODE
     -- returns sql error code
query,
of last error. Can not be used directly in


     -- value must
be set to local variable fir
st

  SQLERRM
     -- returns sql
in query,
error message of last error

. Can not be used directly


     -- value must be set to lo
cal variable first

  UID
     -- returns the user id of
the user you are logged on as

     -- useful in s
electing information from lo
w level sys tables

  USER
     -- returns the
user name of the user you a
re logged on as

  USERENV('option')
     -- returns inf
ormation about the user you
are logged on as

     -- options : E
NTRYID, SESSIONID, TERMINAL,
LANGUAGE, LABEL, OSDBA

     --      (
all options not available in
all Oracle versions)

  VSIZE(expr)
     -- returns the number of b
ytes used by the expression

     -- useful in s
electing information about t
able space requirements

   
  ********************
***************
****************************

****************


  * SQL Date Functions (dt represe
*
nts oracle date and time)          


  * (functions return
*
an oracle date unless otherw

ise specified)        


  ********************************
***********************
************************


  ADD_MONTHS(dt, num)
   -- adds num months to
dt (num can be negative)

  LAST_DAY(dt)    
   -- last day of month in
month containing dt

  MONTHS_BETWEEN(dt1, dt2) -- retu
dt2
rns fractional value of months between dt1,


  NEW_TIME(dt, tz1, tz
zone 2
2)  -- dt = date in time zo

ne 1, returns date in time


  NEXT_DAY(dt, str)    -- date
etc..)
of first (str) after dt (str = 'Monday',


  SYSDATE         -- present system date
  ROUND(dt [,fmt]     -- roun
ds dt as specified by format fmt

  TRUNC(dt [,fmt]  
   -- truncates dt as spe
cified by format fmt

   
  ********************************
***********************
************************


  * Number Functions :      
*
                       


  ********************************
***********************
************************


  ABS(num)       -- absolute
value of num

  CEIL(num)      -- smallest integer > or = num

  COS(num)       -- cosine(n
um), num in radians

  COSH(num)     
 -- hyperbolic cosine(num)


  EXP(num)      
-- e raised to the num powe
r

  FLOOR(num)      -- largest
integer < or = num

  LN(num)       -- natural
logarithm of num

  LOG(num2, num1)   -- logarith
m base num2 of num1

  MOD(num2, num1)   -- remainde
r of num2 / num1

  POWER(num2, num1) 
 -- num2 raised to the num1
power

  ROUND(num1 [,num2]  -- num1 rou
nded to num2 decimel places (default 0)

  SIGN(num)      -- sign of
num * 1, 0 if num = 0

  SIN(num)      
-- sin(num), num in radians


  SINH(num)      -- hyperbolic sine(num)
  SQRT(num)      -- square root of num
  TAN(num)       -- tangent(
num), num in radians

  TANH(num)     
 -- hyperbolic tangent(num)


  TRUNC(num1 [,num2]  -- truncate
num1 to num2 decimel places (default 0)

   
  ********************************
***********************
************************


  * String Functions,
*
String Result :      

               


  ********************************
***********************
************************


  (num)          -- ASCII
character for num

  CHR(num)      
  -- ASCII character for n
um

  CONCAT(str1, str2)   -- str1
concatenated with str2 (same as str1||str2)

  INITCAP(str)    
  -- capitalize first lett
er of each word in str

  LOWER(str)       -- str w
ith all letters in lowercase

  LPAD(str1, num [,str2]) -- left
spaces)
pad str1 to length num with str2 (default


  LTRIM(str [,set]) 
   -- remove set from left
side of str (default spaces)

  NLS_INITCAP(str [,nl
s_val]) -- same as initcap f
or different languages

  NLS_LOWER(str [,nls_
val])  -- same as lower for
different languages

  REPLACE(str1, str2 [,str3]) -- r
eplaces str2 with str3 in str1

                 --
deletes str2 from str1 if str3 is omitted

  RPAD(str1, num [,str
(default spaces)
2])   -- right pad str1 to

length num with str2


  RTRIM(str [,set]) 
spaces)
     -- remove set from

right side of str (default


  SOUNDEX(str)    
    -- phonetic represen
tation of str

  SUBSTR(str, num2 [,n
um1])  -- substring of str,
starting with num2,

                 --
omitted)
num1 characters (to end of str if num1 is


  SUBSTRB(str, num2 [,
bytes
num1]) -- same as substr bu

t num1, num2 expressed in


  TRANSLATE(str, set1,
set2) -- replaces set1 in
str with set2

                 --
truncated
if set2 is longer than set1, it will be


  UPPER(str)     
    -- str with all lett
ers in uppercase

   
  ********************
***************
****************************

****************


  * String Functions,
*
Numeric Result :      

               


  ********************************
***********************
************************


   
  ASCII(str)           
 -- ASCII value of str

  INSTR(str1, str2 [,num1 [,num2]]
) -- position of num2th occurrence of

                  
  -- str2 in str1, starting at num1

                  
  -- (num1, num2 default to 1)

  INSTRB(str1, str2 [,num1 [num2]]

) -- same as instr, byte values for num1, num2


  LENGTH(str)    
        -- number of
characters in str

  LENGTHB(str)          
 -- number of bytes in str

  NLSSORT(str [,nls_val])    
  -- nls_val byte value of str

   
  ********************************
***********************
************************


  * SQL Conversion Functions   
*
                       


  ********************************
***********************
************************


  CHARTOROWID(str)        
  -- converts str to ROWID

  CONVERT(str, chr_set2 [,chr_set1
]) -- converts str to chr_set2

            
character set
        -- chr_set1

default is the datbase


  HEXTORAW(str)   
  -- converts hex string va
lue to internal raw values

  RAWTOHEX(raw_val)   -- convert
s raw hex value to hex string value

  ROWIDTOCHAR(rowid) 
 -- converts rowid to 18 ch
aracter string format

  TO_CHAR(expr [,fmt])
fmt
 -- converts expr(date or n

umber) to format specified by


  TO_DATE(str [,fmt])
  -- converts string to dat
e

  TO_MULTI_BYTE(str)  -- convert
s single byte string to multi byte string

  TO_NUMBER(str [,fmt]) -- convert
s str to a number formatted by fmt

  TO_SINGLE_BYTE(str)
  -- converts multi byte st
ring to single byte string

   
  ********************************
***********************
************************


  * SQL Date Formats 
*
              

               


  ********************
***************
****************************

****************


   
  BC, B.C.    BC indicator
  AD, A.D.    AD indicator
  CC, SCC     Cent
ury Code (SCC includes space
or - sign)

  YYYY, SYYYY   4 digit year (SY
YYY includes space or - sign)

  IYYY      4 digit ISO year
  Y,YYY      4 digit year with comma
  YYY, YY, or Y  last 3, 2, or 1
digit of year

  YEAR, SYEAR   year spelled out
(SYEAR includes space or - sign)

  RR       last 2 digits of
year in prior or next century

  Q        quarter or year, 1 to 4
  MM       month - from 01 to 12
  MONTH      month spelled out
  MON       month 3 letter abbreviation
  RM       roman numeral for month
  WW       week of year, 1 to 53
  IW       ISO week of year
, 1 to 52 or 1 to 53

  W        week of month, 1
to 5 (week 1 begins 1st day of the month)

  D        day of week, 1 to 7
  DD       day of month, 1 to 31
  DDD       day of year, 1 to 366
  DAY       day of week spel
led out, nine characters right padded

  DY       day abbreviation
  J        # of
days since Jan 1, 4712 BC


  HH, HH12    hour of day, 1 to 12
  HH24      hour of day, 0 to 23
  MI       minute of hour, 0 to 59
  SS       second of minute, 0 to 59
  SSSSS      seco
nds past midnight, 0 to 8639
9

  AM, A.M.    am indicator
  PM, P.M.    pm indicator
  any puctuation punc
tuation between format items
, as in 'DD/MM/YY'

  any text    text between format items
  TH       conv
erts 1 to '1st', 2 to '2nd',
and so on

  SP       converts 1 to 'o
ne', 2 to 'two', and so on

  SPTH      converts 1 to 'F
IRST', 2 to 'SECOND', and so on

  FX       fill
exact : uses exact pattern
matching

  FM       fill mode : tog
gles suppression of blanks in output
9:54 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它
取查询结果的几种方法
List:
A. 查询语句中只查一个字段
引用:
Session session = HibernateSessionFactory.currentSession();
Transaction transaction = session.beginTransaction();
Query query = session.createQuery("select e.name from Employee e");
List list = query.list();
for (int i = 0; i < list.size(); i++) {
Object object = (Object)list.get(i);
String s = (String) object;
System.out.println(s);
}

B. 查询语句中多于一个字段
引用:
Session session = HibernateSessionFactory.currentSession();
Transaction transaction = session.beginTransaction();
Query query = session.createQuery("select d.name, e.name from Department d, Employee e where d.id=e.department.id");
List list = query.list();
for (int i = 0; i < list.size(); i++) {
Object[] object = (Object[])list.get(i);
String s = (String) object[0];
System.out.println(s);
}


Iterator:
也看查询语句中的字段,
A 如果是查整个表,可以直接转换为对象。
引用:
HQL: from Department
for (Iterator iter = query.iterate(); iter.hasNext(); ) {
Department department = (Department) iter.next();
System.out.println(department.getName());
}

B 如果字段为一个,直接用实际的字段类型转换。
引用:
HQL: select e.name from Employee e
for (Iterator iter = query.iterate(); iter.hasNext(); ) {
String s = (String) iter.next();
System.out.println(s);
}

C 如果字段多于一个,先用Object[]取出,然后陆续用实际字段的名字转换。
引用:
HQL: select d.name, e.name from Department d, Employee e where d.id=e.department.id
for (Iterator iter = query.iterate(); iter.hasNext(); ) {
Object[] object (Object[]) inter.next();
String s = (String) object[0];
System.out.println(s);
}

9:47 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它
4月24日
Log4j配置1
配置文件:

### 设置org.zblog域对应的级别INFO,DEBUG,WARN,ERROR和输出地A1,A2 ##
log4j.category.org.zblog=ERROR,A1
log4j.category.org.zblog=INFO,A2

log4j.appender.A1=org.apache.log4j.ConsoleAppender
### 设置输出地A1,为ConsoleAppender(控制台) ##
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
### 设置A1的输出布局格式PatterLayout,(可以灵活地指定布局模式)##
log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
### 配置日志输出的格式##

log4j.appender.A2=org.apache.log4j.RollingFileAppender
### 设置输出地A2到文件(文件大小到达指定尺寸的时候产生一个新的文件)##
log4j.appender.A2.File=E:/study/log4j/zhuwei.html
### 文件位置##
log4j.appender.A2.MaxFileSize=500KB
### 文件大小##
log4j.appender.A2.MaxBackupIndex=1
log4j.appender.A2.layout=org.apache.log4j.HTMLLayout
##指定采用html方式输出

输出配置:

# %c 输出日志信息所属的类的全名
# %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2002-10-# 18- 22:10:28
# %f 输出日志信息所属的类的类名
# %l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
# %m 输出代码中指定的信息,如log(message)中的message
# %n 输出一个回车换行符,Windows平台为“ ”,Unix平台为“ ”
# %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
# %r 输出自应用启动到输出该日志信息所耗费的毫秒数
# %t 输出产生该日志事件的线程名

log4j的信息等级为info< debug<warn<error<fatal
10:15 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它
Log4J配置
下面给出得Log4J配置文件实现了输出到控制台,文件,回滚文件,发送日志邮件,输出到数据库日志表,自定义标签等全套功能。

log4j.rootLogger=DEBUG,CONSOLE,A1,im
#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE

log4j.addivity.org.apache=true


###################
# Console Appender
###################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n


#####################
# File Appender
#####################
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# Use this layout for LogFactor 5 analysis

 

########################
# Rolling File
########################
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


####################
# Socket Appender
####################
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n


########################
# Log Factor 5 Appender
########################
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000


########################
# SMTP Appender
#######################
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=chenyl@hollycrm.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@hollycrm.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


########################
# JDBC Appender
#######################
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout

###################
#自定义Appender
###################
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender

log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net

log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


log4j.properties配置文件讲解如下:
# Set root logger level to DEBUG and its only appender to A1
#log4j中有五级logger
#FATAL 0
#ERROR 3
#WARN 4
#INFO 6
#DEBUG 7

配置根Logger,其语法为:
#log4j.rootLogger = [ level ] , appenderName, appenderName, …
log4j.rootLogger=INFO, A1 ,R
#这一句设置以为着所有的log都输出
#如果为log4j.rootLogger=WARN, 则意味着只有WARN,ERROR,FATAL
#被输出,DEBUG,INFO将被屏蔽掉.
# A1 is set to be a ConsoleAppender.
#log4j中Appender有几层如控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等
#ConsoleAppender输出到控制台
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 使用的输出布局,其中log4j提供4种布局. org.apache.log4j.HTMLLayout(以HTML表格形式布局)
#org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
#org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
#org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

log4j.appender.A1.layout=org.apache.log4j.PatternLayout
#灵活定义输出格式 具体查看log4j javadoc org.apache.log4j.PatternLayout
#d 时间 ....
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
#R 输出到文件 RollingFileAppender的扩展,可以提供一种日志的备份功能。
log4j.appender.R=org.apache.log4j.RollingFileAppender
#日志文件的名称
log4j.appender.R.File=log4j.log
#日志文件的大小
log4j.appender.R.MaxFileSize=100KB
# 保存一个备份文件
log4j.appender.R.MaxBackupIndex=1 log4j.appender.R.layout=org.apache.log4j.TTCCLayout
#log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n


配置根Logger,其语法为:

log4j.rootLogger = [ level ] , appenderName, appenderName, ...

level 是日志记录的优先级
appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。

配置日志信息输出目的地Appender,其语法为


log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
...
log4j.appender.appenderName.option = valueN

Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

配置日志信息的格式(布局),其语法为:


log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
....
log4j.appender.appenderName.layout.option = valueN

Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
10:14 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它
简化spring中的事务管理配置
xml代码:

<bean id="proxyService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref local="myTransactionManager"/></property>
<property name="target">
<ref local="itemService"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="itemService" class="com.xxx.services.IServiceImpl">
<property name="itemMasterDAO"><ref local="itemMasterDAO"/></property>
</bean>


系统中有多个service,但我们的事务策略大部分都是一样的,难道非要每个service都要写一个这样的代理配置么?当然不是..
看下面代码:

xml代码:


<!-- Transactional proxy for the services -->
<bean id="baseTxProxy" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>

<bean id="itemService" parent="baseTxProxy">
<property name="target">
<bean class="ItemServiceImpl" autowire="byName"/>
</property>
</bean>
10:11 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它
JavaScript中一些简单的判断
java代码: 


//校验是否全由数字组成(20位以内)
function isNum(str){
        var patrn=/^[0-9]{1,20}$/;
        if (patrn.exec(str)) return true;
        return false;
}

//校验是否是正确的手机号
function isMobile(str){
        var patrn = /^((/+86)|(86))?(13)/d{9}$/;
        if(patrn.exec(str)) return true;
        return false;
}

//校验是否是正确的电话号
function isTel(str){
        var patrn = /^(/d{3,4}/-)?/d{7,8}$/;
        if(patrn.exec(str)) return true;
        return false;
}

//校验Email地址是否正确
function isEmail(str){
        var patrn = /^[/w-]+(/.[/w-]+)*@[/w-]+(/.[/w-]+)+$/;
        if(patrn.exec(str)) return true;
        return false;
}
 

8:44 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它
Hibernater操作一点通
//增加一条记录
Session s = HibernateSessionFactory.currentSession();
Products p=new Products();
p.setProductName("apple");//设置属性值
Byte b=new Byte("0");
p.setDiscontinued(b);

Transaction tx=session.beginTransaction();
session.save(p);
tx.commit();
session.close();
**********************************************************
//查询
Session s = HibernateSessionFactory.currentSession();
Products p=(Products)s.load(Products.class,new Integer(20));// 按主键查询
// Criteria Query查询方式

Criteria cr=session.createCriteria(Products.class);
cr.add(Expression.eq("productId",new Integer(10));
List list=cr.list();
Iterator i=list.iterator();
while(i.hasNext()){
Products p=(Products)i.next();
}
sesssin.close();
// Expression.eq() =
// Expression.gt() >
// Expression.ge() >=
// Expression.lt() <
// Expression.le() <=
// Expression.between()
// Expression.like()
// Expression.and(Expression.eq(),Expression.eq())且
// Expression.or(Expression.eq(),Expression.eq())或
**********************************************************
// Query查询方式
Session s = HibernateSessionFactory.currentSession();
String sql="select p from Products as p where p.productId>?";

Query q=s.createQuery(sql);
q.setInteger(0,10);// 属性值从0开始
List l=q.list();
**********************************************************
分页:

Session s = HibernateSessionFactory.currentSession();

 

Criteria c=s.createCriteria(Products.class);
c.add(Expression.gt("productId",new Integer(2)));
c.setFirstResult(10);
c.setMaxResults(10);


// String hql="from Products ";
// Query q=s.createQuery(hql);
//
// q.setFirstResult(0);
// q.setMaxResults(10);


List list=c.list();

for(int i=0;i<list.size();i++){
Products p=(Products)list.get(i);
System.out.println(p.getProductId());
}

**********************************************************
更新

Session sss = HibernateSessionFactory.currentSession();
Products pp=(Products)sss.load(Products.class,new Integer(3));
System.out.println(""+pp.getProductId()+"/t"+pp.getUnitPrice());
pp.setUnitPrice(new Double(50.0));

Transaction t=sss.beginTransaction();
sss.update(pp);
t.commit();


**********************************************************

load方法和get方法


get档不存在时,不会抛异常
4:20 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它
如何选择适合自己的WEB报表工具?zt
http://www.javaresearch.org/article/showarticle.jsp?column=151&thread=50309
3:05 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它
4月20日
选取合适的dHtml Grid方案
目前网上主流的有四种方案:

1 dhtmlxGrid
http://www.scbr.com/docs/products/dhtmlxGrid/index.shtml
免费版可以填充表格,表格也非常漂亮。但是无法得到数据,或者将修改过的表格内容序列化成xml,只有专业版才可以。

2 activewidgets-grid 1.0.0
http://www.activewidgets.com/
功能非常强大,甚至可以分页,界面也有好看的皮肤。但1.0 同样无法取数据。2.0也不是免费的,

3 DHTMLGrid Ver0.92
http://dhtmlgrid.sourceforge.net/
功能及其简单,界面比较难看

4 os3grid 0.6
http://os3grid.sourceforge.net
功能还可以,不过界面简单。虽然架构不好,但是可以扩展,而且毕竟是LGPL的许可。

最终我还是选用os3grid来做工资录入界面.

创建界面的代码为:
    // Create an OS3Grid instance
    var g = new OS3Grid ();

    // Set the callback for modifications
    g.onchange = row_modified;

    g.set_size ( "400px", "200px" );
   
    // Grid Headers are the grid column names
    g.set_headers ( 'nick', 'name', 'email addr' );

    // If contents is bigger than container, Grid will automatically show scrollbars
    g.set_scrollbars ( true );

    // The grid will have a solid border (these are CSS attributes)
    g.set_border ( 1, "solid", "#cccccc" );

    // Now, we add some rows
    g.add_row ( "fsoft", "Fabio Rotondo", "fsoft (@) sourceforge (dot) net" );
    g.set_row_attr ( -1, 'magic', 'magic-fsoft' );
    g.set_row_attr ( -1, 'changed', 'NO' );

    g.add_row ( "nick", "Nick Fury", "nick (@) sourceforge (dot) net" );
    g.set_row_attr ( -1, 'magic', 'magic-nick' );
    g.set_row_attr ( -1, 'changed', 'NO' );

    g.add_row ( "john", "John JJ Jameson", "john (@) sourceforge (dot) net" );
    g.set_row_attr ( -1, 'magic', 'magic-john' );
    g.set_row_attr ( -1, 'changed', 'NO' );

    g.add_row ( "reds", "Mary Jane Watson", "mj (@) sourceforge (dot) net" );
    g.set_row_attr ( -1, 'magic', 'magic-mj' );
    g.set_row_attr ( -1, 'changed', 'NO' );

    g.add_row ( "white", "Barry White", "barryw (@) sourceforge (dot) net" );
    g.set_row_attr ( -1, 'magic', 'magic-barryw' );
    g.set_row_attr ( -1, 'changed', 'NO' );

    // Enable sortable rows
    g.set_sortable ( true );

    // Enable highlight of rows with the mouse
    g.set_highlight ( true );

    g.set_col_editable ( 1, "txt" );
    g.set_col_editable ( 2, "txt" );

    g.sort_on_edit = true;

    // Show the grid replacing the original HTML object with the "grid" ID.
    g.render ( 'grid' );


取得数据的代码,这是最关键的

     var l = g.length ();
     var t;
     var data, attrs;
     var s = "";
     var i, v;

     for ( t = 0; t < l; t ++ )
     {
      data = g.get_row ( t );
      alert(data[0]+data[1]+data[2]);

     }

3:00 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它
4月11日
JS获取客户端IP
JS 获取的 IP 有个优点就是它获取的是本机设置的 IP,如果计算机通过局域网上网,那么它获得的就是计算机的局域网 IP,而不像 ASP 中 Request 获取的是计算机连接到互联网的 IP。通过两种获取 IP 的方法,就可以确定某一台计算机。

代码:


<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>JS获取客户端IP</title>
</head>

<body>
<script type="text/javascript" language="javascript">
<!--
function GetLocalIPAddress()
{
    var obj = null;
    var rslt = "";
    try
    {
        obj = new ActiveXObject("rcbdyctl.Setting");
        rslt = obj.GetIPAddress;
        obj = null;
    }
    catch(e)
    {
        //异常发生
    }
   
    return rslt;
}

document.write("你的IP是:" + GetLocalIPAddress());
//-->
</script>
</body>

</html>
在使用中可能会出现类似下图的警告,点击“是”,就可以运行了,也可以在【Internet 选项】中【安全】->【ActiveX 控件和插件】->【对没有标记为安全的 ActiveX 控件进行初始化和脚本运行】设置为【启用】,就不会弹出对话框了。有时候测试时因代码出错既不弹出对话框,也不显示 IP,更正代码后也是一样的情况,这时你需要重新打开 IE 进行测试,在实际使用中,不会出现类似情况。

8:39 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它
2月5日
用好HTML的表格标记
http://www.dorla.com/info/1197.htm
对于表格,是网页制作中的重头戏,一些图形化网页制作工具(如:Dreamweaver、Fontpage等)对它也支持的非常好,但HTML为表格设置了几十个参数,图形化网页制作工具要对它全面支持就有点免为其难了。由于参数太多,且大部分参数大家也比较熟悉,就不在这里一一介绍了,下面的例子中仅对一些关键性参数作详细介绍。

  一、作系列横单线


  这是系列横单线试验,效果还好吧?
  在这个例子中,用到了表格主标题标记<caption>,它的语法如下:
<caption
align=left|center|right
valign=top|bottom>
  align和valign分别用于设定标题的水平位置和垂直位置。align的默认值是center;valign的默认值是top。利用<caption>标记可以方便地在紧靠边表格的顶部或底部写上文字,且居中,若用其它办法要麻烦得多。另外在本例中能使表格产生单线效果是设置了<table>标记的rules和frame参数,rules参数是对表格的内部边框作显示控制。
rules="none":表示不加内部边框;
rules="rows":表示只显示水平方向的边框;
rules="cols:表示只显示垂直方向上的边框;
rules="all":则是显示所有方向上的边框,这也是默认值;
frame="void":表示不加外边框;
frame="above":表示显示上边的外边框;
frame="below":表示显示下边的外边框;
frame="lhs" :表示显示左边的外边框;
frame="rls" :表示显示右边的外边框;
frame="hsides":表示显示上下外边框;
frame="vsides":表示显示左右外边框;
frame="box" 则表示显示所有外边框。
  明白了参数值的含义,制作本例的效果就简单了,本例完成后的源代码如下:
<table width="60%" border="1" cellspacing="0" cellpadding="0" rules="rows" frame="hsides">
<caption>这是系列横单线试验</caption>
<tr>
<td>    这是系列横单线试验,效果还好吧?</td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td> </td>
</tr>
</table>
  用这种方法画系列单线,即快又整齐,且所用代码也很少。

  二、作系列竖单线
 

  本例这种效果看起来是不是有点特色,其实在制作方法上与上例没有多少区别,只是改变了rules和frame的参数值,使表格只显示垂直方向的内外边框,其它与上例相同,本例完成后的源代码是:
<table border="1" cellspacing="1" cellpadding="8" rules="clos" frame="vsides" height="115" align="left" hspace="10" width="180">
<tr>
<td>更上一 层 楼 </td>
<td>欲穷千 里 目 </td>
<td>黄河 入 海 流 </td>
<td>白日依 山 尽 </td>
<td><p><br>登 黄 鹤 楼 </p></td>
</tr>
</table>

  三、系列双横线


  这是在例一的基础上再增加设定了cellspacing参数所产生的效果。
  本例采用与例一相同的方法,通过设定rules和frame参数,使表格只显示水平方向的内外边框线,并增加了设定cellspacing参数使其产生双线效果,但是<table>标记默认的双线颜色不一样(因它的本意是用两种颜色来产生立体效果的),所以又通过设定bordercolorlight和bordercolordark 参数来改变双线的颜色,以达到双线颜色一致的目的。另外为了使表格内的文字内容上下留空,又设定了cellpadding参数,当然也可以通过设定单元格高度来达到这个目的,但那样要增加许多代码。下面介绍这几个参数的含义:
cellspacing="n":单元格间距,也就是内外边框线的间距;
cellpadding="n":单元格边距,即单元格内内容与内边框的距离;
bordercolorlight="#n":设定立体边框线中较浅部分的颜色,用颜色名称或十六进制数表示。
bordercolordark="#n":设定立体边框线中较深部分的颜色,用颜色名称或十六进制数表示。
  用本例的方法制作双横线,比用其它方法方便、快捷,所用代码也较少,当横线的数量越多,效果越明显。本例完成后的代码为:
<table width="60%" border="1" cellspacing="6" cellpadding="3" bordercolorlight="#006633" bordercolordark="#006633" rules="rows" frame="hsides">
<tr><td>    这是在例一的基础上再增加设定了cellspacing参数所产</td></tr>
<tr><td>生的效果。</td></tr>
<tr><td> </td></tr>
</table>

  同样,在例二的基础上再加上例三的方法就可以方便地制作出双竖线效果,你可以试试。当然表格在网页制作中的作用远远不止这些,通过这三个例子可以看出,灵活应用表格的参数设定,可以产生一些特殊效果。其它关于表格的应用技巧,可参看《活用Dreamweaver3表格》一文。

9:14 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它
1月21日
使用JXL读取Excel表格,拷贝、更新Excel工作薄
/**
* <p>读取Excel表格,拷贝、更新Excel工作薄 </p>
* <p>Description: 可以读取Excel文件的内容,更新Excel工作薄
* </p>
* <p>Copyright: Copyright (c) Corparation 2005</p>
* <p>程序开发环境为eclipse</p>
* @author Walker
* @version 1.0
*/
package cn.com.yitong.xls;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Vector;

import cn.com.yitong.ChartImg;
import cn.com.yitong.VireObj;
import cn.com.yitong.platform.log.YTLogger;

import jxl.CellType;
import jxl.Workbook;
import jxl.format.CellFormat;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.write.Formula;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.WritableCell;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableImage;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

public class XLSDemo
{
    private static final int TITLE_LENGTH = 7;
    private static final int SHEET_WIDTH = 32;
    private static final int SHEET_HEIGHT = 116;
   
    /**
     * 创建Excel
     */
    private void makeXls()
    {
        Workbook workbook = null;
        try
        {
            // 构建Workbook对象, 只读Workbook对象
            // 直接从本地文件创建Workbook, 从输入流创建Workbook
            InputStream ins = new FileInputStream("D:/Workspace/testproj/source.xls");
            workbook = Workbook.getWorkbook(ins);

            // 利用已经创建的Excel工作薄创建新的可写入的Excel工作薄
            File outFile = new File("D:/Workspace/testproj/test.xls");
            WritableWorkbook wwb = Workbook.createWorkbook(outFile, workbook);
            // 读取第一张工作表
            WritableSheet dataSheet = wwb.getSheet(0);
            //  设置冻结单元格
            dataSheet.getSettings().setVerticalFreeze(7);
            dataSheet.getSettings().setHorizontalFreeze(2);
           
            // 测试模拟数据
            Vector vecData = new Vector();
            for(int i = 0; i < 50; i ++)
            {
                VireObj obj = new VireObj();
                obj.setOrgNo("00" + i + "0");
                obj.setOrgName("机构" + (i + 1));
                obj.setOpenAcc((int)(100 * Math.random()));
                obj.setDestoryAcc((int)(10 * Math.random()));
                obj.setTotalAcc((int)(500 * Math.random()));
                obj.setMonthInCount((int)(500 * Math.random()));
                obj.setMonthInMoney(500 * Math.random());
                obj.setMonthOutCount((int)(500 * Math.random()));
                obj.setMonthOutMoney(500 * Math.random());
               
                vecData.add(obj);
            }           
            // 插入数据
            insertData(wwb, dataSheet, vecData);           
            // 插入模拟图像数据
            Vector vecImg = new Vector();
            for(int i = 0; i < 3; i ++)
            {
                ChartImg img = new ChartImg();
                img.setImgTitle("图像" + (i + 1));
                img.setImgName("D:/Workspace/testproj/images/barchart.png");
                vecImg.add(img);
            }
            // 插入图表
            insertImgsheet(wwb, vecImg);
            //写入Excel对象
            wwb.write();
            wwb.close();
        } catch (Exception e)
        {
            YTLogger.logDebug(e);
        } finally
        {
            // 操作完成时,关闭对象,释放占用的内存空间
            workbook.close();
        }
    }
   
    /**
     * 插入数据
     * @param wwb WritableWorkbook : 工作簿
     * @param dataSheet WritableSheet : 工作表
     * @throws RowsExceededException
     * @throws WriteException
     */
    private void insertData(WritableWorkbook wwb, WritableSheet dataSheet, Vector vecData) throws RowsExceededException, WriteException
    {
        // 获得标题单元格对象       
        modiStrCell(dataSheet, 2, 0, "工商银行江苏省分行 个人网上银行业务种类/开销户明细报表(2005-12)", null);
        // 修改数据单元格数据
        for(int i = 0; i < vecData.size(); i ++)
        {
            VireObj obj = (VireObj)vecData.get(i);
            modiStrCell(dataSheet, 0, TITLE_LENGTH + i, obj.getOrgNo(), null);
            modiStrCell(dataSheet, 1, TITLE_LENGTH + i, obj.getOrgName(), null);
            modiNumCell(dataSheet, 2, TITLE_LENGTH + i, obj.getOpenAcc(), null);
            modiNumCell(dataSheet, 3, TITLE_LENGTH + i, obj.getDestoryAcc(), null);
            modiNumCell(dataSheet, 4, TITLE_LENGTH + i, obj.getTotalAcc(), null);
            modiNumCell(dataSheet, 5, TITLE_LENGTH + i, obj.getMonthInCount(), null);
            modiNumCell(dataSheet, 6, TITLE_LENGTH + i, obj.getTotalInMoney(), null);
            modiNumCell(dataSheet, 7, TITLE_LENGTH + i, obj.getMonthOutCount(), null);
            modiNumCell(dataSheet, 8, TITLE_LENGTH + i, obj.getMonthOutMoney(), null);
        }   
        // 删除空行
        for (int j = vecData.size() + TITLE_LENGTH; j < SHEET_HEIGHT; j++)
        {
            dataSheet.removeRow(vecData.size() + TITLE_LENGTH);
        }       
        // 插入公式
        for(int i = 2; i < SHEET_WIDTH; i ++)
        {
            modiFormulaCell(dataSheet, i, vecData.size() + TITLE_LENGTH, 8, vecData.size() + TITLE_LENGTH, null);
        }       
    }

    /**
     * 修改字符单元格的值
     * @param dataSheet WritableSheet : 工作表
     * @param col int : 列
     * @param row int : 行
     * @param str String : 字符
     * @param format CellFormat : 单元格的样式
     * @throws RowsExceededException
     * @throws WriteException
     */
    private void modiStrCell(WritableSheet dataSheet, int col, int row, String str, CellFormat format) throws RowsExceededException, WriteException
    {
        // 获得单元格对象
        WritableCell cell = dataSheet.getWritableCell(col, row);
        // 判断单元格的类型, 做出相应的转化
        if (cell.getType() == CellType.EMPTY)
        {
            Label lbl = new Label(col, row, str);
            if(null != format)
            {
                lbl.setCellFormat(format);
            } else
            {
                lbl.setCellFormat(cell.getCellFormat());
            }
            dataSheet.addCell(lbl);
        } else if (cell.getType() == CellType.LABEL)
        {
            Label lbl = (Label)cell;
            lbl.setString(str);
        } else if (cell.getType() == CellType.NUMBER)
        {
            // 数字单元格修改
            Number n1 = (Number)cell;
            n1.setValue(42.05);
        }
    }
   
    /**
     * 修改数字单元格的值
     * @param dataSheet WritableSheet : 工作表
     * @param col int : 列
     * @param row int : 行
     * @param num double : 数值
     * @param format CellFormat : 单元格的样式
     * @throws RowsExceededException
     * @throws WriteException
     */
    private void modiNumCell(WritableSheet dataSheet, int col, int row, double num, CellFormat format) throws RowsExceededException, WriteException
    {
        // 获得单元格对象
        WritableCell cell = dataSheet.getWritableCell(col, row);
        // 判断单元格的类型, 做出相应的转化
        if (cell.getType() == CellType.EMPTY)
        {
            Number lbl = new Number(col, row, num);
            if(null != format)
            {
                lbl.setCellFormat(format);
            } else
            {
                lbl.setCellFormat(cell.getCellFormat());
            }
            dataSheet.addCell(lbl);
        } else if (cell.getType() == CellType.NUMBER)
        {
            // 数字单元格修改
            Number lbl = (Number)cell;
            lbl.setValue(num);
        } else if (cell.getType() == CellType.LABEL)
        {
            Label lbl = (Label)cell;
            lbl.setString(String.valueOf(num));
        }
    }
   
    /**
     * 修改公式单元格的值
     * @param dataSheet WritableSheet : 工作表
     * @param col int : 列
     * @param row int : 行
     * @param startPos int : 开始位置
     * @param endPos int : 结束位置
     * @param format
     * @throws RowsExceededException
     * @throws WriteException
     */
    private void modiFormulaCell(WritableSheet dataSheet, int col, int row, int startPos, int endPos, CellFormat format) throws RowsExceededException, WriteException
    {
        String f = getFormula(col, row, startPos, endPos);
        // 插入公式(只支持插入,不支持修改)
        WritableCell cell = dataSheet.getWritableCell(col, row);
        if (cell.getType() == CellType.EMPTY)
        {                   
            // 公式单元格
            Formula lbl = new Formula(col, row, f);
            if(null != format)
            {
                lbl.setCellFormat(format);
            } else
            {
                lbl.setCellFormat(cell.getCellFormat());
            }
            dataSheet.addCell(lbl);
        } else if (cell.getType() == CellType.STRING_FORMULA)
        {
            YTLogger.logWarn("Formula modify not supported!");
        }
    }
   
    /**
     * 得到公式
     * @param col int : 列
     * @param row int : 行
     * @param startPos int : 开始位置
     * @param endPos int : 结束位置
     * @return String
     * @throws RowsExceededException
     * @throws WriteException
     */
    private String getFormula(int col, int row, int startPos, int endPos)
            throws RowsExceededException, WriteException
    {
        char base = 'A';
        char c1 = base;
        StringBuffer formula = new StringBuffer(128);
        // 组装公式
        formula.append("SUM(");
        if (col <= 25)
        {
            c1 = (char) (col % 26 + base);
            formula.append(c1).append(startPos).append(":")
                   .append(c1).append(endPos).append(")");
        } else if (col > 25)
        {
            char c2 = (char) ((col - 26) / 26 + base);
            c1 = (char) ((col - 26) % 26 + base);
            formula.append(c2).append(c1).append(startPos).append(":")
                   .append(c2).append(c1).append(endPos).append(")");
        }

        return formula.toString();
    }
   
    /**
     * 插入图表工作表
     * @param wwb WritableWorkbook : 工作簿
     * @param vecImg Vector : 图像链表
     * @throws RowsExceededException
     * @throws WriteException
     */
    private void insertImgsheet(WritableWorkbook wwb, Vector vecImg)
            throws RowsExceededException, WriteException
    {
        // 插入图像
        WritableSheet imgSheet;
        if((wwb.getSheets()).length < 2)
        {
            imgSheet = wwb.createSheet("图表", 1);
        } else
        {
            imgSheet = wwb.getSheet(1);
        }
       
        for (int i = 0; i < vecImg.size(); i++)
        {
            ChartImg chart = (ChartImg) vecImg.get(i);
            // 插入图像标题
            Label lbl = new Label(0, 2 + 20 * i, chart.getImgTitle());
            WritableFont font = new WritableFont(WritableFont.ARIAL,
                    WritableFont.DEFAULT_POINT_SIZE, WritableFont.NO_BOLD, false,
                    UnderlineStyle.NO_UNDERLINE, Colour.DARK_BLUE2);
            WritableCellFormat background = new WritableCellFormat(font);
            background.setWrap(true);
            background.setBackground(Colour.GRAY_25);
            imgSheet.mergeCells(0, 2 + 20 * i, 9, 2 + 20 * i);
            lbl.setCellFormat(background);
            imgSheet.addCell(lbl);
            // 插入图像单元格
            insertImgCell(imgSheet, 2, 4 + 20 * i, 8, 15, chart.getImgName());
        }
    }

    /**
     * 插入图像到单元格(图像格式只支持png)
     * @param dataSheet WritableSheet : 工作表
     * @param col int : 列
     * @param row int : 行
     * @param width int : 宽
     * @param height int : 高
     * @param imgName String : 图像的全路径
     * @throws RowsExceededException
     * @throws WriteException
     */
    private void insertImgCell(WritableSheet dataSheet, int col, int row, int width,
            int height, String imgName) throws RowsExceededException, WriteException
    {
        File imgFile = new File(imgName);
        WritableImage img = new WritableImage(col, row, width, height, imgFile);
        dataSheet.addImage(img);
    }
   
    /**
     * 测试
     * @param args
     */
    public static void main(String[] args)
    {
        XLSDemo demo = new XLSDemo();
        demo.makeXls();
    }
}

14:42 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它
10月12日
如何连接两台Oracle服务器
软件环境:
 
1、Windows NT4.0+ORACLE 8.0.4
2、ORACLE安装路径为:C:/ORANT
3、服务器A、服务器B,均装有NT 4.0中文版

实现方法:

1. 假设A地址192.1.1.1,B地址192.1.1.2

2. A、B上配置好TCP/IP,互相Ping通。

3. 配置init.ora文件,若global_name = true的话,database link 的名字必须同远程机的实例名相同,

  为简便起见,请将global_name 设为 false。

4. 在服务器上配置tnsnames.ora,将Remote机器的地址(IP)信息加入本地的tnsnames.ora

  A服务器:
  TNSA_B =
   (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS =
       (COMMUNITY = tcp.world)
       (PROTOCOL = TCP)
       (Host = 192.1.1.2)
       (Port = 1521)
      )
    )
    (CONNECT_DATA = (SID = ORCL)
    )
   )

  B服务器:
  TNSB_A =
   (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS =
       (COMMUNITY = tcp.world)
       (PROTOCOL = TCP)
       (Host = 192.1.1.1)
       (Port = 1521)
      )
    )
    (CONNECT_DATA = (SID = ORCL)
    )
   )

5. 在 SQL*Plus 或其它工具中创建数据库链接

  A服务器:create public database link A_TO_B connect to tmp identified by tmp using 'TNSA_B';

  B服务器:create public database link B_TO_A connect to tmp identified by tmp using 'TNSB_A';

  说明:
  tmp是一个临时用户,A服务器、B服务器上均有,它的作用是提供链接的目的地,
  假如:
  B服务器上有user1、user2、tmp三个用户,user1和user2把他们想要对外公开的表的权限授给tmp用户,
  那么,所有能通过database link连接到tmp用户上的人就可以直接访问user1、user2上的已授权表了。

6. 建立database link以后,请用这种格式select * from table_name@database_link_name 的方式访问

  如:在A服务器上想访问B服务器上user1用户table1表的内容(A到B的连接为A_TO_B),则

  SQL> select * from table1@A_TO_B;

 

7. 如果Oracle版本为7.3,则数据库联接写法如下:

  A服务器:create public database link A_TO_B connect to tmp identified by tmp using 't:192.1.1.2:orcl';

  B服务器:create public database link B_TO_A connect to tmp identified by tmp using 't:192.1.1.1:orcl';

4:28 | 添加评论 | 固定链接 | 引用通告 (2) | 记录它
9月2日
不错的几个js判断(判断汉字字数等)
不错的几个js判断(判断汉字字数等)
星期六, 25th 9月 2004


今天周末,在公司加班,碰到一个用js判断汉字字数的东东,觉得比较好,就先收藏了。

//****************************************************************
//* 名  称:DataLength
//* 功    能:计算数据的长度
//* 入口参数:fData:需要计算的数据
//* 出口参数:返回fData的长度(Unicode长度为2,非Unicode长度为1)
//*****************************************************************
function DataLength(fData)
{
    var intLength=0
    for (var i=0;i<fData.length;i++)
    {
        if ((fData.charCodeAt(i) < 0) || (fData.charCodeAt(i) > 255))
            intLength=intLength+2
        else
            intLength=intLength+1   
    }
    return intLength
}

 

//****************************************************************
//* 名  称:DataLength
//* 功    能:计算数据的长度
//* 入口参数:fData:需要计算的数据
//* 出口参数:返回fData的长度(Unicode长度为2,非Unicode长度为1)
//*****************************************************************
function DataLength(fData)
{
    var intLength=0
    for (var i=0;i<fData.length;i++)
    {
        if ((fData.charCodeAt(i) < 0) || (fData.charCodeAt(i) > 255))
            intLength=intLength+2
        else
            intLength=intLength+1   
    }
    return intLength
}

//****************************************************************
//* 名  称:IsEmpty
//* 功    能:判断是否为空
//* 入口参数:fData:要检查的数据
//* 出口参数:True:空                             
//*           False:非空
//*****************************************************************
function IsEmpty(fData)
{
    return ((fData==null) || (fData.length==0) )
}


//****************************************************************
//* 名  称:IsDigit
//* 功    能:判断是否为数字
//* 入口参数:fData:要检查的数据
//* 出口参数:True:是0到9的数字                             
//*           False:不是0到9的数字
//*****************************************************************
function IsDigit(fData)
{
    return ((fData>="0") && (fData<="9"))
}


//****************************************************************
//* 名  称:IsInteger
//* 功    能:判断是否为正整数
//* 入口参数:fData:要检查的数据
//* 出口参数:True:是整数,或者数据是空的                           
//*           False:不是整数
//*****************************************************************
function IsInteger(fData)
{
    //如果为空,返回true
    if (IsEmpty(fData))
        return true
    if ((isNaN(fData)) || (fData.indexOf(".")!=-1) || (fData.indexOf("-")!=-1))
        return false   
   
    return true   
}

//****************************************************************
//* 名  称:IsEmail
//* 功    能:判断是否为正确的Email地址
//* 入口参数:fData:要检查的数据
//* 出口参数:True:正确的Email地址,或者空                             
//*           False:错误的Email地址
//*****************************************************************
function IsEmail(fData)
{
    if (IsEmpty(fData))
        return true
    if (fData.indexOf("@")==-1)
        return false
    var NameList=fData.split("@");
    if (NameList.length!=2)
        return false 
    if (NameList[0].length<1 )
        return false  
    if (NameList[1].indexOf(".")<=0)
        return false
    if (fData.indexOf("@")>fData.indexOf("."))
 return false
    if (fData.indexOf(".")==fData.length-1)
 return false
   
    return true   
}

//****************************************************************
//* 名  称:IsPhone
//* 功    能:判断是否为正确的电话号码(可以含"()"、"()"、"+"、"-"和空格)
//* 入口参数:fData:要检查的数据
//* 出口参数:True:正确的电话号码,或者空                             
//*           False:错误的电话号码
//* 错误信息:
//*****************************************************************
function IsPhone(fData)
{
    var str;
    var fDatastr="";
    if (IsEmpty(fData))
        return true
    for (var i=0;i<fData.length;i++)
    {
        str=fData.substring(i,i+1);
        if (str!="(" && str!=")" && str!="(" && str!=")" && str!="+" && str!="-" && str!=" ")
           fDatastr=fDatastr+str;
    } 
    //alert(fDatastr); 
    if (isNaN(fDatastr))
        return false
    return true   
}

//****************************************************************
//* 名  称:IsPlusNumeric
//* 功    能:判断是否为正确的正数(可以含小数部分)
//* 入口参数:fData:要检查的数据
//* 出口参数:True:正确的正数,或者空                             
//*           False:错误的正数
//* 错误信息:
//*****************************************************************
function IsPlusNumeric(fData)
{
    if (IsEmpty(fData))
        return true
    if ((isNaN(fData)) || (fData.indexOf("-")!=-1))
        return false
    return true   
}

//****************************************************************
//* 名  称:IsNumeric
//* 功    能:判断是否为正确的数字(可以为负数,小数)
//* 入口参数:fData:要检查的数据
//* 出口参数:True:正确的数字,或者空                             
//*           False:错误的数字
//* 错误信息:
//*****************************************************************
function IsNumeric(fData)
{
    if (IsEmpty(fData))
        return true
    if (isNaN(fData))
        return false
       
    return true   
}


//****************************************************************
//* 名  称:IsIntegerInRange
//* 功    能:判断一个数字是否在指定的范围内
//* 入口参数:fInput:要检查的数据
//*           fLower:检查的范围下限,如果没有下限,请用null
//*           fHigh:检查的上限,如果没有上限,请用null
//* 出口参数:True:在指定的范围内                             
//*           False:超出指定范围
//*****************************************************************
function IsIntegerInRange(fInput,fLower,fHigh)
{
    if (fLower==null)
        return (fInput<=fHigh)
    else if (fHigh==null)
        return (fInput>=fLower)
    else        
        return ((fInput>=fLower) && (fInput<=fHigh))
}

10:27 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它
JSP内建对象
① out - javax.servlet.jsp.jspWriter
   out对象用于把结果输出到网页上。

方法:
1. void clear() ;
   清除输出缓冲区的内容,但是不输出到客户端。

2. void clearBuffer() ;
   清除输出缓冲区的内容,并输出到客户端。

3. void close() ;
   关闭输出流,清除所有内容。

4. void flush() ;
   输出缓冲区里面的数据。

5. int getBufferSize() ;
   获取以kb为单位的目前缓冲区大小。

6. int getRemaining() ;
   获取以kb为单位的缓冲区中未被占用的空间大小。

7. boolean isAutoFlush() ;
   是否自动刷新缓冲区。

8. void newLine() ;
   输出一个换行字符。

9. void print( boolean b ) ;
   void print( char c ) ;
   void print( char[] s ) ;
   void print( double d ) ;
   void print( float f ) ;
   void print( int i ) ;
   void print( long l ) ;
   void print( Object obj ) ;
   void print( String s ) ;
   将指定类型的数据输出到Http流,不换行。

10. void println( boolean b ) ;
    void println( char c ) ;
    void println( char[] s ) ;
    void println( double d ) ;
    void println( float f ) ;
    void println( int i ) ;
    void println( long l ) ;
    void println( Object obj ) ;
    void println( String s ) ;
    将指定类型的数据输出到Http流,并输出一个换行符。
   
11. Appendable append( char c ) ;
    Appendable append( CharSequence cxq, int start, int end ) ;
    Appendable append( CharSequence cxq ) ;
    将一个字符或者实现了CharSequence接口的对象添加到输出流的后面。

成员:
int DEFAULT_BUFFER = 0    - 缺省缓冲区大小
int NO_BUFFER = -1        - writer是否处于缓冲输出状态
int UNBOUNDED_BUFFER = -2 - 是否限制缓冲区大小


② request - javax.servlet.http.HttpServletRequest
   request对象包含所有请求的信息,如请求的来源、标头、cookies和请求相关的参数值等。

方法:
1. Object getAttribute( String name ) ;
   返回由name指定的属性值,该属性不存在时返回null。

2. Enumeration getAttributeNames() ;
   返回request对象的所有属性名称的集合。

3. String getAuthType() ;
   返回用来保护servlet的认证方法的名称,未受保护时返回null。

4. String getCharacterEncoding() ;
   返回请求中的字符编码方法,可以在response对象中设置。

5. int getContentLength() ;
   返回请求的BODY的长度,不能确定长度时返回-1。可以在response中设置。

6. String getContentType() ;
   返回在response中定义的内容类型。

7. String getContentPath() ;
   返回请求的路径。

8. Cookie[] getCookies() ;
   返回客户端所有的Cookie的数组。

9. Enumeration getHeaderNames() ;
   返回所有HTTP头的名称的集合。

10. Enumeration getHeaders( String name ) ;
    返回指定HTTP头的所有值的集合。

11. String getHeader( String name ) ;
    返回指定名称的HTTP头的信息。

12. long getDateHeader( String name ) ;
    返回指定名称的Data类型的HTTP头的信息。

13. int getIntHeader( String name ) ;
    返回指定名称的Int类型的HTTP头的信息。

14. ServletInputStream getInputStream() ;
    返回请求的输入流。

15. Locale getLocale() ;
    返回当前页的Locale对象,可以在response中设定。

16. Enumeration getLocales() ;
    返回请求中所有的Locale对象的集合。

17. String getLocalName() ;
    获取响应请求的服务器端主机名。

18. String getLocalAddr() ;
    获取响应请求的服务器端地址。

19. int getLocalPort() ;
    获取响应请求的服务器端端口

20. String getMethod() ;
    获取客户端向服务器端发送请求的方法(GET、POST)。

21. String getParameter( String name ) ;
    获取客户端发送给服务器端的参数值。

22. Map getParameterMap() ;
    该方法返回包含请求中所有参数的一个Map对象。

23. Enumeration getParameterNames() ;
    返回请求中所有参数的集合。

24. String[] getParameterValues( String name ) ;
    获得请求中指定参数的所有值。

25. String getQueryString() ;
    返回get方法传递的参数字符串,该方法不分解出单独的参数。

26. String getPathInfo() ;
    取出请求中处于ServletPath和QueryString之间的额外信息。

27. String getPathTranslated() ;
    返回用getPathInfo()方法取得的路径信息的实际路径。

28. String getProtocol() ;
    返回请求使用的协议。可以是HTTP1.1或者HTTP1.0。

29. BufferedReader getReader() ;
    返回请求的输入流对应的Reader对象,该方法和getInputStream()方法在一个页面中只能调用一个。

30. String getRemoteAddr() ;
    获取发出请求的客户端IP地址。

31. String getRemoteHost() ;
    获取发出请求的客户端主机名

32. String getRemoteUser() ;
    返回经过客户端验证的用户名,未经验证返回null。

33. int getRemotePort() ;
    返回发出请求的客户端主机端口。

34. String getRealPath( String path ) ;
    返回给定虚拟路径的物理路径。

35. RequestDispatcher getRequestDispatcher( String path ) ;
    按给定的路径生成资源转向处理适配器对象。

36. String getRequestedSessionId() ;
    返回请求的session的标识。

37. String RequestURI() ;
    返回发出请求的客户端地址,但是不包括请求的参数字符串。

38. StringBuffer getRequestURI() ;
    返回响应请求的服务器端地址

39. String getScheme() ;
    获取协议名称,缺省值为HTTP协议。

40. String getServerName() ;
    返回响应请求的服务器名称。

41. String getServletPath() ;
    获取客户端所请求的脚本文件的文件路径。

42. int getServerPort() ;
    获取响应请求的服务器端主机端口号。

43. void removeAttribute( String name ) ;
    在属性列表中删除指定名称的属性。

44. void setAttribute( String name, Object value ) ;
    在属性列表中添加/删除指定的属性。

45. void setCharacterEncoding( String name ) ;
    设置请求的字符编码格式。

46. HttpSession getSession() ;
    HttpSession getSession( boolean create ) ;
    获取session,如果create为true,在无session的情况下创建一个。
   
47. boolean isRequestedSessionIdFromCookie() ;
    检查请求的会话ID是否为通过Cookie传入。

48. boolean isRequestedSessionIdFromURL() ;
    检查请求的会话ID是否为通过URL传入。

49. boolean isRequestedSessionIdValid() ;
    检查请求的会话ID是否仍然有效。

50. boolean isSecure() ;
    检查请求是否使用安全链接,如果HTTPS等。

51. boolean isUserInRole( String role ) ;
    检查已经通过验证的用户是否在是role所指定的角色。

52. Principal getUserPrincipal() ;
    返回包含用户登陆名的一个java.security.Principal对象。

成员:
String BASIC_AUTH = "BASIC"             -
String CLIENT_CERT_AUTH = "CLIENT_CERT" -
String DIGEST_AUTH = "DIGEST"           -
String FORM_AUTH = "FORM"               -


③ response - javax.servlet.http.HttpServletResponse
   response对象主要将JSP容器处理后的结果传回到客户端。

方法:
1. void addCookie( Cookie cookie ) ;
   添加一个Cookie对象,保存客户端信息。

2. void addDateHeader( String name, long value ) ;
   添加一个日期类型的HTTP头信息,覆盖同名的HTTP头信息。

3. void addHeader( String name, String value ) ;
   添加一个HTTP头,覆盖同名的旧HTTP头。

4. void addIntHeader( String name, int value ) ;
   添加一个整型的HTTP头,覆盖同名的旧HTTP头。

5. boolean containsHeader( String name ) ;
   判断指定的HTTP头是否存在。

6. String encodeRedirectURL( String url ) ;
   对sendRedirect()方法使用的URL进行编码。

7. String encodeURL( String url ) ;
   将URL予以编码,回传包含session ID的URL。
  
8. void flushBuffer() ;
   强制把当前缓冲区的内容发送到客户端。

9. int getBufferSize() ;
   取得以kb为单位的缓冲区大小。

10. String getCharacterEncoding() ;
    获取响应的字符编码格式。

11. String getContentType() ;
    获取响应的类型。

12. Locale getLocale() ;
    获取响应的Locale对象。

13. ServletOutputStream getOutputStream() ;
    返回客户端的输出流对象。

14. PrintWriter getWriter() ;
    获取输出流对应的writer对象。

15. boolean isCommitted() ;
    判断服务器端是否已经将数据输出到客户端。

16. void reset() ;
    清空buffer中的所有内容。

17. void resetBuffer() ;
    情况buffer中所有的内容,但是保留HTTP头和状态信息。

18. void sendError( int xc, String msg ) ;
    void sendError( int xc ) ;
    发送错误,包括状态码和错误信息。

19. void sendRedirect( String locationg ) ;
    把响应发送到另外一个位置进行处理。

20. void setBufferSize( int size ) ;
    设置以kb为单位的缓冲区大小。

21. void setCharacterEncoding( String charset ) ;
    设置响应使用的字符编码格式。

22. void setContentLength( int length ) ;
    设置响应的BODY长度。

23. void setContentType( String type ) ;
    设置响应的类型。

24. void setDateHeader( String name, long value ) ;
    设置指定名称的Data类型的HTTP头的值。

25. void setHeader( String name, String value ) ;
    设置指定名称的HTTP头的值。

26. void setIntHeader( String name, int value ) ;
    设置指定名称的int类型的HTTP头的值。

27. void setStatus( int xc ) ;
    设置响应状态码,新值会覆盖当前值。

成员(HTTP状态码):
int SC_CONTINUE = 100                      int SC_SWITCHING_PROTOCOLS = 101
int SC_OK = 200                            int SC_NON_AUTHORITATIVE_INFORMATION = 203
int SC_ACCEPTED = 202                      int SC_CREATED = 201
int SC_NO_CONTENT = 204                    int SC_RESET_CONTENT = 205
int SC_PARTIAL_CONTENT = 206               int SC_MULTIPLE_CHOICES = 300
int SC_MOVED_PERMANENTLY = 301             int SC_MOVED_TEMPORARILY = 302
int SC_FOUND = 302                         int SC_SEE_OTHER = 303
int SC_NOT_MODIFIED = 304                  int SC_USE_PROXY = 305
int SC_TEMPORARY_REDIRECT = 307            int SC_BAD_REQUEST = 400
int SC_UNAUTHORIZED = 401                  int SC_PAYMENT_REQUIRED = 402
int SC_FORBIDDEN = 403                     int SC_NOT_FOUND = 404
int SC_METHOD_NOT_ALLOWED = 405            int SC_NOT_ACCEPTABLE = 406
int SC_PROXY_AUTHENTICATION_REQUIRED = 407 int SC_REQUEST_TIMEOUT = 408
int SC_CONFLICT = 409                      int SC_GONE = 410
int SC_LENGTH_REQUIRED = 411               int SC_PRECONDITION_FAILED = 412
int SC_REQUEST_ENTITY_TOO_LARGE = 413      int SC_REQUEST_URI_TOO_LONG = 414
int SC_UNSUPPORTED_MEDIA_TYPE = 415        int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416
int SC_EXPECTATION_FAILED = 417            int SC_INTERNAL_SERVER_ERROR = 500
int SC_NOT_IMPLEMENTED = 501               int SC_BAD_GATEWAY = 502
int SC_SERVICE_UNAVAILABLE = 503           int SC_GATEWAY_TIMEOUT = 504
int SC_HTTP_VERSION_NOT_SUPPORTED = 505


④ session - javax.servlet.http.HttpSession
   session对象表示目前个别用户的会话状态,用来识别每个用户。

方法:
1. Object getAttribute( String name ) ;
   获取与指定名字相关联的session属性值。

2. Enumeration getAttributeNames() ;
   取得session内所有属性的集合。

3. long getCreationTime() ;
   返回session的创建时间,最小单位千分之一秒。

4. String getId() ;
   取得session标识。

5. long getLastAccessedTime() ;
   返回与当前session相关的客户端最后一次访问的时间,由1970-01-01算起,单位毫秒。

6. int getMaxInactiveInterval( int interval ) ;
   返回总时间,以秒为单位,表示session的有效时间(session不活动时间)。-1为永不过期。

7. ServletContext getServletContext() ;
   返回一个该JSP页面对应的ServletContext对象实例。

8. HttpSessionContext getSessionContext() ;
  

9. Object getValue( String name ) ;
   取得指定名称的session变量值,不推荐使用。

10. String[] getValueNames() ;
    取得所有session变量的名称的集合,不推荐使用。

11. void invalidate() ;
    销毁这个session对象。

12. boolean isNew() ;
    判断一个session是否由服务器产生,但是客户端并没有使用。

13. void pubValue( String name, Object value ) ;
    添加一个session变量,不推荐使用。

14. void removeValue( String name ) ;
    移除一个session变量的值,不推荐使用。

15. void setAttribute( String name, String value ) ;
    设置指定名称的session属性值。

16. void setMaxInactiveInterval( int interval ) ;
    设置session的有效期。

17. void removeAttribute( String name ) ;
    移除指定名称的session属性。


⑤ pageContext - javax.servlet.jsp.PageContext
   pageContext对象存储本JSP页面相关信息,如属性、内建对象等。

方法:
1. void setAttribute( String name, Object value, int scope ) ;
   void setAttribute( String name, Object value ) ;
   在指定的共享范围内设置属性。

2. Object getAttribute( String name, int scope ) ;
   Object getAttribute( String name ) ;
   取得指定共享范围内以name为名字的属性值。

3. Object findAttribute( String name ) ;
   按页面、请求、会话和应用程序共享范围搜索已命名的属性。

4. void removeAttribute( String name, int scope ) ;
   void removeAttribute( String name ) ;
   移除指定名称和共享范围的属性。

5. void forward( String url ) ;
   将页面导航到指定的URL。

6. Enumeration getAttributeNamesScope( int scope ) ;
   取得指定共享范围内的所有属性名称的集合。

7. int getAttributeScope( String name ) ;
   取得指定属性的共享范围。

8. ErrorData getErrorDate() ;
   取得页面的errorData对象。

9. Exception getException() ;
   取得页面的exception对象。

10. ExpressionEvaluator getExpressionEvaluator() ;
    取得页面的expressionEvaluator对象。

11. JspWriter getOut() ;
    取得页面的out对象。

12. Object getPage() ;
    取得页面的page对象。

13. ServletRequest getRequest() ;
    取得页面的request对象。

14. ServletResponse getResponse() ;
    取得页面的response对象。

15. ServletConfig getConfig() ;
    取得页面的config对象。

16. ServletContext getServletContext() ;
    取得页面的servletContext对象。

17. HttpSession getSession() ;
    取得页面的session对象。

18. VariableResolver getVariableResolver() ;
    取得页面的variableResolver对象。

19. void include( String url, boolean flush ) ;
    void include( String url ) ;
    包含其他的资源,并指定是否自动刷新。

20. void release() ;
    重置pageContext内部状态,释放所有内部引用。

21. void initialize( Servlet servlet, ServletRequest request, ServletResponse response,
                     String errorPageURL, boolean needSession, int bufferSize, boolean autoFlush ) ;
    初始化未经初始化的pageContext对象。

22. BodyContext pushBody() ;
    BodyContext pushBody( Writer writer ) ;
    保存当前的out对象,并更新pageContext中page范围内的out对象。

23. JspWrite popBody() ;
    取出由pushBody()方法保存的out对象。

24. void handlePageException( Exception e ) ;
    void handlePageException( Thrwoable t ) ;
   

成员:
int PAGE_SCOPE = 1        - 页面共享范围
int REQUEST_SCOPE = 2     - 请求共享范围
int SESSION_SCOPE = 3     - 会话共享范围
int APPLICATION_SCOPE = 4 - 应用程序共享范围
String PAGE = "javax.servlet.jsp.jspPage"
String PAGECONTEXT = "javax.servlet.jsp.jspPageContext"
String REQUEST = "javax.servlet.jsp.jspRequest"
String RESPONSE = "javax.servlet.jsp.jspResponse"
String CONFIG = "javax.servlet.jsp.jspConfig"
String SESSION = "javax.servlet.jsp.jspSession"
String OUT = "javax.servlet.jsp.jspOut"
String APPLICATION = "javax.servlet.jsp.jspApplication"
String EXCEPTION = "javax.servlet.jsp.jspException"


⑥ application - javax.servlet.ServletContext
   application主要功用在于取得或更改Servlet的设定。

方法:
1. Object getAttribute( String name ) ;
   返回由name指定的application属性。

2. Enumeration getAttributes() ;
   返回所有的application属性。

3. ServletContext getContext( String uripath ) ;
   取得当前应用的ServletContext对象。

4. String getInitParameter( String name ) ;
   返回由name指定的application属性的初始值。

5. Enumeration getInitParameters() ;
   返回所有的application属性的初始值的集合。

6. int getMajorVersion() ;
   返回servlet容器支持的Servlet API的版本号。

7. String getMimeType( String file ) ;
   返回指定文件的类型,未知类型返回null。一般为"text/html"和"image/gif"。

8. int getMinorVersion() ;
   返回servlet容器支持的Servlet API的副版本号。

9. String getRealPath( String path ) ;
   返回给定虚拟路径所对应物理路径。

10. RequestDispatcher getNamedDispatcher( String name ) ;
    为指定名字的Servlet对象返回一个RequestDispatcher对象的实例。

11. RequestDispatcher getRequestDispatcher( String path ) ;
    返回一个RequestDispatcher对象的实例。

12. URL getResource( String path ) ;
    返回指定的资源路径对应的一个URL对象实例,参数要以"/"开头。

13. InputStream getResourceAsStream( String path ) ;
    返回一个由path指定位置的资源的InputStream对象实例。

14. Set getResourcePaths( String path ) ;
    返回存储在web-app中所有资源路径的集合。

15. String getServerInfo() ;
    取得应用服务器版本信息。

16. Servlet getServlet( String name ) ;
    在ServletContext中检索指定名称的servlet。

17. Enumeration getServlets() ;
    返回ServletContext中所有servlet的集合。

18. String getServletContextName() ;
    返回本web应用的名称。

19. Enumeration getServletContextNames() ;
    返回ServletContext中所有servlet的名称集合。

20. void log( Exception ex, String msg ) ;
    void log( String msg, Throwable t ) ;
    void log( String msg ) ;
    把指定的信息写入servlet log文件。

21. void removeAttribute( String name ) ;
    移除指定名称的application属性。

22. void setAttribute( String name, Object value ) ;
    设定指定的application属性的值。


⑦ config - javax.servlet.ServletConfig
   config对象用来存放Servlet初始的数据结构。

方法:
1. String getInitParameter( String name ) ;
   返回名称为name的促使参数的值。

2. Enumeration getInitParameters() ;
   返回这个JSP所有的促使参数的名称集合。

3. ServletContext getContext() ;
   返回执行者的servlet上下文。

4. String getServletName() ;
   返回servlet的名称。


⑧ exception - java.lang.Throwable
   错误对象,只有在JSP页面的page指令中指定isErrorPage="true"后,才可以在本页面使用exception对象。

方法:
1. Throwable fillInStackTrace() ;
   将当前stack信息记录到exception对象中。

2. String getLocalizedMessage() ;
   取得本地语系的错误提示信息。

3. String getMessage()
   取得错误提示信息。

4. StackTrackElement[] getStackTrace() ;
   返回对象中记录的call stack track信息。

5. Throwable initCause( Throwable cause ) ;
   将另外一个异常对象嵌套进当前异常对象中。
  
6. Throwable getCause() ;
   取出嵌套在当前异常对象中的异常。

7. void printStackTrace() ;
   void printStackTrace( printStream s ) ;
   void printStackTrace( printWriter s ) ;
   打印出Throwable及其call stack trace信息。

8. void setStackTrace( StackTraceElement[] stackTrace )
   设置对象的call stack trace信息。


⑨ page - javax.servlet.jsp.HttpJspPage
   page对象代表JSP对象本身,或者说代表编译后的servlet对象,
   可以用( (javax.servlet.jsp.HttpJspPage)page )来取用它的方法和属性。
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值