零碎知識

不設限發表於2012-03-18
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

path代表的是當前的request所在的上下文的環境
basePath就是基礎路徑:協議+://+伺服器名稱+埠號+當前的路徑

basePath:http://ztd-pc:8080/Struts2-0500_ActionMethod_1/
request.getContextPath():/Struts2-0500_ActionMethod_1

實際上Action裡面的方法作用在於為每一個特定的請求指明在Action中要呼叫的方法\

方法也可以不在struts.xml中定義而是在呼叫這個方法的時候直接的在Action的後邊加上"!methodName"

這樣做的好處是我們可以簡化struts.xml,是程式碼變得更加的簡介,其實這還不是最簡潔的,最簡潔的是:使用萬用字元

指定當前的struts為開發模式: <constant name="struts.devMode" value="true" />

配置package期中name和namespace都是根據需要去定名字的,但是這些名字最好是按照包的名字去取,因為這樣
會使真實的Action所在的source包和當前的Action配置的包的名字一一對應,這樣的好處就是清晰明瞭,當然namespace
是名稱空間,當你要訪問某一個Action的時候,必須要帶上它的.
 <package name="user" extends="struts-default" namespace="/user">
        <action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
            <result>/user_add_success.jsp</result>
        </action>
        
        <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
            <result>/user_add_success.jsp</result>
        </action>
    </package>

    Action萬用字元配置:

     <package name="actions" extends="struts-default" namespace="/actions">
        <action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
            <result>/Student{1}_success.jsp</result>
        </action>

一個萬用字元只能夠實現對方法的統配,如果要實現對Action和方法都可以統配的話,那麼需要的是兩個萬用字元
第一個萬用字元用來統配Action,第二個萬用字元用來統配方法和返回的結果

        <!--這種萬用字元的配置看起來就更加具有誘惑力了-->
        <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
            <result>/{1}_{2}_success.jsp</result>
            <!-- {0}_success.jsp -->
        </action>
    </package>

    設定字元的編碼:<constant name="struts.i18n.encoding" value="UTF-8" />但是再好的設定還是沒有把所有的頁面的字元格式都統一稱為UTF-8的好,這才是
    解決問題的最有效的方法

    當複製一個web專案的時候,除了需要修改一下當前的網站的名稱之外還需要修改一下它的properties裡面的Web屬性裡面的Web Content-root這個才是在tomcat會去查詢的網站的根的路徑

<s:fielderror>用法:
其中fieldName指定的是出錯的屬性的名字,theme指定的是錯誤顯示的格式,simple的格式為一種<ul><li></li></ul>的格式
在後臺指定filedName和訊息,
this.addFieldError("name", "對不起不是管理員,不準進入!");
this.addFieldError("name", "還是不行!");
this.addFieldError("age", "年齡有問題大哥!");
this.addFieldError("age", "AGE FORMAT IS WRONG!!!!");

前臺獲取訊息,獲取的時候可以使用
 <s:fielderror fieldName="name" theme="simple">
  <s:property value="errors.name[0]"/>
  </s:fielderror>

形式,也可以直接的使用
<s:property value="errors.name[0]"/>
這種形式,而且可以指定某一個fieldName裡面的第幾個錯誤,因為它是陣列的格式返回過來的

問題:取得map型別request,response,application,真實型別:HttpServletRequest,HttpSession,ServletContext的引用


Struts的前三者為什麼依賴於容器?????

它們有什麼區別???區別在於第一個1500後邊有兩個"_"
而下面的只有一個"_"
   http://ztd-pc:8080/Struts2_1500__ResultType_1/
   http://ztd-pc:8080/Struts2_1500_ResultType_1/

而下面的區別在於第一個Element裡面的"l"是小寫的,而後邊的是大寫的
http://ztd-pc:8080/Struts2_1200_AccessWebElements_1/
http://ztd-pc:8080/Struts2_1200_AccessWebELements_1/

