Friday, July 03, 2009

java 使用相对路径读取文件

java 使用相对路径读取文件


1.java project环境,使用java.io用相对路径读取文件的例子:


*目录结构:


DecisionTree


            |___src


                 |___com.decisiontree.SamplesReader.java


            |___resource


                 |___train.txt,test.txt


 *SamplesReader.java:


  String filepath="resource/train.txt";//注意filepath的内容;


  File file=new File(filepath);


  ……


 *我们留意filepath的内容,java.io默认定位到当前用户目录("user.dir")下,即:工程根目


录"D:\DecisionTree"下,因此,此时的相对路径(以user.dir为基路径的路径)为"resource/train.txt"


。这样,JVM就可以根据"user.dir"与"resource/train.txt"得到完整的路径(即绝对路


径)"D:\DecisionTree\resource\train.txt",从来找到train.txt文件。


 *注意:相对路径的起始处无斜杆"/";例如:


filepath="resource/train.txt";


而不是filepath="/resource/train.txt"; //error!


2、javaEE环境,使用Classloader用相对路径读取xml的例子:


 *参见之前写的文章“通过虚拟路径或相对路径读取一个xml文件,避免硬编码”。


 *内容如下:


 java使用相对路径读取xml文件:


一、xml文件一般的存放位置有三个:


1.放在WEB-INF下;


2.xml文件放在/WEB-INF/classes目录下或classpath的jar包中;


3.放在与解析它的java类同一个包中,不一定是classpath;


二、相对应的两种使用相对路径的读取方法:


方法一:(未验证)


将xml文件放在WEB-INF目录下,然后


程序代码:


InputStream is=getServletContext().getResourceAsStream( "/WEB-INF/xmlfile.xml" );


方法二:将xml文件放在/WEB-INF/classes目录下或classpath的jar包中,则可以使用ClassLoader的静态


方法getSystemResourceAsStream(String s)读取;


程序代码:


String s_xmlpath="com/spf/web/ext/hotspot/hotspotxml/hotspot.xml";


InputStream in=ClassLoader.getSystemResourceAsStream(s_xmlpath);


方法三:xml在随意某个包路径下:


String s_xmlpath="com/spf/web/ext/hotspot/hotspotxml/hotspot.xml";


ClassLoader classLoader=HotspotXmlParser.class.getClassLoader();


InputStream in=classLoader.getResourceAsStream(s_xmlpath);

Monday, June 15, 2009

Spring2结合DWR2的用户注册的例子

1.软件版本



Spring-Version: 2.0.7   http://www.springframework.org/

DWR-version: 2.0.2  http://getahead.org/dwr

IDE: Eclipse 3.2 + MyEclipse 6.0





2.新建工程:dwrsping



加入对spring的支持,并把dwr的jar包dwr.jar复制到WEB-INF\lib下

需要的jar包为:







3.编辑web.xml加入对spring和dwr的支持




