随笔-124  评论-49  文章-56  trackbacks-0
 
BeanUtils.copyProperties 与 PropertyUtils.copyProperties 用法及区别
一、简介:
BeanUtils提供对 Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很 多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。
二、用法:
BeanUtils是这个包里比较常用的一个工具类,这里只介绍它的copyProperties()方法。该方法定义如下:
public static void copyProperties(java.lang.Object dest,java.lang.Object orig)
   throws java.lang.IllegalAccessException,
      java.lang.reflect.InvocationTargetException
如 果你有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm,例如 Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐 个赋值:
//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
teacher.setName(teacherForm.getName());
teacher.setAge(teacherForm.getAge());
teacher.setGender(teacherForm.getGender());
teacher.setMajor(teacherForm.getMajor());
teacher.setDepartment(teacherForm.getDepartment());
//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);
而使用BeanUtils后,代码就大大改观了,如下所示:
//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
BeanUtils.copyProperties(teacher,teacherForm);
//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);
如 果Teacher和TeacherForm间存在名称不相同的属性,则BeanUtils不对这些属性进行处理,需要程序员手动处理。例如 Teacher包含modifyDate(该属性记录最后修改日期,不需要用户在界面中输入)属性而TeacherForm无此属性,那么在上面代码的 copyProperties()后还要加上一句:
teacher.setModifyDate(new Date());
怎 么样,很方便吧!除BeanUtils外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用与 BeanUtils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围 内进行转换,而前者不支持这个功能,但是速度会更快一些。BeanUtils支持的转换类型如下:
* java.lang.BigDecimal
* java.lang.BigInteger
* boolean and java.lang.Boolean
* byte and java.lang.Byte
* char and java.lang.Character
* java.lang.Class
* double and java.lang.Double
* float and java.lang.Float
* int and java.lang.Integer
* long and java.lang.Long
* short and java.lang.Short
* java.lang.String
* java.sql.Date
* java.sql.Time
* java.sql.Timestamp
这里要注意一点,java.util.Date是不被支持的,而它的子类java.sql.Date是被支持的。因此如果对象包含时间类型的属性,且希望被转换的时候,一定要使用java.sql.Date类型。否则在转换时会提示argument mistype异常。
三、优缺点:
Apache Jakarta Commons项目非常有用。我曾在许多不同的项目上或直接或间接地使用各种流行的commons组件。其中的一个强大的组件就是BeanUtils。我 将说明如何使用BeanUtils将local实体bean转换为对应的value 对象:
BeanUtils.copyProperties(aValue, aLocal)
上 面的代码从aLocal对象复制属性到aValue对象。它相当简单!它不管local(或对应的value)对象有多少个属性,只管进行复制。我们假设 local对象有100个属性。上面的代码使我们可以无需键入至少100行的冗长、容易出错和反复的get和set方法调用。这太棒了!太强大了!太有用 了!
现在,还有一个坏消息:使用BeanUtils的成本惊人地昂贵!我做了一个简单的测试,BeanUtils所花费的时间要超过取数 据、将其复制到对应的 value对象(通过手动调用get和set方法),以及通过串行化将其返回到远程的客户机的时间总和。所以要小心使用这种威力!
posted @ 2009-11-29 21:17 junly 阅读(267) | 评论 (0)编辑 收藏
在我们应用Freemarker过程中,经常会操作例如字符串,数字,集合等,却不清楚Freemrker有没有类似于Java一样有相关的类及方法。在本文当中,我将向大家详细的介绍Freemarke的内置函数及用法,以便能帮助大家更熟练的应用Freemarker完成项目开发。

一、 Sequence的内置函数

1.     sequence?first 返回sequence的第一个值。

2.     sequence?last 返回sequence的最后一个值。

3.     sequence?reverse 将sequence的现有顺序反转,即倒序排序

4.     sequence?size    返回sequence的大小

5.     sequence?sort    将sequence中的对象转化为字符串后顺序排序

6.     sequence?sort_by(value) 按sequence中对象的属性value进行排序

注意:Sequence不能为null。以上方法在我的另一篇博客Freemarker中如何遍历List有详细的应用,感兴趣的朋友可以参考。

二、          Hash的内置函数

