`

一些SSH笔记

 
阅读更多

程序开发笔记:

1)2011-10-25:(javascript)

因为引用js文件,闭合符号写成另外一种,导致查错半天才找到:
<script type="text/javascript" src="../js/data.js"/>
<script type="text/javascript" src="../js/My97DatePicker/WdatePicker.js"/>
改成
<script type="text/javascript" src="../js/data.js"></script>
<script type="text/javascript" src="../js/My97DatePicker/WdatePicker.js"/>
之后就对了,上面那种情况,WdatePicker文件未能被引入。但是最后一个引入的js文件可以以斜杠结束引入。而不需要写</script>...结果后面的内部自定义js代码却失效了。
所以,以后就写成</script>这种闭合方式。


2) 2011-10-26(Struts)
在一个action中,添加了其他的service类,不仅要在action中加入setter和getter,还要在spring配置文件中注入。。。。。。。。。

3)2011-10-26(方法)
一定要牢记FireBug这个工具,可以调试很多东西。
还有Eclipse自带的debug程序,设置断点,单步调试。

4)2011-10-26(标签)
在使用c:when,c:otherwise时候,一定要记得在外面套一层c:choose,否则会报错

5)2011-11-8(javascript)
javascript判断对象为null的时候,这么写if(empName == "null" || empName == ""){
     alert('您输入的工号不存在,请重新输入!');
    }
因为null它是把它当成字符串的


6)Hibernate
当你在表单的name中设置了 name.assigner.empId,然后赋值了之后,传到后台,
正确的做法是TEmp assigner =  apply.getAssigner();
  assigner = empService.queryEmpById(assigner);
  apply = applyService.queryApplyById(apply.getApplyId()); 这里,因为传过来的是applyId,传过来的apply对象中,实际只有少量的属性有值,因此可以选择先从数据库中查出对象,然后对需要更改或者添加的属性进行相应的更改或者赋值。
  apply.setAssigner(assigner)

7)在一般的类(非servlet类)中获取Spring的IOC容器
ApplicationContext ac = new FileSystemXmlApplicationContext("src/applicationContext.xml");
进而可以获取Bean
AssetService assetService = (AssetService)ac.getBean("assetService");

而在Servlet相关的类中,采用如下的方式可以获取
   ApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext);
WebApplicationContext springCtx = WebApplicationContextUtils.getWebApplicationContext(session.getServletContext())


8)使用下面的方法,可以读取web.xml文件中,配置的url参数(如 http://itsm.genomics.org.cn
ContextLoader.getCurrentWebApplicationContext().getServletContext().getInitParameter("url");

9)HTML
在xhtml里面,要想页面显示“<”而不把它当成是标签的话,必须要转换成它的实体--- &lt;
相类似的有,&对应 &amp;  像这种类似的实体一共有5000多个,都是以&开头,以分号;结束。


10)CSS 权重计算
    通配选择符的权值 0   *{color:red;}
    标签的权值为 1       p{height:12px;}
    类的权值为 10        .main-content{background-color:#abc;}   <div class="main-content"></div>
    属性选择的权值为 10  span[class=demo] { color: red; }         <span class="demo"></span>
    伪类选择的权值为 10  a:hover{text-decoration:underline;color:yellow;} <a href="#"></a>
    伪对象选择的权值为 1  div:first-letter { font-size:14px; }         <div></div>
    ID的权值为 100       #navigationbar{word-wrap:break;}   <div id="navigationbar"></div>
    important的权值为最高 1000  p{text-align:center !important;font-size:12px;}
规则是:选择器的权值加到一起,大的优先;如果权值相同,后定义的优先


组合方式有两种:子对象选择符和 包含选择符
包含选择符    table td { font-size:14px; }
子对象选择符  body > p { font-size:14px; }

下面是 一个文件示例
<html>
 <head><title>javascript study</title>
<style type="text/css">
#content div#main-content h2{color:red;}           注意这里div#main-content之间如果有逗号(“,”)或者空格(“ ”)含义都不一样!!!
#content #main-content>h2{color:blue;} 
body #content div[id="main-content"] h2{color:green;}   其中,div[id="main-content"]的权重计算为 1+10
#main-content div.paragraph h2{color:orange;} 
#main-content [class="paragraph"] h2{color:yellow;} 
div#main-content div.paragraph h2.first{color:pink;}        其中,div.paragraph 的权重计算为 1+10
</style>
</head>
<body>
 <div id="content"> 
            <div id="main-content"> 
              <h2>CSS简介</h2> 
       <p>CSS(Cascading Style Sheet,可译为“层叠样式表”或“级联样式表”)是一组格式设置规则,用于控制Web页面的外观。</p> 
            <div class="paragraph"> 
              <h2 class="first">使用CSS布局的优点</h2> 
                  <p>1、表现和内容相分离 2、提高页面浏览速度 3、易于维护和改版 4、使用CSS布局更符合现在的W3C标准.</p> 
             </div> 
          </div> 
  </div>
</body>
<html>

上例中,权值的计算结果为:
第一个特殊性的值=2*100+2*1=202
第二个特殊性的值=2*100+1=201
第三个特殊性的值=1*100+1*10+3*1=113
第四个特殊性的值=1*100+1*10+2*1=112
第五个特殊性的值=1*100+1*10+1*1=111
第六个特殊性的值=1*100+2*10+3*1=123


11)CSS 文本属性:
text-indent缩进、text-align对齐方式、letter-spacing字母间距、word-spacing单词间距、line-height行与行基线之间的距离、vertical-align垂直对齐方式、text-decoration修饰方式、text-transform大小写方式 ?
“蛇形”文本的概念。文本盒子跨过多行,而且只在第一行和最后一行的结尾是闭合的。
所有文本属性只应用到 一条长长的,像蛇一样的内部文本盒子上,而不是应用到包含元素的盒子上!!!

负文本缩进:要注意设置左外边距,使其大于负边距,从而保证不会被截断
<div style="text-indent:5%;width:800px;height:300px;"><p style="width:400px;"></p><p style="width:400px"></p></div>
这里,p会继承div的 text-indent属性的值。不过,同所有继承的css值一样,这个值不是定义的值,而是计算的值。所以它继承的是值,而不是5%。
因此,这里可以确保无论div中的段落有多宽,都会具有相同的缩进量,当然,可以通过为子元素设置不同的text-indent值 覆盖这一 行为。

text-align 文本会在水平方向上与包含元素对齐,因此必须在包含元素上设置这个属性。
line-height 行高值不需要任何单位!一般做法: div#intro{font:1.2em/1.4;}
text-transform:uppercase(全部大写),lowercase(全部小写)  capitalize(首字母大写)none
vertical-align: 垂直居中一般比较复杂。。。  可以相对于基线将文本向上方或向下方移动。所以常用于将公式或者数学表达式中的数字转换为上标或者下标。
示例:
p.custom sub{vertical-align:-.25em;font-size:65%;}
p.custom sup{vertical-align:.6em;font-size:65%;}

12)CSS 盒模型
为元素添加边框的时候,应该同时设置内边距,以避免内容与边框接触。
border相关的有三个属性:width【thin,medium,thick或者其他任何长度单位 px,em,x%】
                        style【none,hidden,dotted,dashed,solid,double,groove,ridge,inset和 outset】
                        color【任何颜色值】
p.warning{border:4px solid #F33;padding:2px;}可以这么写,也可以挑出来 border、width。

13)CSS 盒模型中的 外边距
外边距比较复杂,一般我们都先把它的默认值清空 *{margin:0;padding:0;}

一般采取这种设置方式  p{font-size:1em;margin:.75em;30px;} em可以等比例变化
 “垂直的外边距折叠”!! 当上下边距相遇时,他们会互相折叠,直至一个元素的外边距接触到另一个元素。【可以理解为取最大的外边距】

结论一:特定尺寸的盒子(宽度已定)会随着内边距、边框及外边距的添加扩展,进而占据更多的水平空间。事实上,通过width属性设置的
是盒子内容的宽度,而不是盒子本身的宽度。
<p style="width:400px;"></p>
当为 盒子 添加内边距时,导致盒子变宽!padding
当为 盒子 添加边框时,导致盒子变宽!
当为 盒子 添加外边距时,会在元素周围创建空白区域!

结论二:无尺寸限制的元素(未设置宽度)会扩展到与他的包含元素同宽。因此,为无尺寸限制的元素添加水平外边距、边框和内边距,会导致元素
内容的宽度变化。
<div id="column">
<h4>An h4 heading</h4>
<p>The haeding and this paragraph ...</p>
</div>

规则 div#column{width:170px;}
 如果为div添加一些内边距(如:div#column{width:170px;padding:10px;}), 会导致包含元素div的宽度达到190px;
解决方案是在作为栏的div中,直接添加另一个div:
<div id="column">
  <div id="column_inner">
<h4>An h4 heading</h4>
<p>The haeding and this paragraph ...</p>
  </div>
</div>
 
div#column{width:170px;(这里去掉 padding:10px;)}
div#column_inner{padding:10px;}
这样,我们既可以通过一条样式来控制栏的内边距,同时也避免了修改栏宽度的问题。

14) CSS float clear
当同时浮动图像和“具有指定宽度”的段落时,文本绕排效果就会停止,原来的文本会在图像旁边够成一个分栏!!!


nnn)CSS基础概念积累
块级元素  div 标题、段落和列表
行内元素  span


25)中文字符乱码
 <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
竟然是忘记配置了下面的 拦截规则
页面设置utf-8,而且表单提交的时候要设置为post提交方式!


26)
国际化:
问题解决了!
Java code
/**
         * Locale 对应特定的国家和语言
         * ResourceBundle 用于加载一个资源包
         * MessageFormat 用于格式化消息
         * 对非西欧的文字进行编码
         * 第一步新建一个.properties 文件 默认编码为iso-8859-1
         * 第二步以key-value 进行编写,并保存,此时会提示一个错误 格式如:username=用户名
         * 第三步把新建文件修改编码为UTF-8
         * 第四步JDK自带一个编码工具叫native2ascii.exe ,在%JAVA_HEMO%/bin/下可以找到
         * 从dos 进入进行编码可格式如:natice2ascii -encoding UTF-8 文件的全限路径+文件名 输出文件地址
         * 编过码的文件如:username=\u7528\u6237\u540d  是标准的UNICODE编码
         * 第五步把编码


27)C3p0等等 导致tomcat启动不了
检查数据库db.properties配置文件中,属性的值是否有tab键或者其他空格值!!!

 

28)    Ajax + xml  传递数据
TEmp emp = empService.queryEmpByNum(empNum);
  HttpServletResponse response = ServletActionContext.getResponse();
  response.setContentType("text/xml;charset=utf-8");
  PrintWriter out = response.getWriter();
  out.println("<?xml version='1.0' encoding='utf-8'?>");
  out.println("<root>");
  out.println("<empID>"+emp.getEmpId()+"</empID>");
  out.println("<empNUM>"+emp.getEmpNum()+"</empNUM>");
  out.println("<empNAME>"+emp.getEmpName()+"</empNAME>");
  out.println("<empEMAIL>"+emp.getEmail()+"</empEMAIL>");
  out.println("<empDEPT>"+emp.getDept()+"</empDEPT>");
  out.println("<empPHONE>"+emp.getPhone()+"</empPHONE>");
  out.println("<empADDRESS>"+emp.getAddress()+"</empADDRESS>");
  out.println("</root>");
  out.close();
**********************
function ajaxEmpByNum(){
 var empNum = $("#empNum").val();
 $.ajax({
  url: "../contract/contract_ajaxEmpByNum",
  data: "empNum="+empNum,
  type: "POST",
  success: function(data){
    var empName=$(data).find("empNAME").text();
    var empEmail = $(data).find("empEMAIL").text();
    var empPhone=$(data).find("empPHONE").text();
    var empDept = $(data).find("empDEPT").text();
    var empAddress=$(data).find("empADDRESS").text();
    if(empName == "null" || empName == ""){
     alert('您输入的工号不存在,请重新输入!');
    }else{
     $("#contract_assigner_name").text(empName);
     $("#contract_assigner_email").text(empEmail);
     $("#contract_assigner_dept").text(empDept);
     $("#contract_assigner_phone").text(empPhone);
     var address_cn;
     switch(empAddress){
     case'SZ':address_cn="深圳";
              break;
     case'BJ':address_cn="北京";
              break;
     case'WH':address_cn="武汉";
              break;
     case'HK':address_cn="香港";
              break;
     case'HZ':address_cn="杭州";
              break;
              default:break;
     }
     $("#contract_assigner_address").text(address_cn);
    }
  },
  error:function(xhr){
   alert(xhr);
  }
 });
}


29)Hibernate
 <many-to-one name="role" class="bgi.npgtis.pojo.Roles" cascade="save-update" lazy="false">
   <column name="role_id"></column>
  </many-to-one>
像这种,如果cascade设置成为了 all,则删除从表,而不是主表的时候都回报错(不符合外键关联的一般特性,设置过于严格)。所以设置为save-upate。


30)struts 配置拦截的时候,是拦截*的话(如果要用struts标签,则必须使用struts拦截,forward到一个新的含有struts标签的jsp页面的时候,不拦截则会报错)
有些页面明明action里面是有值的,结果到页面上之后为null!!!
<filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>*.action</url-pattern>
  <dispatcher>REQUEST</dispatcher>
  <dispatcher>FORWARD</dispatcher>   
 </filter-mapping> 


31)
如果用struts标签
  <s:if test="users.role.id==3">  这里不应该加 ${}

 

32)spring,事务配置
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
这个异常,是由于方法命名不合事务配置的规范,所以不允许提交导致的异常


33) JSTL标签循环的时候
 <c:forEach var="hospital" items="${hospitalList}">
   <option value="${hospital.hospitalCode}">${hospital.hospitalCode}(${hospital.hospitalName})</option>
 </c:forEach>
经常写错,吧items="${hospitalList}" 这个里面的 ${} 写掉!


36)java基础

"2011-12-07~" 这个按照 “\~”切割之后,数组长度为1!,感觉跟perl不同,有时间试试perl的切割结果。

37)struts标签的写法
<s:if test="#session.user.role.id==3"><!-- 片区权限 --></s:if>

38)前段Jquery
建议采用jquery中select的option被选中用jquey的 $("#selectID").find("option:selected").text();,不要 $("#ddlRegType").find("option:checked").text();,后者firefox可以但是ie不行,前者ie和firefox都可以。希望对你有用!

 

39)ajax与javascript
 var checkUserName = function (){
  var manager_name = arguments[0];
  var fun_flag = false;
  $.ajax({
   type:"POST",
   data:"username="+manager_name,
   url:"../users/ajaxCheckUser.html",
   success:function(data){
    if(data=="true"){
     $("#user_exist").text("恭喜,账户名可用!");
     $("#user_exist").css('color','green');
     fun_flag = true;
    }else if(data="false"){
     $("#user_exist").text("抱歉,账户已存在,请选择其他的账户名!");
     $("#user_exist").css('color','red');
     $("#manager_name").focus();
    }
   }
  });
  return fun_flag;
 };
 这个地方,ajax方法并不能将fun_flag 的值修改,置为true,在返回的时候无效


40)
不管做任何append,都要考虑到empty的时候,否则会出问题

 

41)struts的配置文件里面,一定要这样写,
<result name="success">${forwardPage}</result>
不能大写success,否则会报错

 

46)hibernate更新的时候,一定要记得,先从数据库中查出对象,然后再调用更新方法,不能创建对象,set属性,然后更新!!
Users u = usersService.queryUserById(Integer.parseInt(doc_id));
   u.setRealName(doc_realName);
   u.setEmail(doc_email);


47)jquery,引入包的时候,要注意引入顺序
 <script type="text/javascript" src="../js/list.js"></script>        <!-- 这个地方用到jq,所以要先引jq的包 -->

 

====================== JS 部分笔记 ==================

1).IE8以下的浏览器,如果是文本字段输出,多个空格会被IE自动变为一个空格,解决办法可以把它放在title属性中,从titile中取则不会发生这种问题。文件下载的时候就必须要考虑这种情况

 


2).js判断操作系统版本:

 if (agent.indexOf("Windows NT 6") != -1) this.os = "windows-32"; //Vista
    if (agent.indexOf("Windows NT 7") != -1) this.os = "windows-32"; //Win7
    if (agent.indexOf("Windows NT 5") != -1) this.os = "windows-32"; //Win XP and 2003
    if (agent.indexOf("Intel Mac") != -1)    this.os = "mac-intel";
    if (agent.indexOf("PPC Mac") != -1)      this.os = "mac-ppc";
    if (agent.indexOf("Linux") != -1)        this.os = "linux-32";
    if (agent.indexOf("Linux x86_64") != -1) this.os = "linux-64";


3). js 判断浏览器种类以及版本
var userAgent = navigator.userAgent;
 var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1; //判断是否IE浏览器
 var isFF = userAgent.indexOf("Firefox") > -1; //判断是否为火狐浏览器
 if(isIE){
  var reIE = new RegExp("MSIE (\\d+\\.\\d+);");
  reIE.test(userAgent);
  var fIEVersion = parseFloat(RegExp["$1"]);
  if(fIEVersion==8.0){
   $($('.upr_upload')[0]).click();
  }
 }else if(isFF){
  try{
   connect_installer.reloadPlugins();
  }catch(e){}
 }

 

4).prototype.js  跟 jquery.js 冲突

5).css + jquery做弹出层的时候:
①注意设置背景层的div的 background属性,而不是color属性
②注意设置背景层div和弹出层div的 absolute属性,必须设置。
③传递对象的时候,请注意传递 (“.popup_win”)
④ 学习使用fadeIn(300)  fadeTo(300,0.3)   淡出 fadeOut(300)


6).经验:
页面元素布局的时候,要全面考虑form的安排布局。
EG里面,我增加了分页,只在底面加了个分页的form,但是如果搜索,或者删除的时候提交form,则会丢失分页form的保存参数!!!
所以,对于新增一个分页或者其他功能,一定要全面考虑跟它相关的所有原先已经实现功能之间的联系,否则会多出很多bug!!!

 

===================   路径相关笔记     ========================================
java jsp servlet中的绝对路径与相对路径
1.基本概念的理解

绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:
C:xyz est.txt 代表了test.txt文件的绝对路径。http://www.sun.com/index.htm也代表了一个URL绝对路径。

相对路径:相对与某个基准目录的路径。包含Web的相对路径(HTML中的相对目录),例如:在
Servlet中,"/"代表Web应用的跟目录。和物理路径的相对表示。例如:"./" 代表当前目录,"../"代表上级目录。这种类似的表示,也是属于相对路径。
另外关于URI,URL,URN等内容,请参考RFC相关文档标准。

RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax,
(http://www.ietf.org/rfc/rfc2396.txt)


2.关于JSP/Servlet中的相对路径和绝对路径。

2.1服务器端的地址

服务器端的相对地址指的是相对于你的web应用的地址,这个地址是在服务器端解析的(不同于html和javascript中的相对地址,他们是由客户端浏览器解析的)也就是说这时候在jsp和servlet中的相对地址应该是相对于你的web应用,即相对于http: //192.168.0.1/webapp/的。

其用到的地方有:
forward:servlet中的request.getRequestDispatcher(address);这个address是在服务器端解析的,所以,你要forward到a.jsp应该这么写:request.getRequestDispatcher(“/user/a.jsp”)这个/ 相对于当前的web应用webapp,其绝对地址就是:http://192.168.0.1/webapp/user/a.jsp。 sendRedirect:在jsp中<%response.sendRedirect("/rtccp/user/a.jsp");%>

2.22、客户端的地址

所有的html页面中的相对地址都是相对于服务器根目录(http://192.168.0.1/)的,而不是(跟目录下的该Web应用的目录) http://192.168.0.1/webapp/的。 Html中的form表单的action属性的地址应该是相对于服务器根目录(http://192.168.0.1/)的,所以,如果提交到a.jsp 为:action="/webapp/user/a.jsp"或action="<%=request.getContextPath()% >"/user/a.jsp;
提交到servlet为actiom="/webapp/handleservlet" Javascript也是在客户端解析的,所以其相对路径和form表单一样。


因此,一般情况下,在JSP/HTML页面等引用的CSS,Javascript.Action等属性前面最好都加上
<%=request.getContextPath()%>,以确保所引用的文件都属于Web应用中的目录。另外,应该尽量避免使用类似".","./","../../"等类似的相对该文件位置的相对路径,这样当文件移动时,很容易出问题。


3. JSP/Servlet中获得当前应用的相对路径和绝对路径

3.1 JSP中获得当前应用的相对路径和绝对路径
根目录所对应的绝对路径:request.getRequestURI()
文件的绝对路径  :application.getRealPath(request.getRequestURI());
当前web应用的绝对路径 :application.getRealPath("/");
取得请求文件的上层目录:new File(application.getRealPath(request.getRequestURI())).getParent()

3.2 Servlet中获得当前应用的相对路径和绝对路径
根目录所对应的绝对路径:request.getServletPath();
文件的绝对路径 :request.getSession().getServletContext().getRealPath
(request.getRequestURI())
当前web应用的绝对路径 :servletConfig.getServletContext().getRealPath("/");
(ServletContext对象获得几种方式:
javax.servlet.http.HttpSession.getServletContext()
javax.servlet.jsp.PageContext.getServletContext()
javax.servlet.ServletConfig.getServletContext()
)

4.java 的Class中获得相对路径,绝对路径的方法

4.1单独的Java类中获得绝对路径
根据java.io.File的Doc文挡,可知:
默认情况下new File("/")代表的目录为:System.getProperty("user.dir")。
一下程序获得执行类的当前路径

package org.cheng.file;  
  
import java.io.File;  
  
public class FileTest {  
    public static void main(String[] args) throws Exception {  
         System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));  
  
         System.out.println(FileTest.class.getClassLoader().getResource(""));  
  
         System.out.println(ClassLoader.getSystemResource(""));  
         System.out.println(FileTest.class.getResource(""));  
         System.out.println(FileTest.class.getResource("/"));
        //Class文件所在路径
         System.out.println(new File("/").getAbsolutePath());  
         System.out.println(System.getProperty("user.dir"));  
     }  
}


4.2服务器中的Java类获得当前路径(来自网络)

(1).Weblogic

WebApplication的系统文件根目录是你的weblogic安装所在根目录。
例如:如果你的weblogic安装在c: eaweblogic700.....
那么,你的文件根路径就是c:.
所以,有两种方式能够让你访问你的服务器端的文件:
a.使用绝对路径:
比如将你的参数文件放在c:yourconfigyourconf.properties,
直接使用 new FileInputStream("yourconfig/yourconf.properties");
b.使用相对路径:
相对路径的根目录就是你的webapplication的根路径,即WEB-INF的上一级目录,将你的参数文件放

在yourwebappyourconfigyourconf.properties,
这样使用:
new FileInputStream("./yourconfig/yourconf.properties");
这两种方式均可,自己选择。

(2).Tomcat

在类中输出System.getProperty("user.dir");显示的是%Tomcat_Home%/bin

(3).Resin

不是你的JSP放的相对路径,是JSP引擎执行这个JSP编译成SERVLET
的路径为根.比如用新建文件法测试File f = new File("a.htm");
这个a.htm在resin的安装目录下

(4).如何读相对路径哪?

在Java文件中getResource或getResourceAsStream均可

例:getClass().getResourceAsStream(filePath);//filePath可以是"/filename",这里的/代表web

发布根路径下WEB-INF/classes

默认使用该方法的路径是:WEB-INF/classes。已经在Tomcat中测试。

5.读取文件时的相对路径,避免硬编码和绝对路径的使用。(来自网络)
5.1 采用Spring的DI机制获得文件,避免硬编码。
参考下面的连接内容:
http://www.javajia.net/viewtopic.php?p=90213&
5.2 配置文件的读取
参考下面的连接内容:
http://dev.csdn.net/develop/article/39/39681.shtm

5.3 通过虚拟路径或相对路径读取一个xml文件,避免硬编码

参考下面的连接内容:
http://club.gamvan.com/club/clubPage.jsp?iPage=1&tID=10708&ccID=8

6.Java中文件的常用操作(复制,移动,删除,创建等)(来自网络)
常用 java File 操作类
http://www.easydone.cn/014/200604022353065155.htm

Java文件操作大全(JSP中)
http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html

java文件操作详解(Java中文网)
http://www.51cto.com/html/2005/1108/10947.htm

JAVA 如何创建删除修改复制目录及文件
http://www.gamvan.com/developer/java/2005/2/264.html

总结:
通过上面内容的使用,可以解决在Web应用服务器端,移动文件,查找文件,复制
删除文件等操作,同时对服务器的相对地址,绝对地址概念更加清晰。
建议参考URI,的RFC标准文挡。同时对Java.io.File. Java.net.URI.等内容了解透彻
对其他方面的理解可以更加深入和透彻。

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

归纳一些网上取JAVA路径的方法:

    注明:如果从ANT启动程序,this.getClass().getResource("")取出来的比较怪,直接用JAVA命令行调试就可成功。

    得到classpath和当前类的绝对路径的一些方法

    获得CLASSPATH之外路径的方法:

  URL base = this.getClass().getResource(""); //先获得本类的所在位置,如/home/popeye/testjava/build/classes/net/ String path = new File(base.getFile(), "……/……/……/"+name).getCanonicalPath(); //就可以得到/home/popeye/testjava/name

    下面是一些得到classpath和当前类的绝对路径的一些方法。你可能需要使用其中的一些方法来得到你需要的资源的绝对路径。

    1.FileTest.class.getResource("")

    得到的是当前类FileTest.class文件的URI目录。不包括自己!

    如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/

    2.FileTest.class.getResource("/")

    得到的是当前的classpath的绝对URI路径。

    如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

    3.Thread.currentThread().getContextClassLoader().getResource("")

    得到的也是当前ClassPath的绝对URI路径。

    如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

    4.FileTest.class.getClassLoader().getResource("")

    得到的也是当前ClassPath的绝对URI路径。

    如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

    5.ClassLoader.getSystemResource("")

    得到的也是当前ClassPath的绝对URI路径。

    如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

    我推荐使用Thread.currentThread().getContextClassLoader().getResource("")来得到当前的classpath的绝对路径的URI表示法。

    在Web应用程序中,我们一般通过ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径。这样,我们只需要提供相对于Web应用程序根目录的路径,就可以构建出定位资源的绝对路径。

    注意点:

    1.尽量不要使用相对于System.getProperty("user.dir")当前用户目录的相对路径。这是一颗定时炸dan,随时可能要你的命。

    2.尽量使用URI形式的绝对路径资源。它可以很容易的转变为URI,URL,File对象。

    3.尽量使用相对classpath的相对路径。不要使用绝对路径。使用上面ClassLoaderUtil类的public static URL getExtendResource(String relativePath)方法已经能够使用相对于classpath的相对路径定位所有位置的资源。

    4.绝对不要使用硬编码的绝对路径。因为,我们完全可以使用ClassLoader类的getResource("")方法得到当前classpath的绝对路径。

    使用硬编码的绝对路径是完全没有必要的!它一定会让你死的很难看!程序将无法移植!

    如果你一定要指定一个绝对路径,那么使用配置文件,也比硬编码要好得多!

    当然,我还是推荐你使用程序得到classpath的绝对路径来拼资源的绝对路径。(T002)


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);


对于Java程序,无论是未打包的还是打包的JAR或WAR文件,有时候都需要获取它运行所在目录信息,如何做到这一点呢?

在Java处理的文件系统中,目录的表示方式有两种:

(1)绝对目录,它以"/"为起始字符,代表从根目录下开始寻找给出的目录,如/c:/java

(2)相对路径,它以不带“/”的目录名表示,表示以当前Java程序正在运行的目录作为起始目录来寻找给出的目录。如java/classes。在相对路径中,有一些特定的字符,可以代表特的的目录,比如,“.”代表当前目录,“..”代表当前目录的上一级目录。在网上很多给出的例子中,就是利用"."作为目录名,构造File对象的实例,然后通过File对象的方法来获取当前程序运行的目录。

这种方法虽然简单,但有时不能正确的得出当前程序的运行目录。原因在于,运行Java程序不一定要进入到该程序的类文件或JAR文件所在的目录,只要在运行时指定了正确的类路径信息,就可以在任何目录中运行Java程序,此时利用这种方法只能得到发出运行命令时所在的目录信息。

从上面的分析可以看出,对于很多Java程序,尤其是WEB程序,利用当前路径的“.”表示法,都不能满足要求。那么怎样才能正确的得到运行目录信息呢?

在Web程序中,利用Servlet API可以获得一些路径信息,比如HttpServletRequest接口中定义的getRealPath方法,但类似这些方法都依赖于Servlet环境,不便于程序的单元测试。

本文提供了一种只使用Java标准API的路径探测方法,就是利用ClassLoader抽象类。

利用java.lang.Class的getClassLoader方法,可以获得给定类的ClassLoader实例,它的getResource方法可以获得当前类装载器中的资源的位置,我们可以利用类文件的名称作为要查找的资源,经过处理后就可获得当前Java程序的运行位置信息,其伪代码如下:

获得Class参数的所在的类名
取得该类所在的包名
将包名转换为路径
利用getResource得到当前的类文件所在URL
利用URL解析出当前Java程序所在的路径

具体代码如下:

Java代码
/**-----------------------------------------------------------------------
*getAppPath需要一个当前程序使用的Java类的class属性参数,它可以返回打包过的
*Java可执行文件(jar,war)所处的系统目录名或非打包Java程序所处的目录
*@param cls为Class类型
*@return 返回值为该类所在的Java程序运行的目录
-------------------------------------------------------------------------*/   
public static String getAppPath(Class cls){   
    //检查用户传入的参数是否为空   
    if(cls==null)   
     throw new java.lang.IllegalArgumentException("参数不能为空!");   
     ClassLoader loader=cls.getClassLoader();   
    //获得类的全名,包括包名   
     String clsName=cls.getName()+".class";   
    //获得传入参数所在的包   
     Package pack=cls.getPackage();   
     String path="";   
    //如果不是匿名包,将包名转化为路径   
    if(pack!=null){   
         String packName=pack.getName();   
       //此处简单判定是否是Java基础类库,防止用户传入JDK内置的类库   
       if(packName.startsWith("java.")||packName.startsWith("javax."))   
          throw new java.lang.IllegalArgumentException("不要传送系统类!");   
        //在类的名称中,去掉包名的部分,获得类的文件名   
         clsName=clsName.substring(packName.length()+1);   
        //判定包名是否是简单包名,如果是,则直接将包名转换为路径,   
        if(packName.indexOf(".")<0) path=packName+"/";   
        else{//否则按照包名的组成部分,将包名转换为路径   
            int start=0,end=0;   
             end=packName.indexOf(".");   
            while(end!=-1){   
                 path=path+packName.substring(start,end)+"/";   
                 start=end+1;   
                 end=packName.indexOf(".",start);   
             }   
             path=path+packName.substring(start)+"/";   
         }   
     }   
    //调用ClassLoader的getResource方法,传入包含路径信息的类文件名   
     java.net.URL url =loader.getResource(path+clsName);   
    //从URL对象中获取路径信息   
     String realPath=url.getPath();   
    //去掉路径信息中的协议名"file:"   
    int pos=realPath.indexOf("file:");   
    if(pos>-1) realPath=realPath.substring(pos+5);   
    //去掉路径信息最后包含类文件信息的部分,得到类所在的路径   
     pos=realPath.indexOf(path+clsName);   
     realPath=realPath.substring(0,pos-1);   
    //如果类文件被打包到JAR等文件中时,去掉对应的JAR等打包文件名   
    if(realPath.endsWith("!"))   
         realPath=realPath.substring(0,realPath.lastIndexOf("/"));   
  /*------------------------------------------------------------
    ClassLoader的getResource方法使用了utf-8对路径信息进行了编码,当路径
     中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要
     的真实路径,在此,调用了URLDecoder的decode方法进行解码,以便得到原始的
     中文及空格路径
   -------------------------------------------------------------*/   
  try{   
     realPath=java.net.URLDecoder.decode(realPath,"utf-8");   
    }catch(Exception e){throw new RuntimeException(e);}   
   return realPath;   
}//getAppPath定义结束   
/-----------------------------------------------------------------   
/**-----------------------------------------------------------------------
     *getAppPath需要一个当前程序使用的Java类的class属性参数,它可以返回打包过的
     *Java可执行文件(jar,war)所处的系统目录名或非打包Java程序所处的目录
     *@param cls为Class类型
     *@return 返回值为该类所在的Java程序运行的目录
     -------------------------------------------------------------------------*/
    public static String getAppPath(Class cls){
        //检查用户传入的参数是否为空
        if(cls==null)
         throw new java.lang.IllegalArgumentException("参数不能为空!");
        ClassLoader loader=cls.getClassLoader();
        //获得类的全名,包括包名
        String clsName=cls.getName()+".class";
        //获得传入参数所在的包
        Package pack=cls.getPackage();
        String path="";
        //如果不是匿名包,将包名转化为路径
        if(pack!=null){
            String packName=pack.getName();
           //此处简单判定是否是Java基础类库,防止用户传入JDK内置的类库
           if(packName.startsWith("java.")||packName.startsWith("javax."))
              throw new java.lang.IllegalArgumentException("不要传送系统类!");
            //在类的名称中,去掉包名的部分,获得类的文件名
            clsName=clsName.substring(packName.length()+1);
            //判定包名是否是简单包名,如果是,则直接将包名转换为路径,
            if(packName.indexOf(".")<0) path=packName+"/";
            else{//否则按照包名的组成部分,将包名转换为路径
                int start=0,end=0;
                end=packName.indexOf(".");
                while(end!=-1){
                    path=path+packName.substring(start,end)+"/";
                    start=end+1;
                    end=packName.indexOf(".",start);
                }
                path=path+packName.substring(start)+"/";
            }
        }
        //调用ClassLoader的getResource方法,传入包含路径信息的类文件名
        java.net.URL url =loader.getResource(path+clsName);
        //从URL对象中获取路径信息
        String realPath=url.getPath();
        //去掉路径信息中的协议名"file:"
        int pos=realPath.indexOf("file:");
        if(pos>-1) realPath=realPath.substring(pos+5);
        //去掉路径信息最后包含类文件信息的部分,得到类所在的路径
        pos=realPath.indexOf(path+clsName);
        realPath=realPath.substring(0,pos-1);
        //如果类文件被打包到JAR等文件中时,去掉对应的JAR等打包文件名
        if(realPath.endsWith("!"))
            realPath=realPath.substring(0,realPath.lastIndexOf("/"));
      /*------------------------------------------------------------
       ClassLoader的getResource方法使用了utf-8对路径信息进行了编码,当路径
        中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要
        的真实路径,在此,调用了URLDecoder的decode方法进行解码,以便得到原始的
        中文及空格路径
      -------------------------------------------------------------*/
      try{
        realPath=java.net.URLDecoder.decode(realPath,"utf-8");
       }catch(Exception e){throw new RuntimeException(e);}
       return realPath;
    }//getAppPath定义结束
   //-----------------------------------------------------------------
该方法既可以用于JAR或WAR文件,也可以用于非JAR文件。但要注意以下2点:

不要传递系统的类,作为getAppPath的参数,如java.lang.String.class,当然,也不要传递那些已经位于JDK中的那些类,比如xml相关的一些类等等。
要传递应该是程序中主要的运行类,不要传递程序中的支持类库中的类文件,也就是那些第三方的类库中的类文件,否则得到的将是那些类库的位置。

 

============================================================================

 

分享到:
评论

相关推荐

    ssh学习笔记1 ssh学习笔记1

    ssh学习笔记1 ssh学习笔记1 ssh学习笔记1 ssh学习笔记1 ssh学习笔记1 ssh学习笔记1 ssh学习笔记1

    SSH学习笔记3 SSH学习笔记3

    SSH学习笔记3 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记

    最全SSH笔记汇总

    最全SSH笔记汇总,包括:Struts2,Hibernate,Spring相关的PPT,word还有原理图示。

    SSH整合笔记和配置文

    SSH整合笔记和配置文件,

    ssh学习笔记ssh学习笔记

    ssh学习笔记ssh学习笔记ssh学习笔记ssh学习笔记ssh学习笔记ssh学习笔记ssh学习笔记ssh学习笔记ssh学习笔记ssh学习笔记ssh学习笔记

    SSH学习笔记4 SSH学习笔记4

    SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记

    SSH学习笔记7 SSH学习笔记7

    SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记

    SSH学习笔记2 SSH学习笔记2

    SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记

    SSH学习笔记9 SSH学习笔记9

    SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记

    SSH学习笔记6 SSH学习笔记6

    SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记

    SSH学习笔记5 SSH学习笔记5

    SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记

    SSH学习笔记8 SSH学习笔记8

    SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记 SSH学习笔记

    ssh-aop笔记

    ssh-aop笔记

    SSH笔记-web应用下使用Spring

    SSH笔记-分别使用通过配置listener类和调用HttpServlet类和通过配置ContextLoaderListener,实现web中使用Spring

    SSH笔记-Mapping

    SSH笔记-映射关系 基于外键/主键一对一映射、多对多映射、映射继承

    SSH笔记-AOP

    SSH笔记-包含使用动态代理的方法解决代码混乱、分散问题+基于注解方式配置AOP通知+用基于 XML 的配置声明切面

    SSH笔记-二级缓存

    SSH笔记-hibernate二级缓存的配置方法和使用方法,及相关注意事项

    SSH笔记-Spring JdbcTemplate

    SSH笔记-Spring JdbcTemplate,使用JdbcTemplate对数据库进行操作,使用具名参数和JDBC模板,简化操作

    SSH笔记-整合Spring2、Struts2、Hibernate4

    SSH笔记-整合Spring2、Struts2、Hibernate4的完整步骤

Global site tag (gtag.js) - Google Analytics