<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我的Java路上那些事兒

    快樂(lè)成長(zhǎng)
    posts - 110, comments - 101, trackbacks - 0, articles - 7
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

      .表示當(dāng)前目錄 比如cd .或者 cd ./  當(dāng)前目錄
      .. 代表上級(jí)目錄
      ~ 代表用戶的home目錄
      / 代表系統(tǒng)根目錄
      pwd 命令用于顯示當(dāng)前目錄的絕對(duì)路徑
     
      命令1
      find . -name mysql_version.h -exec grep -i 'mysql_server_version' {} \;
      解析: 找到mysql_version.h文件 并查看mysql_server_version
      . 當(dāng)前目錄
      -name: 后面跟上 要找的文件名
      -exec: find命令對(duì)匹配的文件執(zhí)行該參數(shù)所給出的shell命令 相應(yīng)命令的形式為'command' { } /;,注意{ }和/;之間的空格。
      即可以在-exec 后面 跟上 shell命令 但是要以 { } /;結(jié)束 一個(gè)都不能少
      grep 查詢(xún)文件中的內(nèi)容
      -i 是不區(qū)分大小寫(xiě)
     
       find -name mysql_version.h |xargs cat -n | grep -i mysql_server_version
       其中的 -exexc也可以用 |xargs 代替
     
      命令2
      find . -name mysql_version.h -exec cat {} \;
      cat: 一行一行的讀出文件內(nèi)容
     
      命令3 
      find . -name mysql_version.h -exec cat -n {} \;
      cat命令參數(shù)
      -n 顯示行號(hào)
     
      命令4
      find / -type f -size 0 -exec ls -l {} \;
      cat > fileName 創(chuàng)建文件,不能這樣編輯已有的文件
      cat file1 file2 > file3 把幾個(gè)文件合并到一個(gè)文件
     

      命令5
       who  查看當(dāng)前在線的用戶
      
      命令6
      cut –d’:’ -f 1    cut命令可以從一個(gè)文本文件或者文本流中提取文本列,具體的說(shuō)就是在文件中負(fù)責(zé)剪切數(shù)據(jù)用的。cut是以每一行為一個(gè)處理對(duì)象的,這種機(jī)制和sed是一樣的 
     cut -d'分隔字元' -f fields
     -d ∶后面接分隔字符。與 -f 一起使用; 如 -d : 表示用冒號(hào)分隔
        -f ∶依據(jù) -d 的分隔字符將一段訊息分割成為數(shù)段,用 -f 取出第幾段的意思;
     
      命令7
      \w 匹配文字和數(shù)字字符 也就是[A-Za-z0-9]
      x\{m,\}  重復(fù)字符x ,至少m次 如'a\{5,\}' 匹配至少有5個(gè)a的行
      '\w\{4,\}'
     
      命令7
      cut -d: -f 1,3 /etc/passwd |grep '[0-9]\{3,\}' | wc -l
      -f 1,3 /etc/passwd 即是選擇passwd文件中的以冒號(hào)分隔的第一列和第三列,grep ‘[0-9]\{3,\}’即是使用grep匹配包含大于99的數(shù)據(jù)項(xiàng)
     
      命令8
      wc -l 統(tǒng)計(jì)行數(shù)
     
      命令9
      mv 和rename 重命名,區(qū)別mv 只對(duì)單個(gè)文件命名,rename 還可以批量命名
     
      linux 下執(zhí)行amoeba.sh文件  報(bào)錯(cuò)
      -bash: amoeba.sh: command not found
      解決方法: 在執(zhí)行文件前面加上. ;
      . amoeba.sh .后面要有要空格
     
      命令10
      刪除目錄以文件
      rm -rf dal-server/
      -r 就是向下遞歸 一并刪除
      -f 就是直接強(qiáng)行刪除 不作任何提示
     
      命令11
      查看linux是x86還是x64
      getconf LONG_BIT 這里的LONG_BIT需要大寫(xiě)
      ifconfig 系統(tǒng)信息
     
      命令12
      安裝jdk
      下載jdk-6u30-linux-x64.bin 文件
       進(jìn)入安裝目錄
       1 先執(zhí)行 export _POSIX2_VERSION=199209
       2 然后可以安裝jdk了
       命令很簡(jiǎn)單 就是 ./jdk-6u30-linux-x64.bin 之前沒(méi)有空格 如果/后面有了空格 會(huì)出錯(cuò)
       設(shè)置 環(huán)境 變量
       進(jìn)入etc目錄下找到 profile 打開(kāi)并編輯
       在最后  加上
       export JAVA_HOME=/usr/tmp/jdk1.6.0_30
       export PATH=$JAVA_HOME/bin:$PATH
       export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
      
       然后退出終端  重新登錄 就可以了
       java -version 可以發(fā)現(xiàn)環(huán)境變量配置成功了
      
      命令13
      使用腳本 執(zhí)行java工程
        export CLASSPATH=.
     for jarlib in `ls /usr/tmp/hello_yun/dal-server/lib/*.jar`
     do
       CLASSPATH=$CLASSPATH:$jarlib
     done
     export CLASSPATH=$CLASSPATH
     echo current  classpath $CLASSPATH
        這樣就把classpath 都加進(jìn)來(lái)了 
    DEFAULT_OPTS="-server -Xms128m -Xmx128m -Xss128k"
    DEFAULT_OPTS="$DEFAULT_OPTS -XX:+AggressiveOpts -XX:+UseParallelGC -XX:+UseBiasedLocking -XX:NewSize=64m"
    # -Ddalserver.home 
    DEFAULT_OPTS="$DEFAULT_OPTS -Ddalserver.home=\"$DALSERVER_HOME\""
    DEFAULT_OPTS="$DEFAULT_OPTS -Dclassworlds.conf=\"$DALSERVER_HOME/bin/dalserver.classworlds\""
    CMD="exec \"$JAVA_HOME/bin/java\" $DEFAULT_OPTS $OPTS -classpath \"$CLASSPATH\"  $MAIN_CLASS $@"
    eval $CMD


      命令14
      端口查看  
        今天發(fā)現(xiàn)服務(wù)器上Tomcat 8080端口起不來(lái),老提示端口已經(jīng)被占用。
     使用命令:
     netstat –apn |grep 8080
        top  查看系統(tǒng)資源占用
     

    posted @ 2012-03-31 11:35 云云 閱讀(1879) | 評(píng)論 (0)編輯 收藏

    The current (8.0-SNAPSHOT) build uses version 1.5 of the maven-svn-revision-number-plugin plugin, when source code has been checked out using a subversion client version 1.7 the build fails with a subversion error because the repository metadata in the working copy is not upward compatible, 
    com.google.code.maven-svn-revision-number-plugin:1.5:maven-svn-revision-number-plugin uses SVNkit 1.3.x which is compatible with subversion 1.6=<

    When the maven-svn-revision-number-plugin is updated to version 1.7 (currently latest release of this plugin) you can specify a commandline option (-Dsvn-revision-number.failOnError=false) to ignore the subversion error and the build completes normally. Note that com.google.code.maven-svn-revision-number-plugin:1.7:maven-svn-revision-number-plugin still relies on svnkit:1.3.5 so the error is still there, the updated plugin just gives an option to ignore it either from the commandline or as a config option.

    出現(xiàn)了這樣的錯(cuò)誤的時(shí)候 是svn版本問(wèn)題
    由于我的電腦上安裝了客戶端是1.7的版本
    但是pom.xml中使用的是1.6
       <plugin>
        <groupId>com.google.code.maven-svn-revision-number-plugin</groupId>
        <artifactId>maven-svn-revision-number-plugin</artifactId>
        <version>1.6</version>
        <executions>
         <execution>
          <goals>
           <goal>revision</goal>
          </goals>
         </execution>
        </executions>
        <configuration>
         <entries>
          <entry>
           <prefix>SVN</prefix>
          </entry>
         </entries>
        </configuration>
       </plugin>
    在編繹時(shí)  出現(xiàn)了上述異常 ,我想可能是版本問(wèn)題 于是乎我就把pom.xml中maven-svn-revision-number-plugin的<version>1.6</version>改成了<version>1.7</version>
    心想可能問(wèn)題解決了 沒(méi)想到編繹時(shí)還是報(bào)以上錯(cuò)誤
    于是在網(wǎng)上狂搜 終于發(fā)現(xiàn)了 有人也出現(xiàn)了這樣的問(wèn)題
    經(jīng)過(guò)實(shí)驗(yàn)發(fā)現(xiàn)這個(gè)方案靠譜 就記錄下來(lái)了 路過(guò)的人看到了也可以方便解決問(wèn)題

    方案:
         當(dāng)然上面的<version>1.7</version>還是要保留的 因?yàn)槲业目蛻舳艘彩?.7
    然后呢  在編繹的時(shí)候  要加入 -Dsvn-revision-number.failOnError=false
    來(lái)個(gè)完整的 命令:eclipse:eclipse -Dsvn-revision-number.failOnError=false

    就這樣ok了。



    posted @ 2012-03-21 09:44 云云 閱讀(22147) | 評(píng)論 (3)編輯 收藏

    用java寫(xiě)服務(wù)程序時(shí)經(jīng)常會(huì)涉及到監(jiān)控某些配置文件,當(dāng)配置文件發(fā)生變化時(shí)實(shí)時(shí)重新加載該文件的內(nèi)容到內(nèi)存.
    實(shí)際上log4j里有現(xiàn)成的類(lèi)FileWatchdog做了類(lèi)似的工作.我們只需繼承它,然后重寫(xiě)它的一些方法就可以了.
     
       /**使用log4j的監(jiān)控狗 */
        
    public class IPAccessFileWatchdog extends FileWatchdog {
            
    public IPAccessFileWatchdog(String filename){
                
    super(filename);
            }


            
    public void doOnChange() {
                List
    <String> list = IPAccessController.this.loadIPRule(new File(this.filename));
                
    if (list != null{
                    IPAccessController.
    this.ipRule = list.toArray(new String[list.size()]);
                }
     else {
                    IPAccessController.
    this.ipRule = null;
                }

                LogLog.warn(
    "ip access config load completed from file:" + filename);
            }

        }

    }


    FileWatchdog的代碼也很簡(jiǎn)單,其實(shí)就是起一個(gè)線程,每隔固定的時(shí)間掃描一次監(jiān)控的文件.我把代碼也貼出來(lái):'


    // Contributors:  Mathias Bogaert

    package org.apache.log4j.helpers;

    import java.io.File;
    import org.apache.log4j.helpers.LogLog;

    public abstract class FileWatchdog extends Thread {

      
      
    static final public long DEFAULT_DELAY = 60000
      
      
    protected String filename;
      
      
      
    protected long delay = DEFAULT_DELAY; 
      
      File file;
      
    long lastModif = 0
      
    boolean warnedAlready = false;
      
    boolean interrupted = false;

      
    protected
      FileWatchdog(String filename) 
    {
       
    this.filename = filename;
       file 
    = new File(filename);
       setDaemon(
    true);
       checkAndConfigure();
      }


      
      
    public
      
    void setDelay(long delay) {
       
    this.delay = delay;
      }


      
    abstract 
      
    protected 
      
    void doOnChange();

      
    protected
      
    void checkAndConfigure() {
       
    boolean fileExists;
       
    try {
        fileExists 
    = file.exists();
       }
     catch(SecurityException  e) {
        LogLog.warn(
    "Was not allowed to read check file existance, file:["+
     filename
    +"].");
        interrupted 
    = true// there is no point in continuing
        return;
       }


       
    if(fileExists) {
        
    long l = file.lastModified(); // this can also throw a SecurityException
        if(l > lastModif) {      // however, if we reached this point this
    lastModif = l;        // is very unlikely.
    doOnChange();
    warnedAlready 
    = false;
        }

       }
     else {
        
    if(!warnedAlready) {
    LogLog.debug(
    "["+filename+"] does not exist.");
    warnedAlready 
    = true;
        }

       }

      }


      
    public
      
    void run() {   
       
    while(!interrupted) {
        
    try {
      Thread.sleep(delay);
        }
     catch(InterruptedException e) {
    // no interruption expected
        }

        checkAndConfigure();
       }

      }

    }


    posted @ 2012-02-17 14:03 云云 閱讀(3553) | 評(píng)論 (0)編輯 收藏

    <?xml version="1.0" encoding="UTF-8" ?>
    <person>
        
    <name>yunyun</name>
        
    <gender>true</gender>
        
    <address>shanghai</address>
        
    <contents>cc</contents>
        
    <contents>ss</contents>
        
    <taxs>
            
    <string>1</string>
            
    <string>2</string>
            
    <string>3</string>
        
    </taxs>
    </person>

    JavaBean
    public class Person2 {
        
    private String name;
        
    private boolean gender;
        
    private String homeAddress;
        
    private List<String> contentslist;
        
    private String[] taxs;

        @Override
        
    public String toString() {
            
    return ToStringBuilder.reflectionToString(this);
        }


    }

    測(cè)試類(lèi) 解析xml 反序列化到j(luò)avaBean object

    public class TestXmlToObject2 {

         
    public static final XStream xstream=new XStream();
         
         
    static{
             xstream.alias(
    "person", Person2.class);//類(lèi)別名
             xstream.aliasField("address", Person2.class"homeAddress"); //屬性別名
             xstream.alias("contents",String.class);//private List<String> contentslist;是string類(lèi)型
             xstream.addImplicitCollection(Person2.class"contentslist");//隱式集合 隱藏contentslist
             Person2 person=(Person2)xstream.fromXML(TestXmlToObject2.class.getClassLoader().getResourceAsStream("person02.xml"));
             System.out.println(person.toString());
         }

        
        
    public static void main(String[] args) {

        }


    }


    二: 注解方式
    xml:
     
    <?xml version="1.0" encoding="UTF-8" ?>
    <person>
        
    <name>yunyun</name>
        
    <gender>true</gender>
        
    <address>shanghai</address>
        
    <company>yihaodian</company>
        
    <sources>
            
    <string>firstSources</string>
            
    <string>secondSources</string>
        
    </sources>
        
    <part>firstPart</part>
        
    <part>secondPart</part>
    </person>

    javaBean
    @XStreamAlias("person")
    public class Person3 {
        private String name;
        private boolean gender;
        @XStreamAlias("address")
        private String homeAddress;
        private String company;
        @XStreamImplicit(itemFieldName="part")
        private List
    <String> content;
        private String[] sources;
        
        @Override
        public String toString() {
            return ToStringBuilder.reflectionToString(this);
        }
    }

    測(cè)試
    public class TestXmlToObject3 {

         
    public static final XStream xstream=new XStream();
         
         
    static{
             xstream.processAnnotations(Person3.
    class);//顯示聲明使用注解
             xstream.autodetectAnnotations(true);
             Person3 person
    =(Person3)xstream.fromXML(TestXmlToObject3.class.getClassLoader().getResourceAsStream("person03.xml"));
             System.out.println(person.toString());
         }

         
        
        
        
        
    public static void main(String[] args) {

        }


    }

    POM.xml
            <dependency>
                
    <groupId>com.thoughtworks.xstream</groupId>
                
    <artifactId>xstream</artifactId>
                
    <version>1.3.1</version>
            
    </dependency>
            
    <dependency>
                
    <groupId>commons-lang</groupId>
                
    <artifactId>commons-lang</artifactId>
                
    <version>2.4</version>
            
    </dependency>



    posted @ 2012-01-31 17:59 云云 閱讀(16934) | 評(píng)論 (3)編輯 收藏

    tomcat 需要遠(yuǎn)程debug的話 需要在startup.bat中加入下面這段話

    SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8788

    然后在eclipse 中新建遠(yuǎn)程debug 端口號(hào)就是上面的address 8788 

    posted @ 2011-12-09 16:37 云云 閱讀(188) | 評(píng)論 (0)編輯 收藏

    del D:\logs\* /s/q

    posted @ 2011-12-09 15:04 云云 閱讀(222) | 評(píng)論 (0)編輯 收藏

    1、攔截器是基于java的反射機(jī)制的,而過(guò)濾器是基于函數(shù)回調(diào)
    2、過(guò)濾器依賴(lài)與servlet容器,而攔截器不依賴(lài)與servlet容器
    3、攔截器只能對(duì)action請(qǐng)求起作用,而過(guò)濾器則可以對(duì)幾乎所有的請(qǐng)求起作用
    4、攔截器可以訪問(wèn)action上下文、值棧里的對(duì)象,而過(guò)濾器不能
    5、在action的生命周期中,攔截器可以多次被調(diào)用,而過(guò)濾器只能在容器初始化時(shí)被調(diào)用一次
    攔截器 :是在面向切面編程的就是在你的service或者一個(gè)方法,前調(diào)用一個(gè)方法,或者在方法后調(diào)用一個(gè)方法比如動(dòng)態(tài)代理就是攔截器的簡(jiǎn)單實(shí)現(xiàn),在你調(diào)用方法前打印出字符串(或者做其它業(yè)務(wù)邏輯的操作),也可以在你調(diào)用方法后打印出字符串,甚至在你拋出異常的時(shí)候做業(yè)務(wù)邏輯的操作。
    下面通過(guò)實(shí)例來(lái)看一下過(guò)濾器和攔截器的區(qū)別:
    使用攔截器進(jìn)行/admin 目錄下jsp頁(yè)面的過(guò)濾
    <package name="newsDemo" extends="struts-default"
    namespace="/admin">
    <interceptors>
    <interceptor name="auth" class="com.test.news.util.AccessInterceptor" />
    <interceptor-stack name="authStack">
    <interceptor-ref name="auth" />
    </interceptor-stack>
    </interceptors>
    <!-- action -->
    <action name="newsAdminView!*" class="newsAction"
    method="{1}">
    <interceptor-ref name="defaultStack"/>
    <interceptor-ref name="authStack">
    </interceptor-ref>
    下面是我實(shí)現(xiàn)的Interceptor class:
    package com.test.news.util;
    import java.util.Map;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
    import com.test.news.action.AdminLoginAction;
    /**
    * @author chaoyin
    */
    public class AccessInterceptor extends AbstractInterceptor {
    private static final long serialVersionUID = -4291195782860785705L;
    @Override
    public String intercept(ActionInvocation actionInvocation) throws Exception {
    ActionContext actionContext = actionInvocation.getInvocationContext();
    Map session = actionContext.getSession();

    //except login action
    Object action = actionInvocation.getAction();
    if (action instanceof AdminLoginAction) {
    return actionInvocation.invoke();
    }
    //check session
    if(session.get("user")==null ){
    return "logout";
    }
    return actionInvocation.invoke();//go on
    }
    }
    過(guò)濾器:是在java web中,你傳入的request,response提前過(guò)濾掉一些信息,或者提前設(shè)置一些參數(shù),然后再傳入servlet或者struts的 action進(jìn)行業(yè)務(wù)邏輯,比如過(guò)濾掉非法url(不是login.do的地址請(qǐng)求,如果用戶沒(méi)有登陸都過(guò)濾掉),或者在傳入servlet或者 struts的action前統(tǒng)一設(shè)置字符集,或者去除掉一些非法字符.
    使用過(guò)濾器進(jìn)行/admin 目錄下jsp頁(yè)面的過(guò)濾,首先在web.xml進(jìn)行過(guò)濾器配置:
    <filter>
    <filter-name>access filter</filter-name>
    <filter-class>
    com.test.news.util.AccessFilter
    </filter-class>
    </filter>
    <filter-mapping>
    <filter-name>access filter</filter-name>
    <url-pattern>/admin/*</url-pattern>
    </filter-mapping>
    下面是過(guò)濾的實(shí)現(xiàn)類(lèi):
    package com.test.news.util;
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    public class AccessFilter implements Filter {
    /**
    * @author chaoyin
    */

    public void destroy() {
    }
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
    FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest)arg0;
    HttpServletResponse response = (HttpServletResponse)arg1;
    HttpSession session = request.getSession();
    if(session.getAttribute("user")== null && request.getRequestURI().indexOf("login.jsp")==-1 ){
    response.sendRedirect("login.jsp");
    return ;
    }
    filterChain.doFilter(arg0, arg1);
    }
    public void init(FilterConfig arg0) throws ServletException {
    }
    }

    posted @ 2011-11-21 18:27 云云 閱讀(21124) | 評(píng)論 (1)編輯 收藏

    解決方案一:
    原來(lái),是${java.home}在作怪,eclipse 沒(méi)有使用 JAVA_HOME



    默認(rèn),eclipse 使用 C:"windows"system32"javaw.exe 作為 JVM,當(dāng)然找不到tools.jar



    解決方法如下:



    修改 eclipse.exe 目錄下的 eclipse.ini 指定vm,,注意 -vm后面不能有空格。

     


     

    -vmD:\Program Files\Java\jdk1.6.0_23\bin\javaw.exe
    -vmargs
    -Dosgi.requiredJavaVersion=1.5
    -Xms40m
    -Xmx512m
    -XX:PermSize=64M
    -XX:MaxPermSize=512M

    解決方案二:


    配置pom.xml文件

     

    1. <properties>
    2. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    3. <spring.version>3.0.5.RELEASE</spring.version>
    4. <java.home>jdk路徑</java.home>
    5. </properties>
    6. <profiles>
    7. <profile>
    8. <id>default-tools.jar</id>
    9. <activation>
    10. <property>
    11. <name>java.vendor</name>
    12. <value>Sun Microsystems Inc.</value>
    13. </property>
    14. </activation>
    15. <dependencies>
    16. <dependency>
    17. <groupId>com.sun</groupId>
    18. <artifactId>tools</artifactId>
    19. <version>1.5.0</version>
    20. <scope>system</scope>
    21. <systemPath>${java.home}/lib/tools.jar</systemPath>
    22. </dependency>
    23. </dependencies>
    24. </profile>
    25. </profiles>
    在pom.xml文件中將這段配置寫(xiě)上,試一下。注意幾個(gè)位置的內(nèi)容編寫(xiě)。

    posted @ 2011-11-21 11:02 云云 閱讀(23585) | 評(píng)論 (2)編輯 收藏

    Static 靜態(tài):這里主要記錄的是靜態(tài)程序塊和靜態(tài)方法

    如果有些代碼必須在項(xiàng)目啟動(dòng)的時(shí)候就執(zhí)行,就需要使用靜態(tài)代碼塊,這種代碼是主動(dòng)執(zhí)行的;需要在項(xiàng)目啟動(dòng)的時(shí)候就初始化但是不執(zhí)行,在不創(chuàng)建對(duì)象的情況下,可以供其他程序調(diào)用,而在調(diào)用的時(shí)候才執(zhí)行,這需要使用靜態(tài)方法,這種代碼是被動(dòng)執(zhí)行的. 靜態(tài)方法在類(lèi)加載的時(shí)候 就已經(jīng)加載 可以用類(lèi)名直接調(diào)用。

    靜態(tài)代碼塊和靜態(tài)方法的區(qū)別是:


    靜態(tài)代碼塊是自動(dòng)執(zhí)行的;

    靜態(tài)方法是被調(diào)用的時(shí)候才執(zhí)行的.

    靜態(tài)方法:如果我們?cè)诔绦蚓帉?xiě)的時(shí)候需要一個(gè)不實(shí)例化對(duì)象就可以調(diào)用的方法,我們就可以使用靜態(tài)方法,具體實(shí)現(xiàn)是在方法前面加上static,如下:

    public static void method(){}

    在使用靜態(tài)方法的時(shí)候需要注意一下幾個(gè)方面:

    在靜態(tài)方法里只能直接調(diào)用同類(lèi)中其他的靜態(tài)成員(包括變量和方法),而不能直接訪問(wèn)類(lèi)中的非靜態(tài)成員。這是因?yàn)椋瑢?duì)于非靜態(tài)的方法和變量,需要先創(chuàng)建類(lèi)的實(shí)例對(duì)象后才可使用,而靜態(tài)方法在使用前不用創(chuàng)建任何對(duì)象。(備注:靜態(tài)變量是屬于整個(gè)類(lèi)的變量而不是屬于某個(gè)對(duì)象的)

    靜態(tài)方法不能以任何方式引用this和super關(guān)鍵字,因?yàn)殪o態(tài)方法在使用前不用創(chuàng)建任何實(shí)例對(duì)象,當(dāng)靜態(tài)方法調(diào)用時(shí),this所引用的對(duì)象根本沒(méi)有產(chǎn)生。

    靜態(tài)程序塊:當(dāng)一個(gè)類(lèi)需要在被載入時(shí)就執(zhí)行一段程序,這樣可以使用靜態(tài)程序塊。

    public class DemoClass {

    private DemoClass(){}

    public static DemoClass _instance;

    static{

    if(null == _instance ){

    _instance = new DemoClass();

    }

    }

    public static DemoClass getInstance(){

    return _instance;

    }

    }

    這樣的程序在類(lèi)被加載的時(shí)候就執(zhí)行了static中的代碼。

    Ps:java中類(lèi)的裝載步驟:

    在Java中,類(lèi)裝載器把一個(gè)類(lèi)裝入Java虛擬機(jī)中,要經(jīng)過(guò)三個(gè)步驟來(lái)完成:裝載、鏈接和初始化,其中鏈接又可以分成校驗(yàn)、準(zhǔn)備和解析三步,除了解析外,其它步驟是嚴(yán)格按照順序完成的,各個(gè)步驟的主要工作如下:

    所謂裝載就是尋找一個(gè)類(lèi)或是一個(gè)接口的二進(jìn)制形式并用該二進(jìn)制形式來(lái)構(gòu)造代表這個(gè)類(lèi)或是這個(gè)接口的class對(duì)象的過(guò)程。其中類(lèi)或接口的名稱(chēng)是給定了的。

    裝載:查找和導(dǎo)入類(lèi)或接口的二進(jìn)制數(shù)據(jù);

    鏈接:執(zhí)行下面的校驗(yàn)、準(zhǔn)備和解析步驟,其中解析步驟是可以選擇的;

    校驗(yàn):檢查導(dǎo)入類(lèi)或接口的二進(jìn)制數(shù)據(jù)的正確性;

    準(zhǔn)備:給類(lèi)的靜態(tài)變量分配并初始化存儲(chǔ)空間;

    解析:將符號(hào)引用轉(zhuǎn)成直接引用;

    初始化:激活類(lèi)的靜態(tài)變量的初始化Java代碼和靜態(tài)Java代碼塊

    本篇文章來(lái)源于 Linux公社網(wǎng)站(www.linuxidc.com)  原文鏈接:http://www.linuxidc.com/Linux/2010-03/24783.htm

    posted @ 2011-11-14 16:15 云云 閱讀(4834) | 評(píng)論 (1)編輯 收藏

    一、基本語(yǔ)法

    1、"#"用來(lái)標(biāo)識(shí)Velocity的腳本語(yǔ)句,包括#set、#if 、#else、#end、#foreach、#end、#iinclude、#parse、#macro等;
    如:
    #if($info.imgs)
    <img src="$info.imgs" border=0>
    #else
    <img src="noPhoto.jpg">
    #end

    2、"$"用來(lái)標(biāo)識(shí)一個(gè)對(duì)象(或理解為變量);
    如:$i、$msg、$TagUtil.options(...)等。

    3、"{}"用來(lái)明確標(biāo)識(shí)Velocity變量;
    比如在頁(yè)面中,頁(yè)面中有一個(gè)$someonename,此時(shí),Velocity將把someonename作為變量名,若我們程序是想在someone這 個(gè)變量的后面緊接著顯示name字符,則上面的標(biāo)簽應(yīng)該改成${someone}name。

    4、"!"用來(lái)強(qiáng)制把不存在的變量顯示為空白。
    如當(dāng)頁(yè)面中包含$msg,如果msg對(duì)象有值,將顯示msg的值,如果不存在msg對(duì)象同,則在頁(yè)面中將顯示$msg字符。這是我們不希望的,為了把不存 在的變量或變量值為null的對(duì)象顯示為空白,則只需要在變量名前加一個(gè)“!”號(hào)即可。
    如:$!msg

    二、在EasyJWeb中的最佳實(shí)踐

    理論上你可以在EasyjWeb模板使用所有Velocity的腳本及功能,但我們不推薦你在界面模板中使用過(guò)多過(guò)復(fù)雜的腳本表達(dá)方式,在萬(wàn)不得已的情況下,不要在界面模板中加入任何復(fù)雜的邏輯,更不要在界面模板中加入變量聲明、邏輯運(yùn)算符等等。

    在EasyJWeb中,我們提供了五條基本的模板腳本語(yǔ)句,基本上就能滿足所有應(yīng)用模板的要求。這四條模板語(yǔ)句很簡(jiǎn)單,可以直接由界面設(shè)計(jì)人員來(lái)添加。在當(dāng)前很多EasyJWeb的應(yīng)用實(shí)踐中,我們看到,所有界面模板中歸納起來(lái)只有下面四種簡(jiǎn)單模板腳本語(yǔ)句即可實(shí)現(xiàn):
    1、$!obj 直接返回對(duì)象結(jié)果。
    如:在html標(biāo)簽中顯示java對(duì)象msg的值。<p>$!msg</p>
    在html標(biāo)簽中顯示經(jīng)過(guò)HtmlUtil對(duì)象處理過(guò)后的msg對(duì)象的值 <p>$!HtmlUtil.doSomething($!msg)</p>

    2、#if($!obj) #else #end 判斷語(yǔ)句
    如:在EasyJWeb各種開(kāi)源應(yīng)用中,我們經(jīng)常看到的用于彈出提示信息msg的例子。
    #if($msg)
    <script>
    alert('$!msg');
    </script>
    #end
    上面的腳本表示當(dāng)對(duì)象msg對(duì)象存在時(shí),輸出<script>等后面的內(nèi)容。

    3、#foreach( $info in $list) $info.someList #end 循環(huán)讀取集合list中的對(duì)象,并作相應(yīng)的處理。
    如:EasyJF開(kāi)源論壇系統(tǒng)中論(0.3)壇首頁(yè)顯示熱門(mén)主題的html界面模板腳本:
    #foreach( $info in $hotList1)
    <a href="/bbsdoc.ejf?easyJWebCommand=show&&cid=$!info.cid" target="_blank">$!info.title</a><br>
    #end
    上面的腳本表示循環(huán)遍歷hotList1集合中的對(duì)象,并輸出對(duì)象的相關(guān)內(nèi)容。

    4、#macro(macroName)#end 腳本函數(shù)(宏)調(diào)用,不推薦在界面模板中大量使用。
    如:在使用EasyJWeb Tools快速生成的添刪改查示例中,可以點(diǎn)擊列表的標(biāo)題欄進(jìn)行升降排序顯示,這是我們?cè)贓asyJWeb應(yīng)用中經(jīng)常看到的一個(gè)排序狀態(tài)顯示的模板內(nèi)容。
    函數(shù)(宏)定義,一般放在最前面
    #macro(orderPic $type)
    #if ($orderField.equals($type))
    <img src="http://images.cnblogs.com/ico/${orderType}.gif">
    #end
    #end
    具體的調(diào)用如:<font color="#FFFFFF">頭銜#orderPic("title")</font>

    經(jīng)過(guò)測(cè)試,宏不支持方法重載

     

    5、包含文件#inclue("模板文件名")或#parse("模板文件名")
    主要用于處理具有相同內(nèi)容的頁(yè)面,比如每個(gè)網(wǎng)站的頂部或尾部?jī)?nèi)容。
    使用方法,可以參考EasyJF開(kāi)源Blog及EasyJF開(kāi)源論壇中的應(yīng)用!
    如:#parse("/blog/top.html")或#include("/blog/top.html")
    parse與include的區(qū)別在于,若包含的文件中有Velocity腳本標(biāo)簽,將會(huì)進(jìn)一步解析,而include將原樣顯示。


    三、關(guān)于#set的使用

    在萬(wàn)不得已的時(shí)候,不要在頁(yè)面視圖自己聲明Velocity腳本變量,也就是盡量少使用#set。有時(shí)候我們需要在頁(yè)面中顯示序號(hào),而程序?qū)ο笾杏譀](méi)有包 含這個(gè)序號(hào)屬性同,可以自己定義。如在一個(gè)循環(huán)體系中,如下所示:
    #set ($i=0)
    #foreach($info in $list)
    序號(hào):$i
    #set($i=$i+1)
    #end

    四、Velocity腳本語(yǔ)法摘要

    1、聲明:#set ($var=XXX)
    左邊可以是以下的內(nèi)容
    Variable reference
    String literal
    Property reference
    Method reference
    Number literal #set ($i=1)
    ArrayList #set ($arr=["yt1","t2"])
    算術(shù)運(yùn)算符

    2、注釋:
    單行## XXX
    多行#* xxx
    xxxx
    xxxxxxxxxxxx*#

    References 引用的類(lèi)型
    3、變量 Variables
    以 "$" 開(kāi)頭,第一個(gè)字符必須為字母。character followed by a VTL Identifier. (a .. z or A .. Z).
    變量可以包含的字符有以下內(nèi)容:
    alphabetic (a .. z, A .. Z)
    numeric (0 .. 9)
    hyphen ("-")
    underscore ("_")

    4、Properties
    $Identifier.Identifier
    $user.name
    hashtable user中的的name值.類(lèi)似:user.get("name")

    5、Methods
    object user.getName() = $user.getName()

    6、Formal Reference Notation
    用{}把變量名跟字符串分開(kāi)


    #set ($user="csy"}
    ${user}name
    返回csyname

    $username
    $!username
    $與$!的區(qū)別
    當(dāng)找不到username的時(shí)候,$username返回字符串"$username",而$!username返回空字符串""

    7、雙引號(hào) 與 引號(hào)
    #set ($var="helo")
    test"$var" 返回testhello
    test'$var' 返回test'$var'
    可以通過(guò)設(shè)置 stringliterals.interpolate=false改變默認(rèn)處理方式

    8、條件語(yǔ)句
    #if( $foo )
    <strong>Velocity!</strong>
    #end
    #if($foo)
    #elseif()
    #else
    #end
    當(dāng)$foo為null或?yàn)锽oolean對(duì)象的false值執(zhí)行.

    9、邏輯運(yùn)算符:== && || !

    10、循環(huán)語(yǔ)句#foreach($var in $arrays ) // 集合包含下面三種Vector, a Hashtable or an Array
    #end
    #foreach( $product in $allProducts )
    <li>$product</li>
    #end

    #foreach( $key in $allProducts.keySet() )
    <li>Key: $key -> Value: $allProducts.get($key)</li>
    #end

    #foreach( $customer in $customerList )
    <tr><td>$velocityCount</td><td>$customer.Name</td></tr>
    #end

    11、velocityCount變量在配置文件中定義
    # Default name of the loop counter
    # variable reference.
    directive.foreach.counter.name = velocityCount
    # Default starting value of the loop
    # counter variable reference.
    directive.foreach.counter.initial.value = 1

    12、包含文件
    #include( "one.gif","two.txt","three.htm" )

    13、Parse導(dǎo)入腳本
    #parse("me.vm" )

    14、#stop 停止執(zhí)行并返回

    15、定義宏Velocimacros ,相當(dāng)于函數(shù) 支持包含功能
    #macro( d )
    <tr><td></td></tr>
    #end
    調(diào)用
    #d()

    16、帶參數(shù)的宏
    #macro( tablerows $color $somelist )
    #foreach( $something in $somelist )
    <tr><td bgcolor=$color>$something</td></tr>
    #end
    #end

    17、Range Operator
    #foreach( $foo in [1..5] )

    附:《淺析MVC框架中View層的優(yōu)雅設(shè)計(jì)及實(shí)例》

    作者:EasyJF開(kāi)源團(tuán)隊(duì) 大峽

    在基于B/S的應(yīng)用程序開(kāi)發(fā)中,從基本的技術(shù)分工上來(lái)說(shuō)就是兩大塊,一是軟件顯示界面,另一個(gè)是程序邏輯。在N年前的腳本語(yǔ)言時(shí)代,無(wú)論是asp、 php還是jsp,我們基本是都是把這兩者柔和在一起的。盡管我們想方設(shè)法做好很多函數(shù)或者包含文件來(lái)努力達(dá)到軟件的復(fù)用,但仍然無(wú)法滿足多變的用戶需 求,這主要是因?yàn)橐郧暗募兡_本編碼方式無(wú)法很好支持及應(yīng)用面向?qū)ο?OO)領(lǐng)域中的強(qiáng)大功能。

    在常見(jiàn)的B/S軟件項(xiàng)目中,界面的設(shè)計(jì)包括html界面、Wap界面及其它由文本字符協(xié)議為基本表示的界面等。以我們接觸最多的html頁(yè)面為例子,在 做這些界面的時(shí)候往往需要美工先使用photoshop或fireworks等圖形界面設(shè)計(jì)工具進(jìn)行全局設(shè)計(jì),然后再使用進(jìn)行Dreamweaver等 html頁(yè)面制作工具進(jìn)行加工制作。而強(qiáng)大的程序邏輯及后臺(tái)處理都是由服務(wù)器端程序完成,這些程序具有較高的穩(wěn)定性,其開(kāi)發(fā)工具如JBuilder、 Eclipse等對(duì)View層的界面無(wú)法很好的支持(當(dāng)然那些用記事本寫(xiě)界面的應(yīng)用除外),這就使得很多MVC框架的設(shè)計(jì)都無(wú)法兩全齊美。

    作位一個(gè)比較友好的MVC的框架,在簡(jiǎn)化服務(wù)器應(yīng)用開(kāi)發(fā)的同時(shí),還需要在View這一層設(shè)計(jì)上不要過(guò)多的影響到界面人員的工作,最基本的要求就是不要過(guò) 多的加入一些設(shè)計(jì)軟件不支持的標(biāo)簽等元素(如Struts的很多標(biāo)簽在Dreamweaver中都不支持)。這里我們以EasyJWeb為例,探討在 View層如何實(shí)現(xiàn)比較合理的設(shè)計(jì)。

    EasyJWeb作為一個(gè)快速Java Web MVC框架,其設(shè)計(jì)目標(biāo)不盡是要簡(jiǎn)化軟件開(kāi)發(fā)人員的代碼書(shū)寫(xiě)工作,更是要能方便界面設(shè)計(jì)人員的工作。

    當(dāng)然,要使界面能跟后臺(tái)程序邏輯能融合,顯示界面及程序邏輯之間需要一定的對(duì)話協(xié)議在所難免。EasyJWeb作為一個(gè)MVC框架,同樣也存在著這樣的對(duì)話協(xié)議,這就是EasyJWeb中的界面模板標(biāo)識(shí)語(yǔ)言。

    在當(dāng)前發(fā)布的版本中,EasyJWeb界面模板標(biāo)識(shí)語(yǔ)言使用的是Apache開(kāi)源的Velocity模板引擎(template engine),當(dāng)然以后會(huì)根據(jù)際需要加入更多的模板引擎以供框架應(yīng)用者選擇。

    Velocity是一個(gè)基于java的模板引擎(template engine),它允許任何人僅僅簡(jiǎn)單的使用模板語(yǔ)言(template language)來(lái)引用由java代碼定義的對(duì)象。作為一個(gè)比較完善的模板引擎,Velocity的功能是比較強(qiáng)大的,但強(qiáng)大的同時(shí)也增加了應(yīng)用復(fù)雜 性。

    理論上你可以在EasyjWeb模板使用所有Velocity的腳本及功能,但我們不推薦你在界面模板中使用過(guò)多過(guò)復(fù)雜的腳本表達(dá)方式,在萬(wàn)不得已的情況下,不要在界面模板中加入任何復(fù)雜的邏輯,更不要在界面模板中加入變量聲明、邏輯運(yùn)算符等等。

    在EasyJWeb中,我們提供了四條基本的模板腳本語(yǔ)句,基本上就能滿足所有應(yīng)用模板的要求。這四條模板語(yǔ)句很簡(jiǎn)單,可以直接由界面設(shè)計(jì)人員來(lái)添加。在當(dāng)前很多EasyJWeb的應(yīng)用實(shí)踐中,我們看到,所有界面模板中歸納起來(lái)只有下面四種簡(jiǎn)單模板腳本語(yǔ)句即可實(shí)現(xiàn):

    1、$!obj 直接返回對(duì)象結(jié)果。

    如:在html標(biāo)簽中顯示java對(duì)象msg的值。<p>$!msg</p>
    在html標(biāo)簽中顯示經(jīng)過(guò)HtmlUtil對(duì)象處理過(guò)后的msg對(duì)象的值.<p>$!HtmlUtil.doSomething($!msg)</p>

    2、#if($!obj) #else #end 判斷語(yǔ)句

    如:在EasyJWeb各種開(kāi)源應(yīng)用中,我們經(jīng)常看到的用于彈出提示信息msg的例子。
    #if($msg)
    <script>
    alert('$!msg');
    </script>
    #end
    上面的腳本表示當(dāng)對(duì)象msg對(duì)象存在時(shí),輸出<script>等后面的內(nèi)容。

    3、#foreach( $info in $list) $info.something #end 循環(huán)讀取集合list中的對(duì)象,并作相應(yīng)的處理。

    如:EasyJF開(kāi)源論壇系統(tǒng)中論壇首頁(yè)顯示熱門(mén)主題的html界面模板腳本

    #foreach( $info in $hotList1)
    <a href="/bbsdoc.ejf?easyJWebCommand=show&&cid=$!info.cid" target="_blank">$!info.title</a><br>
    #end
    上面的腳本表示循環(huán)遍歷hotList1集合中的對(duì)象,并輸出對(duì)象的相關(guān)內(nèi)容。

    4、#macro(macroName)#end 腳本函數(shù)(宏)調(diào)用,不推薦在界面模板中大量使用。

    如:在EasyJF簡(jiǎn)易訂銷(xiāo)管等系統(tǒng)中經(jīng)常看到的一個(gè)排序狀態(tài)顯示的模板內(nèi)容。
    函數(shù)(宏)定義,一般放在最前面
    #macro(orderPic $type)
    #if ($orderField.equals($type))
    <img src="http://images.cnblogs.com/ico/${orderType}.gif">
    #end
    #end

    具體的調(diào)用如:<font color="#FFFFFF">頭銜#orderPic("title")</font>


    總結(jié):
    當(dāng)然,在實(shí)際應(yīng)用項(xiàng)目中,為了實(shí)現(xiàn)界面的更加友好、人性化,會(huì)出現(xiàn)很多復(fù)、易變的需求。如根據(jù)對(duì)象的不同狀態(tài),顯示不同的提示顏色、提示語(yǔ)音等功能。在這 種時(shí)候,仍然要慎用太多的模板腳本功能,大多數(shù)需求都可以通過(guò)變通的方式解決,有些信息可以直接在對(duì)象中增加邏輯轉(zhuǎn)化信息,有些界面要求可以通過(guò)在界面中 使用與特定界面有關(guān)的表達(dá)方式來(lái)實(shí)現(xiàn),如html頁(yè)面中使用javascript、css,Wap頁(yè)面中使用WMLScript等等。只有,這樣才能確保 證你的系統(tǒng)核心不受界面的的影響及控制,才能更好的擴(kuò)展及維護(hù)。

    我們希望你能成為真正的程序高手,而不只是精通某個(gè)處于表層的腳本語(yǔ)言,因此也不希望廣大Java開(kāi)發(fā)人員在View層消耗太多的時(shí)間。

    由于水平有限,本文所談的內(nèi)容有N多不合理或者需要改進(jìn)的地方,懇請(qǐng)大家指正!

    附:EasyJWeb簡(jiǎn)介

    EasyJWeb是基于java技術(shù),應(yīng)用于WEB應(yīng)用程序快速開(kāi)發(fā)的MVC框架,框架設(shè)計(jì)構(gòu)思來(lái)源于國(guó)內(nèi)眾多項(xiàng)目實(shí)踐,充分借簽了當(dāng)前主流的開(kāi)源 Web框架(Struts、JSF、Tapestry 、Webwork等),吸取了其優(yōu)點(diǎn)及精華,利用Velocity作為模板頁(yè)面引擎,是一個(gè)實(shí)現(xiàn)了頁(yè)面及代碼完全分離的MVC開(kāi)發(fā)框架,是一個(gè)旨在于為中 小型Web應(yīng)用系統(tǒng)提供快速開(kāi)發(fā)實(shí)踐的簡(jiǎn)易Web框架。

    EasyJF開(kāi)源團(tuán)隊(duì)于2006年初才開(kāi)始建設(shè),因此當(dāng)前整個(gè)開(kāi)發(fā)團(tuán)隊(duì)組建以及所發(fā)布的作品,都顯得極不成熟。EasyJWeb仍然處于測(cè)試階段,請(qǐng)廣大的Java愛(ài)好者多多批評(píng)及建議,同時(shí)也非常歡迎您能加入到我們的國(guó)產(chǎn)

    posted @ 2011-11-12 14:40 云云 閱讀(2735) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題
    共12頁(yè): First 上一頁(yè) 3 4 5 6 7 8 9 10 11 下一頁(yè) Last 
    主站蜘蛛池模板: 国产香蕉九九久久精品免费| 久久影院亚洲一区| 亚洲今日精彩视频| 香蕉视频免费在线| 美女视频黄是免费的网址| 国产亚洲大尺度无码无码专线 | 亚洲色婷婷六月亚洲婷婷6月| 亚洲午夜无码久久久久小说| 免费无遮挡无码永久视频| 亚洲片一区二区三区| 亚洲人成网站18禁止| 亚洲精品视频免费看| 亚洲精品亚洲人成在线观看| 婷婷国产偷v国产偷v亚洲| av免费不卡国产观看| 亚洲激情视频在线观看| 国产日韩久久免费影院| 免费午夜爽爽爽WWW视频十八禁| 亚洲第一成人在线| 亚洲高清免费在线观看| 亚洲VA中文字幕无码一二三区| 一级毛片大全免费播放下载 | 特级毛片aaaa级毛片免费| 最近免费中文字幕4| 亚洲成a人片毛片在线| 久久免费动漫品精老司机| 亚洲人成色777777在线观看| 四虎精品免费永久免费视频| 国产精品国产午夜免费福利看 | 成人免费视频77777| 亚洲精品国产手机| 久久久久免费精品国产小说| 国产成人无码综合亚洲日韩| 热久久这里是精品6免费观看| 亚洲视频人成在线播放| 高潮毛片无遮挡高清免费| 免费一级毛片在级播放| 相泽南亚洲一区二区在线播放| 在线免费一区二区| 亚洲国产精品日韩av不卡在线| 成人毛片免费观看视频大全|