张慧的博客

张慧的博客

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  45 Posts :: 0 Stories :: 24 Comments :: 0 Trackbacks

#

function getCookie(c_name)
{
    if (document.cookie.length>0)
    { 
        c_start=document.cookie.indexOf(c_name + "=")
        if (c_start!=-1)
        { 
            c_start=c_start + c_name.length+1 
            c_end=document.cookie.indexOf(";",c_start)
            if (c_end==-1) 
                c_end=document.cookie.length

            return unescape(document.cookie.substring(c_start,c_end))
        } 
    }
    return ""
}

function setCookie(c_name,value,expiredays)
{
    var exdate=new Date();
    exdate.setDate(exdate.getDate()+expiredays)
    document.cookie=c_name+ "=" +escape(value)+
    ((expiredays==null) ? "" : "; expires="+exdate.toGMTString());
}

function delCookie(c_name)
{
    var exdate=new Date();
    exdate.setTime(exdate.getTime() - 1);
    var cval=getCookie(c_name);
    if(cval!=null) document.cookie= c_name + "="+cval+";expires="+exdate.toGMTString();
}

【使用方法】

1 设置Cookie

(1) 设置会话Cookie

所谓会话Cookie就是一旦浏览器关闭,Cookie就失效了。在嵌入式Web服务器(如Boa)中,常用到CGI编程,CGI没有session机制,可以利用文件或数据库与会话Cookie相结合,模仿session机制。

  1. setCookie('loginPage',page,null);  

(2) 设置定时Cookie

  1. setCookie('loginPage',page,1);  

定时时间为一天。

 

2 获取Cookie

  1. var page = getCookie('loginPage');  


3 删除Cookie

  1. delCookie('loginPage');  

*以上代码在IE,Chrome,FireFox中测试通过,均可正常使用。 

posted @ 2012-07-08 23:33 张慧 阅读(2572) | 评论 (0)编辑 收藏

这是在一个opensource项目中看到的获取访问者ip的方法: 
/**
      * 获取访问者IP
      * 
      * 在一般情况下使用Request.getRemoteAddr()即可,但是经过nginx等反向代理软件后,这个方法会失效。
      * 
      * 本方法先从Header中获取X-Real-IP,如果不存在再从X-Forwarded-For获得第一个IP(用,分割),
      * 如果还不存在则调用Request .getRemoteAddr()。
      * 
      * 
@param request
      * 
@return
      
*/
     public static String getIpAddr(HttpServletRequest request) {
         String ip = request.getHeader("X-Real-IP");
         if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
             return ip;
         }
         ip = request.getHeader("X-Forwarded-For");
         if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
             // 多次反向代理后会有多个IP值,第一个为真实IP。
             int index = ip.indexOf(',');
             if (index != -1) {
                 return ip.substring(0, index);
             } else {
                 return ip;
             }
         } else {
             return request.getRemoteAddr();
         }
     }
posted @ 2012-07-08 23:31 张慧 阅读(2965) | 评论 (0)编辑 收藏

在java中经常需要获取一些系统信息,如系统的资源空间等。下面就是一些Runtime的应用:


public static void main(String[] a){
         Runtime runtime 
= Runtime.getRuntime();
         
long freeMemoery = runtime.freeMemory();
         
long totalMemory = runtime.totalMemory();
         
long usedMemory = totalMemory - freeMemoery;
         
long maxMemory = runtime.maxMemory();
         
long useableMemory = maxMemory - totalMemory + freeMemoery;
         
         System.out.println(
"当前时间:"+runtime);
         System.out.println(
"系统闲置空间:"+freeMemoery);
         System.out.println(
"系统总空间:"+totalMemory);
         System.out.println(
"系统被用的空间:"+usedMemory);
         System.out.println(
"系统最大空间:"+maxMemory);
         System.out.println(
"系统可用空间:"+useableMemory);
     }

运行效果:


当前时间:java.lang.Runtime@c3c749
 系统闲置空间:
