2009年4月21日

iframe高度自动调整(通过IE,firefox,opera测试)

1.index.html
    <iframe id="mainIframe" scrolling="no" frameborder="0" width="100%" src="a.html"></iframe>
    <a href="#" onclick="page('a.html')">a页面</a><a href="#" onclick="page('b.html')">b页面</a>

2 a.html  //内嵌页面
    <script language="javascript">
          changeHight();
    </script>

3. b.html  //内嵌页面
     <script language="javascript">
          changeHight();
    </script>

4. page.js
 function changeHight(){
  var iFrm = parent.document.getElementById("mainIframe");
     var subWeb = iFrm.contentDocument;
     if(subWeb){
    if (subWeb.body.scrollHeight>480)
   iFrm.height = subWeb.body.scrollHeight+20;
  else
      iFrm.height=500;
  } 
  if(top.document.frames["mainIframe"].document && window.document.body.scrollHeight!="0"){
   parent.document.getElementById("mainIframe").style.height=window.document.body.scrollHeight;
  }
  if(top.document.frames["mainIframe"].document && window.document.body.scrollHeight=="0"){
   parent.document.getElementById("mainIframe").style.height=500;
  }
}

function page(page){
    document.getElementById("mainIframe").src=page;
}



造成IE,FireFox,Opera中Iframe显示差异原因在于
1.iframe在FireFox中取法为parent.document.getElementById("mainIframe").contentDocument,而在ie,opera中为parent.document.getElementById("mainIframe").document
2.当页面无滚动时,window.document.body.scrollHeight在IE中能取到,fireFox和Opera中取不到。

posted @ 2009-04-21 14:05 software5168 阅读(1260) | 评论 (0)编辑 收藏

2009年2月26日

文件上传下载

     摘要: 1.myapp/index.html <html> <head> 文件操作 <iframe id="iframefile" scrolling="no" frameborder="0" width="100%" src="/myapp/fileUpload.jsp"></iframe> &l...  阅读全文

posted @ 2009-02-26 17:11 software5168 阅读(284) | 评论 (0)编辑 收藏

2007年8月9日

如何控制单选、复选、列表框

一些频繁使用的javascript页面控制,做个总结。
下面是部分代码。
<html>
<head>
<script language="javascript">
 function a(){
  window.document.getElementsByName("dx")[0].checked=true;
 }
 function b(){
  window.document.getElementsByName("dx")[0].checked=false;
 }
 function c(){
  window.document.getElementsByName("fx")[0].checked=true;
 }
 function d(){
  window.document.getElementsByName("fx")[0].checked=false;
 }
 function e(){
  for(i=0;i<window.document.getElementsByName("fx").length;i++){
      if(!window.document.getElementsByName("fx")[i].checked){
       window.document.getElementsByName("fx")[i].checked=true;
      }
     }
 }
 function f(){
  for(i=0;i<window.document.getElementsByName("fx").length;i++){
      if(window.document.getElementsByName("fx")[i].checked){
       window.document.getElementsByName("fx")[i].checked=false;
      }
     }
 }
 function g(){
  window.document.getElementById("lbka")[1].selected=true;
 }
 function h(){
  alert("选择号为:"+window.document.getElementById("lbka").selectedIndex + "    值为:" +window.document.getElementById("lbka")[window.document.getElementById("lbka").selectedIndex].value+"    文本值为:" + window.document.getElementById("lbka")[window.document.getElementById("lbka").selectedIndex].text);
 }
 function m(){
  sel = false;
  var val="";
     for(i=0;i<window.document.getElementsByName("dx").length;i++){
      if(window.document.getElementsByName("dx")[i].checked){
       val = window.document.getElementsByName("dx")[i].value;
       sel=true;
    break;
      }  
     }
    if(sel){
   alert("单选值为:"+val);
     
     }else{
   alert("请选择文件");
      return false;
  }  
 }
 function j(){
  var sel = false;
  var val="";
     for(i=0;i<window.document.getElementsByName("fx").length;i++){
      if(window.document.getElementsByName("fx")[i].checked){
       if(val==""){
        val=window.document.getElementsByName("fx")[i].value;
       }else{
        val = val + "," +window.document.getElementsByName("fx")[i].value;
       } 
      }
     }
     if(val==""){
      alert("请选择文件");
      return false;
     }else{
   alert("复选值为:"+val);
  }
 }
</script>
</head>
<body>
<table id="table1" width="100%"  border="1" align="center" cellpadding="0" cellspacing="0">
 <tr>
  <td>文件</td>
  <td>列表框</td>
  <td>单选</td>
  <td>复选</td>
 </tr>
 <tr>
  <td>文件A</td>
  <td><select name="lbka"><option value="lbka1">文件A1</option><option value="lbka2">文件A2</option></select></td>
  <td><input type="radio" name="dx" value="dxa"></td>
  <td><input type="checkbox" name="fx" value="fxa"></td>
 </tr>
 <tr>
  <td>文件B</td>
  <td><select name="lbkb"><option value="lbkb1">文件B1</option><option value="lbkb2">文件B2</option></select></td>
  <td><input type="radio" name="dx" value="dxb"></td>
  <td><input type="checkbox" name="fx" value="fxb"></td>
 </tr>
 <tr>
  <td colspan="4">
   <a href="#" onclick="a();">单选A选中</a>
   <a href="#" onclick="b();">单选A不选中</a>
   <a href="#" onclick="c();">复选A选中</a>
   <a href="#" onclick="d();">复选A不选中</a>
   <a href="#" onclick="e();">复选全选</a>
   <a href="#" onclick="f();">复选全不选</a>
   <a href="#" onclick="g();">选中列表框文件A2</a>
   <a href="#" onclick="h();">取得选中列表框A的值,文本</a>
   <a href="#" onclick="m();">判断单选选择</a>
   <a href="#" onclick="j();">判断复选选择</a>
  </td>
 </tr>
</table>
</body>
</html>

posted @ 2007-08-09 09:17 software5168 阅读(1062) | 评论 (0)编辑 收藏

2007年8月8日

如何动态控制表单元素

主要通过javascript实现,理解IE的DOM结构,并调用元素的固定方法,可以实现表单元素的动态增删。
下面是部分代码。
<html>
<head>
<script language="javascript">
 function add(){
  //取得表格
  var table = document.getElementById("table1");
  //取得行数;
  var num = table.rows.length;
  //增加一行
  var newrow1 = table.insertRow(num-1);
  var cell1 = newrow1.insertCell();
     var cell2 = newrow1.insertCell();
     var cell3 = newrow1.insertCell();
     var cell4 = newrow1.insertCell();
  //增加行元素
  var inputcell2 = document.createElement("<input size='32' name=''>");
     cell2.appendChild(inputcell2);
  var inputcell4_1 = document.createElement("<input size='32' name=''>");
  var inputcell4_2 = document.createElement("<input type='button' value='删除元素'onClick='del(this);'/>");
     cell4.appendChild(inputcell4_1);
  cell4.appendChild(inputcell4_2);
  //刷新标签显示
  frash();
 }
 function del(obj){
  //取得按钮所在行
  var i = obj.parentNode.parentNode.rowIndex;
      var tab = document.getElementById("table1");
      //删除按钮所在行
  tab.deleteRow(i-1); 
      frash();
 }
 function frash(){
  var table = document.getElementById("table1");
     var num = table.rows.length;
     //计算动态元素个数
  var n = num-2;
     for(i=1;i<=n;i++){
   //设置标签值
      table.rows[i].cells[0].innerText="元素"+i+"属性A";
      //设置属性值
   table.rows[i].cells[1].childNodes[0].setAttribute("name","ysa"+i);
      table.rows[i].cells[2].innerText="元素"+i+"属性B";
      table.rows[i].cells[3].childNodes[0].setAttribute("name","ysb"+i);
     }
 }
</script>
</head>
<body>
<table id="table1" width="100%"  border="1" align="center" cellpadding="0" cellspacing="0">
 <tr>
  <td>标签1</td>
  <td><input name="a"></td>
  <td>标签2</td>
  <td><input name="b"></td>
 </tr>
 <tr>
  <td colspan="4" align="center"><a href="#" onclick="add();">增加元素</a></td>
 </tr>
</table>
</body>
</html>

posted @ 2007-08-08 16:11 software5168 阅读(647) | 评论 (0)编辑 收藏

如何实现页面打印

页面打印通常直接调用IE中打印命令,并通过class控制打印范围。当页面文件内容过多,无法完整打印时,可以通过javascript控制缩放实现完整打印。
下面是部分代码。
<html>
<head>
<title>***上海市眼病防治中心病人结帐费用报表***</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<!--media=print 这个属性可以在打印时有效-->
<style media=print>
.Noprint{display:none;}
.PageNext{page-break-after: always;}
</style>
<style>
body,td,th
{
font-size: 12px;
}
.tdp
{
border-bottom: 1 solid #000000;
border-left: 1 solid #000000;
border-right: 0 solid #ffffff;
border-top: 0 solid #ffffff;
}
.tabp
{
border-color: #000000;

border-collapse:collapse;
}
.NOPRINT {
font-family: "宋体";
font-size: 12px;
}

</style>
<script language="javascript">
  var i=0;
       function zoomL(){
      i++;
      document.getElementById("f").style.zoom=1+i/3;
  }
       function zoomS(){
      i--;
      document.getElementById("f").style.zoom=1+i/3;
  }
</script>
</head>

<body >
<OBJECT id=WebBrowser classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 width=0 VIEWASTEXT> </OBJECT>
<input type=button value=打印 onclick="document.all.WebBrowser.ExecWB(6,1)" class="NOPRINT">
<input type=button value=直接打印 onclick="document.all.WebBrowser.ExecWB(6,6)" class="NOPRINT">
<input type=button value=页面设置 onclick="document.all.WebBrowser.ExecWB(8,1)" class="NOPRINT">
<input type=button value=打印预览 onclick="document.all.WebBrowser.ExecWB(7,1)" class="NOPRINT">
<input type=button value=放大 onclick="zoomL();" class="NOPRINT">
<input type=button value=缩小 onclick="zoomS();" class="NOPRINT">
<br/>
<table width="90%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr align="center">
<td colspan="5"><font size="3">上海市眼病防治中心病人结帐费用报表(A) </font></td>
</tr>
<tr>
<td>汇总人次 5</td>
<td>费用合计 15853.12</td>
<td>统计日期 </td>
<td>制表人 023</td>
<td>制表日期:2004-05-13</td>
</tr>
</table>