1.                     hash?keys 返回hash里的所有key,返回结果为sequence

2.                     hash?values 返回hash里的所有value,返回结果为sequence

例如:

<#assign user={“name”:“hailang”, “sex”:“man”}>

            <#assign keys=user?keys>

            <#list keys as key>

                ${key}=${user[key]}

            </#list>

三、          操作字符串函数

1.                     substring(start,end)从一个字符串中截取子串

start:截取子串开始的索引,start必须大于等于0,小于等于end

end: 截取子串的长度,end必须大于等于0,小于等于字符串长度,如果省略该参数,默认为字符串长度。

例子:

${‘str’?substring(0)}à结果为str

${‘str’?substring(1)}à结果为tr

${‘str’?substring(2)}à结果为r

${‘str’?substring(3)}à结果为

${‘str’?substring(0,0)}à结果为

${‘str’?substring(0,1)}à结果为s

${‘str’?substring(0,2)}à结果为st

${‘str’?substring(0,3)}à结果为str

2.                     cap_first 将字符串中的第一个单词的首字母变为大写。

${‘str’?cap_first}à结果为Str

3.                     uncap_first将字符串中的第一个单词的首字母变为小写。

${‘Str’?cap_first}à结果为str

4.                     capitalize将字符串中的所有单词的首字母变为大写

${‘str’? capitalize}à结果为STR

5.                     date,time,datetime将字符串转换为日期

例如:

<#assign date1=”2009-10-12”?date(“yyyy-MM-dd”)>

<#assign date2=”9:28:20”?time(“HH:mm:ss”)>

<#assign date3=” 2009-10-12 9:28:20”?time(“HH:mm:ss”)>

${date1}à结果为2009-10-12

${date2}à结果为9:28:20

${date3}à结果为2009-10-12 9:28:20

注意:如果指定的字符串格式不正确将引发错误。

6.                     ends_with 判断某个字符串是否由某个子串结尾,返回布尔值。

${“string”?ends_with(“ing”)?string} 返回结果为true

注意:布尔值必须转换为字符串才能输出

7.                     html 用于将字符串中的<、>、&和“替换为对应得&lt;&gt;&quot:&amp