4873672
 系统总空间:
5177344
 系统被用的空间:
303672
 系统最大空间:
66650112
 系统可用空间:
66346440

 

posted @ 2012-07-08 23:30 张慧 阅读(736) | 评论 (0)编辑 收藏

 1、什么是混淆?为什么要混淆?这个问题不多说明,简单讲,就是为了保护软件项目的所有权,防止别人反编译,将代码打乱,人看着会很费劲,但对计算机执行没有障碍。 
    2、当前项目的结构:项目采用的框架是ssh(spring、struts2、hibernate)的,其中还用了Annotation 注释标签。代码形如: 
    (1)一个bo的代码 
Java代码  收藏代码
  1. /** 
  2.  *@preserve all 
  3.  */  
  4. @Entity  
  5. @Table(name = "crm_code_clientSort")  
  6. public class ClientSort  
  7. {  
  8.     @Id  
  9.     @GeneratedValue(generator = "uuidGenerator")  
  10.     @GenericGenerator(name = "uuidGenerator", strategy = "uuid")  
  11.     @Column(length = 32)  
  12.     private String id;//标识  
  13.       
  14.     @Column(length = 6)  
  15.     private String code; //编号  
  16.   
  17.     @Column(length = 20)  
  18.     private String name; //名称  
  19.       
  20. }  

    (2)action的代码 
Java代码  收藏代码
  1. /** 
  2.  *@preserve all 
  3.  */  
  4. @Controller  
  5. @Scope("prototype")  
  6. @ParentPackage(value = "abc-default")  
  7. @Namespace("/crm/backlog")  
  8. @Results(  
  9. {       
  10.     @Result(name = "showInfo", location = "/jsp/crm/backlog/showInfo.jsp"),  
  11.     @Result(name = "common", location = "/jsp/crm/backlog/list.jsp"),  
  12.     @Result(name = "addBacklog", location = "/jsp/crm/backlog/addBacklog.jsp"),  
  13.     @Result(name = "updateBacklog", location = "/jsp/crm/backlog/updateBacklog.jsp")  
  14.       
  15. })  
  16. @InterceptorRef("isLogin")  
  17. public class BacklogAction {  
  18.       
  19.     @Resource  
  20.     private CRM_BacklogService cRM_backlogService; //此对象是spring自动注入的,因为加了@Resource标签  
  21.       
  22.     @Resource  
  23.     private CodeBean codeBean;      
  24.       
  25.     private Object fere;       
  26.     private Backlog dto;   
  27.         //以下略  
  28.   
  29. }  

    (3)service代码 
Java代码  收藏代码
  1. @Service  
  2. public class UserService  
  3. {  
  4.    @Resource  
  5.    public Dao dao;  
  6.   
  7.    public String getTheNum()  
  8.    {  
  9.       //省略代码  
  10.       return "";  
  11.     }  
  12.   
  13.   
  14.    /** 
  15.      * @preserve public 
  16.      */  
  17.    public void updateObject(User user)  
  18.    {  
  19.       dao.updateObject(user);  
  20.    }  
  21.       
  22.    //********省略其他  
  23. }  


    3、混淆介绍。 
    (1)整体混淆级别设置。设置为public的。对所有的代码混淆。具体配置文件我使用方法,参见jocky的说明文件,附件的压缩包中有。 
Xml代码  收藏代码
  1. <property name="jocky.scramble.level" value="public"/>  

    (2)对于不需要混淆的类,加上注释 @preserve all 将其除外。如上面的bo、action代码。本项目中不能混淆的类有: 
    A、action类,可能是由于struts2管理的原因,如果混淆,项目会报错,找不到相应的action. 
    B、bo类,该类是和数据库表一一对应的,改变了,就乱了。因为用的是hibernate自动映射的。 
    C、其他会被jsp页面中引用到的类,如dto类,工具类,dwr类等。 
    (3)对于可以混淆的类,但不能混淆的方法,加上@preserve public 注释。如上面的service类。因为涉及到事务的控制,如果方法名被混淆了,在方法内改变数据的某些操作时,就会报错。本项目中在sping.xml内配置了所有service方法中,只有以save,update,delete开头的方法,才能改变数据库,否则会报错。参见如下: 