<table width="90%" border="1" align="center" cellpadding="2" cellspacing="0" bordercolor="#000000" class="tabp" id="f">
<tr>
<td >姓名</td>
<td >住院号</td>
<td >科室</td>
<td >结帐日期</td>
<td >出院日期</td>
<td >费用合计</td>
<td >医保交易费用</td>
<td >分类给付费用</td>
<td >非医保交易费</td>
</tr>
<tr>
<td >&nbsp;</td>
<td >&nbsp;</td>
<td >&nbsp;</td>
<td >&nbsp;</td>
<td >&nbsp;</td>
<td >&nbsp;</td>
<td >&nbsp;</td>
<td >&nbsp;</td> 
<td >&nbsp;</td> 
</tr>
</table>
<hr align="center" width="90%" size="1" noshade class="NOPRINT" >
<!--分页-->
<div class="PageNext"></div>
<table width="90%" border="1" align="center" cellpadding="2" cellspacing="0" bordercolor="#000000" class="tabp">
<tr>
<td >第2页</td>
</tr>
<tr>
<td >看到分页了吧</td>
</tr>
<tr>
<td >&nbsp;</td>
</tr>
<tr>
<td >&nbsp;</td>
</tr>
<tr>
<td ><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="50%" >这样的报表
对一般的要求就够了。</td>
<td>&nbsp;</td>
</tr>
</table></td>
</tr>
</table>

<table width="780%" border="1" class="Noprint">
<tr>
<td>能不能打印</td>
</tr>
</table>

</body>
</html>

posted @ 2007-08-08 11:27 software5168 阅读(564) | 评论 (0)编辑 收藏

如何同时提交表单中的文件和文本

思路是把表单类型设置为enctype="multipart/form-data",其他表单中文本数据通过javascript处理,附加在action后面,后台通过request.getParameter()取得。上传文件调用commons-fileupload.jar中方法。

下面是部分代码。
<form  name="ajform" action="/da.do" method="post" enctype="multipart/form-data">
   <tr><td><input name="a" value=""></td></tr>
   <tr><td><input name="b" type="file"></td></tr>
   <tr><td><a href="#" onclick="checksubmit();">提交</a></td></tr>
</form>

<script language="javascript">
   function checksubmit(){
      var value  = "/da.do?formAction=save";   
      value = value+"&a="+ window.document.getElementById("a").value;
      window.document.ajform.action=value;
      window.document.ajform.submit();
   }
</script>

String a = request.getParameter("a");
try {
      //文件上传目录“/file/wj”
    String filepath= request.getSession().getServletContext().getRealPath("/")+"file"+File.separator+"wj";
   //文件上传临时目录“/file/temp”
    String tempPath = request.getSession().getServletContext().getRealPath("/")+"file"+File.separator+"temp";
    File dir = new File(filepath);
      //建立目录
       if(!dir.exists()){
        dir.mkdirs();
       }
       File dir1 = new File(tempPath);
       if(!dir1.exists()){
        dir1.mkdirs();
       }
       DiskFileUpload fu = new DiskFileUpload();
       //设置最大文件尺寸,这里是10MB
          fu.setSizeMax(10485760);
          //设置缓冲区大小,这里是4kb
          fu.setSizeThreshold(4096);
          //设置临时目录:
          fu.setRepositoryPath(tempPath);
         
    List fileItems = fu.parseRequest(request);
    Iterator iter = fileItems.iterator();
    while (iter.hasNext()) {
       FileItem item = (FileItem) iter.next();
        String fileName = item.getName();
        //判断是否为文件
        if(fileName!=null){
         //取文件名
         String name = fileName.substring(fileName.lastIndexOf(File.separator)+1);
         if(fileName!=null&& !fileName.equals("")) {          
           File file = new File(filepath+File.separator+name);
                   //上传文件 
                  item.write(file);
                }
        } 
     }
   } catch (Exception e) {
       e.printStackTrace();
   }

posted @ 2007-08-08 10:52 software5168 阅读(851) | 评论 (0)编辑 收藏

2007年1月12日

最简单的视频页面

<html>
<head>
</head>
<body>
<embed height=240 name=aa style="BORDER-BOTTOM:#2a8a21 3px solid;BORDER-LEFT:#2a8a21 3px  solid;BORDER-RIGHT:#2a8a21 3px solid;BORDER-TOP:#2a8a21 3px solid"
 type=audio/x-pn-realaudio-plugin width=320 loop="no" console="clip1" reset="false"
 controls="ImageWindow" src="a1.rmvb">
</embed><br>
<embed height=30 type=audio/x-pn-realaudio-plugin width=320  console="clip1"  reset="false" autostart="false" controls="controlpanel">
</embed><br>
<embed height=30 type=audio/x-pn-realaudio-plugin width=320  console="clip1"  reset="false" autostart="false" controls="statusbar">
</embed><br>
<Script Language=JavaScript>
function OpenFile(txt){
 document.aa.src=txt.value;
}
</Script>
</body>
</html>

posted @ 2007-01-12 18:34 software5168 阅读(704) | 评论 (2)编辑 收藏

2006年12月14日

ant 模板

1。EJB打包
<?xml version="1.0"?>
<project name="jartest" default="jar" basedir=".">
<property name="build.dir" value="${basedir}/build" />
<property name="build.classes.dir" value="${build.dir}/classes" />
<target name="jar" description="打包成Jar">
<jar jarfile="${basedir}/ejbfile.jar">
<fileset dir="${build.classes.dir}">
<include name="**/*.class" />
</fileset>
<metainf dir="${basedir}/META-INF ">
<include name="**" />
</metainf>
</jar>
</target>
</project>

2。web应用打包
<?xml version="1.0"?>
<project name="wartest" default="war" basedir=".">
<target name="war" description="创建WEB发布包">
<war warfile="${basedir}/EJBTest.war" webxml="${basedir}/WEB-INF/web.xml">
<fileset dir="${basedir}">
<include name="**"/>
<exclude name="build.xml" />
<exclude name="/WEB-INF/web.xml" />
</fileset>
</war>
</target>
</project>

posted @ 2006-12-14 11:03 software5168 阅读(478) | 评论 (0)编辑 收藏

2006年12月13日

电子书下载连接

ejb3.0实例教程
http://book.knowsky.com/down/818.html


J2EE应用与BEA WebLogic Server(第二版)
http://www.itepub.net/html/ebookcn/2006/0523/40144.html

JavaScript权威指南第四版
http://www.itepub.net/html/ebookcn/2006/0523/40153.html

Jbuilder2006
http://www.borland.com/downloads/download_jbuilder.html
JBuilder2006破解
http://www.54bk.com/user1/2690/archives/2005/21893.html

posted @ 2006-12-13 09:18 software5168 阅读(425) | 评论 (0)编辑 收藏

2006年10月9日

springMVC小结_1


1.web.xml中配置Spring的servlet和servlet-mapping
   <servlet>
        <servlet-name>example</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param> 
            <param-name>contextConfigLocation</param-name> 
            <param-value>/WEB-INF/application-servlet.xml</param-value> 
        </init-param> 
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>example</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
2.配置spring配置文件application-servlet.xml
   <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
     <property name="prefix">
         <value>/page/</value>
     </property>
     <property name="suffix">
         <value>.jsp</value>
     </property>
   </bean>
   <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/login.do">loginAction</prop>
            </props>
        </property>
   </bean>
   <bean id="loginAction" class="loginAction">
        <property name="commandClass">
            <value> LoginActionVo  </value>
        </property>
        <property name="formView">
            <value>login</value>
        </property>
        <property name="sessionForm">
            <value>true</value>
        </property>
        <property name="serviceLocator">
            <ref bean="servicelocator" />
        </property>
 </bean>
3.新建類繼承SimpleFormController﹐並複寫protected Object formBackingObject(HttpServletRequest request) 和 protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response,
 Object cmd, BindException ex)。常用結構為
   protected Object formBackingObject(HttpServletRequest request){
      LoginActionVo  loginActionVo   = new LoginActionVo ();
      request.setAttribute(" loginActionVo", loginActionVo);
      return loginActionVo;
   }
   protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response,
       Object cmd, BindException ex){
      LoginActionVo  loginActionVo =(LoginActionVo)cmd;
      Map map = new HashMap();
     map.put(" loginActionVo", loginActionVo);
     request.getSession().setAttribute(this.getFormSessionAttributeName(), loginActionVo);
     return new ModelAndView("login",map);
  }

4.將jsp頁面參數和VO進行綁定。綁定的方法為頁面元素name和VO對象對應﹐當進行深層次的綁定時﹐要注意﹐在變量的get方法中進行初始化。在servlet2.4容器中可以不用c:out標籤
輸入框綁定﹕<input name="user.name"  value = "<c:out value="${loginActionVo.user.name}"/>" type="text" disabled="disabled"  size="14" maxlength="14" /></td>
VO為﹕
 public class loginActionVo{
    private User user;
    public User getUser(User user){
      if( user == null){
         user = new User();
      }
      return user;
   }
 }

   

posted @ 2006-10-09 15:14 software5168 阅读(685) | 评论 (0)编辑 收藏

2006年9月17日

springMVC心得

以SimpleFormController為例
1。spring 接收一個請求後首先會判斷"get"還是"post"方法

2。1 "get"方法時
         2。1。1 首先創建一個command對象﹐通過調用AbstractFormController的formBackingObject方法得到﹐通常是一個pojo﹐根據name用來和提交的數據綁定。
          2。1。2 然後會創建一個BindException對象﹐裡面包括command對象﹐和其他一些屬性。
           2。1。3 判斷sessionForm 屬性﹐默認為false。如果為true﹐就會把command對象對象保存在session裡     面。session中key為類名+".FORM." + command對象名。可以通過request.getSession().getAttribute(this.getFormSessionAttributeName(request));得到command對象。
      
   2。1。4 調用AbstractFormController的referenceData方法。這個方法默認為空﹐可以復寫來初始化頁面參數。

2。1。5 返回ModelAndView對象﹐返回formview頁面。

2 。2 “post”方法時
   2。2。1 首先得到command對象,如果SessionForm = false﹐調用formBackingObjectde創建
                     如果SessionForm = true,從request.getSession中得到原command對象﹐然後將command對象從
                     Session中刪除。
  2。2。2  然後會創建一個ServletRequestDataBinder對象﹐裡面包括command對象﹐和其他一些屬性。
                   這個過程將調用initBinder()﹔可以複寫這個方法初始化數據。
 2。2。3 調用processFormSubmission(HttpServletRequest request, HttpServletResponse response, Object command,  BindException errors)。有錯誤時返回formview頁面﹐否則進入successview頁面。這個過程將調用onSubmit(Object command)﹐必須複寫這個方法放入業務邏輯。
 
   




posted @ 2006-09-17 14:11 software5168 阅读(529) | 评论 (0)编辑 收藏

2006年9月6日

springMVC第四個例子

1./WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
 xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!--
<!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>
-->
 
 <!--
 <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/application-servlet.xml</param-value>
   </context-param>
 <listener>
     <listener-class>
       org.springframework.web.context.ContextLoaderListener
     </listener-class>
   </listener>
   -->
 <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>/WEB-INF/application-servlet.xml</param-value>
      </init-param>
  <load-on-startup>1</load-on-startup>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
 