8.                     index_of(substring,start)在字符串中查找某个子串,返回找到子串的第一个字符的索引,如果没有找到子串,则返回-1。

 Start参数用于指定从字符串的那个索引处开始搜索,start为数字值。

 如果start大于字符串长度,则start取值等于字符串长度,如果start小于0, 则start取值为0。

 ${“string”?index_of(“in”) à结果为3

${“string”?index_of(“ab”) à结果为-1

9.                     length返回字符串的长度 ${“string”?length}à结果为6

10.                  lower_case将字符串转为小写

${“STRING”?lower_case}à结果为string

11.                  upper_case将字符串转为大写

${“string”?upper_case}à结果为STRING

12.                  contains 判断字符中是否包含某个子串。返回布尔值

 ${“string”?contains(“ing”)?string} à结果为true

    注意:布尔值必须转换为字符串才能输出

13.                  number将字符串转换为数字

${“111.11”?number}à结果为111.11

14.                  replace用于将字符串中的一部分从左到右替换为另外的字符串。

${“strabg”?replace(“ab”,”in”)} à结果为string

15.                   split使用指定的分隔符将一个字符串拆分为一组字符串

<#list “This|is|split”?split(“|”) as s>

    ${s}

</#list>

结果为:

This

is

split

16.                  trim 删除字符串首尾空格 ${“ String ”?trim} à结果为String

 

四、          操作数字

1.                     c 用于将数字转换为字符串

${123?c} à结果为123

2.                     string用于将数字转换为字符串

Freemarker中预订义了三种数字格式:number,currency(货币)和percent(百分比)其中number为默认的数字格式转换

例如: 

<#assign tempNum=20>

${tempNum}   

${tempNum?string.number}或${tempNum?string(“number”)} à结果为20

${tempNum?string.currency}或${tempNum?string(“currency”)} à结果为¥20.00

${tempNum?string. percent}或${tempNum?string(“percent”)} à结果为2,000%

五、    操作布尔值

string 用于将布尔值转换为字符串输出

true转为“true”,false转换为“false”

foo?string(“yes”,”no”)如果布尔值是true,那么返回“yes”,否则返回no

 

    通过上面对开发中常用的Freemarker内置函数及用法的介绍,相信您已经对这些函数的有了一定的了解,希望本文能对您的开发有所帮助。由于时间仓促,有不足之处请您批评指正。

posted @ 2009-11-25 11:21 junly 阅读(1582) | 评论 (0)编辑 收藏
集合

集合以方括号包括,各集合元素之间以英文逗号","分隔,看如下的例子:
<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x>
${x}
</#list>
输出结果是:
星期一
星期二
星期三
星期四
星期五
星期六
星期天

除此之外,集合元素也可以是表达式,例子如下:
[2 + 2, [1, 2, 3, 4], "whatnot"]

还可以使用数字范围定义数字集合,如2..5等同于[2, 3, 4, 5],但是更有效率.注意,使用数字范围来定义集合时无需使用方括号,数字范围也支持反递增的数字范围,如5..2

Map对象

Map对象使用花括号包括,Map中的key-value对之间以英文冒号":"分隔,多组key-value对之间以英文逗号","分隔.下面是一个例子:
{"语文":78, "数学":80}
Map对象的key和value都是表达式,但是key必须是字符串


输出变量值

FreeMarker的表达式输出变量时,这些变量可以是顶层变量,也可以是Map对象中的变量,还可以是集合中的变量,并可以使用点(.)语法来访问Java对象的属性.下面分别讨论这些情况

1,顶层变量
所谓顶层变量就是直接放在数据模型中的值,例如有如下数据模型:
Map root = new HashMap();   //创建数据模型
root.put("name","annlee");   //name是一个顶层变量

对于顶层变量,直接使用${variableName}来输出变量值,变量名只能是字母,数字,下划线,$,@和#的组合,且不能以数字开头号.为了输出上面的name的值,可以使用如下语法:
${name}

2,输出集合元素
如果需要输出集合元素,则可以根据集合元素的索引来输出集合元素,集合元素的索引以方括号指定.假设有索引:
["星期一","星期二","星期三","星期四","星期五","星期六","星期天"].该索引名为week,如果需要输出星期三,则可以使用如下语法:
${week[2]}   //输出第三个集合元素

此外,FreeMarker还支持返回集合的子集合,如果需要返回集合的子集合,则可以使用如下语法:
week[3..5]   //返回week集合的子集合,子集合中的元素是week集合中的第4-6个元素

3,输出Map元素
这里的Map对象可以是直接HashMap的实例,甚至包括JavaBean实例,对于JavaBean实例而言,我们一样可以把其当成属性为key,属性值为value的Map实例.为了输出Map元素的值,可以使用点语法或方括号语法.假如有下面的数据模型:
Map root = new HashMap();
Book book = new Book();
Author author = new Author();
author.setName("annlee");
author.setAddress("gz");
book.setName("struts2");
book.setAuthor(author);
root.put("info","struts");
root.put("book", book);

为了访问数据模型中名为struts2的书的作者的名字,可以使用如下语法:
book.author.name    //全部使用点语法
book["author"].name
book.author["name"]    //混合使用点语法和方括号语法
book["author"]["name"]   //全部使用方括号语法

使用点语法时,变量名字有顶层变量一样的限制,但方括号语法没有该限制,因为名字可以是任意表达式的结果.

集合连接运算符

这里所说的集合运算符是将两个集合连接成一个新的集合,连接集合的运算符是+,看如下的例子:
<#list ["星期一","星期二","星期三"] + ["星期四","星期五","星期六","星期天"] as x>
${x}
</#list>
输出结果是:星期一 星期二 星期三 星期四 星期五 星期六 星期天

Map连接运算符

Map对象的连接运算符也是将两个Map对象连接成一个新的Map对象,Map对象的连接运算符是+,如果两个Map对象具有相同的key,则右边的值替代左边的值.看如下的例子:
<#assign scores = {"语文":86,"数学":78} + {"数学":87,"Java":93}>
语文成绩是${scores.语文}
数学成绩是${scores.数学}
Java成绩是${scores.Java}
输出结果是:
语文成绩是86
数学成绩是87
Java成绩是93

posted @ 2009-11-25 10:06 junly 阅读(2587) | 评论 (0)编辑 收藏

Messages: No result defined for action com.xxx.action.SomeAction and result input
---------------------------------------------------------------------------------------------------------------------------

症状: action中无法正常进行跳转.

原因: 验证值时验证报错.

解决办法:
1) 给 Action 加入 input 的结果;
2) 去除所有证验相关的拦截器,包括默认的validation
     调试方法:在 input 中加入调试
                      <s:fielderror/>
                      <s:debug />
                      <a href="javascript:void(0);" onclick="toggleDebug('debug');return false;">[调试信息]</a>
                      可显示下列信息:
                      Invalid field value for field "attachment". 
                      fieldErrors {attachment=[Invalid field value for field "attachment".]} 
