[標(biāo)題]:[原]Struts2校驗(yàn)框架
          [時(shí)間]:2009-7-27
          [摘要]:校驗(yàn)框架配置、客戶端校驗(yàn)
          [關(guān)鍵字]:浪曦視頻,Struts2應(yīng)用開發(fā)系列,WebWork,Apache,validation
          [環(huán)境]:struts-2.1.6、JDK6、MyEclipse7、Tomcat6
          [作者]:Winty (wintys@gmail.com) http://www.aygfsteel.com/wintys

          [正文]:
              Struts校驗(yàn)框架提供了一種不用編寫代碼,只需修改配置文件即可對(duì)輸入進(jìn)行校驗(yàn)的功能。代碼方式校驗(yàn),即重寫validate()方法。實(shí)際應(yīng)用中,validate()與校驗(yàn)框架一般只選其一

          1、校驗(yàn)框架配置
              在RegisterAction.java相同目錄新建校驗(yàn)框架配置文件RegisterAction-validation.xml。RegisterAction-validation.xml的DTD可以復(fù)制struts自帶的示例struts2-mailreader-2.1.6中的DTD:
          <!DOCTYPE validators PUBLIC
                    "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
                    "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

          xwork-validator-1.0.2.dtd:
          <?xml version="1.0" encoding="UTF-8"?>

          <!--
            XWork Validators DTD.
            Used the following DOCTYPE.
           
            <!DOCTYPE validators PUBLIC
                    "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
                    "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
          -->


          <!ELEMENT validators (field|validator)+>

          <!ELEMENT field (field-validator+)>
          <!ATTLIST field
              name CDATA #REQUIRED
          >

          <!ELEMENT field-validator (param*, message)>
          <!ATTLIST field-validator
              type CDATA #REQUIRED
              short-circuit (true|false) "false"
          >

          <!ELEMENT validator (param*, message)>
          <!ATTLIST validator
              type CDATA #REQUIRED
              short-circuit (true|false) "false"
          >

          <!ELEMENT param (#PCDATA)>
          <!ATTLIST param
              name CDATA #REQUIRED
          >

          <!ELEMENT message (#PCDATA)>
          <!ATTLIST message
              key CDATA #IMPLIED
          >


          RegisterAction-validation.xml:
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE validators PUBLIC
                    "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
                    "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
           
           <validators>
           <!--  
               與field等價(jià)的validator
               <validator type="requiredstring">
                   <param name="fieldName">name</param>
                   <param name="trim">true</param>
                   <message>name required</message>
               </validator>
               <validator type="stringlength">
                   <param name="fieldName">name</param>
                       <param name="trim">true</param>
                       <param name="minLength">6</param>
                       <param name="maxLength">10</param>
                       <message>name length range : ${minLength} ~ ${maxLength}</message>
               </validator>
           -->    
               <field name="name">
                   <field-validator type="requiredstring" >
                       <param name="trim">true</param>
                       <message>name required</message>
                   </field-validator>
                   <field-validator type="stringlength">
                       <param name="trim">true</param>
                       <param name="minLength">6</param>
                       <param name="maxLength">10</param>
                       <message>name length range : ${minLength} ~ ${maxLength}</message>
                   </field-validator>
               </field>
               
               <field name="age">
                   <field-validator type="conversion" short-circuit="true">
                       <message>the field age conversion error</message>
                   </field-validator>
                   <field-validator type="int">
                       <param name="min">1</param>
                       <param name="max">150</param>
                       <message>age range: ${min} ~ ${max}</message>
                   </field-validator>
               </field>
               
               <field name="birthday">
                   <field-validator type="required">
                       <message>birthday required</message>
                   </field-validator>
                   <field-validator type="date">
                       <param name="min">2009-01-01</param>
                       <param name="max">2009-12-31</param>
                       <message>birthday range: ${min} ~ ${max}</message>
                   </field-validator>
               </field>
               
               <field name="email">
                   <field-validator type="email">
                       <message>invalid email address</message>
                   </field-validator>
               </field>
           </validators>

          說明:
          a.校驗(yàn)框架有兩種校驗(yàn)方式:field和validator。
          field校驗(yàn):先指定需要校驗(yàn)的屬性,再指定校驗(yàn)方式。validator校驗(yàn):先指定校驗(yàn)方式,再指定需要校驗(yàn)的屬性。兩種方式是等價(jià)的。

          field校驗(yàn):
          <field name="name">
              <field-validator type="requiredstring" >
                  <param name="trim">true</param>
                  <message>name required</message>
              </field-validator>
              <field-validator type="stringlength">
                  <param name="trim">true</param>
                  <param name="minLength">6</param>
                  <param name="maxLength">10</param>
                  <message>name length range : ${minLength} ~ ${maxLength}</message>
              </field-validator>
          </field>

          validator校驗(yàn):
          <validator type="requiredstring">
              <param name="fieldName">name</param>
              <param name="trim">true</param>
              <message>name required</message>
          </validator>
          <validator type="stringlength">
              <param name="fieldName">name</param>
              <param name="trim">true</param>
              <param name="minLength">6</param>
              <param name="maxLength">10</param>
              <message>name length range : ${minLength} ~ ${maxLength}</message>
          </validator>

          b.<field-validator type="requiredstring" >中的type及其對(duì)應(yīng)的xwork類可以在xwork-2.1.2.jar/com.opensymphony.xwork2.validator.validators/default.xml中查找到。
          default.xml:
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE validators PUBLIC
                  "-//OpenSymphony Group//XWork Validator Config 1.0//EN"
                  "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">

          <!-- START SNIPPET: validators-default -->
          <validators>
              <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
              <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
              <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
              <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
              <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
              <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
              <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
              <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
              <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
              <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
              <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
              <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
              <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
              <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
              <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
              <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
          </validators>
          <!--  END SNIPPET: validators-default -->

          c. 對(duì)于校驗(yàn)<field-validator type="requiredstring" >:String用requiredstring,其它類型用required。
          d. 驗(yàn)證錯(cuò)誤將默認(rèn)產(chǎn)生FieldError。
          e. short-circuit="true" : 一個(gè)校驗(yàn)失敗,是否是繼續(xù)執(zhí)行后續(xù)校驗(yàn)。
          f. 對(duì)于相同屬性的FieldError,validate()方法中的驗(yàn)證和RegisterAction-validation.xml中的驗(yàn)證都會(huì)執(zhí)行,并且FieldError都會(huì)顯示。
          執(zhí)行順序: RegisterAction-validation.xml => validate()。


          2、特定于業(yè)務(wù)邏輯的局部校驗(yàn):
          對(duì)于struts.xml中<action>的method="register"指定的業(yè)務(wù)方法register(),使用校驗(yàn)RegisterAction-register-validation.xml(與RegisterAction.java在同一目錄下)。同時(shí),RegisterAction-validation.xml會(huì)被執(zhí)行。執(zhí)行順序:  RegisterAction-validation.xml => RegisterAction-register-validation.xml

          3、Struts2客戶端校驗(yàn)
              設(shè)置struts標(biāo)簽<s:form>中validate="true"。這樣就會(huì)根據(jù)RegisterAction-validation.xml生成頁面Javascript,在客戶端執(zhí)行校驗(yàn)。
           
           注意:
           a.struts標(biāo)簽不能使用simple主題
           b.Struts2客戶端校驗(yàn)功能較弱,一般不用。

          4、FieldError和ActionError的實(shí)現(xiàn)
          a.真正存放field級(jí)別錯(cuò)誤信息的對(duì)象是LinkedHashMap。
          b.該LinkedHashMap的key是String類型的,value是ArrayList類型,所以同一個(gè)key可以對(duì)應(yīng)多個(gè)錯(cuò)誤消息。
          c.對(duì)于Action級(jí)別的錯(cuò)誤信息,實(shí)際上是放置在ArrayList中的。
              
          [參考資料]:
              《浪曦視頻之Struts2應(yīng)用開發(fā)系列》
          posted @ 2010-07-27 10:01 勒緊皮帶向前沖| 編輯 收藏
           

          一.WebContextLoaderListener 監(jiān)聽類
          它能捕捉到服務(wù)器的啟動(dòng)和停止,在啟動(dòng)和停止觸發(fā)里面的方法做相應(yīng)的操作!
          它必須在web.xml 中配置才能使用,是配置監(jiān)聽類的

          二.下面是搜集的一些listener方面的知識(shí)
          簡例一
          監(jiān)聽用戶上線與退出,顯示在線用戶

          1、登陸頁面 Login.jsp

          <%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" %>
          <%
          session=request.getSession(false);
          if(session!=null)session.invalidate();
          %>
          <html>
          <head><title></title></head>
          <body>
          <form action="isOnline.jsp" method="post">
          用戶名:<input type="text" name="uName"/>
          <input type="submit" value="上線">
          </form>
          </body>
          </html>

          2、控制頁面(只是為了說明監(jiān)聽器問題,所以簡單了點(diǎn)...) isOnline.jsp

          <%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" %>
          <html>
          <head><title></title></head>
          <body>
          <%
          session=request.getSession();
          session.setAttribute("userName",request.getParameter("uName"));
          response.sendRedirect("showOnline.jsp");
          %>
          </body>
          </html>


          3、顯示頁面 showOnline.jsp

          <%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" import="java.util.ArrayList" %>
          <html>
          <head><title></title></head>
          <body>
          <%
          ArrayList showList=(ArrayList)(getServletContext().getAttribute("list"));
          out.print("在線人數(shù) "+showList.size()+"<br>");
          for(int i=0;i<showList.size();i++){
          out.print(showList.get(i)+"在線"+"<br>");
          }
          %>
          <br>
          <a href="Login.jsp">退出</a>
          </body>
          </html>

          4、配置頁面 web.xml

          <?xml version="1.0" encoding="gb2312"?>
          <!DOCTYPE web-app
              PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
              "http://java.sun.com/dtd/web-app_2_3.dtd">
          <web-app>
          <listener>
              <listener-class>org.xiosu.listener.onlineListener</listener-class>
          </listener>
          </web-app>

          5、監(jiān)聽器 onlineListener.java

          package org.xiosu.listener;

          import java.util.ArrayList;
          import javax.servlet.ServletContext;
          import javax.servlet.http.HttpSessionAttributeListener;
          import javax.servlet.http.HttpSessionBindingEvent;
          import javax.servlet.http.HttpSessionEvent;
          import javax.servlet.http.HttpSessionListener;

          public class onlineListener implements HttpSessionListener,
          HttpSessionAttributeListener {
          // 參數(shù)
          ServletContext sc;
          ArrayList list = new ArrayList();
          // 新建一個(gè)session時(shí)觸發(fā)此操作
          public void sessionCreated(HttpSessionEvent se) {
          sc=se.getSession().getServletContext();
          System.out.println("新建一個(gè)session");
          }
          // 銷毀一個(gè)session時(shí)觸發(fā)此操作
          public void sessionDestroyed(HttpSessionEvent se) {
          System.out.println("銷毀一個(gè)session");
          if (!list.isEmpty()) {
             list.remove((String) se.getSession().getAttribute("userName"));
             sc.setAttribute("list", list);
          }
          }
          // 在session中添加對(duì)象時(shí)觸發(fā)此操作,在list中添加一個(gè)對(duì)象
          public void attributeAdded(HttpSessionBindingEvent sbe) {
          list.add((String) sbe.getValue());
          sc.setAttribute("list", list);
          }
          // 修改、刪除session中添加對(duì)象時(shí)觸發(fā)此操作
          public void attributeRemoved(HttpSessionBindingEvent arg0) {
          }
          public void attributeReplaced(HttpSessionBindingEvent arg0) {
          }
          }


          說明:本例只為簡單介紹監(jiān)聽器,并未進(jìn)行安全方面設(shè)置。

          監(jiān)聽器也叫Listener,是Servlet的監(jiān)聽器,它可以監(jiān)聽客戶端的請(qǐng)求、服務(wù)端的操作等。通過監(jiān)聽器,可以自動(dòng)激發(fā)一些操作,比如監(jiān)聽在線的用戶的數(shù)量。當(dāng)增加一個(gè)HttpSession時(shí),就激發(fā)sessionCreated(HttpSessionEvent   se)方法,這樣
          就可以給在線人數(shù)加1。常用的監(jiān)聽接口有以下幾個(gè):
          ServletContextAttributeListener監(jiān)聽對(duì)ServletContext屬性的操作,比如增加、刪除、修改屬性。
          ServletContextListener監(jiān)聽ServletContext。當(dāng)創(chuàng)建ServletContext時(shí),激發(fā)contextInitialized(ServletContextEvent   sce)方法;當(dāng)銷毀ServletContext時(shí),激發(fā)contextDestroyed(ServletContextEvent   sce)方法。
          HttpSessionListener監(jiān)聽HttpSession的操作。當(dāng)創(chuàng)建一個(gè)Session時(shí),激發(fā)session   Created(HttpSessionEvent   se)方法;當(dāng)銷毀一個(gè)Session時(shí),激發(fā)sessionDestroyed   (HttpSessionEvent   se)方法。
          HttpSessionAttributeListener監(jiān)聽HttpSession中的屬性的操作。當(dāng)在Session增加一個(gè)屬性時(shí),激發(fā)attributeAdded(HttpSessionBindingEvent   se)   方法;當(dāng)在Session刪除一個(gè)屬性時(shí),激發(fā)attributeRemoved(HttpSessionBindingEvent   se)方法;當(dāng)在Session屬性被重新設(shè)置時(shí),激發(fā)attributeReplaced(HttpSessionBindingEvent   se)   方法。
          example:隨服務(wù)器啟動(dòng)
          web-app>

                com.tb.listener.CountStartListener


          package com.tb.listener;
          import javax.servlet.ServletContextEvent;
          import javax.servlet.ServletContextListener;
          import javax.servlet.http.HttpServlet;
          import com.tb.timertask.DoCountTask;
          public class CountStartListener extends HttpServlet implements ServletContextListener
          {
          private static final long serialVersionUID = 1824920962239905170L;
          public CountStartListener()
          {
             // TODO Auto-generated constructor stub
          }
          public void contextDestroyed(ServletContextEvent arg0)
          {
             // TODO Auto-generated method stub
          }
             public void contextInitialized(ServletContextEvent arg0)
          {   
             DoCountTask.dotask();
          }
          }

          posted @ 2010-06-01 10:33 勒緊皮帶向前沖 閱讀(12659) | 評(píng)論 (0)編輯 收藏
           
               摘要: Flex+Spring+Hibernate整合  閱讀全文
          posted @ 2010-05-23 18:03 勒緊皮帶向前沖 閱讀(3919) | 評(píng)論 (2)編輯 收藏
           
          在分享這幾種配置之前,先簡單的介紹一下需要用到的一些資源。
          1、 MyEclipse+Flex 插件(官網(wǎng)下載)
          2、 Tomcat6.0作為服務(wù)器(官網(wǎng)下載)
          3、 用 BlazeDS(免費(fèi))代替 LCDS(收費(fèi)) :沒錢啊,只能先使用免費(fèi)的了。從 Adobe
          官方網(wǎng)站上下載下來,將 blazeds.war、ds-console.war、samples.war 三個(gè)文件放在
          tomcat的webapps目錄下。
          Flex+Java配置
          第一種: Java工程和 Flex 工程獨(dú)立,這種方式也是很多人使用的方式, Flex程序員和 Java
          程序員相互獨(dú)立的工作,這種方式網(wǎng)上有很多的資料,在這里就不再 贅述了。
          第二種:Flex工程加入 Java 元素
          1、 切換到 Flex視圖,新建 Flex project,如下圖

          說明: Java source folder 就是你自己 java業(yè)務(wù)源碼存放的根目錄,在 FB3 里, LCDS
          項(xiàng)目旨在將 Java J2ee 項(xiàng)目和 FlexLcds 項(xiàng)目混合。

          當(dāng)然如果你不選擇 combined 兩個(gè)在一起,那么就麻煩些:要么你再單獨(dú)新建一個(gè)
          Flex 項(xiàng)目,而這個(gè)項(xiàng)目只寫 java代碼。要么再建一個(gè)J2ee工程寫 java代碼,而這

          因?yàn)槲覀兪且?java 和 flex結(jié)合,所
          以在服務(wù)器選擇上我們選擇 J2EE

          存放java類的源文件,我們的目的
          就是Flex和 java在一個(gè)工程里,所
          以我們這里選擇上
          個(gè)項(xiàng)目只寫 Flex 代碼,但最后要把 Java 編譯后的 class 文件放到這個(gè)項(xiàng)目下的
          webroot\web-inf\classes 目錄中。即不管怎樣,最后發(fā)布時(shí),java 編譯后的 class
          文件必須和 lcds 部署的項(xiàng)目在一起。
          2、 點(diǎn)擊Next,配置 J2EE服務(wù)器,如下圖

          說明:Target runtime 實(shí)際上沒什么用(后來我刪除了配置文件里的對(duì)應(yīng)信息,也
          沒問題),但是不指定就不能繼續(xù),如果這里顯示的是<none>那么就新建一個(gè)
          Tomcat 的runtime,簡單的只需要指定tomcat 的安裝目錄即可。

          Content folder 實(shí)際上就是最終編譯后的容器目錄,因此,BlazeDS 的 blazeds.war
          文件將會(huì)發(fā)布到 該目錄 下的 web-inf 下的 flex 目錄中。同時(shí)因?yàn)榻坛滩捎玫氖?br /> MyEclipse,他默認(rèn)的就是發(fā)布 WebRoot 里的內(nèi)容,為了自動(dòng)化,因此這里改為了
          WebRoot(這也是 java 開發(fā)的習(xí)慣)

          Flex WAR file 指的是安裝了 lcds 后的 flex.war 文件的路徑,但是在這里我們采用
          的是BlazeDS來取代 lcds,所以這里設(shè)置的是 blazeds.war的路徑。

          Compilation options 指定了 flex 文件的編譯方式,選擇推薦的在 FlexBuilder 里編
          譯吧,雖然開發(fā)時(shí)多耗點(diǎn)時(shí)間,但是在發(fā)布后不會(huì)占用服務(wù)器的編譯處理時(shí)間,對(duì)
          用戶來說是有好處的。

          Output folder 指的是 Flex 編譯后的 swf 和 html 等文件存放的路徑,這里改為了
          WebRoot,意思是發(fā)布到根目錄就可以了。當(dāng)然你可以根據(jù)你的需要和習(xí)慣自行設(shè)
          置其他的路徑

          因?yàn)槲覀儾捎玫?BlazeDS,所
          以這里要設(shè)置 BlazeDS 的路

          這里我們可以自定義輸出路徑,
          一般情況下設(shè)置成根目錄
          WebRoot 就可以了
          3、 點(diǎn)擊下一步,采用默認(rèn)的配置就可以,點(diǎn)擊完成,該工程就建立完成。下圖為該工
          程的目錄結(jié)構(gòu)

          4、 讓它變成 web工程由MyEclipse發(fā)布吧


          Flex 文件的源文件夾Java 源文件夾自動(dòng)生成的flex 的配置文件
          Flex 編譯后發(fā)布的文件。我們發(fā)布在根目錄下


          點(diǎn)擊Finish,現(xiàn)在我們的工程的圖標(biāo)變成了 J2EE Web 工程了,這意味著,你可以


          注意,不要點(diǎn)的太快了,要把這里的
          對(duì)號(hào)勾掉,這樣就不會(huì)覆蓋 BlazeDS
          創(chuàng)建的 web.xml 用MyEclipse來發(fā)布它或者添加更多容器,比如hibernate、spring等

          5、 工程建好以后,你可以通過右鍵—>屬性來進(jìn)行更多的設(shè)置。

          6、 這樣一個(gè) Flex+Java的工程就建立完成。
          7、 編寫例子,測試在介紹完第三種方式以后統(tǒng)一介紹。

          第三種:由 Web project反向加入 Flex,也就是Java+Flex
          1、 先建立一個(gè) web工程:flexweb。(略)
          2、 向flexweb 工程手工添加 Flex需要的元素。
          1)首先將 BlazeDS需要的jar文件拷到工程的 lib 目錄下。可以將上面建的那個(gè) flex
          工程的 lib下的jar文件拷到該工程下的 lib目錄下。
          2)然后要加入 Flex BlazeDS需要的配置文件。在 WEB-INF下新建一個(gè)名為 flex 的文
          件夾,然后將我們上面建立的那個(gè) firstFlex 該文件夾下的四個(gè) xml 文件拷到該文件
          夾下。
          3)最后,修改 web.xml 文件,加入 Flex 的配置。做法一個(gè)簡單的把上面我們新建
          的那個(gè) flex工程的web.xml的部分代碼拷過來。

          (注意:這樣會(huì)出錯(cuò),可以把

          <web-app version="2.4"
          xmlns="
          http://java.sun.com/xml/ns/j2ee"
          xmlns:xsi="
          http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="
          http://java.sun.com/xml/ns/j2ee
          http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

          改為:<web-app>)(本人提示:這里經(jīng)本人測試,并不需要這樣更改,本人的測試環(huán)境為Eclipse3.4+MyEclipse7.5,不排除在此版本前不需要做更改)


          <context-param>
          <param-name>flex.class.path</param-name>

          <param-value>/WEB-INF/flex/hotfixes,/WEB-INF/flex/jars</param-val
          ue>
          </context-param>

          <!-- Http Flex Session attribute and binding listener support -->
          <listener>

          <listener-class>flex.messaging.HttpFlexSession</listener-class>
          </listener>

          <!-- MessageBroker Servlet -->
          <servlet>
          <servlet-name>MessageBrokerServlet</servlet-name>
          <display-name>MessageBrokerServlet</display-name>

          <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
          <init-param>
          <param-name>services.configuration.file</param-name>

          <param-value>/WEB-INF/flex/services-config.xml</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
          </servlet>

          <servlet-mapping>
          <servlet-name>MessageBrokerServlet</servlet-name>
          <url-pattern>/messagebroker/*</url-pattern>
          </servlet-mapping>
          3、 將該工程發(fā)布到tomcat下,并啟動(dòng) tomcat。(注:一定要啟動(dòng)tomcat,因?yàn)樵诤竺?br /> 的設(shè)置中,它要驗(yàn)證工程的路徑)
          4、 然后在該工程上右鍵?Flex Project Nature?Add Flex Project Nature



          5、 設(shè)置完成后,會(huì)發(fā)現(xiàn) web工程的目錄結(jié)構(gòu)已經(jīng)發(fā)生了改變,如下圖。
          我們發(fā)現(xiàn)以這種形式建立的工程的目錄結(jié)構(gòu)和第二種方法有少許的不同,flex 的
          mxml文件默認(rèn)的放在 src文件夾中,和java文件共用一個(gè)目錄。并且沒有像上一個(gè)
          工程那樣自動(dòng)的編譯出可運(yùn)行的文件。

          配置服務(wù)器路徑
          配置正確的顯示
          建議不要修改這里的配置

          6、 如果你對(duì)這個(gè)目錄結(jié)構(gòu)不太滿意,還想讓 flex 的文件放在 flex_src 目錄下,別急,
          我們可以通過右鍵?屬性來設(shè)置。如下圖

          在這里你可以重新設(shè)置你的 flex源文件夾和輸出目錄
          7、 配置 flex 默認(rèn)的 sdk。這樣配置完,還不行,程序可能還不能正常地運(yùn)行,還需要
          配置他使用的 sdk。如下圖

          8、 馬上就大功告成了,讓我們來寫個(gè)程序測試一下吧。
          1)新建一個(gè) java類:Hello.java
          package com;

          public class Hello {
          public String hello(String name){
          System.out.println("flex調(diào)用我了,真好~~~~");
          return "hello "+name;
          }
          }
          2)為flex配置這個(gè)要調(diào)用的對(duì)象,修改WEB-INF/flex下remoting-config.xml
          加入:
          <destination id="hello">
          <properties>
          <source>
          com.Hello
          </source>
          </properties>
          </destination>

          3)編寫一個(gè)Flex程序
          <?xml version="1.0" encoding="utf-8"?>
          <mx:Application xmlns:mx=" layout="absolute">
          <mx:Script>
          <![CDATA[
          import mx.rpc.events.ResultEvent;

          function gg(evnet:ResultEvent):void{
          var ff:String = evnet.result as String;
          ggg.text = ff;
          }

          function remotingSayHello():void{
          var sname:String = nameInput.text;
          h.hello(sname);
          }
          ]]>
          </mx:Script>

          <mx:RemoteObject destination="hello" id="h"
          result="gg(event)"
          endpoint="
          http://localhost:8080/flexweb/messagebroker/amf" >

          </mx:RemoteObject>


          <mx:TextArea id="ggg" x="109" y="122"/>

          <mx:Button label="say hello" click="remotingSayHello();"
          x="144" y="193"/>
          <mx:TextInput id="nameInput" x="109" y="73"/>
          <mx:Label text="name" x="47" y="75"/>
          </mx:Application>
          4)重啟tomcat,運(yùn)行flexweb.mxml.
          第三種方法,在編譯完后,訪問網(wǎng)頁會(huì)出現(xiàn) 404 異常。具體原因不詳。但是它仍會(huì)編譯出
          一個(gè) swf文件,訪問這個(gè) swf 即可。而第二種方式可以編譯出一個(gè) html 文件。訪問一下會(huì)出
          現(xiàn)一下界面:
          輸入 dfdff,則輸出 hello dfdff。說明調(diào)用 java 類成功。不信我們可以看看 java
          類在控制臺(tái)上的打印。

          配置成功,高興吧,o(∩_∩)o…哈哈。
          如果用 lcds,則不需要預(yù)編譯,可以直接訪問 mxml 文件,lcds 會(huì)動(dòng)態(tài)編譯返回結(jié)果。(本人提示:其實(shí)你可以通過在上面配置中的flex輸出目錄中訪問其html文件例如:http://127.0.0.1:8080/xxx/xxx_debug/xxx.html

          解決:

          倒數(shù)第11行的404 異常,我對(duì)比第二種和第三種發(fā)現(xiàn)第三種漏了


          這個(gè)文件夾,所以解決辦法:把漏的文件夾整個(gè)從第二種拷一份到項(xiàng)目中、刷新,一定要刷新到到出現(xiàn)

          這個(gè)文件夾有這些內(nèi)容,才可以成功。

          注:文章中出現(xiàn)的“本人提示”是轉(zhuǎn)載者,不是原作者。
          (本人提示:對(duì)于第三種方式整合,建議其需要修改的文件全從第二種拷貝,這樣能避免一個(gè)status404錯(cuò)誤)。
          posted @ 2010-05-18 23:34 勒緊皮帶向前沖 閱讀(3453) | 評(píng)論 (1)編輯 收藏
           

          不可否認(rèn)MyEclipse現(xiàn)在越做越強(qiáng)大(畢竟是收費(fèi)的嘛),強(qiáng)大到開始排斥第三方插件,這有些不符合Eclipse的初衷,Eclipse就是靠良好的擴(kuò)展性發(fā)展起來的。

          MyEclipse從7.5開始(7.0沒用過,不知道),完全改變了程序結(jié)構(gòu),現(xiàn)在擴(kuò)展第三方插件 再也沒有以前那么方便了,特別是link方式,這對(duì)程序員來說是致命的。Flex Plugin 安裝時(shí)需要選擇Eclipse目錄,7.5中根本沒有Eclipse目錄,所以想直接在myeclipse中安裝flex plugin是不太可能。我試過將flex里的features和plugins目錄拷貝到myeclipse中進(jìn)行強(qiáng)制安裝,還是失敗,所以最后只能將Eclipse,Flex plugin和myeclipse分開進(jìn)行安裝。

          MyEclipse 7.5對(duì)應(yīng)的Eclipse 版本為3.4,先到www.Eclipse.org官網(wǎng)去下載Eclipse3.4的版本。然后再到Myeclipse官網(wǎng)(已屏蔽大陸IP,需代理,但下載可以用迅雷直接下)去下載增量升級(jí)包,注意,一定要是增量升級(jí)包,即archived update site.zip 這個(gè)包,不能下載集成安裝包,flex builder plugin 的版本也必須為3.02,這一點(diǎn)很重要,Adobe官網(wǎng)已經(jīng)很明確的說明了3.0本版存在bug,不能再Eclipse3.4  中安裝,已經(jīng)下載3.0本版的可以到Adobe官網(wǎng)或google 中去下載補(bǔ)丁。安裝順序是,先解壓Eclipse3.4 ,然后安裝 Flex plugin ,和以前的安裝方法一樣,選好目錄,直接下一步就行,然后再通過Eclipse的Help->Software Updates->Available Software ->Add site->Archive安裝剛才下載的MyEclipse7.5 的增量升級(jí)包。如果你RP不是特別差的話,應(yīng)該就大功告成了,Enjoy this !

          同樣,MyEclipse8.0中的Flex plugin 也可以這樣安裝。需要說明的是MyEclipse8.0 對(duì)應(yīng)的Eclipse版本是3.5 。Eclipse3.5 對(duì)應(yīng)的Flex plugin為4.0.目前Flex plugin 4.0的正式版還沒出,還是Beta 版 ,F(xiàn)lex builder4 已經(jīng)正式更名為 Flash builder4了 ,還是喜歡Flex builder的命名,感覺更加專業(yè)點(diǎn),哈哈!


          本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/turejackon/archive/2010/03/10/5365821.aspx

          posted @ 2010-05-17 09:46 勒緊皮帶向前沖 閱讀(1550) | 評(píng)論 (0)編輯 收藏
           
               摘要: Ext:讓Grid支持中文排序  閱讀全文
          posted @ 2010-04-01 11:02 勒緊皮帶向前沖 閱讀(668) | 評(píng)論 (0)編輯 收藏
           
          開發(fā)環(huán)境:Struts2.0.11.1
          問題描述:當(dāng)點(diǎn)擊頁面鏈接時(shí)候,隨機(jī)出現(xiàn)以下對(duì)話框,Internet Explorer無法打開Internet站點(diǎn)http://localhost:8080/kmtcm/login.action 已終止操作
          問題原因:頁面使用了My97DatePicker這個(gè)日期控件,大概是在IE下載完了源文件但沒有加載完,這個(gè)時(shí)候用JS的DOM對(duì)象的AppdenChid和innerHTML就會(huì)出錯(cuò)。我用FireFox試下,完全沒有問題。
          解決方法使用其他日歷控件代替。
          在此我替換使用的是jquery ui的日歷插件。
          關(guān)于使用方法(轉(zhuǎn)自:http://hi.baidu.com/fairywood/blog/item/638bee30e4d4649ea8018ec8.html):
          JQuery 日期控件
          2009-02-12 13:16
              JQuery提供了很多控件, 例如用于選擇日期的日期控件(Date Picker)。這些控件并沒有隨Jquery的核心庫一并發(fā)布。而是作為一個(gè)叫做"JQuery UI"的子項(xiàng)目——或者叫做插件——的形式發(fā)布。
          所以, 我們除了要在頁面中引用jquery的那個(gè)js文件外, 還需要在http://jqueryui.com/下載與我們使用JQuery對(duì)應(yīng)版本的JQuery UI的程序包。
          目前, 最新的JQuery版本是1.3。 與這個(gè)版本對(duì)應(yīng)的JQuery UI版本是1.6rc6。
          由于JQuery UI采取了顯示和功能分離的設(shè)計(jì)(皮膚, 或者叫”換膚“)。所以, 我們需要為日期控件附加樣式。JQuery UI最神奇的特點(diǎn)之一就是提供了一個(gè)網(wǎng)站來給我們修改控件的樣式:http://jqueryui.com/themeroller/。在這個(gè)頁面中, 將控件樣式調(diào)整滿意后, 點(diǎn)擊左側(cè)的"Download theme"按鈕。就可以把樣式下載下來了。現(xiàn)在, 下載的是JQuery UI1.6rc5版本所使用的樣式庫。如果您用的較低的1.5, 那么請(qǐng)注意在點(diǎn)擊”Download theme“按鈕后出現(xiàn)頁面的右側(cè)選擇相應(yīng)的版本。不然, 不同版本的樣式是不兼容的。
          將下載下來的zip包解開, 我們可以看到里面已經(jīng)準(zhǔn)備好我們要用jquery核心庫和JQuery UI的庫。首先, 我們把jquery-1.3.x.js復(fù)制到網(wǎng)站的js目錄下,jquery-ui-personalized-1.6rc6.min.js、i18n目錄、theme目錄復(fù)制到網(wǎng)站js/ui目錄下。
          JQuery核心庫的安裝非常簡單, 我們把jquery.1.3.x.js文件引入頁面即可。一般來說, 我們會(huì)把這個(gè)js文件改名為jquery.js, 放到“/js"目錄下。
          然后, 我們將jquery-ui-personalized-1.6rc6.min.js引入頁面。如果覺得它的文件名太長。可以直接改成jquery-ui.js或者其他比較短的名字。
          最后, 引入分別引入js/ui/theme/ui.all.css樣式表以及/js/ui/i18n/ui.datepicker-zh-CN.js腳本文件到頁面中。就完成了中文日期控件的安裝。如果我們需要其他語言的空間, 請(qǐng)更換ui.datepicker-zh-CN.js文件。在js/ui/i18n中有很多其他語言的腳本。
          終于, 我們可以在頁面中,給某個(gè)輸入框綁定一個(gè)日期控件了。例如, 我們的頁面中有這么一個(gè)input:
          <input type="text" id="birthday" name="birthday"/>
          那么, 我們可以在$(document).ready()的事件函數(shù)(不懂的可以參見Jquery核心庫的說明或者網(wǎng)上的相關(guān)資料)中寫:$("birthday").datepicker();
          現(xiàn)在打開頁面, 如果不出意外。當(dāng)我們點(diǎn)擊這個(gè)文本框的時(shí)候就可以出現(xiàn)一個(gè)很炫的日期控件了。

          現(xiàn)在修改一下:$("#bithday").attr("readonly", "true").datepicker(); 這樣一來,用戶就不能手工輸入, 而只能通過控件選擇日期了。

          上面簡單介紹了一下日期控件的使用方法。其實(shí), 他們的可定制性是非常高的。今天我們只是使用了它們最簡單最基本的功能。
          posted @ 2010-02-26 14:03 勒緊皮帶向前沖 閱讀(1894) | 評(píng)論 (0)編輯 收藏
           
          晚上做DEMO的時(shí)候遇到了這個(gè)問題,其實(shí)字面意義很明了:一個(gè)是display:inline把元素顯示為行內(nèi)元素,float:left讓其脫離文檔流,浮動(dòng)起來。但對(duì)其具體的用處和區(qū)別還是不解。
          于是google一下,好像這個(gè)問題并不像其它問題一樣有很多博客轉(zhuǎn)載,但還是找到了一些可以參考的東西。
          細(xì)看了下,網(wǎng)上僅有的一些資料都是轉(zhuǎn)載自這篇博文:http://andymao.com/andy/post/42.html。我也看了一下,但說實(shí)話只看懂了一半(可能是對(duì)標(biāo)準(zhǔn)化頁面的設(shè)計(jì)還了解得不夠深)。
          于是動(dòng)手做了一下實(shí)驗(yàn),一目了然:

          例:
          XHTML部分
          <ul class="disp">
          <li>aaa</li>
          <li>bbb</li>
          <p>asdfadsf</p>
          </ul>

          <ul class="floa">
          <li>ccc</li>
          <li>ddd</li>
          <p>eweweew</p>
          </ul>
          CSS部分:
          ul.disp li
          {
          display:inline;
          }
          ul.floa li
          {
          float:left;
          }
          結(jié)果:
          第一個(gè)class為disp的UL里L(fēng)I顯示為aaa,bbb為同一行,而
          asdfadsf則另起了一行。前兩個(gè)都均已經(jīng)設(shè)為了行內(nèi)元素。所以它們還是占著一行,下一個(gè)元素就另起了一行。
          第二個(gè)class為 floa的UL里三個(gè)L均I顯示在同一行里,因?yàn)榍皟蓚€(gè)已經(jīng)設(shè)為了float:left脫離了標(biāo)準(zhǔn)的文檔行,而下一個(gè)塊級(jí)元素,則忽略了前面的元素,而繼續(xù)按照標(biāo)準(zhǔn)的文檔進(jìn)行排列。

          最后摘抄一下,瀏覽到有用的資料:

          首先我們要明確,display:inline;與float:left;正確含義。display:inline;(內(nèi)聯(lián))《CSS權(quán)威指南》中文字顯示:任何不是塊級(jí)元素的可見元素都是內(nèi)聯(lián)元素。其表現(xiàn)的特性是“行布局”形式,這里的“行布局”的意思就是說其表現(xiàn)形式始終以行進(jìn)行顯示。比如,我們設(shè)定一個(gè)內(nèi)聯(lián)元素border-bottom:1px solid #000;時(shí)其表現(xiàn)是以每行進(jìn)行重復(fù),每一行下方都會(huì)有一條黑色的細(xì)線。如果是塊級(jí)元素那么所顯示的的黑線只會(huì)在塊的下方出現(xiàn)。

          當(dāng)然這看起來不像是display:inline;與float:left;的區(qū)別所在,但是當(dāng)理解了float:left;的特性那么我們就清楚到底是怎么回事了。float:left;(左浮動(dòng))他使得指定元素脫離普通的文檔流而產(chǎn)生的特別的布局特性。并且FLOAT必需應(yīng)用在塊級(jí)元素之上,也就是說浮動(dòng)并不應(yīng)用于內(nèi)聯(lián)標(biāo)簽。或者換句話來說當(dāng)應(yīng)用了FLOAT那么這個(gè)元素將被指定為塊級(jí)元素。

          那么我們很清楚了,內(nèi)聯(lián)(display:inline;)元素不能設(shè)置寬高,因?yàn)閮?nèi)聯(lián)屬于行布局,其特性是在一行里進(jìn)行布局,所以不能被設(shè)定寬高。

          posted @ 2010-02-23 10:37 勒緊皮帶向前沖 閱讀(663) | 評(píng)論 (0)編輯 收藏
           
               摘要: 后臺(tái)報(bào)SQL Error: 1064, SQLState: 42000錯(cuò)誤,Could not synchronize database state with session   閱讀全文
          posted @ 2010-01-09 11:25 勒緊皮帶向前沖 閱讀(9428) | 評(píng)論 (1)編輯 收藏
           
          新的項(xiàng)目決定使用s2sh框架,于是按文檔整合好,在加入tiles后,啟動(dòng)包實(shí)例化tles實(shí)例化不能。翻篇看文檔,找解決。
          同事也同樣遇到這樣的問題。經(jīng)兩人花費(fèi)兩天時(shí)間后中解決。
          由于jar包的沖突,特別是asm這個(gè)包,我和同事,是用了不同的asm版本,他使用低版本,我使用高版本。
          因此,將我和他的jar包做個(gè)截圖,以供以后配置。
          先是同事的




          我使用的jar包



          請(qǐng)一定要注意在s2sht中去掉xerces-2.6.2.jar這個(gè)jar包,導(dǎo)致tiles不能啟動(dòng)的元兇。(上面貼出的jar可直接使用)
          我和同事用于是用不同版本的asm.jar包,因此將高版本解決方法貼出。(解決方法來自:http://edu.codepub.com/2009/1215/18741.php
          解決辦法是:
          1.去掉類路徑上的關(guān)于Hibernate的3個(gè)lib
          asm.jar
          asm-attrs.jar
          cglib-2.1.3.jar
          2.加入Spring中的以下4個(gè)lib
          asm-2.2.2.jar
          asm-commons-2.2.2.jar
          asm-util-2.2.2.jar
          cglib-nodep-2.1_3.jar

          注:我們是用的MyEclipse8自帶的jar包。struts2.18,hibernate3.2,spring2.5
          posted @ 2010-01-07 13:48 勒緊皮帶向前沖 閱讀(1154) | 評(píng)論 (0)編輯 收藏
          僅列出標(biāo)題
          共14頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
           
          主站蜘蛛池模板: 武乡县| 五指山市| 家居| 汾西县| 新昌县| 衡山县| 双辽市| 石首市| 定西市| 九寨沟县| 巴楚县| 沙湾县| 韩城市| 常德市| 黄龙县| 扶沟县| 桓台县| 咸阳市| 威海市| 波密县| 常州市| 始兴县| 安新县| 太湖县| 渭南市| 石家庄市| 宁津县| 抚顺市| 江山市| 巩义市| 亳州市| 郯城县| 横峰县| 梧州市| 阳山县| 灌阳县| 砀山县| 辽中县| 定结县| 云安县| 辽宁省|