<!--
 <taglib>
      <taglib-uri>/spring</taglib-uri>
      <taglib-location>/WEB-INF/spring.tld</taglib-location>
 </taglib>
--> 
</web-app>

2./WEB-INF/application-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/login.do">loginAction</prop>
            </props>
        </property>
    </bean>
   
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass">
            <value>org.springframework.web.servlet.view.JstlView</value>
        </property>
        <property name="prefix">
            <value>/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>
   
    <bean id="loginAction" class="onlyfun.caterpillar.LoginAction">
        <property name="commandName">
         <value>command</value>
  </property>
  <property name="commandClass">
            <value>onlyfun.caterpillar.LoginForm</value>
        </property>
        <property name="successView">
            <value>success</value>
        </property>
        <property name="formView">
            <value>form</value>
        </property>
       <property name="user">          
            <ref local="user" />
        </property>
    </bean> 
   
   <bean id="user" class="onlyfun.caterpillar.User">
     <property name="username">
         <value>111</value>
     </property>
     <property name="password">
         <value>111</value>
     </property>
    </bean>
</beans>



3./form.jsp
<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head><title>Login</title></head>
<body>
 <spring:bind path="command.*">
        <font color="red"><b>${status.errorMessage}</b></font><br>
    </spring:bind>
       請輸入使用者名稱與密碼:<p>    
    <form name="loginform" action="login.do" method="post">
     <spring:bind path="command.username">  
          名稱 <input type="text" name="${status.expression}" value="${status.value}"/>
          <font color="red">${status.errorMessage}</font><br>
     </spring:bind>
     <spring:bind path="command.password"> 
          密碼 <input type="password" name="${status.expression}" value="${status.value}"/>
          <font color="red">${status.errorMessage}</font><br>
     </spring:bind>
        <input type="submit" value="確定"/>
    </form>
      注意:輸入錯誤會再回到這個頁面中。  
</body>
</html>

4./index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>  
    begin......
    <%
     response.sendRedirect("login.do");
    %>
  </body>
</html>

5./success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head><title>Login Success</title></head>
<body>
    <H1><c:out value="用戶名﹕${user}"/></H1>
</body>
</html>

6./WEB-INF/classes/onlyfun/caterpillar/LoginAction.class
package onlyfun.caterpillar;

import org.springframework.validation.BindException;
import org.springframework.web.servlet.mvc.SimpleFormController;
import org.springframework.web.servlet.*;

public class LoginAction extends SimpleFormController { 
    private User user;
    protected ModelAndView onSubmit(Object command,BindException errors) throws Exception {
       LoginForm form = (LoginForm) command; 
       String username = user.getUsername();
       String password = user.getPassword();
       if(username.equals(form.getUsername()) &&
         password.equals(form.getPassword())) {
          return new ModelAndView(this.getSuccessView(),"user", form.getUsername());
       }
       else {
        errors.reject("loginfail", "使用者名稱或密碼錯誤");
        if(!(username.equals(form.getUsername()))){
         errors.rejectValue("username", "error", null, "使用者名稱錯誤");
        }
       if(!(password.equals(form.getPassword()))){
         errors.rejectValue("password", "error", null, "密碼錯誤");
        }      
           return new ModelAndView(this.getFormView(),errors.getModel());
       }
    }
    public User getUser() {
     return user;
    }
    public void setUser(User user) {
     this.user = user;
    }
}



7./WEB-INF/classes/onlyfun/caterpillar/LoginForm.class
package onlyfun.caterpillar;

public class LoginForm {
    private String username;
    private String password;
   
    public void setUsername(String username) {
       this.username = username;
    }
   
    public void setPassword(String password) {
       this.password = password;
    }
   
    public String getUsername() {
       return username;
    }
   
    public String getPassword() {
       return password;
    }
}

8./WEB-INF/tags/spring.tld

9./WEB-INF/tags/c.tld

10./WEB-INF/classes/onlyfun/caterpillar/User.class
package onlyfun.caterpillar;

public class User {
 private String username;
 private String password;
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
}

posted @ 2006-09-06 18:03 software5168 阅读(1365) | 评论 (4)编辑 收藏

2006年9月5日

ServletConfig与ServletContext的区别

 HttpServletRequest,HttpServletResponse:这两个属性的作用范围最小。
    时间上:只是本身请求和应答完成就失效,当然转发是把当前的request对象取出来传给另一
          个资源,其实本身的request对象还是只生存到本次请求结束,response也同样。
    空间上:只能发送请求的客户端有效。

    HttpSession:一次连结到客户端关闭,时间作用范围比上面两个大,空间任用范围相同。

    ServletConfig:从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet
    有效,一个servlet的ServletConfig对象不能被另一个servlet访问。

    ServletContext:对任何servlet,任何人在任何时间都有效,这才是真正全局的对象。

    那么,ServletConfig参数和ServletContext参数到底应该如何使用,如何取得?

    一般来说,对整个应用的配置,为了不使用“硬编码”,应该配置为ServletContext参数,比如字
    符集设定。
    <web-app>
        .................
        <init-param>
            <param-name>charset</param-name> 
            <param-value>GB2312</param-value> 
        </init-param>
        .................
    </web-app>
    注意以上格式只是2。0以后的标准格式,旧容器(引擎)采用服务商自己的格式配置。注意它的
    父元素应该是<web-app>也就是说它是对一个应用作用的。

    而如果只有一个特定的servlet要设定的参数,其它servlet不能共享,应该配置为ServletConfig
    参数,如一个读取附件的servlet要用到绝对目录,而别的servlet不会用到:
    <servlet>
            <servlet-name>GetAtt</servlet-name>
        <servlet-class>mail.GetAttServlet</servlet-class>
        <init-param>
            <param-name>absPath</param-name> 
            <param-value>/usr/mail/ax/axman/Maildir/</param-value> 
        </init-param>
    </servlet>
    不用说,因为在<servlet>标签中已经指定了name和class,也就是说只有mail.GetAttServlet这个
    servlet中才能取到path,而别的Servlet是不能取到的。

    那么如何访问这两个对象的参数呢?
    访问ServletConfig参数:
        首先要取得ServletConfig对象,然后调用它的getInitParameter();方法。要访问
    ServletConfig对象,jsp中直接使用config内置对象,但因为你的JSP编译后的servlet一般不会被
    加到web.xml中的,所以一般不会通过jsp来取对本JSP编译后的servlet的配置参数,那么在servlet
    中要得到ServletConfig对象有两种方法:

    在inii()方法中取到:通过init的重载方法传递

    .....
    public class Test extends HttpServlet 
    {
        ServletConfig config;
        public void init(ServletConfig config) throws ServletException {
            this.config = config;
        }
        ..................
    }
    然后在下面的方法中就可以访问config对象。但要注意,为了确保能从构造方法中到到当前servlet的
    config对象,应该调用父类的构造方法:
    .....
    public class Test extends HttpServlet 
    {
        ServletConfig config;
        public void init(ServletConfig config) throws ServletException {
            super.init(config);
            this.config = config;
        }
        ..................
    }

    通过getServletConfig()方法直接到时,这样做的好处是不必调手工传递属性,想在任何时候都可
    以得到。

    还有第三种方法,要自己实现一些接口,这里作为一般讨论就不介绍了。

    要访问ServletContext对象,只要从现有的ServletConfig对象getServletContext()就可以了,然后
    调用它的getInitParameter()方法就可以获取它的参数。

    按说:ServletContext对象的作用域比ServletConfig作用域大,为什么要从ServletConfig中到得
    ServletContext对象呢?我个人认为:容器保存了很多个ServletContext对象,请求时容器到底取哪一个
    给你呢?那就取其中包含ServletConfig信息的那个给你,就是说取ServletConfig对象的父级对象。就好
    象HttpSession要从requset中取得一样,就是取那个包含当前requese对象的session对象给你,这只是我
    的个人想法,还没有来得及看具体实现。反正就这么用吧。

posted @ 2006-09-05 10:26 software5168 阅读(2439) | 评论 (1)编辑 收藏

2006年8月25日

spring + jsf

JSF和Spring集成的资料比较少,原理是获得彼此的上下文引用,以此进一步获得各自管理的bean,这是可能的,因为两者是web应用框架都遵循servlet规范,为二者整合提供了可能和基础.
 
在Spring中ApplicationContext是相当重要的类,对于web应用,它还包装了javax.servlet.ServletContext,为web应用提供了所有可以利用的数据,包括可管理bean,Faces中通过FacesContext类可以获得所有可以利用的资源,同样包括JSF的可管理支持bean,它们都围绕着ServletContext提供了自己的门面,通过各自的门面在Servlet容器的世界里彼此相通.
本文介绍两种方式,实现二者集成:
1.         通过写自己的类来完成二者的连通,实际上只是获得彼此世界里存活的bean,对于JSF中事件处理可能需要更进一步的构思和编码,为了这点,第二个方法介绍了一种框架.
2.         使用框架完成二者集成.
 
一  自己动手,下面的代码以示例为主,其它涉及的类和接口略去.
这个工具类提供在JSF世界里查找Spring管理的bean.也实现在Spring中查找JSF组件的方法.
package com.skysoft.rbac.dao;
 
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.faces.el.ValueBinding;
import javax.faces.FactoryFinder;
import javax.faces.application.Application;
import javax.faces.application.ApplicationFactory;
 
public final class SpringFacesUtil {
  public SpringFacesUtil() {
  }
  /**
   * 从Spring中查找bean.
   * @param beanname String
   * @return Object
   */
  public static Object findBean(String beanname) {
    ServletContext context = (ServletContext) FacesContext.getCurrentInstance().
        getExternalContext().getContext();
    ApplicationContext appctx = WebApplicationContextUtils.
        getRequiredWebApplicationContext(context);
    return appctx.getBean(beanname);
  }
  /**
   * 从JSF中查找bean.
   * @param beanname String
   * @return Object
   */
  public static Object lookupBean(String beanname) {
    Object obj = getValueBinding(getJsfEl(beanname)).getValue(FacesContext.
        getCurrentInstance());
    return obj;
  }
 
  private static ValueBinding getValueBinding(String el) {
    return getApplication().createValueBinding(el);
  }
 
  private static Application getApplication() {
    ApplicationFactory appFactory = (ApplicationFactory) FactoryFinder.
        getFactory(FactoryFinder.APPLICATION_FACTORY);
    //FactoryFinder.FACES_CONTEXT_FACTORY
    //FactoryFinder.RENDER_KIT_FACTORY
    return appFactory.getApplication();
  }
 
  private static String getJsfEl(String value) {
    return "#{" + value + "}";
  }
}
下面定义一个由JSF管理的bean:
package com.skysoft.rbac.dao;
 