3) Action 不再继承自 ActionSupport(里面有 ValidationAware 接口), 而转而只实现 Action 接口即可.

posted @ 2009-11-20 16:57 junly 阅读(3004) | 评论 (0)编辑 收藏
转:
版本号: Eclipse SDK Version: 3.2.0
  现象:启动或者import新的project时,Eclipse会自动进行building workspace...这个操作,然后一直持续这个状态不再响应其他事件操作。有时也会在10几分钟后完成这个操作,但是费时严重。
  解决方法:查了很多资料,最后在一个BBS上查到可能是启动参数设置的问题
  (http://www.myeclipseide.com/PNphpBB2+file-viewtopic-t-8253.html)
解决方法:
方法1.如帖子中添加启动参数参数:-vmargs -Xmx256m(效果并不明显)
方法2.关闭自动构建工作区: project -> build Auto….. (效果并不明显) 

在Eclipse启动时加入参数:
  -vmargs -Xmx512M (效果明显)
  重启,building workspace...在短时间内结束,一切正常,具体原因可参考上面网址中的回答,可以给人很多提示,呵呵,看来还是多查资料有好处。写出来希望有相同现象的同仁可以参考解决。
原因详见:http://www.myeclipseide.com/PNphpBB2+file-viewtopic-t-8253.html

关闭其自动Build,然后增大你的内存为512M以上,Eclipse开始内存损耗比JBuilder小,后来同样厉害,注意开大Eclipse内存,这里有一个办法防止outofmemeory:
http://forum.java.sun.com/thread.jspa?threadID=587273&tstart=0
posted @ 2009-11-12 15:15 junly 阅读(1408) | 评论 (0)编辑 收藏

1  Freemarker网站静态化的实现(转)

首页:
1.<body>   
2.
<div id="wrap">   
3.    
<!--头部开始-->   
4.    
<jsp:include page="/html/top.html" flush="true"></jsp:include>   
5.    
<!--头部结束-->   
6.    
<!--导航开始-->   
7.    
<jsp:include page="/html/channel.html" flush="true"></jsp:include>   
8.    
<!--导航结束-->   
9.    
<jsp:include page="/html/center.html" flush="true"></jsp:include>   
10.    
<!--友情连接开始-->   
11.    
<jsp:include page="/html/index_link.html" flush="true"></jsp:include>   
12.    
<!--友情结束-->   
13.    
<!--底部开始-->   
14.    
<jsp:include page="/html/bottom.html" flush="true"></jsp:include>   
15.    
<!--底部结束-->   
16.
</div>   
17.
</body>  
整个网站首页的基本结构是通过jsp的include标签将所有通过freemarker生成的静态页面组织起来。后台控制各个部分的静态页生成。这样做将首页进行了拆分,便于了静态页面的维护,当我们需要生成“友情链接”部分的时候就只生成友情链接部分,而不需要将整个页面都从新生成一次。
   以下是我生成静态页最核心的方法,使用freemarker。
       /**  
* 生成静态页面主方法  
@param context ServletContext  
@param data 一个Map的数据结果集  
@param templatePath ftl模版路径  
@param targetHtmlPath 生成静态页面的路径  
*/
  
public static void crateHTML(ServletContext context,Map<String,Object> data,String templatePath,String targetHtmlPath){   
Configuration freemarkerCfg 
= new Configuration();   
//加载模版   
freemarkerCfg.setServletContextForTemplateLoading(context, "/");   
freemarkerCfg.setEncoding(Locale.getDefault(), 
"UTF-8");   
try {   
    
//指定模版路径   
    Template template = freemarkerCfg.getTemplate(templatePath,"UTF-8");   
    template.setEncoding(
"UTF-8");   
    
//静态页面路径   
    String htmlPath = context.getRealPath("/html")+"/"+targetHtmlPath;   
    File htmlFile 
= new File(htmlPath);   
          Writer out 
= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8"));   
          
//处理模版     
          template.process(data, out);   
          out.flush();   
          out.close();   
}
 catch (Exception e) {   
    e.printStackTrace();   
}
   
其实很简单,只要Google一下就有很多这方面的代码。我也是Google的代码然后自己再根据实际情况修改。简单说明一下参数:
ServletContext :这个不用说了吧。做java web的应该都知道,只不过struts2中这样获取ServletActionContext.getServletContext()
Map<String,Object> data : 模版的数据来源。freemarker通过一个Map给ftl模版送数据。
现在已友情链接为列子详细介绍静态页面如何生成。其他模块以此类推。
String templatePath : ftl所在的路径。我这里相对于网站的一个相对路径然后通过ServerContext获取绝对路径。
String targetHtmlPath : 最后生成静态页的路径:我这里相对于网站的一个相对路径然后通过ServerContext获取绝对路径。

友情链接根据这段代码<jsp:include page="/html/index_link.html" flush="true"></jsp:include>我们需要freemarker生成一个index_link.html文件。友情链接数据来源通过数据库查询获取。
然后再写一个方法专门生成友情链接静态页面:
/**  
* 生成友情链接的静态页index_link.html  
@param context  
@param data  
*/
  
public static void createIndexFriendLink(ServletContext context,Map<String,Object> data){   
crateHTML(context,data,
"index_link.ftl","index_link.html");   
此方法调用上面的createHTML方法。
然后根据以上方法我们就可以再Struts2的action里面从数据库查询数据放入map调用createIndexFriendLink()方法生成静态页了。
这是action中的一个方法:
 /**  
 * 生成友情链接静态页index_link.html  
 * 
@return  
 
*/
  
public String createLink(){   
    
//权限验证   
    if(! this.isAccess())   
        
return "error";   
    
try{   
        
//得到友情链接   
        List links = friendLinkDAO.findAll();   
        
//准备数据   
        HashMap<String,Object> data = new HashMap<String,Object>();   
        data.put(
"links", links);   
        
//调用静态页面方法   
        HTML.createIndexFriendLink(ServletActionContext.getServletContext(), data);   
        addActionMessage(
"静态页面生成成功!");   
        
return "message";   
    }
catch(Exception e){   
        e.printStackTrace();   
        
return "failure";   
    }
   
}
  
List links = friendLinkDAO.findAll();通过spring注入action的hiberate DAO获取数据给list然后通过以下代码
HashMap<String,Object> data = new HashMap<String,Object>();
data.put("links", links);
准备数据调用createIndexFriendLink()方法。
以下是:ftl模版源码:
<#if links?size != 0>   
<div class="link">   
        
<strong>友情链接:</strong>   
        
<#list links as link>   
        
<href="${link.linkUrl}" target="_blank" title="${link.linkName}">${link.linkName}</a>   
        
</#list>   
</div>   
<#else>   
<div class="link"></div>   
</#if>  
这样友情链接静态页就生成了。然后其他静态页依此葫芦画瓢。
posted @ 2009-11-06 17:52 junly 阅读(1103) | 评论 (2)编辑 收藏
import java.io.*
  
public class ReadMAC 
  
public static String physicalAddress = "read MAC error!"
  
public ReadMAC() 
  }
 
  
public static String checkPhysicalAddress()
  
try
  String line; 
  Process process 
= Runtime.getRuntime().exec("cmd /c ipconfig /all"); 
  BufferedReader bufferedReader 
= new BufferedReader(new InputStreamReader(process.getInputStream())); 
  
while ( (line=bufferedReader.readLine()) != null)
  
if(line.indexOf("Physical Address. . . . . . . . . :"!= -1)
  
if(line.indexOf(":"!= -1)
  physicalAddress 
= line.substring(line.indexOf(":")+2); 
  
break//找到MAC,推出循环 
  }
 
  }
 
  }
 
  process.waitFor(); 
  }