Xml代码



  1. <!-- DWR servlet 配置 -->  

  2. <servlet>  

  3.     <servlet-name>dwr-invoker</servlet-name>  

  4.     <servlet-class>  

  5.         org.directwebremoting.spring.DwrSpringServlet  

  6.     </servlet-class>  

  7.     <init-param>  

  8.         <param-name>debug</param-name>  

  9.         <param-value>true</param-value>  

  10.     </init-param>  

  11. </servlet>  

  12. <servlet-mapping>  

  13.     <servlet-name>dwr-invoker</servlet-name>  

  14.     <url-pattern>/dwr/*</url-pattern>  

  15. </servlet-mapping>  

  16.   

  17. <!-- 设置Spring监听器 -->  

  18. <listener>  

  19.     <listener-class>  

  20.         org.springframework.web.context.ContextLoaderListener  

  21.     </listener-class>  

  22. </listener>  








说明:




org.directwebremoting.


spring

.DwrSpringServlet这个类是dwr专门为整合


spring

提供的一个servlet,加入这个之后,dwr的配置就可以写入到


spring

的配置文件applicationContext.xml中,省掉了dwr.xml








4.编辑jsp页面 index.jsp








Html代码



  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  

  2.   

  3. <html>  

  4.   <head>      

  5.     <title>DWR+SPRING</title>  

  6.     <script type="text/javascript" src="dwr/engine.js"></script>  

  7.     <script type="text/javascript" src="dwr/util.js"></script>  

  8.     <script type="text/javascript" src="dwr/interface/UserAjaxHelper.js"></script>  

  9.     <script language="javascript">  

  10.     function checkUser(widget){  

  11.         var username = widget.value;  

  12.         //将username传入到checkUsername方法,返回后调用showUsermsg的js方法  

  13.         UserAjaxHelper.checkUsername(username,showUsermsg);  

  14.     }  

  15.   

  16.     //showUsermsg的方法定义,data为checkUsername的返回值  

  17.     var showUsermsg = function(data){  

  18.         if(data){  

  19.                 DWRUtil.setValue("usermsg","<font color='red'>此用户名已被使用</font>", { escapeHtml:false });  

  20.             }  

  21.             else{  

  22.                 DWRUtil.setValue("usermsg","<font color='green'>此用户名可以使用</font>", { escapeHtml:false });  

  23.             }  

  24.     }  

  25.     </script>  

  26.   </head>  

  27.     

  28.   <body onload='dwr.util.useLoadingMessage()'>  

  29.     <form action="#">  

  30.         <table border="0">  

  31.             <tr><td>用户名:</td><td><input type="text" name="username" id="username" value="" onkeyup="checkUser(this);"/><span id="usermsg"></span></td></tr>  

  32.             <tr><td>密码:</td><td><input type="password" name="userpwd" id="userpwd" value=""></td></tr>  

  33.             <tr><td><input type="submit" value="注册"/></td><td><input type="reset" value="清空"/></td></tr>  

  34.         </table>  

  35.     </form>  

  36.   </body>  

  37. </html>  








说明:






Html代码



  1. <script type="text/javascript" src="dwr/engine.js"></script>  

  2. <script type="text/javascript" src="dwr/util.js"></script>  






这两个是dwr默认要调用的js文件,必须写到文件里




UserAjaxHelper.js就是通过applicationContext.xml文件配置的AJAX操作类




调用的写法为:






Html代码



  1. UserAjaxHelper.checkUsername(username,showUsermsg);  

  2. var showUsermsg = function(data){......}  








有时写成:






Html代码



  1. UserAjaxHelper.checkUsername(username,showUsermsg());  

  2. function showUsermsg (data){......}  






这样就会出问题,showUsermsg就会得不到返回值data,不知道为什么








5. 编辑


spring

的配置文件applicationContext.xml,加入对dwr的配置






Xml代码



  1. <?xml version="1.0" encoding="UTF-8"?>  

  2. <beans  

  3.     xmlns="http://www.springframework.org/schema/beans"  

  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

  5.     xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"  

  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  

  7.      http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-2.0.xsd">  

  8.        

  9.     <!-- DWR 配置开始 -->  

  10.     <dwr:configuration></dwr:configuration><!-- 必须要configuration -->  

  11.     <dwr:controller id="dwrController" debug="true" />  

  12.     <!-- DWR 配置结束 -->  

  13.         

  14.      <!-- spring bean配置 -->  

  15.      <bean id="userService" class="test.bcndyl.service.impl.UserServiceImpl">  

  16.      </bean>  

  17.        

  18.      <bean id="userAjaxHelper" class="test.bcndyl.dwr.UserAjaxHelper">  

  19.         <property name="userService" ref="userService" />  

  20.         <!-- 定义调用的js文件 -->  

  21.         <dwr:remote javascript="UserAjaxHelper"></dwr:remote>  

  22.     </bean>  

  23.     <!-- end spring bean配置 -->  

  24. </beans>  






说明:






要加入dwr的定义






xmlns:dwr=http://www.directwebremoting.org/schema/


spring

-dwr






还有http://www.directwebremoting.org/schema/


spring

-dwr http://www.directwebremoting.org/schema/


spring

-dwr-2.0.xsd






所有dwr的定义要加dwr的前缀,由于只是传入string类型的username,所以就没有配置convert






6.dwr调用的操作类UserAjaxHelper






Java代码



  1. package test.bcndyl.dwr;  

  2.   

  3. import test.bcndyl.service.IUserService;  

  4.   

  5. public class UserAjaxHelper {  

  6.       

  7.     private IUserService userService;  

  8.   

  9.     public IUserService getUserService() {  

  10.         return userService;  

  11.     }  

  12.   

  13.     public void setUserService(IUserService userService) {  

  14.         this.userService = userService;  

  15.     }  

  16.       

  17.     public boolean checkUsername(String username){  

  18.         boolean returnVal = this.getUserService().isUserExist(username);  

  19.         return returnVal;  

  20.     }  

  21.   

  22. }  






用户操作的service接口IUserService






Java代码



  1. package test.bcndyl.service;  

  2.   

  3. public interface IUserService {  

  4.       

  5.     //用户是否存在  

  6.     public boolean isUserExist(String username);  

  7.   

  8. }  






用户操作的service接口IUserService的实现类UserServiceImpl






Java代码



  1. package test.bcndyl.service.impl;  

  2.   

  3. import test.bcndyl.service.IUserService;  

  4.   

  5. public class UserServiceImpl implements IUserService {  

  6.   

  7.     @Override  

  8.     public boolean isUserExist(String username) {  

  9.         /* 

  10.          *  添加访问数据库代码  

  11.          *  或者调用Hibernate方法 

  12.          *  返回用户是否存在 

  13.          *  true--用户存在,false-用户不存在 

  14.          */  

  15.           

  16.         //测试代码,检测用户名是否为hello,是hello返回true,不是hello返回false  

  17.         if("hello".equals(username))  

  18.             return true;  

  19.         return false;  

  20.     }  

  21.   

  22. }  