import javax.servlet.ServletContext;
 
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.skysoft.struts.jsf.util.FacesUtils;
 
public class ServiceLocatorBean
    implements ServiceLocator {
  private static final String DAO_SERVICE_BEAN_NAME = "userDAO";
  //这个dao就是由Spring提供的管理bean,这个dao可以使用Hibernate实现.
  private UserDAO dao;
 
  public ServiceLocatorBean() {
    this.dao = (UserDAO)SpringFacesUtil.findBean(DAO_SERVICE_BEAN_NAME);
  }
 
  public UserDAO getDao() {
    return dao;
  }
}
下面是一个使用ServiceLocatorBean的类.
public class UserDAOImp
    extends HibernateDaoSupport implements UserDAO {
  private UserDAO dao;
  private List list;
 
  public UserDAOImp() {}
 
  public List getList() {
    if (list == null) {
      list = dao.getList();
    }
    return list;
  }
 
  public UserDAO getDao() {
    return dao;
  }
 
  public void setDao(UserDAO dao) {
    this.dao = dao;
  }
}
 
在faces-config.xml中的配置:
       <managed-bean>
              <managed-bean-name>serviceLocatorBean</managed-bean-name>
              <managed-bean-class>com.skysoft.rbac.dao.ServiceLocatorBean</managed-bean-class>
              <managed-bean-scope>session</managed-bean-scope>
       </managed-bean>
       <managed-bean>
              <managed-bean-name>User</managed-bean-name>
              <managed-bean-class>com.skysoft.rbac.User</managed-bean-class>
              <managed-bean-scope>request</managed-bean-scope>
              <managed-property>
                     <property-name>serviceLocator</property-name>
                     <property-class>com.skysoft.rbac.dao.ServiceLocatorBean</property-class>
                     <value>#{serviceLocatorBean}</value>
              </managed-property>
       </managed-bean>
在applicationContext.xml中的配置:
       <bean id="userDAO" class="com.skysoft.rbac.dao.UserDAOImp">
              <property name="sessionFactory">
                     <ref local="sessionFactory" />
              </property>
       </bean>
二 使用框架
1 介绍
这个框架是Spring相关项目,提供一个包de.mindmatters.faces.spring,这个包包含JSF和Spring框架综合集成的粘合代码,这些代码以独立于一个实现的方式完成,这样它能和任何JSF实现一起使用.
本包的提供的代码主要目的是尽可能透明的集成两个框架,主要特征:
l         JSF/JSP开发者应该能访问Spring管理的Beans,就好象它们是由JSF管理的.
l         JSF可管理beans应能集成入Spring.
l         RequestHandledEvent事件也应该能被发布到Spring.
2  JSF配置集成
本包构造了一个基于faces配置文件(e.g. /WEB-INF/faces-config.xml)的WebApplicationContext类, 让它成为遵循"spring-beans" DTD配置文件(e.g. defined in /WEB-INF/applicationContext.xml)来配置的ApplicationContext的孩子,这样依从"faces-config" DTD的WebApplicationContext就是全特征的,即自动拥有如下功能:
l         JSF可管理beans实现了Spring的*Aware interfaces:
ApplicationContextAware
BeanFactoryAware
BeanNameAware
ResourceLoaderAware
ServletContextAware
l         JSF可管理beans实现Spring的lifecycle interfaces:
InitializingBean
DisposableBean
l         实现Spring的FactoryBean interface
l         实现Spring的ApplicationListener interface
l         发布ApplicationEvent事件.
l         从资源中读取消息.
等等,更多可看Spring.
3 访问方式
1) 从JSF中程序化的访问Spring管理的beans.
因为在FacesWebApplicationContext和ApplicationContext之间有层次关系,所以你的JSF可管理支持beans能容易的实现ApplicationContextAware接口,并能通过getBean方法访问它而不管它是否定义在FacesWebApplicationContext中还是定义在父ApplicationContext类对象中.
2) 通过JSF EL从JSF中访问Spring管理的beans.
能够使用JSF EL访问beans无论你引用的bean由JSF管理还是由Spring管理.两个bean上下文在存取时间合并.
a) 直接访问:
如果一个带有请求名字的bean只存在于Spring上下文内的话,这个bean被使用,bean的singleton属性设置被完全保持.
b) 区域化访问(scoped access):
如果你要从JSF定义bean的作用域的能力上得益还想让那个bean由Spring管理,那么就要在两个上下文中定义,只是对于JSF上下文中的定义的类类型要使用de.mindmatters.faces.spring.SpringBeanFactory类,你还应该设置那个bean的singleton属性到false,因这能覆盖你的作用域设置.在你使用JSF EL访问bean时,你总能获得一个遵从你在JSF上下文中定义的作用域设置的由Spring管理的bean的实例.
 
三 用法
通常,就象设置任何其它JSF web应用一样设置你的web应用,下面的样例配置展示怎样使能上面提到的特征。
在web.xml 配置中必须加入下列配置条目, 同时注意把该库的jsf-spring.jar 放在适当的位置.
<web-app>
    .........
    <!--
        过滤器用于向Spring发布RequestHandledEvent,它应该影射到和FacesServlet url相同的模式.
    -->   
    <filter>
        <filter-name>RequestHandled</filter-name>
        <filter-class>de.mindmatters.faces.spring.support.RequestHandledFilter</filter-class>
    </filter>
      
    <filter-mapping>
        <filter-name>RequestHandled</filter-name>
        <url-pattern>*.faces</url-pattern>
    </filter-mapping>
 
    <!--
    这个侦听器用于装入Spring beans的父应用上下文.
    -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    .........
</web-app>
下面的一些说明,都可以通过下载这个Spring相关项目得到,列在这里只为演示上面的说明的功能.
WEB-INF/faces-config.xml
<!-- 一个纯JSF管理的bean -->
<managed-bean>
    <managed-bean-name>jsfBean</managed-bean-name>
    <managed-bean-class>example.NameBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
        <property-name>name</property-name>
    </managed-property>
</managed-bean>
<!--一个SpringBeanScope用来定义Spring可管理bean的作用域.-->
       <managed-bean>
              <managed-bean-name>scopedAccessSpringBean</managed-bean-name>
       <managed-bean-class>de.mindmatters.faces.spring.SpringBeanScope</managed-bean-class>
              <managed-bean-scope>session</managed-bean-scope>
       </managed-bean>
<!-- 这是一个纯JSF可管理bean,它持有一个到Spring可管理bean的一个引用. -->
<managed-bean>
    <managed-bean-name>referencingBean</managed-bean-name>
    <managed-bean-class>example.ReferencingBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
        <property-name>referencedBean</property-name>
        <value>#{managedPropertyAccessSpringBean}</value>
    </managed-property>
</managed-bean>
WEB-INF/applicationContext.xml (partial)
<!-- 一个纯Spring的可管理bean -->
<bean id="directAccessSpringBean" class="example.NameBean"/>
<!-- 一个向JSF作用域提供的可管理bean.  -->
<bean id="scopedAccessSpringBean" class="example.NameBean" singleton="false"/>
<!-- 一个纯Spring的可管理bean,它由一个JSF可管理bean引用.(当然了,它也能被直接访问啦.) -->
<bean id="managedPropertyAccessSpringBean" class="example.NameBean" singleton="false"/>
参考:
http://jsf-spring.sourceforge.net/   JSF-Spring,Spring相关项目官方站点,提供本文介绍的框架下载以及实例下载.
http://www.javaworld.com/javaworld/jw-07-2004/jw-0719-jsf.html 一篇关于JSF和Spring的文章.

posted @ 2006-08-25 14:06 software5168 阅读(688) | 评论 (0)编辑 收藏

2006年8月24日

springMVC 第三個例子

1./home.xsl
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" omit-xml-declaration="yes" />
    <xsl:template match="/">
        <html>
            <head><title>Hello!</title></head>
            <body>
                <h1>My First Words</h1>
                <xsl:for-each select="wordList/word">
                    <xsl:value-of select="."/><br />
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

2./index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>   
  </head>
  <body>
   <center><input type="button" value="xslt" onclick="location.href='home.htm'"></center>
  </body>
</html>

3./WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
 xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
 <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/application-servlet.xml</param-value>
     </init-param> 
    </servlet>  
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>   
</web-app>

4./WEB-INF/application-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/home.htm">homeAction</prop>
            </props>
        </property>
    </bean>  
    <bean id="bundleViewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
        <property name="basename">
            <value>views</value>
        </property>
    </bean>  
    <bean id="homeAction" class="xslt.HomePageController"/>
</beans>

5./WEB-INF/classes/views_zh_TW.properties
home.class=xslt.HomePage
home.stylesheetLocation=/home.xsl
home.root=wordList

6./WEB-INF/classes/xslt/HomePage.class
package xslt;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jdom.Element;
import org.jdom.output.DOMOutputter;
import org.springframework.web.servlet.view.xslt.AbstractXsltView;
import org.w3c.dom.Node;
public class HomePage extends AbstractXsltView {
  protected Node createDomNode(
          Map model, String rootName, HttpServletRequest req, HttpServletResponse res
      ) throws Exception {    
          org.jdom.Document doc = new org.jdom.Document();
          Element root = new Element(rootName);
          doc.setRootElement(root);
          List words = (List) model.get("wordList");
          for (Iterator it = words.iterator(); it.hasNext();) {
              String nextWord = (String) it.next();
              Element e = new Element("word");
              e.setText(nextWord);
              root.addContent(e);
          }
          // convert JDOM doc to a W3C Node and return
          return new DOMOutputter().output( doc );
      }
}


7./WEB-INF/classes/xslt/HomePageController.class
package xslt;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class HomePageController extends AbstractController{
 protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception {
  Map map = new HashMap();
     List wordList = new ArrayList();        
     wordList.add("hello");
     wordList.add("world");       
     map.put("wordList", wordList);      
     return new ModelAndView("home", map);
 }
}

posted @ 2006-08-24 15:18 software5168 阅读(586) | 评论 (0)编辑 收藏

JDOM

1.         Abstract

Java 的世界裡,要操控 XML ,最簡單的方法莫過於使用 JDOM 。在這裡我簡單的介紹如何用 JDOM 從無到有的建立一分 XML 、當有一份 XML file 時,如何將這個 XML file 讀進程式裡及如何利用 JDOM XML 透過 XSLT 轉成 HTML

JDOM 是由 Brett Mclaughlin Jason Hunter 編寫,在 http://www.jdom.org 可免費下載。

 

2.         建立、新增、刪除、輸出

範例 1 展示如何建立、新增、刪除及輸出一份 XML ,每份 XML JDOM 裡是由一個 Document 類別代表,所以一開始我們要先 new 一個 Document ,在建構 Document 時應指明根節點,如果沒有指明,在建構應由 setRootElement 設定。基本上 XML 都可以化成一個樹狀結構,所以,在產生根節點之後,就由根節點開始增加子節點,新增的方式是呼叫 Element.addContent 將新的節點加入。刪除如果知道是某節點以下的子節點,則可呼叫 Element.getChildren 取得所有子節點,再找出要刪除的點節予以刪除。