catch(Exception e)
  e.printStackTrace(); 
  }
 
  
return physicalAddress; 
  }
 
  
public static void main(String[] args) 
  System.out.println(
"本机的MAC地址是: "+ ReadMAC.checkPhysicalAddress()); 
  }
 
  }
1 引言

  用Java编写的程序,可以很方便地运行在各种平台的环境。但在实际的开发过程中,有时不得不涉及一些底层的编程。比如为了防止软件盗用,我们希望软件只能在指定计算机上运行,所以需要程序读取该机区分于其它计算机的硬件特征,如MAC地址等。作为一种跨平台语言,给Java语言提出了挑战。本文正是针对该问题,提出一种直接用纯Java语言,读去MAC地址的编程方法。

  我们知道,在每一个Java应用程序中都存在着一个与其运行环境相联系的Runtime对象。该对象可执行外部命令、查可用内存等。而多数操作系统都提供有查询该机MAC地址的命令。如在Microsoft的操作系统中,命令IPCONFIG等。本文的思路是在程序中运行一个外部命令,将该命令的运行结果作为一个流(Stream),读取并分析之,进而实现获取MAC地址的目的。

  2 Runtime类

  在每一个Java 应用程序里面,都有惟一的一个Runtime 对象。通过这个Runtime 对象,应用程序可以与其运行环境发生相互作用。

  一般不实例化一个Runtime对象。但是可以通过调用静态方法Runtime.getRuntime( )而获得对当前Runtime对象的引用。Runtime 类的大多数方法是实例方法。

  Runtime 对象的作用主要有:执行外部命令;返回空闲内存;运行垃圾回收器;加载动态库等。

  Applets和其他不可信赖的程序由于没有引起一个安全异常(SecurityException)而不能调用任何的Runtime方法。

  下面的例子演示了怎样使用Runtime 对象运行一个外部命令。

 