7.检测dwr是否正确工作的方法,可以在浏览器地址栏输入http://localhost:8080/appName/dwr




可以看到可供dwr调用的方法








8. 此例子程序运行结果




dwr spring整合


Ajax,它使浏览器可以为用户提供更为自然的浏览体验,对于j2EE WEB开发人员来说,使用DWR框架可以很简单的使用Ajax技术.

本文以一个DWR+SPRING的实例来说明DWR的使用

1、将dwr.jar放到应用的/WEB-INF/lib目录下

2、配置web.xml,增加如下代码:


代码




  1. <!--初始化WebApplicationContext-->  

  2.  <context-param>  

  3.         <param-name>contextConfigLocation</param-name>  

  4.         <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml</param-value>  

  5.  </context-param>  

  6.  <listener>  

  7.        <listener-class>  

  8.              org.springframework.web.context.ContextLoaderListener   

  9.        </listener-class>  

  10.  </listener>  

  11. <!--配置DWR拦截器-->  

  12.  <servlet>  

  13.   <servlet-name>dwr-invoker</servlet-name>  

  14.   <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>  

  15.   <init-param>  

  16.    <param-name>debug</param-name>  

  17.    <param-value>true</param-value>  

  18.   </init-param>  

  19.  </servlet>  

  20.  <servlet-mapping>  

  21.   <servlet-name>dwr-invoker</servlet-name>  

  22.   <url-pattern>/dwr/*</url-pattern>  

  23.  </servlet-mapping>  






3、增中dwr.xml文件

文件内容:

代码




  1. <?xml version="1.0" encoding="UTF-8"?>  

  2. <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">  

  3. <dwr>  

  4.  <allow>  

  5.   <create creator="spring" javascript="DWRUser">  

  6.    <param name="beanName" value="DWRUser"/>  

  7.   </create>  

  8.  </allow>  

  9. </dwr>  






creator属性的值可以是new,struts,spring......因为此处是整合spring来做的,所以设置成“spring”,javascript="DWRUser" 表示实例转换成javascript语言后以DWRUser命名,前台页面可以通过代码(<script type='text/javascript' src='../../dwr/interface/DWRUser.js'></script>)来调用。param元素的name属性值可以是class,beanName等,此处用beanName,value得值是定义在applicationContext.xml中某个bean的id值。

4、创建一个实体bean供DWR转换成js

代码




  1. package com.note.dwr;   

  2. import com.note.bussies.service.IUserService;   

  3. public class User {   

  4.  private IUserService ius;   

  5.     

  6.  public IUserService getIus() {   

  7.   return ius;   

  8.  }   

  9.  public void setIus(IUserService ius) {   

  10.   this.ius = ius;   

  11.  }   

  12.  public User(){   

  13.      

  14.  }   

  15.  public boolean isExist(String username) {   

  16.       Users user = this.ius.getUserByName(username);   

  17.       return (null == user) ? false : true;   

  18.  }   

  19. }  






5、在applicationContext.xml中配置第4步写的bean

代码




  1. ......   

  2.  <bean id="DWRUser" class="com.note.dwr.User">  

  3.   <property name="ius">  

  4.    <ref bean="UserService" />  

  5.   </property>  

  6.  </bean>  

  7. ......  






6、在视图页面中调用

先导入以下文,每个文件的功能这里不再详述

代码




  1. <script type='text/javascript' src='../../dwr/interface/DWRUser.js'></script>  

  2. <script type='text/javascript' src='../../dwr/engine.js'></script>  

  3. <script type='text/javascript' src='../../dwr/util.js'></script>  






因为我的视图文件是放在/view/user/下,所以这里用了../../返回到根

具体调用:

代码




  1. <script type='text/javascript'>  

  2.  function regUserChked(){   

  3.   var username=$("username").value;   

  4.   DWRUser.isExist(username,showData);//showData回调函数   

  5.  }   

  6.  function showData(data){   

  7.      if(data){   

  8.           DWRUtil.setValue("userMsg","该用户名已经被注册,请更换您的用户名!");   

  9.      }else{   

  10.           DWRUtil.setValue("userMsg","恭喜您,该用户名尚未被注册!");         

  11.      }   

  12.  }   

  13. </script>  

  14. input type="text" name="username" value="" onblur="regUserChked()" /><div id="userMsg"></div>