當建立好 XML 之後,通常我們會希望將它輸出到檔案, JDOM 提供了 XMLOutputter 類別供我們輸出之用,輸出前要先設定編碼方式,不然,會以 UTF-8 為預設值, setNewlines 則是指明輸出時是否要幫我們斷行,方便閱讀,如果沒有加這行指令,預設是不會斷行,那麼所有資料將在同一行上。

===== 範例 1 =====

import org.jdom.*;

import org.jdom.output.*;

import java.io.*;

import java.util.List;

 

public class myCreate {

  public myCreate() {

    String[] strChapter = { "XML 簡論 ", " 編寫 XML", " 剖析 XML", " 約制 XML", " 驗正 XML", " 轉換 XML" };

 

    Element elmtRoot = new Element("Article");

    Document docJDOM = new Document(elmtRoot);

    // 新增

    for(int i=0; i<6; i++) {

      Element elmtChapter = new Element("Chapter");

      elmtChapter.addContent(strChapter[i]);

      elmtChapter.setAttribute("sort", new Integer(i).toString());

      elmtRoot.addContent(elmtChapter);

    }

    // 刪除

    List lstChapter = elmtRoot.getChildren("Chapter");

    lstChapter.remove(4);

    // 輸出

    OutputXML(docJDOM, "e:/myJDOM.xml");

  }

 

  private void OutputXML(Document docXML, String strFilename) {

    XMLOutputter fmt = new XMLOutputter();

    try {

      fmt.setEncoding("big5");

      fmt.setNewlines(true);

      FileWriter fwXML = new FileWriter(strFilename);

      fmt.output(docXML, fwXML);

      fwXML.close();

    }

    catch (IOException e) {

      e.printStackTrace();

    }

  }

 

  public static void main(String[] args) {

    myCreate myCreate1 = new myCreate();

  }

}

 

3.         讀進一份 XML file

目前 XML 最常被拿來應用的領域之一大概就是當作設定檔,因此,如何從檔案中讀入一份已存在的 XML 更為重要。

JDOM 是利用 SAX DOM 來剖析 XML ,用 SAX 會比 DOM ,所以一般都是用 SAX ,如果對 SAX 不熟悉,在 http://www.saxproject.org/ 相關文件資料。

範例 2 就是用 SAX 建立 Document ,在建立 SAXBuilder 時傳入的參數指出是否用 DTD 驗正 XML 的合法性, true 表示要, false 表示不要。當呼叫 build 之後 JDOM 就已經幫我們用 SAX 建立好一棵 XML Tree ,如此我們就可以很方便由 Tree 中找到我們要的節點。

 

===== 範例 2 =====

import org.jdom.*;

import org.jdom.input.*;

import org.jdom.output.*;

import java.io.*;

import java.util.List;

 

public class myRead {

  public myRead() {

    Document docJDOM;

 

    // 利用 SAX 建立 Document

    SAXBuilder bSAX = new SAXBuilder(false);

    try {

      docJDOM = bSAX.build(new File("e:/myJDOM.xml"));

    }

    catch (JDOMException e) {

      e.printStackTrace();

      return;

    }

    // 在根節點中加入一個新的子節點

    Element elmtRoot = docJDOM.getRootElement();

    Element elmtChapter = new Element("Chapter");

    elmtChapter.setText(" 驗正 XML");

    elmtChapter.setAttribute("sort", "4");

    elmtRoot.addContent(elmtChapter);

    // 印出所有根節點的子節點

    List lstChildren = elmtRoot.getChildren("Chapter");

    for(int i=0; i<lstChildren.size(); i++) {

      Element elmtChild = (Element) lstChildren.get(i);

      System.out.println("Child " + i);

      System.out.println("  Text:" + elmtChild.getText());

      System.out.println("  Attribute:" + elmtChild.getAttributeValue("sort"));

    }

    // 輸出到檔案

    OutputXML(docJDOM, "e:/myJDOM2.xml");

  }

 

  private void OutputXML(Document docXML, String strFilename) {

    XMLOutputter fmt = new XMLOutputter();

    try {

      fmt.setEncoding("big5");

      fmt.setNewlines(true);

      FileWriter fwXML = new FileWriter(strFilename);

      fmt.output(docXML, fwXML);

      fwXML.close();

    }

    catch (IOException e) {

      e.printStackTrace();

    }

  }

 

  public static void main(String[] args) {

    myRead myRead1 = new myRead();

  }

}

 

4.         轉換 XML HTML

要將 XML 轉成 HTML 當然要先寫好 XSL ,但是即使寫好 XSL JDOM 也並不提供 XML 轉換,幸好在 JDOM 安裝好之後,就會有 Apache Xalan ,它可以幫我們做這樣的轉換。

要使用 Apache Xalan ,首先確定 xalan.jar classpath 裡。 Xalan 的第一個用法是在命令列執行,指令如下…

C:\> java org.apache.xalan.xslt.Process –IN XML 文件 –XSL XSL 樣版 –OUT 輸出檔名

命令列的用法在一般的運用裡是很方便,但是我們有興趣的是在程式裡怎麼用。範例 4 提供了一個簡單的 sample

===== 範例 4 =====

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerException;

import javax.xml.transform.TransformerConfigurationException;

import javax.xml.transform.stream.*;

 

public class myGenHTML {

 

  public myGenHTML(String strXML, String strXSL, String strHTML) {

    try {

      GenHTML(strXML, strXSL, strHTML);

    }

    catch (TransformerConfigurationException e) {

      e.printStackTrace();

    }

    catch (TransformerException e) {

      e.printStackTrace();

    }

  }

 

  private void GenHTML(String strXMLFile, String strXSLFile, String strHTMLFile) throws TransformerConfigurationException, TransformerException

  {

    TransformerFactory myFactory = TransformerFactory.newInstance();

    Transformer myTransformer = myFactory.newTransformer(new StreamSource(strXSLFile));

    myTransformer.transform(new StreamSource(strXMLFile), new StreamResult(strHTMLFile));

  }

 

  public static void main(String[] args) {

    myGenHTML myGenHTML1 = new myGenHTML(args[0], args[1], args[2]);

  }

}

posted @ 2006-08-24 12:50 software5168 阅读(675) | 评论 (0)编辑 收藏

2006年8月23日

springMVC 第二個例子

1./WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
 xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 
 <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/application-servlet.xml</param-value>
     </init-param> 
    </servlet>
 
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
 
 <welcome-file-list>
     <welcome-file>form.jsp</welcome-file>
   </welcome-file-list>
</web-app>


2./WEB-INF/application-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/login.do">loginAction</prop>
            </props>
        </property>
    </bean>
   
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass">
            <value>org.springframework.web.servlet.view.InternalResourceView</value>
        </property>
        <property name="prefix">
            <value>/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>
   
    <bean id="loginAction" class="onlyfun.caterpillar.LoginAction">
        <property name="commandClass">
            <value>onlyfun.caterpillar.LoginForm</value>
        </property>
        <property name="successView">
            <value>success</value>
        </property>
        <property name="formView">
            <value>form</value>
        </property>
    </bean>
</beans>


3./WEB-INF/classes/onlyfun/caterpillar/LoginAction.class
package onlyfun.caterpillar;

import org.springframework.web.servlet.mvc.SimpleFormController;
import org.springframework.web.servlet.*;

public class LoginAction extends SimpleFormController {
    protected ModelAndView onSubmit(Object command) throws Exception {
       LoginForm form = (LoginForm) command;
       
       if("111".equals(form.getUsername()) &&
             "111".equals(form.getPassword())) {
          return new ModelAndView(this.getSuccessView(),"user", form.getUsername());
       }
       else {
           return new ModelAndView(this.getFormView());
       }
    }
}

4./WEB-INF/classes/onlyfun/caterpillar/LoginForm.class
package onlyfun.caterpillar;

public class LoginForm {
    private String username;
    private String password;
   
    public void setUsername(String username) {
       this.username = username;
    }
   
    public void setPassword(String password) {
       this.password = password;
    }
   
    public String getUsername() {
       return username;
    }
   
    public String getPassword() {
       return password;
    }
}


5./form.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head><title>Login</title></head>
<body>
    請輸入使用者名稱與密碼:<p>
    <form name="loginform" action="login.do" method="post">
        名稱 <input type="text" name="username"/><br>
        密碼 <input type="password" name="password"/><br>
        <input type="submit" value="確定"/>
    </form>
    注意:輸入錯誤會再回到這個頁面中。
</body>
</html>


6./success.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head><title>Login Success</title></head>
<body>
    <H1> Hello, ${user}!!</H1>
    This is your secret gift.
</body>
</html>

posted @ 2006-08-23 16:29 software5168 阅读(482) | 评论 (0)编辑 收藏

springMVC 第一個例子

1. /hellouser.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head><title>HelloPage</title></head>
<body>
     <H1> ${helloWord}</H2>
</body>
</html>

2./index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
    <%
     response.sendRedirect("hellouser.do");
    %>
  </body>
</html>

3./WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
 xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 
 <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/application-servlet.xml</param-value>
     </init-param> 
    </servlet>
 
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
  
</web-app>

4./WEB-INF/application-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/hellouser.do">helloUserAction</prop>
            </props>
        </property>
    </bean>
   
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass">
            <value>org.springframework.web.servlet.view.InternalResourceView</value>
        </property>
    </bean>
   
    <bean id="helloUserAction" class="onlyfun.caterpillar.HelloUserAction">
        <property name="helloWord">
            <value>Hello!</value>
        </property>
        <property name="viewPage">
            <value>/hellouser.jsp</value>
        </property>
    </bean>
</beans>

5./WEB-INF/classes/onlyfun/caterpillar/HelloUserAction.class
package onlyfun.caterpillar;

import java.io.IOException;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.bind.RequestUtils;

public class HelloUserAction implements Controller {
   private String helloWord;
    private String viewPage;
   
   public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException {
     //String user = RequestUtils.getRequiredStringParameter(req, "user");
      Map model = new HashMap();
      model.put("helloWord", getHelloWord());
     // model.put("user", user);
   
       return new ModelAndView(getViewPage(), model);
    }
   
    public void setViewPage(String viewPage) {
       this.viewPage = viewPage;
    }
   
    public String getViewPage() {
       return viewPage;
    }

    public void setHelloWord(String helloWord) {
       this.helloWord = helloWord;
    }
   
    public String getHelloWord() {
       return helloWord;
    }
}

posted @ 2006-08-23 15:52 software5168 阅读(447) | 评论 (0)编辑 收藏

2006年8月14日

ajax - 回調函數Observer實現例子