Xml代码  收藏代码
  1. <!-- 配置事务的传播特性 -->  
  2. <tx:advice id="txAdvice" transaction-manager="transactionManager">  
  3.     <tx:attributes>  
  4.         <tx:method name="save*" propagation="REQUIRED" />  
  5.         <tx:method name="update*" propagation="REQUIRED" />  
  6.         <tx:method name="delete*" propagation="REQUIRED" />  
  7.         <tx:method name="*" read-only="true" />  
  8.     </tx:attributes>  
  9. </tx:advice>  
  10.   
  11.   
  12. <!-- 那些类的哪些方法参与事务 -->  
  13. <aop:config>  
  14.     <aop:pointcut id="commonServiceMethod" expression="execution(* com.abc.domain.common.service.*.*(..))" />  
  15.     <aop:pointcut id="khServiceMethod" expression="execution(* com.abc.domain.*.*.inside.service.*.*(..))" />  
  16.       
  17.     <aop:advisor pointcut-ref="commonServiceMethod" advice-ref="txAdvice" />  
  18.     <aop:advisor pointcut-ref="khServiceMethod" advice-ref="txAdvice" />  
  19. </aop:config>  

posted @ 2012-07-08 01:46 张慧 阅读(3536) | 评论 (0)编辑 收藏

Macro总结了该问题的一些返回结果:

  1. 应用打开即崩溃。各种折腾都没用
  2. 可能并不是全球性的,只影响个别地区
  3. 从iTunes更新的用户可能收到 error 8324 或者 error 8326 信息
  4. Mac应用可能显示:该应用已损坏,请删除或重装。
  5. 控制台显示AppleFairplayTextCrypterSession::fairplayOpen() failed, error -42110
posted @ 2012-07-08 01:46 张慧 阅读(1027) | 评论 (0)编辑 收藏

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Jquery</title>
<script type="text/javascript" src="../Js/jquery1.6.1.js"></script>
<script type="text/javascript">
    $(document).ready(function() {
        var ht = $('.toshow li').html();
        var te = $('.toshow li').text();
        var htte = '这是html()在li的显示结果' + ht + '****' + '<br>这是text()在li的显示结果' + te + '****';
        var ht1 = $('.toshow1').html();
        var te1 = $('.toshow1').text();
        htte += '<br>这是html()在div的显示结果' + ht1 + '****' + '<br>这是text()在div的显示结果' + te1 + '****';
        $('.totext').html(htte);
    });
</script>
</head>

<body>



<div class="toshow">
    <ul>
        <li>sj*</li>
    </ul>
</div>
<div class="toshow1">sj*</div>
<div class="totext"></div>
<div class="result">
    在li下,将会在最后有一个' '空格
</div>


</body>
</html>

先上代码。

运行结果如下:

这是html()在li的显示结果sj* ****
这是text()在li的显示结果sj* ****
这是html()在div的显示结果sj*****
这是text()在div的显示结果sj*****
在li下,将会在最后有一个' '空格 

posted @ 2012-07-05 22:56 张慧 阅读(1477) | 评论 (0)编辑 收藏

1.需要把json的包源码搞出来,我们就可以测试了。(下载地址)https://github.com/douglascrockford/JSON-java
2,测试代码如下:

package shengsiyuan.lxd.json;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Test;

