posts - 10, comments - 9, trackbacks - 0, articles - 17

          2010年7月29日

          [ERROR] 07-29 11:23 - The /WEB-INF/web.xml was not found.  (ActionServlet.java:1787)
          java.net.ConnectException: Connection timed out: connect

          原web.xml頭部:
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
          <web-app>




            <servlet>
              <servlet-name>action</servlet-name>
              <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>


          修改為
          <?xml version="1.0" encoding="UTF-8"?>
          <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">




            
          <servlet>
              
          <servlet-name>action</servlet-name>
              
          <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

          posted @ 2010-07-29 11:23 wesley1987 閱讀(1511) | 評論 (0)編輯 收藏

          2010年7月28日


          在tomcat等容器中發布帶velocity的應用時, 出現 org.apache.velocity.exception.ResourceNotFoundException : Unable to find resource ...vm  的解決辦法:

          配置文件 velocity.properties 中, 如果有
          resource.loader = file

          file
          .resource.loader.description = Velocity File Resource Loader
          file
          .resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
          file
          .resource.loader.path = .
          file
          .resource.loader.cache = false
          file
          .resource.loader.modificationCheckInterval = 2

          這段, 全部注釋掉即可.

          若沒有, 就在配置里寫上以上內容, 并更改第三項為

          file.resource.loader.class = org.apache.velocity.tools.view.WebappResourceLoader

          posted @ 2010-07-28 15:35 wesley1987 閱讀(14184) | 評論 (1)編輯 收藏

          1。指定velocity.properties文件,  默認路徑為 WEB-INF/velocity.properties 也可自定義路徑, 在web.xml中
                <servlet>
                  
          <servlet-name>velocity</servlet-name>
                  
          <servlet-class>org.apache.velocity.tools.view.servlet.VelocityLayoutServlet</servlet-class>
                  
          <init-param>
                      
          <param-name>org.apache.velocity.properties</param-name>
                      
          <param-value>/WEB-INF/config/velocity.properties</param-value>
                  
          </init-param>
                  
          <init-param>
                      
          <param-name>org.apache.velocity.toolbox</param-name>
                      
          <param-value>/WEB-INF/config/velocity-toolbox.xml</param-value>
                  
          </init-param>
                  
          <load-on-startup>5</load-on-startup>
                
          </servlet>
          注意 load-on-startup 需要配置且靠后, 否則啟動時看不到日志.

          2。在velocity.properties中配置日程相關參數:
          #----------------------------------------------------------------------------
          #  default LogSystem to use: default: AvalonLogSystem
          #----------------------------------------------------------------------------


          runtime
          .log.logsystem.class = org.apache.velocity.runtime.log.SimpleLog4JLogSystem

          runtime
          .log.logsystem.log4j.category = velocity_log

          #----------------------------------------------------------------------------
          # This controls if Runtime.error(), info() and warn() messages include the
          # whole stack trace. The last property controls whether invalid references
          # are logged.
          #----------------------------------------------------------------------------


          runtime
          .log.error.stacktrace = false
          runtime
          .log.warn.stacktrace = false
          runtime
          .log.info.stacktrace = false
          runtime
          .log.invalid.reference = true


          3\ 配置log4j.properties,  具體配置意義請參看log4j配置相關文檔
          log4j.rootLogger=INFO,CONSOLE,FILE
          log4j
          .logger.velocity_log=INFO,CONSOLE,VELOCITY
          log4j
          .addivity.org.apache=true

          log4j
          .appender.CONSOLE=org.apache.log4j.ConsoleAppender
          log4j
          .appender.CONSOLE.Threshold=WARN
          log4j
          .appender.CONSOLE.Target=System.out
          log4j
          .appender.CONSOLE.Encoding=GBK
          log4j
          .appender.CONSOLE.layout=org.apache.log4j.PatternLayout
          log4j
          .appender.CONSOLE.layout.ConversionPattern=[%-4p] %d{MM-dd HH:mm} - %m  %n

          log4j
          .appender.VELOCITY=org.apache.log4j.FileAppender
          log4j
          .appender.VELOCITY.File=E:/workspace/dwrt/WebRoot/log/velocity.log
          log4j
          .appender.VELOCITY.Append=false
          log4j
          .appender.VELOCITY.Encoding=GBK
          log4j
          .appender.VELOCITY.layout=org.apache.log4j.PatternLayout
          log4j
          .appender.VELOCITY.layout.ConversionPattern=[%-4p] %d{MM-dd HH:mm} - %m  %n

          posted @ 2010-07-28 11:39 wesley1987 閱讀(2475) | 評論 (0)編輯 收藏

          2010年7月7日

          select COUNT(*) from table t WHERE t.col <> '3'


          SELECT COUNT(*) FROM table t WHERE t.col NOT IN
          (select t.col from table t WHERE t.col= '3')

          以上兩句SQL的執行結果不同, 因為 <> 在排除3的同時, 將null也排除了,
          所以當比較字段含null時,第一句將比第二句的結果少.

          當然第二句從效率上來說不是一個好的寫法, 這樣寫只是為了理解, 在第一句后面, 加上 or t.col is null 應該就等效了.

          posted @ 2010-07-07 10:17 wesley1987 閱讀(7305) | 評論 (1)編輯 收藏

          在js中寫了個替換字符的句子, 然后才知道原來js沒有replaceAll方法, 就是說用replace的話, 他自會替換一次.

          自定義replaceAll方法,
          String.prototype.replaceAll  = function(s1,s2){    
                  return this.replace(new RegExp(s1,"gm"),s2);   
          }  

          gm     g=global, m=multiLine  , 

          或直接 string = string..replace(new RegExp(s1,"gm"),s2);   

          posted @ 2010-07-07 09:44 wesley1987 閱讀(1076) | 評論 (0)編輯 收藏

          2009年7月27日

          在使用DispatchAction時出現了這個問題,從這句話分析,就是沒有在指定的類中,找到對應的方法。

          先說結論: 在Action中定義的方法(要在參數中使用的方法),參數一定要固定為
          (ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response )

          --------------------------------
          這種錯誤,一般在保證所有路徑的拼寫都正確的情況下應該就能避免,

          那接著分析一下,struts是如何從jsp一步步找到這個方法呢?


          1 頁面上 action的路徑,以及對應的struts配置文件中定義的parameter的參數名(我這叫method)屬性值,這個屬性值應對應著 Action類的方法名。

          2 確認了以上路徑都正確的情況下,考慮到DispatchAction對應“方法”的方式,發現原來是方法多了一個參數。

          順便看了下DispatchAction源代碼,看到里面找方法的時候,用的是
           method = clazz.getMethod(name, types);
          其中
          clazz = getClass();
          types = (new Class[] {
                      org.apache.struts.action.ActionMapping.class,  org.apache.struts.action.ActionForm.class,  javax.servlet.http.HttpServletRequest.class,  javax.servlet.http.HttpServletResponse.class
                  });

          就是說,DispatchAction只會將參數固定為以上4中的函數作為控制器方法使用。

          posted @ 2009-07-27 21:13 wesley1987 閱讀(4248) | 評論 (2)編輯 收藏

          2009年4月21日

          選自 http://java.chinaitlab.com/Spring/762022.html

           Spring Security使用一組過濾器鏈來對用戶進行身份驗證和授權。首先,在web.xml文件中添加FilterToBeanProxy過濾器配置:
           1 <filter>   
           2       <filter-name>springSecurityFilterChain</filter-name>
           3      <filter-class>
           4         org.springframework.security.util.FilterToBeanProxy
           5      </filter-class>
           6      <init-param>       
           7           <
          param-name>targetClass</param-name>
           8          <param-value>           
           9               org.springframework.security.util.FilterChainProxy
          10          </param-value>
          11       </init-param>
          12 </filter>
          13
                  org.springframework.security.util.FilterToBeanProxy實現了Filter接口,它通過調用WebapplicationContextUtils類的getWebApplicationnContext(servletContext)方法來獲取Spring的應用上下文句柄,并通過getBean(beanName)方法來獲取Spring受管Bean的對象,即這里targetClass參數配置的Bean,并通過調用FilterChain Proxy的init()方法來啟動Spring Security過濾器鏈進行各種身份驗證和授權服務(FilterChainProxy類也是實現了Filter接口),從而將過濾功能委托給Spring的FilterChainProxy受管Bean(它維護著一個處理驗證和授權的過濾器列表,列表中的過濾器按照一定的順序執行并完成認證過程),這樣即簡化了web.xml文件的配置,又能充分利用 Spring的IoC功能來完成這些過濾器執行所需要的其它資源的注入。

                  當用戶發出請求,過濾器需要根據web.xml配置的請求映射地址來攔截用戶請求,這時Spring Security開始工作,它會驗證你的身份以及當前請求的資源是否與你擁有的權限相符,從而達到保護Web資源的功能,下面是本例所要過濾的用戶請求地址:
           1 <filter-mapping>
           2 
           3        <filter-name>springSecurityFilterChain</filter-name>

           5        <url-pattern>/j_spring_security_check</url-pattern>
           6 
           7     </filter-mapping>
           8 
           9     <filter-mapping>
          10 
          11        <filter-name>springSecurityFilterChain</filter-name>
          12 
          13        <url-pattern>/*</url-pattern>
          14 
          15 </filter-mapping>

          提示:
          /j_spring_security_check是Spring Security默認的進行表單驗證的過濾地址,你也可以修改為別的名稱,但是需要和
          applicationContext-security.xml中相對應,當然還會涉及到其它一些默認值(可能是一個成員變量,也可能是別的請
          求地址),在下文我們將看到,建議你在閱讀此文的同時,應該參照Spring Security項目的源代碼,便于你更好的理解。


          3 配置applicationContext-security.xml

              3.1 FilterChainProxy過濾器鏈

              FilterChainProxy會按順序來調用一組filter,使這些filter即能完成驗證授權的本質工作,又能享用Spring Ioc的功能來方便的得到其它依賴的資源。FilterChainProxy配置如下:

           1 <bean id="filterChainProxy"   
                  class
          ="org.springframework.security.util.FilterChainProxy">
           2      <property name="filterInvocationDefinitionSource">
           3         <value><![CDATA[         
                          CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 
           4              PATTERN_TYPE_APACHE_ANT         
                          /**=httpSessionContextIntegrationFilter,logoutFilter,
           5              authenticationProcessingFilter,securityContextHolderAwareRequestFilter,
           6              rememberMeProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,
           7              filterSecurityInterceptor 
           8         ]]></value>
           9      </property>
          10 </bean>

              CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 定義URL在匹配之前必須先轉為小寫,PATTERN_TYPE_APACHE_ANT 定義了使用Apache ant的匹配模式,/**定義的將等號后面的過濾器應用在那些URL上,這里使用全部URL過濾,每個過濾器之間都適用逗號分隔,它們按照一定的順序排列。

           
          提示:
          特別需要注意的是,即使你配置了系統提供的所有過濾器,這個過濾器鏈會很長,但是千萬不要使用換行,否則它們不會正常工作,
          容器甚至不能正常啟動。
           

              下面根據FilterChainProxy的配置來介紹各個過濾器的配置,各個過濾器的執行順序如以上配置。

              首先是通道處理過濾器,如果你需要使用HTTPS,這里我們就使用HTTP進行傳輸,所以不需要配置通道處理過濾器,然后是集成過濾器,配置如下:

          1 <bean id="httpSessionContextIntegrationFilter"
          2 
          3 class="org.springframework.security.context.HttpSessionContextIntegrationFilter"/>

              httpSessionContextIntegrationFilter是集成過濾器的一個實現,在用戶的一個請求過程中,用戶的認證信息通過SecurityContextHolder(使用ThreadLoacl實現)進行傳遞的,所有的過濾器都是通過SecurityContextHolder來獲取用戶的認證信息,從而在一次請求中所有過濾器都能共享Authentication(認證),減少了HttpRequest參數的傳送,下面的代碼是從安全上下文的獲取Authentication對象的方法:

          1 SecurityContext context = SecurityContextHolder.getContext();
          2 
          3 Authentication authentication = context.getAuthentication();

              但是,ThreadLoacl不能跨越多個請求存在,所以,集成過濾器在請求開始時從Http會話中取出用戶認證信息并創建一個SecurityContextHolder將Authentication對象保存在其中,在請求結束之后,在從SecurityContextHolder中獲取Authentication對象并將其放回Http會話中,共下次請求使用,從而達到了跨越多個請求的目的。集成過濾器還有其它的實現,可以參考相關文檔。

          提示:
          集成過濾器必須在其它過濾器之前被使用。
           

              logoutFilter(退出過濾器) ,退出登錄操作:

           1 <bean id="logoutFilter"
           2 
           3     class="org.springframework.security.ui.logout.LogoutFilter">
           4 
           5     <constructor-arg value="/index.jsp"/>
           6 
           7     <constructor-arg>
           8 
           9        <list>
          10 
          11            <!-- 實現了LogoutHandler接口(logout方法) -->
          12 
          13            <ref bean="rememberMeServices"/>
          14 
          15            <bean class="org.springframework.security.ui.logout.SecurityContextLogoutHandler"/>
          16 
          17        </list>
          18 
          19     </constructor-arg>
          20 
          21 </bean>


          posted @ 2009-04-21 16:11 wesley1987 閱讀(618) | 評論 (0)編輯 收藏

          2008年12月23日

           

                            項目實訓心得

                       在這一個多月的項目實訓過程,我感到是我專業學習中收獲非常大的一個月。在這個月里,我體驗到了團隊合作的經驗,編程過程中的樂趣,以及將學習應用到實際、從實踐中學習的豐收感。

                        這一個月里,得到了二個最寶貴體驗:一是參與了一個團隊合作的、有很強多同模塊相互性、和一套完整生命周期流程的工程項目。這一套項目按照軟件工程的流程一步步走下來,經歷了需求分析,詳細設計,實際編碼和測試這一系列階段。一步一步慢慢的走下來。雖然對于真實的項目來說,這個項目的復雜度和規模并不是很大,邏輯要求也不是太嚴格。但是對于只參加一些3-4人的項目編程的我來說,已經第一次讓我體真正的體驗到將編程作為一項工程來執行的難得經驗。

                        第二個體驗是詳細設計中,將軟件架構和分層的思想以及簡單的工程模式等應用到了項目中。使用框架等方式,非常有效的提高了代碼的復用和工程的可維護性,雖然多層結構看似麻煩,但實際上它很大的降低了設計的復雜度,在實際的體驗中感到,使用了框架后的模塊,維護起來清晰了很多,容易了很多,降低了耦合,同時增強了模塊間的交互和重用。

                        隨著整個工程的流程一步步進行,我們看到了一個工程的一次次成長。項目伊始,我們得到了項目需求文檔(我想這一步在實際中也應該是由項目人員精心設計才完成的),對于工程的不同用例,將工程分為了六個模塊,并對應的將組員分為了六組。我們的第一步是完成對需求文檔的理解,而成果就是對應了各個模塊的實際功能的靜態頁面,因為軟件客戶最后體驗所有需求的功能實現就是通過操作頁面來實現,所以頁面要在客戶需求的角度去考慮,同時要將需求的功能都賦予體現。在這個過程中,大家除了按功能分化出頁面分類外,大部分時間還用來精心設計頁面的風格。頁面布局和菜單中大量用到了JavaScriptCSS。和以我往設計頁面時不同的是,為了讓大家可以公用這些設計,在頁面的布局中不能太復雜,甚至幾乎是不能在需要統一的地面對整體的布置有任何復雜的干預。所有希望統一的部分都要在公共的CSSJavaScript中做出方便統一使用的類或方法,在頁面本身的代碼中幾乎看不到布局設計,只有功能組件。

                        在頁面設計通過審核之后就是詳細設計階段了,在這階段的前幾天我們犯了一個順序錯誤,直接從數據庫著手。結果由于項目的功能的復雜性和模塊之間太多需要交互的地方,使得數據庫的設計進行的很緩慢。經過老師的提點我們改為從程序編碼的框架開始著手。聯系各功能的具體實現來設計編碼的層次結構(框架詳細設計在下一節),劃分出公共平臺。這樣再從各模塊的功能及其交互劃分來聯系設計數據庫就變的清晰了很多。在設計過程中我們還使用了E-R圖來設計出關系數據庫,即從參與的對象和對象之間的關系最終設計出數據庫的方法。在這次設計中發現自己在利用一些系統的理論進行整體的數據庫模型設計方面還存在很多不足。數據庫完成后,對框架的設計也基本完成,公共的分頁設計,數據庫連接與關閉,工程的文件結構和工程的環境也在幾次討論后完成統一設計。

                        由于之前對struts有了一定的了解,所以我在需求分析階段就開始嘗試著著手對幾個簡單模塊的實現編碼,之后在詳細設計階段中,每次討論后新加的內容都需要對已經完成的代碼進行一次大的修改。隨著代碼的增長,嘗試了很多種文件結構。之后引入項目的框架也經歷了很大的修改和許多次的嘗試。此外的修改還包括BaseAction的引入,DispatchAction的引入,使用struts異常處理等,并做好工程備份及將修改記錄在日報中。在這一次次的修改中讓我受益匪淺,對這些設計和修改有了更深刻的體會。這樣在詳細設計階段的過程中,框架設計都已經在編碼中事先進行了實現和測試,一些功能在寫好后被分離出來作為公共平臺。終于在小組開始編碼時確定出了統一并詳細完整的的工程的全部環境,項目的框架結構和整體編碼方式。我的編碼實現和單元測試也基本完成。

                        在兩周的編碼過程中,我主要是和吉利一起協助各模塊編碼,增加各模塊間交流,在這期間也解決問題的過程中學到知識。經過全體組員兩周的努力工作,終于進入了測試階段。我和吉利負責整體測試,測試聯結了所有模塊之后,可以順利的完成全套的流程。讓整個設計可以在6個流程中一步步的走下去,同時保證數據庫中所有數據和狀態的正確性。隨著測試一次次的進行,問題漸漸被全部排除,經過3次測試之后,基本可以完全順利的走完全套流程。

                         

                        我們這次工程中使用的是四層結構的框架,即將MVC三層結構的同時,將model模型層分成了model模型層和DAO持久層。其中又根據工廠模式分出DAO接口,beanfactoryservicemanager)提供DAO實現。

                        結構實現:首先我們根據框架,設計出相應的文件結構。視圖層即所有JSP文件,和配置文件一起由eclipse的自動生成單獨分在WebRoot下,六模塊的頁面分別分于六個子目錄下。所有的公共頁面和jscss目錄也放入WebRoot下。由于這次項目中模塊間的功能頁面基本是完全相互獨立的,這為在實現視圖層和控制層之間的頁面跳轉控制帶來很大的方便。代碼目錄(src)下為六個模塊的六個目錄,公共代碼目錄(platform),以及后加入的驗證模塊的目錄(validate)。除公共目錄外,各模塊下代碼分為5個目錄:ActionmodelFormmanagerdao。(這里有兩個命名的失誤,根據實際的使用,model的名字應該叫bean更合適,而這里manager一般在框架中稱為service。但我們已經有了稱為service的模塊名稱。)這里的ActionForm對應了struts中的組件,DAO層和model-bean一起完成了操作的具體實現,

                        視圖層view:總體框架上,我們使用的是frameset來實現,不過聽老師說現在流行的使用japinclude結合div等來實現頁面框架。在之后編碼中,因為frameset出現了一個問題,就是用來驗證攔截的過濾器無法刷新整個框架,使得攔截后的頁面只能顯示在被操作的frame中。但是frameset的好處是框架分離的很好,在實現jsp編碼中幾乎完全不用去考慮框架。我不知道用include是否能做到。以前雖然都使用的include,但是是在每個頁面中都要加入include。有時還會影響布局。在編碼過程中,我們用JavaScript實現了很多很好用的效果,比如選擇時間的窗口,表單的正則表達式驗證,表格的變色效果等,封裝到公共的js文件中,調用起來很方便。在這次jap編程中,我終于由最初的在頁面中堆滿java代碼,轉變為只使用一些JSTLEL語句和struts標簽處理邏輯,美觀了頁面編碼,同時讓頁面更專注于顯示層。但這里我對EL語句和純標簽語句又有些難以取舍。EL語句在頁面代碼中雖然不如單用標簽顯得純粹美觀,但是EL表達式簡約的表現風格讓實現和維護變得容易了很多。

                        控制層Action的設計一是使用了DispatchAction,將多個Action類合并,方便了管理。二在公共部分中定義了BaseAction,由這個類去繼承strutsDispatchAction。之后我們的所有Action都去繼承這個BaseAction。這樣在需要對Action進行統一處理,以及定義一些供Action公共使用的方法時就可以在這個BaseAction中修改。雖然在這次項目中,BaseAction只定義了個用于處理字符亂碼的方法公共使用,但由此即可瞥見對于更復雜的Action統一處理這種設計也能從容應對。由于是分模塊進行,于是我們將strutsxml配置文件也分為對應各個模塊,使用多xml的配置方式,而這也需要對命名規則等很多方面有更好的協調和統一。在這次控制層的實現中,我起初還是像以前一樣對很多不同的驗證,模型層返回的異常都在Action中處理并跳轉。在之后的修改中,逐漸將這些處理都改至模型層Manager中,由Manager取用持久層的操作方法,實現所有業務邏輯處理。

                        具體實現功能的模型層中,我們為每個DAO定義了接口和實現類,這也是我第一次將接口真正應用到程序中。同時我們在每個模塊的DAO中應用了工廠模式,由一個factory類實現所有DAO的單例生成。之后在Manager中調用這個實例實現操作。而這個Manager同時本身也是單例實現的,由Action進行靜態調用。可見其中實現Action控制層和DAO持久層交互的就是Manager模型層,并將兩者嚴格的分離開來。同時在Manager中還集合處理了所有來至業務功能邏輯和底部數據庫的所有異常。因為數據庫的連接也是在Manager中創建的,但這不影響持久層的獨立性,因為這是考慮到有時一次業務操作會進行多個數據庫操作、調用多個數據庫方法,將連接在模型層中創建更便于數據庫的高效使用。模型層中對異常的集中處理,更簡化了上下控制層和模型層的實現,使其更專注于各自的業務實現。在異常處理上,使用了struts的一種異常處理機制,在xml配置文件中進行異常配置。這樣在Manager中將異常拋出,由struts實現異常跳轉和提示。同時我們還將自定義的異常處理類也作為公共類公用,這樣就可以在需要的時候對異常進行統一的處理。

                        在持久層的實現上,我們使用了tomcat數據庫連接池,在編碼中將數據庫連接等方法封裝到公共類中,并且將連接數據源作靜態單例實現,以提高數據庫調用的效率。在DAO的設計方面,我們主要針對實際的操作對象和對應的數據庫進行DAO層方法的封裝。每個方法盡量實現一些簡單的操作。這樣在不同模塊直接有數據和操作交互的時候,只在模型層只要去各個模塊的DAO中取得需要的方法加以組合,實現自己的業務處理。很好的提高了代碼的復用性和可維護性,降低了各個模塊間數據交互處理的設計復雜度。

              //文采太爛, 結尾的感慨段就不發了

          posted @ 2008-12-23 21:38 wesley1987 閱讀(744) | 評論 (0)編輯 收藏

          2008年12月15日

          今天一個詭異的問題弄了我半天,最后發現原因如下:

          在HTML的head中 引入外部script:
                  <script src="<%=path%>/js/service.js" type="text/javascript" ></script>
          之后又寫內部script (內容無關)
          <script type="text/javascript">
            function SecondType(){
            if (document.check.classTwo.value==1){
             stext.style.display="inline";
            }

            else{
             stext.style.display="none";
            }

           }

           function FirstType(select,forwards){
            if (document.check.classOne.value==1){
              ftext.style.display = "inline";
              document.check.classTwo.value=1;
              SecondType();
            }
          else{
             ftext.style.display = "none";
             window.location="<%=path%>/service/good.do?operation=getClass&classone="+select.value+"&forward="+forwards; 
            }

           }

          </script>
          一切正常,
          但是 如果將head中的改為
          <script src="<%=path%>/js/service.js" type="text/javascript"  />變了下結尾
          引入的外部script任然好用,但是下面的內部script就完全不執行。并伴隨很多奇怪的顯示效果。

          posted @ 2008-12-15 19:21 wesley1987 閱讀(564) | 評論 (0)編輯 收藏

          轉自網上的一篇很詳細的關于servlet中各種出現亂碼的問題即解決方案:
          http://www.diybl.com/course/3_program/java/javajs/200829/99730.html

          (1)前言:
          解決web程序的國際化問題,必須在任何地方使用UTF-8對字符進行編碼。(包括:數據庫設置為:UTF-8,web頁面也要設置為:UTF-8)
          這樣做的好處在于可以解決在web上不止中文字符編碼問題,所有的字符編碼都統一使用UTF-8,實現了語言的國際化。同時在保存數據到
          數據庫時候也省去了編碼轉換的問題。
          在JSP或JSF應用中使用到Servlet,我們通過使用Servlet過濾器進行編碼轉換,也就是制定編碼轉換為UFT-8。

          (2)Servlet和JSP過濾器Filter簡介:
          servlet API的2.3版本中最重要的一個新功能就是能夠為servlet和JSP頁面定義過濾器。過濾器提供了某些早期服務器所支持的非標準“servlet鏈接”的一種功能強大且標準的替代品。
          過濾器是一個程序,它先于與之相關的servlet或JSP頁面運行在服務器上。過濾器可附加到一個或多個servlet或JSP頁面上,并且可以檢查進入這些資源的請求信息。在這之后,過濾器可以作如下的選擇:
          - 以常規的方式調用資源(即,調用servlet或JSP頁面)。
          - 利用修改過的請求信息調用資源。
          - 調用資源,但在發送響應到客戶機前對其進行修改
          - 阻止該資源調用,代之以轉到其他的資源,返回一個特定的狀態代碼或生成替換輸出。
          過濾器提供了幾個重要好處。
               首先,它以一種模塊化的或可重用的方式封裝公共的行為。你有30個不同的serlvet或JSP頁面,需要壓縮它們的內容以減少下載時間嗎?沒問題:構造一個壓縮過濾器(參閱第11節),然后將它應用到30個資源上即可。
              其次,利用它能夠將高級訪問決策與表現代碼相分離。這對于JSP特別有價值,其中一般希望將幾乎整個頁面集中在表現上,而不是集中在業務邏輯上。例如,希望阻塞來自某些站點的訪問而不用修改各頁面(這些頁面受到訪問限制)嗎?沒問題:建立一個訪問限制過濾器(參閱第8節)并把它應用到想要限制訪問的頁面上即可。
              最后,過濾器使你能夠對許多不同的資源進行批量性的更改。你有許多現存資源,這些資源除了公司名要更改外其他的保持不變,能辦到么?沒問題:構造一個串替換過濾器(參閱第10節),只要合適就使用它。
              但要注意,過濾器只在與servlet規范2.3版兼容的服務器上有作用。如果你的Web應用需要支持舊版服務器,就不能使用過濾器。
          建立一個過濾器涉及下列五個步驟:
          1、建立一個實現Filter接口的類。這個類需要三個方法,分別是:doFilter、init和destroy。doFilter方法包含主要的過濾代碼,init方法建立設置操作,而destroy方法進行清楚。
          2、在doFilter方法中放入過濾行為。doFilter方法的第一個參數為ServletRequest對象。此對象給過濾器提供了對進入的信息(包括表單數據、cookie和HTTP請求頭)的完全訪問。第二個參數為ServletResponse,通常在簡單的過濾器中忽略此參數。最后一個參數為FilterChain,如下一步所述,此參數用來調用servlet或JSP頁。
          3、調用FilterChain對象的doFilter方法。Filter接口的doFilter方法取一個FilterChain對象作為它的一個參數。在調用此對象的doFilter方法時,激活下一個相關的過濾器。如果沒有另一個過濾器與servlet或JSP頁面關聯,則servlet或JSP頁面被激活。
          4、對相應的servlet和JSP頁面注冊過濾器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。
          5、禁用激活器servlet。防止用戶利用缺省servlet URL繞過過濾器設置。

          doFilter方法:

          1 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
          2  throws ServletException, IOException
          3 {
          4  HttpServletRequest req = (HttpServletRequest)request;
          5  System.out.println(req.getRemoteHost() + " tried to access " +req.getRequestURL() +" on " + new Date() + ".");
          6  chain.doFilter(request,response);
          7 }


          在web.xml中進行部署
          分別是:filter和filter-mapping。filter元素向系統注冊一個過濾對象,filter-mapping元素指定該過濾對象所應用的URL。

          <filter>
          <filter-name>ChangeCodeFilter</filter-name>
          <display-name>ChangeCodeFilter</display-name>
          <description></description>
          <filter-class>com.cnc.SetCharacterEncodingFilter</filter-class>
          </filter>
          <filter-mapping>
          <filter-name>SetCharacterEncodingFilter</filter-name>
          <url-pattern>/SetCharacterEncodingFilter</url-pattern>
          </filter-mapping>

          1.filter元素
          filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六個可能的子元素:
           :icon  這是一個可選的元素,它聲明IDE能夠使用的一個圖象文件。
           : filter-name  這是一個必需的元素,它給過濾器分配一個選定的名字。
           : display-name  這是一個可選的元素,它給出IDE使用的短名稱。
           : description  這也是一個可選的元素,它給出IDE的信息,提供文本文檔。
           : filter-class  這是一個必需的元素,它指定過濾器實現類的完全限定名。
           : init-param  這是一個可選的元素,它定義可利用FilterConfig的getInitParameter方法讀取的初始化參數。單個過濾器元素可包含多個init-param元素。
          2.filter-mapping元素
            filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。它包含如下三個可能的子元素::
            filter-name 這個必需的元素必須與用filter元素聲明時給予過濾器的名稱相匹配。
            url-pattern  此元素聲明一個以斜杠(/)開始的模式,它指定過濾器應用的URL。所有filter-mapping元素中必須提供url-pattern或servlet-name。但不能對單個filter-mapping元素提供多個url-pattern元素項。如果希望過濾器適用于多個模式,可重復整個filter-mapping元素。
          :servlet-name  此元素給出一個名稱,此名稱必須與利用servlet元素給予servlet或JSP頁面的名稱相匹配。不能給單個filter-mapping元素提供多個servlet-name元素項。如果希望過濾器適合于多個servlet名,可重復這個filter-mapping元素。

          (3)在Rational Application Developer 中的建立字符轉換過濾器:
          1.新建-web-過濾器:SetCharacterEncodingFilter
          會在web.xml中產生如上代碼:

          2.在過濾器的doFilter方法中添加如下代碼:

          public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {
            arg0.setCharacterEncoding(
          "UTF-8"); //設定字體編碼為UTF-8
            arg2.doFilter(arg0, arg1);// 傳遞控制到下一個過濾器
           }

          3.在web.xml中進行部署
          在web.xml的過濾器-編輯器中選擇:servlet 映射 - 添加 - Faces Servlet
          會在web.xml中產生如下代碼:
          <filter-mapping>
          <filter-name>SetCharacterEncodingFilter</filter-name>
          <servlet-name>Faces Servlet</servlet-name>
          </filter-mapping>

          (4)其他參考信息
          tomcat下中文的徹底解決
          (一)    JSP頁面上是中文,但是看的是后是亂碼:
          解決的辦法就是在JSP頁面的編碼的地方<%@ page language="java" contentType="text/html;charset=GBK" %>,因為Jsp轉成Java文件時的編碼問題,默認的話有的服務器是ISO-8859-1,如果一個JSP中直接輸入了中文,Jsp把它當作ISO8859-1來處理是肯定有問題的,這一點,我們可以通過查看Jasper所生成的Java中間文件來確認
          (二)    當用Request對象獲取客戶提交的漢字代碼的時候,會出現亂碼:
          解決的辦法是:要配置一個filter,也就是一個Servelet的過濾器,代碼如下:

          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.UnavailableException;
          /**
           * Example filter that sets the character encoding to be used in parsing the
           * incoming request
           
          */
          public class SetCharacterEncodingFilter implements Filter {
              
          /**
               * Take this filter out of service.
               
          */
              
          public void destroy() {
              }
              
          /**
               * Select and set (if specified) the character encoding to be used to
               * interpret request parameters for this request.
               
          */
              
          public void doFilter(ServletRequest request, ServletResponse response,
              FilterChain chain)
          throws IOException,ServletException {
              request.setCharacterEncoding(
          "GBK");
              
          // 傳遞控制到下一個過濾器
              chain.doFilter(request, response);
              }
              
          public void init(FilterConfig filterConfig) throws ServletException {
              }
          }

           

           

          配置web.xml

          <
          filter>
          <filter-name>Set Character Encoding</filter-name>
          <filter-class>SetCharacterEncodingFilter</filter-class>
          </filter>
          <filter-mapping>
          <filter-name>Set Character Encoding</filter-name>
          <url-pattern>/*</url-pattern>
          </filter-mapping>

          如果你的還是出現這種情況的話你就往下看看是不是你出現了第四中情況,你的Form提交的數據是不是用get提交的,一般來說用post提交的話是沒有問題的,如果是的話,你就看看第四中解決的辦法。
          還有就是對含有漢字字符的信息進行處理,處理的代碼是:
          package dbJavaBean;
          public class CodingConvert
          {  
           public CodingConvert()
           {
            //
           }
           public String toGb(String uniStr){
               String gbStr = "";
               if(uniStr == null){
             uniStr = "";
               }
               try{
             byte[] tempByte = uniStr.getBytes("ISO8859_1");
             gbStr = new String(tempByte,"GB2312");
               }
            catch(Exception ex){
              }
               return gbStr;
           }
            
           public String toUni(String gbStr){
               String uniStr = "";
               if(gbStr == null){
             gbStr = "";
               }
               try{
             byte[] tempByte = gbStr.getBytes("GB2312");
             uniStr = new String(tempByte,"ISO8859_1");
               }catch(Exception ex){
              }
              return uniStr;
           }
          }
          你也可以在直接的轉換,首先你將獲取的字符串用ISO-8859-1進行編碼,然后將這個編碼存放到一個字節數組中,然后將這個數組轉化成字符串對象就可以了,例如:
          String str=request.getParameter(“girl”);
          Byte B[]=str.getBytes(“ISO-8859-1”);
          Str=new String(B);
          通過上述轉換的話,提交的任何信息都能正確的顯示。
          (三)    在Formget請求在服務端用request. getParameter(“name”)時返回的是亂碼;按tomcat的做法設置Filter也沒有用或者用request.setCharacterEncoding("GBK");也不管用問題是出在處理參數傳遞的方法上:如果在servlet中用doGet(HttpServletRequest request, HttpServletResponse response)方法進行處理的話前面即使是寫了:
          request.setCharacterEncoding("GBK");
          response.setContentType("text/html;charset=GBK");
          也是不起作用的,返回的中文還是亂碼!!!如果把這個函數改成doPost(HttpServletRequest request, HttpServletResponse response)一切就OK了。
          同樣,在用兩個JSP頁面處理表單輸入之所以能顯示中文是因為用的是post方法傳遞的,改成get方法依舊不行。
          由此可見在servlet中用doGet()方法或是在JSP中用get方法進行處理要注意。這畢竟涉及到要通過瀏覽器傳遞參數信息,很有可能引起常用字符集的沖突或是不匹配。
          解決的辦法是:
          1) 打開tomcat的server.xml文件,找到區塊,加入如下一行:
          URIEncoding=”GBK”
          完整的應如下:
          <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/>
          2)重啟tomcat,一切OK。
          需要加入的原因大家可以去研究 $TOMCAT_HOME/webapps/tomcat-docs/config/http.html下的這個文件就可以知道原因了。需要注意的是:這個地方如果你要是用UTF-8的時候在傳遞的過程中在Tomcat中也是要出現亂碼的情況,如果不行的話就換別的字符集。
          (四)    JSP頁面上有中文,按鈕上面也有中文,但是通過服務器查看頁面的時候出現亂碼:
               解決的辦法是:首先在JSP文件中不應該直接包含本地化的消息文本,而是應該通過<bean:message>標簽從Resource Bundle中獲得文本。應該把你的中文文本放到Application.properties文件中,這個文件放在WEB-INF/classes/*下,例如我在頁面里有姓名,年齡兩個label,我首先就是要建一個Application.properties,里面的內容應該是name=”姓名” age=”年齡”,然后我把這個文件放到WEB-INF/classes/properties/下,接下來根據Application.properties文件,對他進行編碼轉化,創建一個中文資源文件,假定名字是Application_cn.properties。在JDK中提供了native2ascii命令,他能夠實現字符編碼的轉換。在DOS環境中找到你放置Application.properties的這個文件的目錄,在DOS環境中執行一下命令,將生成按GBK編碼的中文資源文件Application_cn.properties:native2ascii ?encoding gbk Application.properties Application_cn.properties執行以上命令以后將生成如下內容的Application_cn.properties文件:name=\u59d3\u540d age=\u5e74\u9f84,在Struts-config.xml中配置:<message-resources parameter="properties.Application_cn"/>。到這一步,基本上完成了一大半,接著你就要在JSP頁面上寫<%@ page language="java" contentType="text/html;charset=GBK" %>,到名字的那個label是要寫<bean:message key=”name”>,這樣的化在頁面上出現的時候就會出現中文的姓名,年齡這個也是一樣,按鈕上漢字的處理也是同樣的。
          (五)    寫入到數據庫是亂碼:
          解決的方法:要配置一個filter,也就是一個Servelet的過濾器,代碼如同第二種時候一樣。
          如果你是通過JDBC直接鏈接數據庫的時候,配置的代碼如下:jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&characterEncoding=GBK,這樣保證到數據庫中的代碼是不是亂碼。
          如果你是通過數據源鏈接的化你不能按照這樣的寫法了,首先你就要寫在配置文件中,在tomcat 5.0.19中配置數據源的地方是在C:\Tomcat 5.0\conf\Catalina\localhost這個下面,我建立的工程是workshop,放置的目錄是webapp下面,workshop.xml的配置文件如下:
          <!-- insert this Context element into server.xml -->
          <Context path="/workshop" docBase="workshop" debug="0"
          reloadable="true" >
            <Resource name="jdbc/WorkshopDB"
                         auth="Container"
                         type="javax.sql.DataSource" />
            <ResourceParams name="jdbc/WorkshopDB">
              <parameter>
                <name>factory</name>
                <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
              </parameter>
              <parameter>
                <name>

          maxActive</name>
                <value>100</value>
              </parameter>
              <parameter>
                <name>maxIdle</name>
                <value>30</value>
              </parameter>
             
              <parameter>
                <name>maxWait</name>
                <value>10000</value>
              </parameter>
                <parameter>
               <name>username</name>
               <value>root</value>
              </parameter>
              <parameter>
               <name>password</name>
               <value></value>
              </parameter>
              <!-- Class name for mm.mysql JDBC driver -->
              <parameter>
                 <name>driverClassName</name>
                 <value>com.mysql.jdbc.Driver</value>
          </parameter>
             <parameter>
                <name>url</name>
           <value><![CDATA[jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&characterEncoding=GBK]]></value>
              </parameter>
            </ResourceParams>
          </Context>
          粗體的地方要特別的注意,和JDBC直接鏈接的時候是有區別的,如果你是配置正確的化,當你輸入中文的時候到數據庫中就是中文了,有一點要注意的是你在顯示數據的頁面也是要用<%@ page language="java" contentType="text/html;charset=GBK" %>這行代碼的。需要注意的是有的前臺的人員在寫代碼的是后用Dreamver寫的,寫了一個Form的時候把他改成了一個jsp,這樣有一個地方要注意了,那就是在Dreamver中Action的提交方式是request的,你需要把他該過來,因為在jsp的提交的過程中緊緊就是POST和GET兩種方式,但是這兩種方式提交的代碼在編碼方面還是有很大不同的,這個在后面的地方進行說明.


          文章出處:http://www.diybl.com/course/3_program/java/javajs/200829/99730_3.html

          posted @ 2008-12-15 17:09 wesley1987 閱讀(483) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 新闻| 油尖旺区| 永济市| 牡丹江市| 南投县| 焉耆| 吉木乃县| 邵阳市| 新田县| 梓潼县| 辰溪县| 政和县| 黄骅市| 姜堰市| 琼海市| 兴安县| 丹寨县| 香河县| 乐陵市| 和林格尔县| 伊金霍洛旗| 尤溪县| 徐水县| 疏勒县| 苗栗市| 绵竹市| 安阳市| 游戏| 陕西省| 垦利县| 丹巴县| 吉林市| 佛冈县| 奉化市| 汕头市| 大理市| 克东县| 乐清市| 龙川县| 交城县| 平武县|