1.EventRouter.js
/**
 * @author user
 */
var jsEvent = new Array();
jsEvent.EventRouter = function(el,eventType){
 this.lsnrs = new Array();
 this.el = el;
 el.eventRouter = this;
 el[eventType] = jsEvent.EventRouter.callback;
};
jsEvent.EventRouter.prototype.addListener = function(lsnr){
 this.lsnrs.append(lsnr,true); 
} ;

jsEvent.EventRouter.prototype.notify = function(e){
 var lsnrs = this.lsnrs;
 for(var i=0;i<lsnrs.length;i++){
  var lsnr = lsnrs[i];
  lsnr.call(this,e);
 }
};
jsEvent.EventRouter.callback=function(event){
 var e = event || window.event;
 var router = this.eventRouter;
 router.notify(e);
};

Array.prototype.append = function(obj,nodup){
 if(nodup){ 
  this[this.length]=obj;
 }
};

2.mousemat.css
.mousemat{
 background-color:#ffe0d0;
 border:solid maroon 0px;
 position:absolute;
 margin:0px;
 width:500px;
 height:500px;
 top:50px;
 left:50px; 
}
.thumbnail{
 background-color:#ffe0d0;
 border:solid maroon 0px;
 position:absolute;
 margin:0px;
 width:100px;
 height:100px;
 top:50px;
 left:600px; 
}
.cursor{
 background-color:blue;
 position:relative;
 height:5px;
 width:5px;
}

3.mousemat.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>Untitled Document</title>
  <link rel='stylesheet' type = 'text/css' href = 'mousemat.css'>
  <script type ='text/javascript' src = 'EventRouter.js'></script>
  <script type='text/javascript'>
   var cursor = null;
   window.onload = function(){
    var mat = document.getElementById('mousemat');
    cursor = document.getElementById('cursor');
    var mouseRouter = new jsEvent.EventRouter(mat,"onmousemove");
    //var mouseRouter = new jsEvent.EventRouter(mat,"onclick");
    mouseRouter.addListener(writeStatus);
    mouseRouter.addListener(drawThumbnail);
   };
   function writeStatus(e){
    window.status = e.clientX + "," + e.clientY;
   }
   function drawThumbnail(e){
    cursor.style.left = ((e.clientX/5)-2) + "px";
    cursor.style.top = ((e.clientY/5)-2) + "px";
   }
  </script>
 </head>
 <body>
  <div class='mousemat' id='mousemat'></div>
  <div class='thumbnail' id='thumbnail'>
   <div class = 'cursor' id = 'cursor'></div>
  </div>
 </body>
</html>

posted @ 2006-08-14 08:50 software5168 阅读(741) | 评论 (0)编辑 收藏

2006年8月11日

ajax 單個元素中實現多個回調函數的例子

1.mousemat.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>Untitled Document</title>
  <link rel='stylesheet' type = 'text/css' href = 'mousemat.css'>
  <script type='text/javascript'>
   var cursor = null;
   window.onload = function(){
    var mat = document.getElementById('mousemat');
    mat.onmousemove = mouseObserver;
    cursor = document.getElementById('cursor');
   }
   function mouseObserver(event){
    var e = event || window.event;
    writeStatus(e);
    drawThumbnail(e);
   }
   function writeStatus(e){
    window.status = e.clientX + "," + e.clientY;
   }
   function drawThumbnail(e){
    cursor.style.left = ((e.clientX/5)-2) + "px";
    cursor.style.top = ((e.clientY/5)-2) + "px";
   }
  </script>
 </head>
 <body>
  <div class='mousemat' id='mousemat'></div>
  <div class='thumbnail' id='thumbnail'>
   <div class = 'cursor' id = 'cursor'></div>
  </div>
 </body>
</html>


2.mousemat.css
mousemat{
 background-color:#ffe0d0;
 border:solid maroon 0px;
 position:absolute;
 margin:0px;
 width:500px;
 height:500px;
 top:50px;
 left:50px; 
}
.thumbnail{
 background-color:#ffe0d0;
 border:solid maroon 0px;
 position:absolute;
 margin:0px;
 width:100px;
 height:100px;
 top:50px;
 left:600px; 
}
.cursor{
 background-color:blue;
 position:relative;
 height:5px;
 width:5px;
}

posted @ 2006-08-11 16:12 software5168 阅读(438) | 评论 (0)编辑 收藏

ajax -第一個例子

1.MyHtml.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
 <script type='text/javascript'>
  var req = null;
  var console = null;
  var READY_STATE_UNINITIALIZED = 0;
  var READY_STATE_LOADING = 1;
  var READY_STATE_LOADED = 2;
  var READY_STATE_INTERACTIVE = 3;
  var READY_STATE_COMPLETE = 4;
  
  function sendRequest(url,params,HttpMethod){
   if(!HttpMethod){
    HttpMethod = "GET";
   }
   req = initXMLHTTPRequest();
   if(req){
    req.onreadystatechange = onReadyState;
    req.open(HttpMethod,url,true);
    req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    req.send(params);
    
   }
  }
  
  function initXMLHTTPRequest(){
   var xRequest = null;
   if(window.XMLHttpRequest){
    xRequest = new XMLHttpRequest();
   }else if(window.ActiveXObject){
    xRequest = new ActiveXObject("Microsoft.XMLHTTP");
   }
   return xRequest;
  }
  
  function onReadyState(){
   var ready = req.readyState;
   var data = null;
   if(ready==READY_STATE_COMPLETE){
    data = req.responseText;
   }else{
    data = "loading...[" + ready +"]";
   }
   toConsole(data);
  }
  
  function toConsole(data){
   if(console!=null){
    var newline = document.createElement("div");
    console.appendChild(newline);
    var txt = document.createTextNode(data);
    console.appendChild(txt);
   }
  }
  
  window.onload = function(){
   console = document.getElementById('console');
   sendRequest("data.txt");
  }
 </script>
  </head>
   
  <body>
   <DIV id ='console'></DIV>
  </body>
</html>

2.data.txt
 i'm ok!!!!!!!!

posted @ 2006-08-11 14:46 software5168 阅读(389) | 评论 (1)编辑 收藏

ajax 參數傳遞的例子

1.new_file.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>Untitled Document</title>
  <SCRIPT type='text/javascript' src='new_file.js'></SCRIPT>
  <SCRIPT type='text/javascript'>
   window.onload = load;
  </SCRIPT>
 </head>
 <body>
  <CENTER><INPUT type='button' id='b1'></INPUT></CENTER> 
 </body>
</html>

2.new_file.js
var value = '500';