以下是引用片段:

  Process process = Runtime.getRuntime().exec("cmd.exe /c dir");
  process.waitFor();

 

  Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。通过Process可以控制该子进程的执行或获取该子进程的信息。第二条语句的目的是等待子进程完成后再往下执行。

  上面的程序在运行时会执行dir命令。如果在Windows95/98下,命令格式可以写成"command.exe /c dir"。开关/C指明后面跟随的字符串是命令,并在执行命令后关闭DOS 窗口。

  方法exec还可以打开一个不可执行的程序,但该文件存在关联的应用程序。以打开一个word文档Mydoc.doc文件为例,Java中可以有以下两种写法:

 

以下是引用片段:
 exec(""cmd /E:ON /c start MyDoc.doc"");
  exec(" c:Program FilesMicrosoft Officeofficewinword.exe .mydoc.doc");

 

  在第一种方式中,被执行的命令是start Mydoc.doc,开关E:ON 指定DOS 命令处理器允许命令扩展,而start 命令会开启一个单独的窗口执行所提供的命令。
执行一个有标准输出的DOS命令,程序执行完后往往不会自动关闭,从而导致Java应用程序阻塞在waitfor( )。导致该现象的原因可能是该命令的输出比较多,而运行窗口的输出缓冲区不够大。解决的办法是,利用Java的Process类提供的方法让Java虚拟机截获DOS运行的标准输出,在waitfor()命令之前读出该缓冲区的内容。以运行命令dir为例,典型的程序如下:

 

 

以下是引用片段:
 :
  String line;
  Process process = Runtime.getRuntime().exec("cmd /c dir");
  BufferedReader bufferedReader = new BufferedReader ( new InputStreamReader(process.getInputStream()));
  while ( (line = bufferedReader.readLine()) != -1) System. out.println(line);
  process.waitFor( );
  :3 Process

 

  Runtime.exec方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获取相关信息。

  抽象类Process封装了一个进程(process),一个正在执行的程序。它主要被当作由Runtime类中的exec( )方法所创建的对象的类型的超类。在抽象类Process中,主要包含了如下一些抽象方法。

  InputStream getInputStream( ):返回一个从进程的out输出流中读输入的输入流。

  OutputStream getOutputStream( ):返回一个从进程的in输入流中写输出的输出流。

  int waitFor( ) throws InterruptedException:返回由进程返回的退出码。这个方法直到调用它的进程中止,才会返回。

  4 程序编写

  我们先来分析ipconfig/all的输出格式:


 

  从图1中我们看到MAC地址包含的行为:“ Physical Address. . . . . . . . . : 00-10-DC-A9-0B-2C”。为了找到MAC地址,我们一行一行读取字符,只要找到字符串“ Physical Address. . . . . . . . . :”,就可以找到MAC地址了。下面是实现的程序片段:

 