public class TestJson
{
    @Test
    
public void TestJson01() throws JSONException
    {
        String jsonContent 
= "{'name':'lixiaodaoaaa','age':26}";
        JSONObject myJson 
= new JSONObject(jsonContent);
        String strName 
= myJson.getString("name").toString();
        String strAge 
=String.valueOf(myJson.getInt("age"));
        System.out.println(strName);
        System.out.println(strAge);
    }
    @Test
    
public void TestJson02() throws JSONException
    {
        String jsonContent 
="[{'name':'lixiaodaoaaa','age':22}," +
                
"{'name':'lihao','age':26}," +
                
"{'name':'libo','age':27}]";
        JSONArray myJsonArray 
= new JSONArray(jsonContent);
        String strName1  
= myJsonArray.getJSONObject(0).getString("name");
        String strName2  
= myJsonArray.getJSONObject(1).getString("name");
        String strName3  
= myJsonArray.getJSONObject(2).getString("name");
        String strAge1 
= String.valueOf(myJsonArray.getJSONObject(0).getInt("age"));
        String strAge2 
= String.valueOf(myJsonArray.getJSONObject(1).getInt("age"));
        String strAge3 
= String.valueOf(myJsonArray.getJSONObject(2).getInt("age"));
        System.out.println(strName1
+".************."+strAge1);
        System.out.println(strName2
+".************."+strAge2);
        System.out.println(strName3
+".************."+strAge3);
    }
    @Test
    
public void TestJson03() throws JSONException
    {
        String jsonString 
= "[{'key':{'name':'lixiaodaoaaa','age':22}}, {'key':{'name':'lihao','age':21}},{'key':{'name':'libo','age':23}}]";
        JSONArray myjsonArray 
= new JSONArray(jsonString);
        
for(int i=0;i<myjsonArray.length();i++)
        {
            String strName 
= myjsonArray.getJSONObject(i).getJSONObject("key").get("name").toString();
            String strAge 
= String.valueOf(myjsonArray.getJSONObject(i).getJSONObject("key").getInt("age"));
            System.out.println(strName
+"************************"+strAge);
        }
    }
}

 
posted @ 2012-07-05 22:55 张慧 阅读(818) | 评论 (0)编辑 收藏

很多时候,尤其是当我们需要展示或者宣传自己的产品时,我们都会用到图片轮播的特效,但是,选择什么样的图片播放器更实用、更美观、更大气呢?下面就给大家推荐几款简单实用却又美观大气的jQuery图片播放器,希望能给大家带来帮助。

1、jQuery图片水平播放插件

这是一个非常简洁但又十分实用的jQuery图片水平播放插件,这个jQuery图片播放插件允许你自己定义同时滚动几张图片,并且滑动很平滑。

2、jQuery仿苹果图片播放器

这是一款基于jQuery的仿苹果样式的图片播放器,这个图片播放器配置简单,外观简洁但不是美观,和苹果的特点非常相符。这个图片播放器非常适合放在你的首页上作为产品图片轮播组件。

3、jQuery幻灯片式播放的相册插件

这是一款基于jQuery的相册插件,该jQuery图片播放插件将相片的缩略图展示在一个导航网格中。我们不仅可以手动地点击按钮切换当前的图片,也可以让相册自动播放图片,当然也可以展开网格点击缩略图来浏览整张图片。

4、jQuery图片水平滚动插件

这是一款基于jQuery的图片水平滚动插件,这个插件在滚动图片的时候十分流畅,同时支持自动播放,你也可以利用鼠标滚轮来使图片左右滚动。

5、jQuery图片播放插件

这是一款基于jQuery的图片播放插件,一共分5屏,有JS代码基础的朋友也可以根据自己的需求修改需要展示的图片数量,这个jQuery图片播放插件整体滑动比较流畅,兼容所有主流浏览器。

6、jQuery图片层叠展示特效

这是一款基于jQuery的图片展示插件,该图片展示插件将图片交错地叠在一起,当鼠标点击图片时,下一张图片将会浮现上来,效果非常棒。