function load(){
 var domEl = document.getElementById('b1'); 
 JsButton(value,domEl);
}
function JsButton(value,domEl){
 this.domEl = domEl;
 this.value = value;
 this.domEl.buttonObj = this;
 //this.domEl.onclick = function(){
  //alert(this.value);
 //}
 this.domEl.onclick = JsButton.prototype.clickHandler;

JsButton.prototype.clickHandler = function(){
 //alert(this.value); 在回調函數中調用this屬性時﹐
 //得到的是對應的DOM元素裡面的數值﹐此處為空。
 var buttonObj = this.buttonObj;
 var value =(buttonObj && buttonObj.value)? buttonObj.value:"unknown value";
 alert(value);
}

posted @ 2006-08-11 14:35 software5168 阅读(636) | 评论 (0)编辑 收藏

ajax

1.musical_dyn_keys.css
.musicalKeys{
 background-color:#ffe0d0;
 border:solid maroon 2px;
 position:absolute;
 overflow:auto;
 margin:4px;
}
.toplong{
 width:536px;
 height:68px;
 top:24px;
 left:24px;
}
.sidebar{
 width:100px;
 height:400px;
 top:24px;
 left:570px;
}
.musicalButton{
 border:solid navy 1px;
 width:60px;
 height:60px;
 position:relative;
 margin:2px;
 float:left;
}
.do{background-color:red;}
.re{background-color:orange;}
.mi{background-color:yellow;}
.fa{background-color:green;}
.so{background-color:blue;}
.la{background-color:indigo;}
.ti{background-color:violet;}
div.console{
 font-family:arial,helvetica;
 font-size:16px;
 color:navy;
 background-color:white;
 border:solid navy 2px;
 width:536px;
 height:320px;
 top:106px;
 left:24px;
 margin:4px;
 position:absolute;
 overflow:auto;
}

2.musical_dyn_keys.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
 <head>
  <title>Two Keyboards</title>
  <LINK rel='stylesheet' type='text/css' href='musical_dyn_keys.css'/>
  <SCRIPT type='text/javascript' src='musical_dyn_keys.js'></SCRIPT>
  <SCRIPT type='text/javascript'>
   window.onload=assignKeys
  </SCRIPT>
 </head>
 <body>
  <DIV id='keyboard-top' class='toplong musicalKeys'></DIV>
  <DIV id='keyboard-side' class='sidebar musicalKeys'></DIV>
  <DIV id='console' class='console'></DIV>
 </body>
</html>


3.musical_dyn_keys.js
var notes = new Array("do","re","mi","fa","so","la","ti","do");
function assignKeys(){
 var candidates = document.getElementsByTagName("DIV");
 if(candidates){
  for(var i=0;i<candidates.length;i++){
   var candidate = candidates[i];
   if(candidate.className.indexOf('musicalKeys')>=0){
    makeKeyboard(candidate);
   }
  }
 }
}

function makeKeyboard(el){
 for(var i=0;i<notes.length;i++){
  var key=document.createElement("DIV");
  key.className = notes[i] + " musicalButton";
  alert(key.className);
  key.note = notes[i];
  key.onclick = playNote;
  el.appendChild(key);
 } 
}

function playNote(event){
 var note = this.note;
 var console = document.getElementById('console');
 if(note && console){
  console.innerHTML +=note + ".";
 }
}

posted @ 2006-08-11 11:34 software5168 阅读(289) | 评论 (0)编辑 收藏

2006年8月10日

ajax - 簡單的客戶端MVC實現例子

1.murical.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>  
    <link rel='stylesheet' type='text/css' href='musical.css'>
    <script type='text/javascript' src="musical.js"></script>
    <script type='text/javascript'>
   window.onload = assignKeys
    </script>  
  </head>
 
  <body>
   <DIV>
    <DIV id='keyboard' class='musicalKeys'>
   <DIV class='do musicalButton'></DIV>
   <DIV class='re musicalButton'></DIV>
   <DIV class='mi musicalButton'></DIV>
   <DIV class='fa musicalButton'></DIV>
   <DIV class='so musicalButton'></DIV>
   <DIV class='la musicalButton'></DIV>
   <DIV class='ti musicalButton'></DIV>
   <DIV class='do musicalButton'></DIV>
  </DIV>
  <DIV id='console' class='console'></DIV>
   </DIV>
  </body>
</html>

2.musical.css
.body{
 background-color:white; 
}
.musicalKeys{
 background-color:#ffe0d0;
 boarder:solid maroon 2px;
 width:536px;
 height:68px;
 top:24px;
 left:24px;
 margin:4px;
 position:absolute;
 overflow:auto;
}
.musicalButton{
 border:solid navy 1px;
 width:60px;
 height:60px;
 position:relative;
 margin:2px;
 float:left;
}
.do{background-color:red;}
.re{background-color:orange;}
.mi{background-color:yellow;}
.fa{background-color:green;}
.so{background-color:blue;}
.la{background-color:indigo;}
.ti{background-color:violet;}
div.console{
 font-family:arial,helvetica;
 font-size:16px;
 color:navy;
 background-color:white;
 border:solid navy 2px;
 width:536px;
 height:320px;
 top:106px;
 left:24px;
 margin:4px;
 position:absolute;
 overflow:auto;
}

3.musical.js
function assignKeys(){
 var keyboard=document.getElementById("keyboard");
 var keys = keyboard.getElementsByTagName("DIV");
 if(keys){
  for(var i=0;i<keys.length;i++){
   var key=keys[i];
   var classes=(key.className).split(" ");
   if(classes && classes.length>=2 && classes[1]=="musicalButton"){
    var note=classes[0];
    key.note=note;
    //key.onmouseover=playNote;
    key.onclick = playNote;
   }
  }
 }
}

function playNote(event){
 var note = this.note;
 var console = document.getElementById("console");
 if(note && console){
  console.innerHTML += note + ".";
 }
}

posted @ 2006-08-10 17:03 software5168 阅读(442) | 评论 (0)编辑 收藏

2006年8月9日

ajax -rico最簡單的例子

MyHtml.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <script type="text/javascript" src="prototype.js"></script>
  <script type="text/javascript" src="rico.js"></script>
  <script type='text/javascript'>
     function accordion(){
   var outer = $('myAccordion');
   outer.style.width = '320px';  
  new Rico.Accordion(
   outer,
   {panelHeight:400,
    expandedBg:'#909090',
    collapsedBg:'#404040'
   }
  );
  }
    window.onload = accordion 
  </script>
  </head>
  <body>
   <div id='myAccordion'>
    <div>
     <div>first title</div>
     <div>first!!!!!</div>
    </div>
    <div>
     <div>second title</div>
     <div>second!!!!!</div>
    </div>
   </div>  
  </body>
</html>

posted @ 2006-08-09 15:15 software5168 阅读(556) | 评论 (0)编辑 收藏

2006年8月3日

正則表達式

 String sql = "INSERT INTO AB(A,B,C,D,E) VALUES(?,?,?,?,?)";
 sql = sql.toUpperCase();
 String str="\\s*INSERT\\s+INTO\\s+([^\\(]+)\\(([^\\)]+)\\)\\s*VALUES\\s*\\(([^\\)]+)\\)\\s*";
 Pattern p = Pattern.compile(str);
 Matcher m = p.matcher(sql);
 m.find();
 String table = m.group(1);
 String cols = m.group(2);
 String values = m.group(3);
 System.out.println("table ==== " + table); //AB
 System.out.println("cols ==== " + cols); //A﹐B﹐C﹐D﹐E
 System.out.println("values ==== " + values); //﹖﹐﹖﹐﹖﹐﹖﹐﹖

註﹕.表示任何字符
      [abc]表示abc之一字符
      [^abc]表示非abc的一字符
      \s表示空格﹐tab,換行﹐換頁﹐回車
     \S表示非空格﹐tab,換行﹐換頁﹐回車
    \d表示數字[0-9]
    \D表示非數字[^0-9]
   \w表示詞字符[a-zA-Z0-9]
   \W表示非詞字符[^a-zA-Z0-9]
 
匹配量詞   X? 表示1或0個X
                  X* 表示0或n個X
                  X+表示1或n個X

posted @ 2006-08-03 15:26 software5168 阅读(494) | 评论 (0)编辑 收藏

2006年7月25日

WEB開發中的JAVA字符編碼

一、概要
  在JAVA應用程式特別是基於WEB的程式中,經常遇到字符的編碼問題。為了防止出現亂碼,首先需要了解JAVA是如何處理字符的,這樣就可以有目的地在輸入/輸出環節中增加必要的轉碼。其次,由於各種伺服器有不同的處理方式,還需要多做試驗,確保使用中不出現亂碼。
二、基本概念
2.1 JAVA中字符的表達
  JAVA中有char、byte、String這幾個概念。char 指的是一個UNICODE字符,為16位的整數。byte 是字節,字符串在網路傳輸或存儲前需要轉換為byte數組。在從網路接收或從存儲設備讀取後需要將byte數組轉換成String。String是字符串,可以看成是由char組成的數組。String 和 char 為內存形式,byte是網路傳輸或存儲的序列化形式。
舉例:

String ying = “英”;
char ying = ying.charAt(0);
String yingHex = Integer.toHexString(ying);
82 F1
byte yingGBBytes = ying.getBytes(“GBK”);
GB編碼的字節數值
D3 A2

 

2.2 編碼方式的簡介
  String序列化成byte數組或反序列化時需要選擇正確的編碼方式。如果編碼方式不正確,就會得到一些0x3F的值。常用的字符編碼方式有ISO8859_1、GB2312、GBK、UTF-8/UTF-16/UTF-32。
ISO8859_1用來編碼拉丁文,它由單字節(0-255)組成。
  GB2312、GBK用來編碼簡體中文,它有單字節和雙字節混合組成。最高位為1的字節和下一個字節構成一個漢字,最高位為0的字節是ASCII碼。
  UTF-8/UTF-16/UTF-32是國際標準UNICODE的編碼方式。 用得最多的是UTF-8,主要是因為它在對拉丁文編碼時節約空間。

UNICODE值 UTF-8編碼
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

三、J2SE中相關的函數
String str =”英”;
//取得GB2312編碼的字節
byte[] bytesGB2312 = str.getBytes(“GB2312”);

//取得平臺缺省編碼的字節(solaris為ISO8859_1,windows為GB2312)
byte[] bytesDefault = str.getBytes();

//用指定的編碼將字節轉換成字符串
String newStrGB = new String(bytesGB2312, “GB2312”);

//用平臺缺省的編碼將字節轉換成字符串(solaris為ISO8859_1,windows為GB2312)
String newStrDefault = new String(bytesDefault);

//用指定的編碼從字節流裏面讀取字符
InputStream in = xxx;
InputStreamReader reader = InputStreamReader( in, “GB2312”);
char aChar = reader.read();
四、JSP、數據庫的編碼
4.1 JSP中的編碼
(1) 靜態聲明:
CHARSET有兩個作用:
JSP文件的編碼方式:在讀取JSP文件、生成JAVA類時,源JSP文件中漢字的編碼
JSP輸出流的編碼方式:在執行JSP時,往response流裏面寫入數據的編碼方式
(2) 動態改變:在往response流裏面寫數據前可以調用response.setContentType(),設定正確的編碼類型。
(3) 在TOMCAT中,由Request.getParameter() 得到的參數,編碼方式都是ISO8859_1。所以如果在瀏覽器輸入框內輸入一個漢字“英”,在伺服器端就得到一個ISO8859_1編碼的(0x00,0xD3,0x00,0xA2)。所以通常在接收參數時轉碼:
String wrongStr = response.getParameter(“name”);
String correctStr = new String(wrongStr.getBytes(“ISO8859_1”),”GB2312”);
在最新的SERVLET規範裏面,也可以在獲取參數之前執行如下代碼:
request.setCharacterEncoding(“GB2312”);

4.2 數據庫的編碼
(1) 數據庫使用UTF-16
如果String中是UNICODE字符,寫入讀出時不需要轉碼
(2) 數據庫使用ISO8859_1
如果String中是UNICODE字符,寫入讀出時需要轉碼
寫入:String newStr = new String(oldStr.getByte(“GB2312”), “ISO8859_1”);
讀出:String newStr = new String(oldStr.getByte(“ISO8859_1”),”GB2312”);
五、源文件的編碼
5.1 資源文件
資源文件的編碼方式和編輯平臺相關。在WINDOWS平台下編寫的資源文件,以GB2312方式編碼。在編譯時需要轉碼,以確保在各個平臺上的正確性:
native2ascii –encoding GB2312 source.properties
這樣從資源文件中讀出的就是正確的UNICODE字符串。
5.2 源文件
源文件的編碼方式和編輯平臺相關。在WINDOWS平台下開發的源文件,以GB2312方式編碼。在編譯的時候,需要指定源文件的編碼方式:
javac –encoding GB2312
JAVA編譯後生成的字節文件的編碼為UTF-8。


點最新版TOMCAT4.1.18支援request.setCharacterEncoding(String enc)
點資源文件轉碼成company.name=\u82f1\u65af\u514b
點如果數據庫使用utf-16則不需要這部分轉碼
點頁面上應有
轉碼ⅰ:
String s = new String
(request.getParameter(“name”).getBytes(“ISO8859_1”),”GB2312”);
轉碼ⅱ:
String s = new String(name.getBytes(“GB2312”),”ISO8859_1”);
轉碼ⅲ:
String s = new String(name.getBytes(“ISO8859_1”),” GB2312”);

posted @ 2006-07-25 17:12 software5168 阅读(952) | 评论 (0)编辑 收藏

2006年7月12日

JAVA的反編譯---使用jad

1.單個.class文件編譯
  首先從控制台進入jad.exe目錄
   運行 jad example1.class
  (此時example1.class和jad.exe位於同一個目錄)
  成功運行後﹐當前目錄下產生一個新文件example1.jad﹐裡面為反編譯後的java代碼

2.多個.class文件編譯
與1大致相同
輸入jad -o -dtest -sjava *.class
其中"test"表示反編譯文件的存放目錄﹐"java"表示反編譯後產生文件的後綴名

3.某文件夾下所有文件編譯
與1大致相同
輸入jad -o -dtest -sjava  tree/**/*.class
其中"test"表示反編譯文件的存放目錄﹐"java"表示反編譯後產生文件的後綴名
tree表示源文件夾名

詳細說明參看“Readme.txt”
jad下載聯接 http://www.infoxa.com/asp/soft_file/xxnr_soft_242.htm

posted @ 2006-07-12 11:36 software5168 阅读(1369) | 评论 (0)编辑 收藏

2006年6月30日

Java操作Excel的一种方法

Java操作Excel的一种方法 

 bromon原创 版权所有

  MS的电子表格(Excel)是Office的重要成员,是保存统计数据的一种常用格式。作为办公文档,势必要涉及到的电子文档的交换,Excel是一种在企业中非常通用的文件格式,打印和管理也比较方便。在一个Java应用中,将一部分数据生成Excel格式,是与其他系统无缝连接的重要手段。

  在开源世界中,有两套比较有影响的API可供使用,一个是POI,一个是jExcelAPI。其中jExcelAPI是一个韩国程序员的作品,虽然没有POI那样血统高贵,但是在笔者的使用过程中,感觉简单方便,对中文支持非常好,功能也比较强大。可以在sourceforge.net下载。作者的网站上对它的特征有如下描述:

 ● 支持Excel 95-2000的所有版本
 ● 生成Excel 2000标准格式
 ● 支持字体、数字、日期操作
 ● 能够修饰单元格属性
 ● 支持图像和图表

  应该说以上功能已经能够大致满足我们的需要。最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。

  搭建环境

  将下载后的文件解包,得到jxl.jar,放入classpath,安装就完成了。

 基本操作

 一、创建文件

 拟生成一个名为“测试数据.xls”的Excel文件,其中第一个工作表被命名为“第一页”,大致效果如下:

 

 代码(CreateXLS.java):
  
 
  1. //生成Excel的类
  2.  import java.io.*;
  3.  import jxl.*;
  4.  import jxl.write.*;
  5.  public class CreateXLS
  6.  {
  7.    public static void main(String args[])
  8.    {
  9.    try
  10.    {
  11.     //打开文件
  12.     WritableWorkbook book=Workbook.createWorkbook(new File(“测试.xls”));
  13.      
  14.     //生成名为“第一页”的工作表,参数0表示这是第一页
  15.     WritableSheet sheet=book.createSheet(“第一页”,0);
  16.    
  17.     //在Label对象的构造子中指名单元格位置是第一列第一行(0,0)
  18.     //以及单元格内容为test
  19.     Label label=new Label(0,0,”test”);
  20.     //将定义好的单元格添加到工作表中
  21.     sheet.addCell(label);
  22.     /**生成一个保存数字的单元格
  23.     *必须使用Number的完整包路径,否则有语法歧义
  24.     *单元格位置是第二列,第一行,值为789.123
  25.     */
  26.     jxl.write.Number number = new jxl.write.Number(1,0,789.123);
  27.     sheet.addCell(number);
  28.     //写入数据并关闭文件
  29.     book.write();
  30.     book.close();
  31.     }catch(Exception e)
  32.     {
  33.       System.out.println(e);
  34.     }
  35.   }
  36.  } 

 编译执行后,会在当前位置产生一个Excel文件。

 三、读取文件

 以刚才我们创建的Excel文件为例,做一个简单的读取操作,程序代码如下:
  
 
  1. //读取Excel的类
  2.  import java.io.*;
  3.  import jxl.*;
  4.  public class ReadXLS
  5.  {
  6.  public static void main(String args[])
  7.  {
  8.   try
  9.   {
  10.    Workbook book=
  11.  Workbook.getWorkbook(new File(“测试.xls”));
  12.    
  13.    //获得第一个工作表对象
  14.  Sheet sheet=book.getSheet(0);
  15.  //得到第一列第一行的单元格
  16.  Cell cell1=sheet.getCell(0,0);
  17.  String result=cell1.getContents();
  18.  System.out.println(result);
  19.  book.close();
  20.   }catch(Exception e)
  21.   {
  22.    System.out.println(e);
  23.   }
  24.  }
  25.  } 


 程序执行结果:test

 四、修改文件

 利用jExcelAPI可以修改已有的Excel文件,修改Excel文件的时候,除了打开文件的方式不同之外,其他操作和创建Excel是一样的。下面的例子是在我们已经生成的Excel文件中添加一个工作表:

 
  1. //修改Excel的类,添加一个工作表
  2.  import java.io.*;
  3.  import jxl.*;
  4.  import jxl.write.*;
  5.  public class UpdateXLS
  6.  {
  7.  public static void main(String args[])
  8.  {
  9.   try
  10.   {
  11.    //Excel获得文件
  12.    Workbook wb=Workbook.getWorkbook(new File(“测试.xls”));
  13.    
  14.    //打开一个文件的副本,并且指定数据写回到原文件
  15.  WritableWorkbook book=
  16.  Workbook.createWorkbook(new File(“测试.xls”),wb);
  17.    
  18.    //添加一个工作表
  19.    WritableSheet sheet=book.createSheet(“第二页”,1);
  20.    sheet.addCell(new Label(0,0,”第二页的测试数据”));
  21.    
  22.    book.write();
  23.    book.close();
  24.   }catch(Exception e)
  25.   {
  26.    System.out.println(e);
  27.   }
  28.  }
  29.  } 

 执行结果如图:

 

 高级操作

 一、 数据格式化

 在Excel中不涉及复杂的数据类型,能够比较好的处理字串、数字和日期已经能够满足一般的应用。

 1、 字串格式化

 字符串的格式化涉及到的是字体、粗细、字号等元素,这些功能主要由WritableFont和WritableCellFormat类来负责。假设我们在生成一个含有字串的单元格时,使用如下语句,为方便叙述,我们为每一行命令加了编号:


 
  1. WritableFont font1=
  2.  new WritableFont(WritableFont.TIMES,16,WritableFont.BOLD); ①
  3.  WritableCellFormat format1=new WritableCellFormat(font1); ②
  4.  Label label=new Label(0,0,”data 4 test”,format1) ③


 其中①指定了字串格式:字体为TIMES,字号16,加粗显示。WritableFont有非常丰富的构造子,供不同情况下使用,jExcelAPI的java-doc中有详细列表,这里不再列出。

 ②处代码使用了WritableCellFormat类,这个类非常重要,通过它可以指定单元格的各种属性,后面的单元格格式化中会有更多描述。

 ③处使用了Label类的构造子,指定了字串被赋予那种格式。

 在WritableCellFormat类中,还有一个很重要的方法是指定数据的对齐方式,比如针对我们上面的实例,可以指定:

 
  1. //把水平对齐方式指定为居中
  2.  format1.setAlignment(jxl.format.Alignment.CENTRE);


 
  1. //把垂直对齐方式指定为居中
  2.  format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);


 二、单元格操作

 Excel中很重要的一部分是对单元格的操作,比如行高、列宽、单元格合并等,所幸jExcelAPI提供了这些支持。这些操作相对比较简单,下面只介绍一下相关的API。

 1、 合并单元格

 
  1. WritableSheet.mergeCells(int m,int n,int p,int q); 


 作用是从(m,n)到(p,q)的单元格全部合并,比如:
 
  1. WritableSheet sheet=book.createSheet(“第一页”,0);


 //合并第一列第一行到第六列第一行的所有单元格
 
  1. sheet.mergeCells(0,0,5,0);


 合并既可以是横向的,也可以是纵向的。合并后的单元格不能再次进行合并,否则会触发异常。

 2、 行高和列宽

 
  1. WritableSheet.setRowView(int i,int height);


 作用是指定第i+1行的高度,比如:

 //将第一行的高度设为200
 
  1. sheet.setRowView(0,200);
  2.  WritableSheet.setColumnView(int i,int width);


 作用是指定第i+1列的宽度,比如:

 //将第一列的宽度设为30
 
  1. sheet.setColumnView(0,30);


 jExcelAPI还有其他的一些功能,比如插入图片等,这里就不再一一介绍,读者可以自己探索。