以下是引用片段:

  Process process = Runtime.getRuntime().exec("cmd /c ipconfig /all");
  BufferedReader bufferedReader =
  new BufferedReader(new InputStreamReader (process.getInputStream()));
  while ( (line=bufferedReader.readLine()) != null){
  if(line.indexOf("Physical Address. . . . . . . . . :") != -1){
  if(line.indexOf(":") != -1){
  physicalAddress = line.substring(line.indexOf(":")+2);
  :

在上面的程序中,为了读取命令输出的字符,利用子进程process生成了一个数据流缓冲区。
5 结束语

  作为一个跨平台语言,编写的JAVA程序一般都与硬件无关,因而能运行在不同的操作系统环境。但这给编写底层相关的程序时带来不便。

  Java的应用程序都存在着一个与其运行环境相联系的Runtime对象,利用该对象可执行外部命令,在WindowsXP/NT/2000环境中的命令IPCONFIG的输出包含有MAC地址。本文编写的Java程序,执行外部命令IPCONFIG,并通过分析该命令的输入流而获得本机的MAC地址。由于IPCONFIG命令是操作系统命令,所以该方法既方便又可靠。

  以上讨论的程序适合于Windows XP/NT/2000操作系统,因为它是基于该操作系统的命令IPCONFIG格式的。由于不同操作系统读取MAC地址的命令、以及命令输出格式的不同,所以该程序不能直接运用到其它系统。要移植到其它系统只需针对命令的输出格式稍作修改。

posted @ 2009-11-06 17:21 junly 阅读(454) | 评论 (0)编辑 收藏

1.解压struts2-core-X.X.X.jar文件,把在META-INF文件夹下面的struts-tags.tld文件复制到WEB-INF文件夹下。
     将freemark的jar导入到工程中

2.在web.xml文件中配置freemark同时启动JSPSupportServlet.代码如下:

<servlet>
        
<servlet-name>freemarker</servlet-name>
        
<servlet-class>
            freemarker.ext.servlet.FreemarkerServlet
        
</servlet-class>
        
<!--下面的配置freemarke的ftl文件的位置 -->
        
<init-param>
            
<param-name>TemplatePath</param-name>
            
<param-value>/</param-value>
        
</init-param>
        
<!-- 是否和服务器(tommcat)一起启动。0为不。1为是-->
        
<load-on-startup>1</load-on-startup>
    
</servlet>

    
<servlet-mapping>
        
<servlet-name>freemarker</servlet-name>
        
<url-pattern>*.ftl</url-pattern>
    
</servlet-mapping>


<servlet>
  
<!-- define a JspSupportServlet Object -->
  
<servlet-name>JspSupportServlet</servlet-name>
  
<servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
  
<!-- setting JspSupportServlet auto start -->
  
<load-on-startup>1</load-on-startup>
 
</servlet>

3.在FreeMarker模板中使用assign指令导入标签库。代码如下

<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] /> 注:这里我把struts-tags.tld放在WEB-INF下面

4.现在我们可以在FreeMarker模板中使用标签了
示例代码如下:

<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />
<@s.form action="login">
 
<@s.textfield name="username" label="username"/>
 
<@s.submit value="login" />
/@s.form

<!-- login.ftl代码如下 -->

<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />
<html>
<head>
<title>Login Form</title>
</head>
<body>
please input username and password login
<br>
<@s.form action="Login.action">
 
<@s.textfield name="username" label="username"/>
 
<@s.password name="password" label="password" />
 
<@s.submit value="submit" />
</@s.form>
</body>
</html>

 

<!-- welcome.ftl代码如下: -->

<html>
<head>
<title>Success</title>
</haed>
<body>
WelCome,${username},you logined!
<br>
<href="ShowInfo.action">Show Information</a>
</body>
</html>

 

<!-- showinfo.ftl代码如下: -->

<html>
<head>
<title>User Information</title>
<body>
<table border="1" width="360">
<caption>User Information</caption>

<tr>
<td>username:</td>
<td>${username}</td>
</tr>
<tr>
<td>sex:</td>
<td>${sex}</td>
</tr>
<tr>
<td>age:</td>
<td>${age}</td>
</tr>
</table>
</body>
</html>

posted @ 2009-11-05 15:00 junly 阅读(1226) | 评论 (0)编辑 收藏
     摘要: 读取配置文件有很多种方法,现就最常用的方法作以下总结:(其他会慢慢更新) configuration/ConfigurationFactory用法(pache.commons包下) 本文:org.apache.commons.configuration.configuration 其它:com.opensymphony.xwork2.config.configuration &nb...  阅读全文
posted @ 2009-11-04 17:14 junly 阅读(2488) | 评论 (0)编辑 收藏
js读写cookie可以提高效率,现对代码作仔细说明,以备用:
//写cookies函数 
function SetCookie(name,value)//两个参数,一个是cookie的名子,一个是值
{
    
var Days = 30//此 cookie 将被保存 30 天
    var exp  = new Date();    //new Date("December 31, 9998");
    exp.setTime(exp.getTime() + Days*24*60*60*1000);
    
//将 cookie 内容写入客户端,其中 expires 是系统使用的,表示 cookie 的失效日期(也可以省略),
    //expires 不可读。escape 是对 cookie 值进行编码,这是为了处理中文、空格等而设立的。
    document.cookie = name.toLowerCase() + "="+ escape (value) + ";expires=" + exp.toGMTString();
}

//读取cookies函数 
function getCookie(name)       
{
    
//取 cookie 字符串,由于 expires 不可读,所以 expires 将不会出现在 cookieStr 中。 
    var arr = document.cookie.match(new RegExp("(^| )"+name.toLowerCase()+"=([^;]*)(;|$)"));
    
if(arr != nullreturn unescape(arr[2]); return null;

}

//删除cookie
function delCookie(name)
{
    
var exp = new Date();
    exp.setTime(exp.getTime() 
- 1);
    
var cval=getCookie(name);
    
if(cval!=null) document.cookie= name.toLowerCase() + "="+cval+";expires="+exp.toGMTString();
}



//简单例子
SetCookie ("name", www.buslfy.cn)
alert(getCookie(name));

//写入名称为 cv 的 cookie
SetCookie ("cv""test123"null);

//写入名称为 Ab,带失效日期的 cookie
var expires = new Date("December 11, 2010");
SetCookie (
"Ab""test234", expires);

1. Cookie的兼容性问题

Cookie的格式有2个不同的版本,第一个版本,我们称为Cookie Version 0,是最初由Netscape公司制定的,也被几乎所有的浏览器支持。而较新的版本,Cookie Version 1,则是根据RFC 2109文档制定的。为了确保兼容性,JAVA规定,前面所提到的涉及Cookie的操作都是针对旧版本的Cookie进行的。而新版本的Cookie目前还不被Javax.servlet.http.Cookie包所支持。

2. Cookie的内容

同样的Cookie的内容的字符限制针对不同的Cookie版本也有不同。在Cookie Version 0中,某些特殊的字符,例如:空格,方括号,圆括号,等于号(=),逗号,双引号,斜杠,问号,@符号,冒号,分号都不能作为Cookie的内容。这也就是为什么我们在例子中设定Cookie的内容为"Test_Content"的原因。

虽然在Cookie Version 1规定中放宽了限制,可以使用这些字符,但是考虑到新版本的Cookie规范目前仍然没有为所有的浏览器所支持,因而为保险起见,我们应该在Cookie的内容中尽量避免使用这些字符

posted @ 2009-11-04 15:42 junly 阅读(280) | 评论 (0)编辑 收藏
仅列出标题
共18页: First 上一页 8 9 10 11 12 13 14 15 16 下一页 Last