posted @ 2012-07-05 22:52 张慧 阅读(1121) | 评论 (0)编辑 收藏

 对于Java Web程序的学习已经有一段时间了,也正在跟做一个项目——DRP分销资源计划。

         DRP这段时间已经看了不少了,把相关代码也实现了。但是还是没有搞清楚一些关系。大概知道是哪里调用了那里,整体上和.net一致。细说就不知道了。为了能更好的理解Java程序,所以在网上也了些资料来促进理解。

       在web程序中不太容易搞清楚的就是客户端和服务器。这也是B/S结构的一大特点,C/S结构的客户端和服务器非常明了,没有其他的辅助技术。在B/S中将很多技术都分离出来成为独立的技术,让其变得更加灵活。(像 jsjspajax等等)

       为了搞清楚他们这些相关技术之间的关系,首先来了解一下Java Web程序客户端和服务器端是如何进行交互的。

       说起来其实很简单,web程序客户端和服务器的交互主要依赖于Http协议的。先来了解一下什么是个HTTP协议吧!

        A、HTTP是一种超文本传送协议(Hyper Text Transport Protocol)是一套计算机在网络中通信的一种规则。在TCP/IP体系结构中,HTTP属于应用层协议,位于TCP/IP协议的顶层。

       B、HTTP是一种无状态的协议,意思是指在Web 浏览器(客户端)和 Web 服务器之间不需要建立持久的连接。整个过程就是当一个客户端向服务器端发送一个请求(request),然后Web服务器返回一个响应 (response),之后连接就关闭了,在服务端此时是没有保留连接的信息。

       C、HTTP 遵循 请求/响应(request/response) 模型的,所有的通信交互都被构造在一套请求和响应模型中。

       D、浏览WEB时,浏览器通过HTTP协议与WEB服务器交换信息,Web服务器向Web浏览器返回的文件都有与之相关的类型,这些信息类型的格式由MIME定义。

 

       HTTP定义的事物处理有以下四个步骤:1、建立链接  2、客户端发送HTTP请求报文(request)  3、服务器响应请求生成结果并回发(response)  4、服务器端关闭连接,客户端解析回发响应报文,恢复页面

 

          1、  建立连接

             我们在浏览器地址栏中输入URL地址,例如:http://blog.csdn.net/lidonglong121。客户端请求这个地址的时候即打开了web服务器HTTP端口的一个套接字。

         2、  客户端发送HTTP请求报文(request)

            一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令,是一个ASCII文本请求行,后跟0个或多个HTTP头标(即报头),一个空行和实现请求的任意数据。

             请求报文共含四部分,详见博文:http://blog.csdn.net/lidonglong121/article/details/7719405

             


     请求报文总结:

           我们可以这样写出一个标准的 HTTP请求:

                       POST /lidonglong121 HTTP1.1

                       HOST: blog.csdn.net/

                       User-Agent: Mozilla/4.0

                       Accpt: image/gif,text/html,application/pdf,image/png...

                       (CRLF)

                        viewmode=contents           (POST()请求的数据)

    这上面的一个例子意思是:

           我要去访问的服务器端的地址是:blog.csdn.net/  它下面的资源: /lidonglong121  

           连起来就是:blog.csdn.net/lidonglong121
           这个页面用的是 HTTP1.1 规范,我的浏览器版本是Mozilla/4.0
           可以支持的MIME格式为 image/gif,text/html,application/pdf,image/png.....


       GET 和 POST 最直观的区别就是:GET方法将数据的请求跟在了所请求的URL后面,也就是在请求行里面我们是这么样来做的:
            GET /lidonglong121?key=value&key=value&key=value......HTTP1.1
       实际上用 GET 是这样传递数据的:http://blog.csdn.net/lidonglong121?viewmode=contents
       POST是不会将调用的参数在URL中显示的。

 

        3.服务器端响应请求生成结果并回发(response)
             Web 服务器解析请求,定位指定的资源 http://blog.csdn.net/lidonglong121/article/details/7718663
           

            1)根据请求时的 GET/POST 对应的用servlet里的 doGet() / doPost()方法来处理(有可能是一些业务逻辑,也有可能是一些验证等等,也有可能是一些数据查询,提交等等)其有效的数据就来源于key=value&key=value&key=value......,以及其它的一些封装在request 对象中的数据资源。

            2)处理请求之后,由 response 对象得到 java.io.PrintWriter 输出流对象out,通过 out.println(); 将数据以指定的格式,如按照response.setcontentType("text/html;charset=gb2312");的格式输出到输出流。

         它的响应报文与请求报文非常类似,其区别就在于:我们在请求阶段的请求行被状态行给替换了,再来看响应报文:
            3)一个响应报文由四个部分组成:状态行、响应头标、空行、响应数据:

              详见博文:http://blog.csdn.net/lidonglong121/article/details/7719109

       4、服务器端关闭连接,客户端解析回发响应报文,恢复页面

            1)浏览器先解析状态行,查看请求是否成功的状态代码。

            2)解析每一个响应头标,如:

                  ContentType.text/html;charset=gb2312

                  Content-Lengh:122 ---响应中的字节数

            3)读取响应数据HTML,根据标签<html></html>中的内容恢复标准的HTML格式页面或者其他。

            4)一个HTML文档可能包含其它的需要被载入的资源,浏览器会识别,并对这些资源再进行额外的请求,这个过程可以是循环的方式一直到所有的数据都按照响应头标中规定的格式恢复到页面中。

            5)数据传送完毕,服务器端关闭连接,即无状态协议。 

   

       web客户端和服务器的一个交互主要流程如上所述。