posted @ 2006-06-30 16:54 software5168 阅读(1138) | 评论 (0)编辑 收藏

使用Java读取Excel文件内容

可以用Java读取Microsoft Excel文件。微软提供了一个Excel的ODBC驱动程序,因此我们就可以使用JDBC和Sun的JDBC-ODBC驱动来读取Excel文件了。

  如果你有个Excel文件,名为Book1.xls(译者注:由于原文的例子我没有下载下来,所以我用了自己的例子),并且,该文件中有一个工作表(sheet)名为Sheet1

  

微软的ODBC驱动程序把工作表中的第一行作为列名(译者注:即字段名),工作表名作为数据库表名。

  要通过JDBC访问工作表,我们还必须创建一个新的ODBC数据源,在Windows 2000系统上创建数据源的过程如下:


进入“控制面板” --> “管理工具” --> “数据源(ODBC)”,(译者注:打开后选择系统DSN),点击添加,在弹出窗口中选择“Driver do Microsoft Excel(*.xls)”




然后在数据源名处输入你一个名字Book1(译者注:相当于数据库名),然后点击“选择工作簿”,然后找到并选取你的Excel文件


点击确定后,系统数据源列表中会出现你设置的数据源名称,
  



  现在数据表已经在数据源列表里了(译者注:点击确定完成配置)。

  (译者注:我的例子中)现在如果我们想挑出test1列中的所有“测试”值,那就需要用以下的SQL查询:

  SELECT test1 FROM [Sheet1$] WHERE test1='测试'

  要注意的是工作表名后面跟了一个“$”符号,这个符号是不可缺少的。为什么?因为他的前后有方括号,因为“$”是SQL语句中的保留字。Life is never easy(译者注:作者发感慨了)。

下面是例子程序:
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.DriverManager;

public class ExcelReader {

    public static void main( String[] args ) {

        Connection c = null;
        Statement stmnt = null;
        try {
            Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
            c = DriverManager.getConnection( "jdbc:odbc:Book1", "", "" );
            stmnt = c.createStatement();
            String query = "SELECT test1 FROM [Sheet1$] WHERE test1='测试'";
            ResultSet rs = stmnt.executeQuery( query );
            
            System.out.println( "查得匹配'测试'的test1的记录为:" );
            while( rs.next() ) {
                System.out.println( rs.getString( "test1" ) );
            }
        }
        catch( Exception e ) {
            System.err.println( e );
        }
        finally {
            try {
                stmnt.close();
                c.close();
            }
            catch( Exception e ) {
                System.err.println( e );
            }
        }
    }
}

在此程序中,主函数main() 建立了一个数据表的连接,并取出符合条件的记录。

(译者注:另外,我这里还有一段程序,是读取所有记录的程序,仅作参考):

import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.DriverManager;

public class ExcelReader {

    public static void main(String[] args){
        Connection connection = null;

        try{
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection con = DriverManager.getConnection( "jdbc:odbc:Book1","","" );
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery( "SELECT * FROM [Sheet1$]" );

            ResultSetMetaData rsmd = rs.getMetaData();
            int numberOfColumns = rsmd.getColumnCount();

            while (rs.next()) {
                for (int i = 1; i <= numberOfColumns; i++) {
                    if(i>1)  //用逗号分隔各列
      System.out.print(", ");
                    String columnValue = rs.getString(i);
                    System.out.print(columnValue);
                }
                System.out.println("");
            }

            st.close();
            con.close();


        } catch(Exception ex) {
            System.err.print("Exception: ");
            System.err.println(ex.getMessage());
        }
    }

}

posted @ 2006-06-30 16:51 software5168 阅读(9948) | 评论 (4)编辑 收藏

仅列出标题  下一页
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿(3)

随笔分类

随笔档案

收藏夹

JAVA學習網站

綜合

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