posts - 110, comments - 101, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

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

            命令5
             who  查看當前在線的用戶
            
            命令6
            cut –d’:’ -f 1    cut命令可以從一個文本文件或者文本流中提取文本列,具體的說就是在文件中負責剪切數據用的。cut是以每一行為一個處理對象的,這種機制和sed是一樣的 
           cut -d'分隔字元' -f fields
           -d ∶后面接分隔字符。與 -f 一起使用; 如 -d : 表示用冒號分隔
              -f ∶依據 -d 的分隔字符將一段訊息分割成為數段,用 -f 取出第幾段的意思;
           
            命令7
            \w 匹配文字和數字字符 也就是[A-Za-z0-9]
            x\{m,\}  重復字符x ,至少m次 如'a\{5,\}' 匹配至少有5個a的行
            '\w\{4,\}'
           
            命令7
            cut -d: -f 1,3 /etc/passwd |grep '[0-9]\{3,\}' | wc -l
            -f 1,3 /etc/passwd 即是選擇passwd文件中的以冒號分隔的第一列和第三列,grep ‘[0-9]\{3,\}’即是使用grep匹配包含大于99的數據項
           
            命令8
            wc -l 統計行數
           
            命令9
            mv 和rename 重命名,區別mv 只對單個文件命名,rename 還可以批量命名
           
            linux 下執行amoeba.sh文件  報錯
            -bash: amoeba.sh: command not found
            解決方法: 在執行文件前面加上. ;
            . amoeba.sh .后面要有要空格
           
            命令10
            刪除目錄以文件
            rm -rf dal-server/
            -r 就是向下遞歸 一并刪除
            -f 就是直接強行刪除 不作任何提示
           
            命令11
            查看linux是x86還是x64
            getconf LONG_BIT 這里的LONG_BIT需要大寫
            ifconfig 系統信息
           
            命令12
            安裝jdk
            下載jdk-6u30-linux-x64.bin 文件
             進入安裝目錄
             1 先執行 export _POSIX2_VERSION=199209
             2 然后可以安裝jdk了
             命令很簡單 就是 ./jdk-6u30-linux-x64.bin 之前沒有空格 如果/后面有了空格 會出錯
             設置 環境 變量
             進入etc目錄下找到 profile 打開并編輯
             在最后  加上
             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 可以發現環境變量配置成功了
            
            命令13
            使用腳本 執行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 都加進來了 
          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
            端口查看  
              今天發現服務器上Tomcat 8080端口起不來,老提示端口已經被占用。
           使用命令:
           netstat –apn |grep 8080
              top  查看系統資源占用
           

          posted @ 2012-03-31 11:35 云云 閱讀(1879) | 評論 (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.

          出現了這樣的錯誤的時候 是svn版本問題
          由于我的電腦上安裝了客戶端是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>
          在編繹時  出現了上述異常 ,我想可能是版本問題 于是乎我就把pom.xml中maven-svn-revision-number-plugin的<version>1.6</version>改成了<version>1.7</version>
          心想可能問題解決了 沒想到編繹時還是報以上錯誤
          于是在網上狂搜 終于發現了 有人也出現了這樣的問題
          經過實驗發現這個方案靠譜 就記錄下來了 路過的人看到了也可以方便解決問題

          方案:
               當然上面的<version>1.7</version>還是要保留的 因為我的客戶端也是1.7
          然后呢  在編繹的時候  要加入 -Dsvn-revision-number.failOnError=false
          來個完整的 命令:eclipse:eclipse -Dsvn-revision-number.failOnError=false

          就這樣ok了。



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

          用java寫服務程序時經常會涉及到監控某些配置文件,當配置文件發生變化時實時重新加載該文件的內容到內存.
          實際上log4j里有現成的類FileWatchdog做了類似的工作.我們只需繼承它,然后重寫它的一些方法就可以了.
           
             /**使用log4j的監控狗 */
              
          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的代碼也很簡單,其實就是起一個線程,每隔固定的時間掃描一次監控的文件.我把代碼也貼出來:'


          // 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) | 評論 (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);
              }


          }

          測試類 解析xml 反序列化到javaBean object

          public class TestXmlToObject2 {

               
          public static final XStream xstream=new XStream();
               
               
          static{
                   xstream.alias(
          "person", Person2.class);//類別名
                   xstream.aliasField("address", Person2.class"homeAddress"); //屬性別名
                   xstream.alias("contents",String.class);//private List<String> contentslist;是string類型
                   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);
              }
          }

          測試
          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) | 評論 (3)編輯 收藏

          tomcat 需要遠程debug的話 需要在startup.bat中加入下面這段話

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

          然后在eclipse 中新建遠程debug 端口號就是上面的address 8788 

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

          del D:\logs\* /s/q

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

          1、攔截器是基于java的反射機制的,而過濾器是基于函數回調
          2、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器
          3、攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用
          4、攔截器可以訪問action上下文、值棧里的對象,而過濾器不能
          5、在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
          攔截器 :是在面向切面編程的就是在你的service或者一個方法,前調用一個方法,或者在方法后調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前打印出字符串(或者做其它業務邏輯的操作),也可以在你調用方法后打印出字符串,甚至在你拋出異常的時候做業務邏輯的操作。
          下面通過實例來看一下過濾器和攔截器的區別:
          使用攔截器進行/admin 目錄下jsp頁面的過濾
          <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>
          下面是我實現的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
          }
          }
          過濾器:是在java web中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然后再傳入servlet或者struts的 action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者 struts的action前統一設置字符集,或者去除掉一些非法字符.
          使用過濾器進行/admin 目錄下jsp頁面的過濾,首先在web.xml進行過濾器配置:
          <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>
          下面是過濾的實現類:
          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) | 評論 (1)編輯 收藏

          解決方案一:
          原來,是${java.home}在作怪,eclipse 沒有使用 JAVA_HOME



          默認,eclipse 使用 C:"windows"system32"javaw.exe 作為 JVM,當然找不到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文件中將這段配置寫上,試一下。注意幾個位置的內容編寫。

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

          Static 靜態:這里主要記錄的是靜態程序塊和靜態方法

          如果有些代碼必須在項目啟動的時候就執行,就需要使用靜態代碼塊,這種代碼是主動執行的;需要在項目啟動的時候就初始化但是不執行,在不創建對象的情況下,可以供其他程序調用,而在調用的時候才執行,這需要使用靜態方法,這種代碼是被動執行的. 靜態方法在類加載的時候 就已經加載 可以用類名直接調用。

          靜態代碼塊和靜態方法的區別是:


          靜態代碼塊是自動執行的;

          靜態方法是被調用的時候才執行的.

          靜態方法:如果我們在程序編寫的時候需要一個不實例化對象就可以調用的方法,我們就可以使用靜態方法,具體實現是在方法前面加上static,如下:

          public static void method(){}

          在使用靜態方法的時候需要注意一下幾個方面:

          在靜態方法里只能直接調用同類中其他的靜態成員(包括變量和方法),而不能直接訪問類中的非靜態成員。這是因為,對于非靜態的方法和變量,需要先創建類的實例對象后才可使用,而靜態方法在使用前不用創建任何對象。(備注:靜態變量是屬于整個類的變量而不是屬于某個對象的)

          靜態方法不能以任何方式引用this和super關鍵字,因為靜態方法在使用前不用創建任何實例對象,當靜態方法調用時,this所引用的對象根本沒有產生。

          靜態程序塊:當一個類需要在被載入時就執行一段程序,這樣可以使用靜態程序塊。

          public class DemoClass {

          private DemoClass(){}

          public static DemoClass _instance;

          static{

          if(null == _instance ){

          _instance = new DemoClass();

          }

          }

          public static DemoClass getInstance(){

          return _instance;

          }

          }

          這樣的程序在類被加載的時候就執行了static中的代碼。

          Ps:java中類的裝載步驟:

          在Java中,類裝載器把一個類裝入Java虛擬機中,要經過三個步驟來完成:裝載、鏈接和初始化,其中鏈接又可以分成校驗、準備和解析三步,除了解析外,其它步驟是嚴格按照順序完成的,各個步驟的主要工作如下:

          所謂裝載就是尋找一個類或是一個接口的二進制形式并用該二進制形式來構造代表這個類或是這個接口的class對象的過程。其中類或接口的名稱是給定了的。

          裝載:查找和導入類或接口的二進制數據;

          鏈接:執行下面的校驗、準備和解析步驟,其中解析步驟是可以選擇的;

          校驗:檢查導入類或接口的二進制數據的正確性;

          準備:給類的靜態變量分配并初始化存儲空間;

          解析:將符號引用轉成直接引用;

          初始化:激活類的靜態變量的初始化Java代碼和靜態Java代碼塊

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

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

          一、基本語法

          1、"#"用來標識Velocity的腳本語句,包括#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、"$"用來標識一個對象(或理解為變量);
          如:$i、$msg、$TagUtil.options(...)等。

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

          4、"!"用來強制把不存在的變量顯示為空白。
          如當頁面中包含$msg,如果msg對象有值,將顯示msg的值,如果不存在msg對象同,則在頁面中將顯示$msg字符。這是我們不希望的,為了把不存 在的變量或變量值為null的對象顯示為空白,則只需要在變量名前加一個“!”號即可。
          如:$!msg

          二、在EasyJWeb中的最佳實踐

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

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

          2、#if($!obj) #else #end 判斷語句
          如:在EasyJWeb各種開源應用中,我們經??吹降挠糜趶棾鎏崾拘畔sg的例子。
          #if($msg)
          <script>
          alert('$!msg');
          </script>
          #end
          上面的腳本表示當對象msg對象存在時,輸出<script>等后面的內容。

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

          4、#macro(macroName)#end 腳本函數(宏)調用,不推薦在界面模板中大量使用。
          如:在使用EasyJWeb Tools快速生成的添刪改查示例中,可以點擊列表的標題欄進行升降排序顯示,這是我們在EasyJWeb應用中經??吹降囊粋€排序狀態顯示的模板內容。
          函數(宏)定義,一般放在最前面
          #macro(orderPic $type)
          #if ($orderField.equals($type))
          <img src="http://images.cnblogs.com/ico/${orderType}.gif">
          #end
          #end
          具體的調用如:<font color="#FFFFFF">頭銜#orderPic("title")</font>

          經過測試,宏不支持方法重載

           

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


          三、關于#set的使用

          在萬不得已的時候,不要在頁面視圖自己聲明Velocity腳本變量,也就是盡量少使用#set。有時候我們需要在頁面中顯示序號,而程序對象中又沒有包 含這個序號屬性同,可以自己定義。如在一個循環體系中,如下所示:
          #set ($i=0)
          #foreach($info in $list)
          序號:$i
          #set($i=$i+1)
          #end

          四、Velocity腳本語法摘要

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

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

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

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

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

          6、Formal Reference Notation
          用{}把變量名跟字符串分開


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

          $username
          $!username
          $與$!的區別
          當找不到username的時候,$username返回字符串"$username",而$!username返回空字符串""

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

          8、條件語句
          #if( $foo )
          <strong>Velocity!</strong>
          #end
          #if($foo)
          #elseif()
          #else
          #end
          當$foo為null或為Boolean對象的false值執行.

          9、邏輯運算符:== && || !

          10、循環語句#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導入腳本
          #parse("me.vm" )

          14、#stop 停止執行并返回

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

          16、帶參數的宏
          #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層的優雅設計及實例》

          作者:EasyJF開源團隊 大峽

          在基于B/S的應用程序開發中,從基本的技術分工上來說就是兩大塊,一是軟件顯示界面,另一個是程序邏輯。在N年前的腳本語言時代,無論是asp、 php還是jsp,我們基本是都是把這兩者柔和在一起的。盡管我們想方設法做好很多函數或者包含文件來努力達到軟件的復用,但仍然無法滿足多變的用戶需 求,這主要是因為以前的純腳本編碼方式無法很好支持及應用面向對象(OO)領域中的強大功能。

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

          作位一個比較友好的MVC的框架,在簡化服務器應用開發的同時,還需要在View這一層設計上不要過多的影響到界面人員的工作,最基本的要求就是不要過 多的加入一些設計軟件不支持的標簽等元素(如Struts的很多標簽在Dreamweaver中都不支持)。這里我們以EasyJWeb為例,探討在 View層如何實現比較合理的設計。

          EasyJWeb作為一個快速Java Web MVC框架,其設計目標不盡是要簡化軟件開發人員的代碼書寫工作,更是要能方便界面設計人員的工作。

          當然,要使界面能跟后臺程序邏輯能融合,顯示界面及程序邏輯之間需要一定的對話協議在所難免。EasyJWeb作為一個MVC框架,同樣也存在著這樣的對話協議,這就是EasyJWeb中的界面模板標識語言。

          在當前發布的版本中,EasyJWeb界面模板標識語言使用的是Apache開源的Velocity模板引擎(template engine),當然以后會根據際需要加入更多的模板引擎以供框架應用者選擇。

          Velocity是一個基于java的模板引擎(template engine),它允許任何人僅僅簡單的使用模板語言(template language)來引用由java代碼定義的對象。作為一個比較完善的模板引擎,Velocity的功能是比較強大的,但強大的同時也增加了應用復雜 性。

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

          在EasyJWeb中,我們提供了四條基本的模板腳本語句,基本上就能滿足所有應用模板的要求。這四條模板語句很簡單,可以直接由界面設計人員來添加。在當前很多EasyJWeb的應用實踐中,我們看到,所有界面模板中歸納起來只有下面四種簡單模板腳本語句即可實現:

          1、$!obj 直接返回對象結果。

          如:在html標簽中顯示java對象msg的值。<p>$!msg</p>
          在html標簽中顯示經過HtmlUtil對象處理過后的msg對象的值.<p>$!HtmlUtil.doSomething($!msg)</p>

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

          如:在EasyJWeb各種開源應用中,我們經??吹降挠糜趶棾鎏崾拘畔sg的例子。
          #if($msg)
          <script>
          alert('$!msg');
          </script>
          #end
          上面的腳本表示當對象msg對象存在時,輸出<script>等后面的內容。

          3、#foreach( $info in $list) $info.something #end 循環讀取集合list中的對象,并作相應的處理。

          如:EasyJF開源論壇系統中論壇首頁顯示熱門主題的html界面模板腳本

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

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

          如:在EasyJF簡易訂銷管等系統中經??吹降囊粋€排序狀態顯示的模板內容。
          函數(宏)定義,一般放在最前面
          #macro(orderPic $type)
          #if ($orderField.equals($type))
          <img src="http://images.cnblogs.com/ico/${orderType}.gif">
          #end
          #end

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


          總結:
          當然,在實際應用項目中,為了實現界面的更加友好、人性化,會出現很多復、易變的需求。如根據對象的不同狀態,顯示不同的提示顏色、提示語音等功能。在這 種時候,仍然要慎用太多的模板腳本功能,大多數需求都可以通過變通的方式解決,有些信息可以直接在對象中增加邏輯轉化信息,有些界面要求可以通過在界面中 使用與特定界面有關的表達方式來實現,如html頁面中使用javascript、css,Wap頁面中使用WMLScript等等。只有,這樣才能確保 證你的系統核心不受界面的的影響及控制,才能更好的擴展及維護。

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

          由于水平有限,本文所談的內容有N多不合理或者需要改進的地方,懇請大家指正!

          附:EasyJWeb簡介

          EasyJWeb是基于java技術,應用于WEB應用程序快速開發的MVC框架,框架設計構思來源于國內眾多項目實踐,充分借簽了當前主流的開源 Web框架(Struts、JSF、Tapestry 、Webwork等),吸取了其優點及精華,利用Velocity作為模板頁面引擎,是一個實現了頁面及代碼完全分離的MVC開發框架,是一個旨在于為中 小型Web應用系統提供快速開發實踐的簡易Web框架。

          EasyJF開源團隊于2006年初才開始建設,因此當前整個開發團隊組建以及所發布的作品,都顯得極不成熟。EasyJWeb仍然處于測試階段,請廣大的Java愛好者多多批評及建議,同時也非常歡迎您能加入到我們的國產

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

          僅列出標題
          共12頁: First 上一頁 3 4 5 6 7 8 9 10 11 下一頁 Last 
          主站蜘蛛池模板: 克什克腾旗| 尼玛县| 微山县| 诸暨市| 宁化县| 汾阳市| 东方市| 台安县| 鹤庆县| 正定县| 阿尔山市| 沅江市| 麦盖提县| 和林格尔县| 吉隆县| 旌德县| 防城港市| 遵义市| 华池县| 洛隆县| 横山县| 越西县| 孝感市| 汪清县| 都兰县| 德格县| 兴宁市| 绩溪县| 连山| 乐至县| 乌海市| 西和县| 奉贤区| 宁河县| 罗源县| 洪湖市| 榆林市| 台南市| 务川| 寻乌县| 金乡县|