posted @ 2012-07-05 22:51 张慧 阅读(3536) | 评论 (0)编辑 收藏

做一名禅修程序员意味着什么?那意味着,你要持守我从禅宗 习得的10条戒律,它们与计算机程序员的现代世界息息相关。

早晨,外面下着雨,我发觉自己正坐在办公桌上琢磨有关高效率工作(efficient working)的问题。在我成为自由职业者之前的那些日子,尽管做了许多工作,然而回首往昔,不过是一片狼藉罢了。

回想2006年我开始禅修之际,当时有好一阵子,这种念头清晰地浮现在我的脑海里:几百年前,老禅师就已知晓今天的程序员到底该如何工作。尽管我并不喜欢那些诸如“成为更好的程序员”之类的帖子,但是从那天早上起,我想概括我的一些想法。谨以此文作为自我提醒,但如果你对此有任何想法,欢迎不吝赐教。

1. 一心不乱(Focus——集中精神)

一旦你已决定处理某项任务,就要尽你所能把它做好。不要同时启动几件事。一次只做一件事。一心多用不会使你变得更快,你只不过是在进行多线程式的工作。如果进行多线程式的工作,那么你将变得精疲力竭、错误倍出,而且为了从一个任务跳转到另一任务也会浪费时间。这不仅适用于编程,而且是条通用建议。

泽木兴道(Kodo Sawaki)禅师说过:要是你想睡就睡。当你准备睡觉时,就别盘算软件了。只管去睡。要是你想编码就编码。切勿虚度光阴——专心编码。要是你累得写不动程序了,那就睡吧!即使像Stephan Uhrenbacher那样知名的多任务处理者在此时也会决定进行单线程式的工作。我有着与Stephan类似的经历,并最终写出了名为Time & Bill的时间跟踪工具。其目的是跟踪我的时间,哪怕是像打电话那样的小任务也可轻松跟踪。现在我可以在每天伊始创建几个秒表,而且只需轻轻一点便可跟踪我的时间。但是过去的结果却是场灾难:有时直到我移至下一个任务为止,我仅仅在某个任务上工作了几分钟。现在我的情况已有所改善。与番茄工作法类似,我会计划若干时段,并且在那些时段里全神贯注地工作,不聊天、不瞌睡、不浏览应用商店上那些精彩的新游戏。

posted @ 2012-07-05 22:22 张慧 阅读(782) | 评论 (0)编辑 收藏

仅列出标题
共5页: 上一页 1 2 3 4 5 下一页