為form賦值的時候直接把當前要訪問的Action放上去就可以了,因為瀏覽器會預設的幫助我們把專案的名字加上去的
http://ztd-pc:8080/Struts2_1200_AccessWebELements_1/login/login1

這說明struts2裡不同的標籤對ognl的表示式的理解是不一樣的。如果當有的標籤“看不懂”類似“#myMap['key1']”的語句時,就要用%{}來把這括進去,“翻譯”一下了。   

包含其他的struts.xml檔案     <include file="login.xml" />

配置常量::<constant name="struts.i18n.encoding" value="UTF-8" />  開發方式 <constant name="struts.devMode" value="true" />


配置預設的jsp
<package name="default" namespace="/" extends="struts-default">
    <default-action-ref name="index"></default-action-ref>
    <action name="index">
    <result>/default.jsp</result>
    </action>
    </package>

    http://ztd-pc:8080/Struts2_1500__ResultType_1/

    http://ztd-pc:8080/Struts2_1500_ResultType_1/

介面包:userDAO只是單純的負責與資料庫打交道
實體包:專案中使用到的實體
服務包:專門為了實現業務而使用的包


面向介面程式設計的好處:

可以為介面新增多個不同的實類,根據業務需求去例項化一個介面的子類,一個具體物件,而具體的功能不用變
介面可以繼承,方法不用全部的去使用,可以使用一個或者多個.
面向抽象程式設計的好處:就是靈活
對映和反射的區別:對映是一對一的,而反射是一種查詢的方法. 

設定el表示式可用

<%@ page isELIgnored="false" %>

i18n.reload、configuration.xml.reload

設定struts2為開發模式
<constant name="struts.devMode" value="true" />

Action的規定:
1.如果是普通類只需要有public String execute(){}方法就可以了
2.實現Action介面類
3.繼承了ActionSupport類

在做專案的時候,如果一個專案是拷貝的另外的一個專案的話,除了需要給這個專案重新的命名之外,還需要修改它的Web Project Setting屬性(eclipse裡面是這樣的),在myEclipse裡面修改的也是webRoot屬性好像是

而且在修改之後需要把tomcat清空,否則新建的專案很難被識別的
    
實際上在配置struts.xml的時候,<package>屬性裡面的name屬性只是作為一個標記來使用的,用來告訴別人這個package裡面定義的action都是用來處理哪一個包下面的action請求的並沒有其他特殊的作用,不過一個好的習慣是按照包的名字來配置action這樣做的好處是你可以很清楚的知道,哪一個包是幹嘛的,也容易讓別人來看

配置struts.xml的時候,實際上那個namespace跟實際的Action所在的類之間也沒有必然的關係,它也是一個指示的標誌,不過在訪問具體的某個
Action的時候,你必須要把它給加上,如果不加那麼程式會去預設的package裡面去查詢,如果配置了但是裡面沒有對應的action也是會報錯的,它
的配置原則和name的配置原則是一模一樣的,程式之所以可以可以呼叫配置好的Action是因為在配置package裡面的action的時候需要指定類的位置,所以說對於Action的配置而言,很簡單隻需要把自己的package的名字配置的跟自己的Action所在的包的名字相同就可以了.

而result裡面的返回的jsp頁面的結果需要注意配置好它的位置,為什麼呢?你不配置好的話,tomcat它是找不到的,在Action返回頁面的時候,它是以當前的專案為根節點的,所以直接放在了webContent目錄下面的檔案需要"/"代表的是當前的web根目錄下面的jsp檔案,如果是webContent/aa則需要配置成為/aa/xxx.jsp

junit使用:junit3 過程:1.匯入junit的jar包 2.要測試的類繼承testCase類 3.被測試的方法命名為testxxx()
junit使用:junit4 可以使用junit3的方法,也可以直接在需要測試的方法上加上@org.junit.Test annotation然後方法命名為testxxx()就可以了

 
Eclipse3.5 反編譯外掛 線上安裝 http://java.decompiler.free.fr/jd-eclipse/update
Eclipse3.5 svn 線上安裝 http://subclipse.tigris.org/update_1.6.x

相關文章