Java海闊天空

          編程是我的生活,但生活不僅僅是編程。

          Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境

          第一章 搭建Struts2開發(fā)環(huán)境

          Struts2概述

                 Struts的官方網(wǎng)站上,寫著下面兩段話:

          Apache Struts 2 is an elegant, extensible framework for creating enterprise-ready Java web applications. The framework is designed to streamline the full development cycle, from building, to deploying, to maintaining applications over time.

          Apache Struts 2 was originally known as WebWork 2. After working independently for several years, the WebWork and Struts communities joined forces to create Struts2. This new version of Struts is simpler to use and closer to how Struts was always meant to be.

          其大意為:Apache Struts2是一個(gè)為企業(yè)級(jí)應(yīng)用打造的優(yōu)秀的、可擴(kuò)展的WEB框架,該框架旨在充分精簡(jiǎn)應(yīng)用程序的開發(fā)周期,從而減少創(chuàng)建、發(fā)布直到應(yīng)用所花費(fèi)的時(shí)間。

          Apache Struts2原本就是舉世聞名的Webwork2,在各自經(jīng)歷幾年的發(fā)展之后,StrutsWebWork社區(qū)決定合二為一,也就是今天的Struts2

          Struts是一個(gè)基于Model2MVC框架,為應(yīng)用程序的WEB層提供了良好的結(jié)構(gòu)嚴(yán)謹(jǐn)?shù)膶?shí)現(xiàn)。Struts發(fā)展較早,早期的Struts1.X已被很多J2EE程序員熟悉,經(jīng)過多年來的發(fā)展,這支隊(duì)伍變得越來越大,很多企業(yè)級(jí)應(yīng)用程序都是基于Struts開發(fā)的。

          Struts2Struts1.X已經(jīng)不能再放到一起比較,雖然都是對(duì)MVC架構(gòu)模式的實(shí)現(xiàn),本質(zhì)卻完全不同。Struts2的前身是WebWork,其實(shí)現(xiàn)方式和功能都要優(yōu)于Struts1.X,但是,Struts先入為主,很多應(yīng)用程序都基于Struts,其生命力和普及度使得WebWork落于下風(fēng)。隨著新思想和新架構(gòu)的不斷涌入,特別是WEB2.0被大量提及,Struts1.x顯然無法跟上日新月異的變化,在很多應(yīng)用上顯得力不從心,最終催生了Struts2.0。可以說Struts2.0是為變而變。

          很大程度上,Struts2.0無法避開投機(jī)取巧的嫌疑。不過,借助Struts的名聲,加上WebWork構(gòu)建良好的框架,二者取長補(bǔ)短,確實(shí)不失為一種黃金組合和一種絕佳的宣傳方式。

          筆者杜撰此文時(shí),可以下載到的最新版本為2.1.0,但他的魅力已初露尖角,應(yīng)該會(huì)有很好的前途。

          Struts2的新特征

          如果讀者熟悉Struts1.X,會(huì)發(fā)現(xiàn)Struts2Struts1.X有了巨大的變化:

          Action :

          Struts1要求Action類繼承一個(gè)抽象基類。Struts1的一個(gè)普遍問題是使用抽象類編程而不是接口。

          Struts 2 Action類可以實(shí)現(xiàn)一個(gè)Action接口,也可實(shí)現(xiàn)其他接口,使可選和定制的服務(wù)成為可能。Struts2提供一個(gè)ActionSupport基類去實(shí)現(xiàn)常用的接口。Action接口不是必須的,任何有execute標(biāo)識(shí)的POJO對(duì)象都可以用作Struts2Action對(duì)象。

          線程模式:

          Struts1 Action是單例模式并且必須是線程安全的,因?yàn)閮H有Action的一個(gè)實(shí)例來處理所有的請(qǐng)求。單例策略限制了Struts1 Action能作的事,并且要在開發(fā)時(shí)特別小心。Action資源必須是線程安全的或同步的。

          Struts2 Action對(duì)象為每一個(gè)請(qǐng)求產(chǎn)生一個(gè)實(shí)例,因此沒有線程安全問題。(實(shí)際上,servlet容器給每個(gè)請(qǐng)求產(chǎn)生許多可丟棄的對(duì)象,并且不會(huì)導(dǎo)致性能和垃圾回收問題)

          Servlet 依賴:  

          Struts1 Action 依賴于Servlet API ,因?yàn)楫?dāng)一個(gè)Action被調(diào)用時(shí)HttpServletRequest HttpServletResponse 被傳遞給execute方法。

          Struts 2 Action不依賴于容器,允許Action脫離容器單獨(dú)被測(cè)試。如果需要,Struts2 Action仍然可以訪問初始的requestresponse。但是,其他的元素減少或者消除了直接訪問HttpServetRequest HttpServletResponse的必要性。

          可測(cè)性:

          測(cè)試Struts1 Action的一個(gè)主要問題是execute方法暴露了servlet API(這使得測(cè)試要依賴于容器)。一個(gè)第三方擴(kuò)展--Struts TestCase--提供了一套Struts1的模擬對(duì)象(來進(jìn)行測(cè)試)。

          Struts 2 Action可以通過初始化、設(shè)置屬性、調(diào)用方法來測(cè)試,“依賴注入”支持也使測(cè)試更容易。

          捕獲輸入:

          Struts1 使用ActionForm對(duì)象捕獲輸入。所有的ActionForm必須繼承一個(gè)基類。因?yàn)槠渌?/span>JavaBean不能用作ActionForm,開發(fā)者經(jīng)常創(chuàng)建多余的類捕獲輸入。動(dòng)態(tài)BeanDynaBeans)可以作為創(chuàng)建傳統(tǒng)ActionForm的選擇,但是,開發(fā)者可能是在重新描述(創(chuàng)建)已經(jīng)存在的JavaBean(仍然會(huì)導(dǎo)致有冗余的javabean)。

          Struts 2直接使用Action屬性作為輸入屬性,消除了對(duì)第二個(gè)輸入對(duì)象的需求。輸入屬性可能是有自己()屬性的rich對(duì)象類型。Action屬性能夠通過web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對(duì)象類型,包括業(yè)務(wù)對(duì)象,能夠用作輸入/輸出對(duì)象。這種ModelDriven 特性簡(jiǎn)化了taglib對(duì)POJO輸入對(duì)象的引用。

          表達(dá)式語言:

          Struts1 整合了JSTL,因此使用JSTL EL。這種EL有基本對(duì)象圖遍歷,但是對(duì)集合和索引屬性的支持很弱。

          Struts2可以使用JSTL,但是也支持一個(gè)更強(qiáng)大和靈活的表達(dá)式語言--"Object Graph Notation Language" (OGNL). 

          綁定值到頁面(view:

          Struts 1使用標(biāo)準(zhǔn)JSP機(jī)制把對(duì)象綁定到頁面中來訪問。

          Struts 2 使用 "ValueStack"技術(shù),使taglib能夠訪問值而不需要把你的頁面(view)和對(duì)象綁定起來。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面(view)。

          類型轉(zhuǎn)換:

          Struts 1 ActionForm 屬性通常都是String類型。Struts1使用Commons-Beanutils進(jìn)行類型轉(zhuǎn)換。每個(gè)類一個(gè)轉(zhuǎn)換器,對(duì)每一個(gè)實(shí)例來說是不可配置的。

          Struts2 使用OGNL進(jìn)行類型轉(zhuǎn)換。提供基本和常用對(duì)象的轉(zhuǎn)換器。

          校驗(yàn):  

          Struts 1支持在ActionFormvalidate方法中手動(dòng)校驗(yàn),或者通過Commons Validator的擴(kuò)展來校驗(yàn)。同一個(gè)類可以有不同的校驗(yàn)內(nèi)容,但不能校驗(yàn)子對(duì)象。

          Struts2支持通過validate方法和XWork校驗(yàn)框架來進(jìn)行校驗(yàn)。XWork校驗(yàn)框架使用為屬性類類型定義的校驗(yàn)和內(nèi)容校驗(yàn),來支持chain校驗(yàn)子屬性 

          Action執(zhí)行的控制:

          Struts1支持每一個(gè)模塊有單獨(dú)的Request Processors(生命周期),但是模塊中的所有Action必須共享相同的生命周期。

          Struts2支持通過攔截器堆棧(Interceptor Stacks)為每一個(gè)Action創(chuàng)建不同的生命周期。堆棧能夠根據(jù)需要和不同的Action一起使用。

          注:以上資料從網(wǎng)上搜集,來源:Struts開發(fā)組,翻譯:tianxinet(胖猴)。

          Struts2的環(huán)境要求

                 Apache Struts2的環(huán)境需求如下:

                        Servlet API 2.4

          JSP API 2.0

          Java 5

          需要提醒的是,在Struts中會(huì)用到Annotation,所以請(qǐng)將JDK版本升級(jí)到1.5.

          Struts2環(huán)境搭建

          4.1Struts的下載

                 從游覽器輸入http://people.apache.org/builds/struts/,即可看到Struts的各個(gè)版本列表。從下圖中可以發(fā)現(xiàn),現(xiàn)在Struts2.0的最新版是2.1.0,發(fā)布于20071029           

                

          (圖1

                

                 (2)

          從圖2中可以看出,即可以分開下載,又可以一次全部下載。全部下載的大小為83M,

                 下表注明了各個(gè)壓縮包的作用。

          壓縮包名稱

          作用

          struts-2.1.0-docs.zip 

          文檔,包含了Struts2API

          struts-2.1.0-lib.zip 

          構(gòu)建Struts2工程所需要的包

          struts-2.1.0-src.zip 

          Struts2的所有源代碼

          struts2-blank-2.1.0.war

          空白工程

          struts-2.1.0-all.zip

          大集成,包括上面所有的內(nèi)容

          4.2 開發(fā)工具介紹

                 目前J2EE開發(fā)工具主要分為EclipseNetBeans兩大陣營,Eclipse的最高版本為3.3,NetBeans的最高版本為6.0.今天剛剛從新聞上看到,NetBeans6.0的英文正式版正式發(fā)布了,真是可喜可賀。

                 筆者在開發(fā)時(shí)以Eclipse為主,但Eclipse并不支持WEB開發(fā),需要安裝相應(yīng)插件。MyEclipse是一個(gè)功能強(qiáng)大且框架支持非常廣泛的WEB開發(fā)插件,該產(chǎn)品是收費(fèi)項(xiàng)目。目前MyEclipse的最高版本為6.0,即便如此,尚不支持Struts2.0,我們只能手工配置Struts2.0的開發(fā)環(huán)境。

          4.3 庫文件

                 從網(wǎng)站上下載的Struts2包含了二三十個(gè)庫文件,但大多數(shù)是可選的,有些庫是插件,用于和其他框架的整合。

                 讀者可自行下載struts2-blank-2.1.0.war壓縮包,展開后是一個(gè)非常簡(jiǎn)單的項(xiàng)目,從WEB-INF/lib目錄中可以看到5個(gè)庫文件,解釋如下:

          包名

          說明

          commons-logging-1.0.4.jar

          日志管理

          freemarker-2.3.8.jar

          表現(xiàn)層框架,定義了struts2的可視組件主題(theme

          ognl-2.6.11.jar

          OGNL表達(dá)式語言,struts2支持該EL

          struts2-core-2.0.10.jar

          struts2的核心庫

          xwork-2.0.4.jar

          webwork的核心庫,自然需要它的支持

                 (圖3

          4.3 使用Eclipse搭建Struts2的開發(fā)環(huán)境

          4.3.1創(chuàng)建用戶庫

                 Struts2所需的包建成用戶庫,可以更加方便地進(jìn)行管理和使用,這是一個(gè)好的習(xí)慣——編程從習(xí)慣開始。

                 1.選擇菜單Window->Preferences->Java->Build Path->User Libraries。如圖4

                

                 (4)

                 2.點(diǎn)擊右側(cè)的New…按鈕,創(chuàng)建一個(gè)新的用戶庫,彈出如圖5所示對(duì)話框:

                

                 (5)


                 3.
          輸入用戶庫的名稱,如:Struts2,點(diǎn)擊OK按鈕,該對(duì)話框自動(dòng)關(guān)閉。結(jié)果如圖6所示:

                

                 (圖6

                 此時(shí),右側(cè)的按鈕被點(diǎn)亮。

                 4.點(diǎn)擊“Add JARS…”按鈕,添加用戶庫所需的庫文件,在Struts2中,至少要包含上文中提到的5個(gè)庫文件。添加后效果如圖7所示:

                

                 (圖7

                 5.點(diǎn)擊“OK”完成。

          4.3.2開發(fā)第一個(gè)Struts2應(yīng)用程序——世界,你好

                 開發(fā)WEB應(yīng)用程序,本文使用了MyEclipse插件。該插件為收費(fèi)軟件,目前提供英文版和日文版,不同的版本可以運(yùn)行在WindowsLinux等操作系統(tǒng)上。為了方便用戶,MyEclipse有一個(gè)Full版,連同Eclipse一起安裝,對(duì)于初學(xué)者而言,可以減少很多麻煩和困擾。

                 讀者可自行去http://www.myeclipseide.com/網(wǎng)站下載該軟件的共享版本。建議讀者下載MyEclipse5.5(這也是筆者使用的版本),這個(gè)版本相對(duì)比較穩(wěn)定,MyEclipse6.0還處于測(cè)試之中。

                 入門教程總是以HelloWorld作為學(xué)習(xí)的第一步,自然筆者也不例外。本示例從游覽器輸入網(wǎng)址,提交請(qǐng)求后在頁面中顯示“世界,你好”的信息。

                 1.新建WEB工程,如圖8所示:

                

                 (圖8

                 2.點(diǎn)擊“Next”,輸入工程名,如圖9所示:

                

                 (圖9

                 3.點(diǎn)擊“Finish”完成。

                 4.現(xiàn)在將Struts2的庫導(dǎo)入到工程中,右擊工程名稱彈出快捷菜單,選擇Build Path->Add Libraries…,如圖10所示。

                

                 (圖10

                 5.從彈出的對(duì)話框中選擇“User Libraries”,如圖11所示。

                

                 (圖11

                 6. 單擊下一步,我們看到,上文中創(chuàng)建的用戶庫出現(xiàn)在列表中,在“Struts2前的復(fù)選框上打勾,點(diǎn)擊“Finish”完成。如圖12

                

                 (圖12

                 7.Struts2所帶的過濾器org.apache.struts2.dispatcher.FilterDispatcher配置到工程的web.xml文件中,默認(rèn)情況下,該過濾器攔截請(qǐng)求字符串中以.action結(jié)尾的請(qǐng)求,并將該請(qǐng)求委托給指定的Action進(jìn)行處理。最直觀的表現(xiàn)就是調(diào)用Actionexecute()方法。代碼如下:

          代碼清單1web.xml

             <filter>

                 <filter-name>struts2</filter-name>

                 <filter-class>

                     org.apache.struts2.dispatcher.FilterDispatcher

                 </filter-class>

              </filter>

              <filter-mapping>

                 <filter-name>struts2</filter-name>

                 <url-pattern>/*</url-pattern>

              </filter-mapping>

          注:在Sturts1.X中,該行為由Servlet完成。

          8.創(chuàng)建包com.lizanhong.action,并在該包中創(chuàng)建HelloWorldAction類,該類繼承自com.opensymphony.xwork2.ActionSupport。理論上,Action可以不繼承任何類或?qū)崿F(xiàn)任何接口,以增強(qiáng)程序的可測(cè)試性,這也是和Struts1.X不同的地方。但是,繼承自ActionSupport可以減少更多的編碼工作。

                 ActionSupport中,定義了方法execute(),當(dāng)用戶向該Action發(fā)送請(qǐng)求時(shí),會(huì)自動(dòng)調(diào)用。程序代碼如下:

          代碼清單2HelloWorldAction.java

          package com.lizanhong.action;

          import com.opensymphony.xwork2.ActionSupport;

          publicclass HelloWorldAction extends ActionSupport {

              @Override

              public String execute() throws Exception {

                 System.out.println("Action執(zhí)行了。");

                 returnSUCCESS;

              }

          }

          注:ActionSupportStruts2提供的類,功能類似于Struts1.x中的Action類,該類封裝了幾個(gè)有用的功能,比如:

          getText():從資源文件中獲取國際化消息。

          addFieldError():驗(yàn)證輸入未通過時(shí)添加錯(cuò)誤消息,支持國際化。

          execute():該方法一般會(huì)被重寫,當(dāng)客戶端向Action發(fā)送請(qǐng)求時(shí),會(huì)調(diào)用此方法。

          總結(jié)起來,該類主要提供了錯(cuò)誤消息的支持和國際化支持。

                 在工程類路徑下創(chuàng)建struts.xml文件,這是Struts2的配置文件,類似于Struts1.x中的struts-config.xml,在struts.xml文件中可以配置ActionBeanInterceptor等組件。

          代碼清單3struts.xml

          <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

          <struts>

              <include file="struts-default.xml"></include>

             

              <package name="a" extends="struts-default">

                 <action name="helloworld" class="com.lizanhong.action.HelloWorldAction">

                     <result>/result.jsp</result>

                 </action>

              </package>

          </struts>

          注:WEB應(yīng)用程序的類路徑是指WEB-INF/classes目錄,在Eclipse中,創(chuàng)建在src目錄下的文件最終發(fā)布后會(huì)自動(dòng)復(fù)制到WEB-INF/classes目錄下。

          代碼清單3中涉及到很多標(biāo)簽,以下是簡(jiǎn)單的解釋:

          標(biāo)簽名稱

          說明

          include

          包含其他xml文件,在示例中,這意味著struts.xml可以訪問定義在struts-default.xml文件中的組件。

          該元素可以使得Struts2定義多個(gè)配置文件,“分而治之”。

          要注意的是,任何一個(gè)struts2配置文件都應(yīng)該和struts.xml有相同的格式,包括doctype,并且可以放在類路徑下的任何地方。

          package

          Action或截?cái)r器分組。

          name:名稱,必填項(xiàng),名稱自定義,沒特別要求。方便別的package引用。

          extendspackage能繼承其他的package,即通過該屬性實(shí)現(xiàn),值為另一個(gè)packagename

          在示例中,extends =”struts-default”是從struts-default.xml中繼承的。

          action

          定義Actionname屬性為訪問時(shí)用到的名稱,class屬性是Action的類名。

          result

          根據(jù)Action的返回值定義頁面導(dǎo)航。

          Action的預(yù)定義的返回值有:

          String SUCCESS = "success";

          String NONE    = "none";

          String ERROR   = "error";

          String INPUT   = "input";

          String LOGIN   = "login";

          比如,當(dāng)Action返回SUCCESS時(shí)希望轉(zhuǎn)到ok.jsp頁面,則可以這樣寫:

          <result name=”success”>ok.jsp</result>

              其中,name的缺省為success

                 9.result.jsp是一個(gè)非常簡(jiǎn)單的jsp頁面,輸出“世界,你好”。

          代碼清單4result.jsp

          <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

          <%

          String path = request.getContextPath();

          String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

          %>

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

          <html>

           <head>

              <base href="<%=basePath%>">

             

              <title>My JSP 'result.jsp' starting page</title>

             

              <meta http-equiv="pragma" content="no-cache">

              <meta http-equiv="cache-control" content="no-cache">

              <meta http-equiv="expires" content="0">   

              <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

              <meta http-equiv="description" content="This is my page">

              <!--

              <link rel="stylesheet" type="text/css" href="styles.css">

              -->

           </head>

           

           <body>

              世界,你好. <br>

           </body>

          </html>

          9.發(fā)布工程,在瀏覽器中輸入:http://localhost:8081/Struts2Demo/helloworld.action,在控制臺(tái)輸出“Action執(zhí)行了。”

          10.在瀏覽器的結(jié)果如下圖13

          (13)

          struts.xml的定義文件

          代碼清單5struts-2.0.dtd

          <?xml version="1.0" encoding="UTF-8"?>

          <!-- START SNIPPET: strutsDtd -->

          <!--

             Struts configuration DTD.

             Use the following DOCTYPE

            

             <!DOCTYPE struts PUBLIC

              "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

              "http://struts.apache.org/dtds/struts-2.0.dtd">

          -->

          <!ELEMENT struts (package|include|bean|constant)*>

          <!ELEMENT package (result-types?, interceptors?, default-interceptor-ref?, default-action-ref?, global-results?, global-exception-mappings?, action*)>

          <!ATTLIST package

              name CDATA #REQUIRED

              extends CDATA #IMPLIED

              namespace CDATA #IMPLIED

              abstract CDATA #IMPLIED

              externalReferenceResolver NMTOKEN #IMPLIED

          > 

          <!ELEMENT result-types (result-type+)>

          <!ELEMENT result-type (param*)>

          <!ATTLIST result-type

              name CDATA #REQUIRED

              class CDATA #REQUIRED

              default (true|false) "false"

          > 

          <!ELEMENT interceptors (interceptor|interceptor-stack)+>

          <!ELEMENT interceptor (param*)>

          <!ATTLIST interceptor

              name CDATA #REQUIRED

              class CDATA #REQUIRED

          > 

          <!ELEMENT interceptor-stack (interceptor-ref+)>

          <!ATTLIST interceptor-stack

              name CDATA #REQUIRED

          > 

          <!ELEMENT interceptor-ref (param*)>

          <!ATTLIST interceptor-ref

              name CDATA #REQUIRED

          > 

          <!ELEMENT default-interceptor-ref (param*)>

          <!ATTLIST default-interceptor-ref

              name CDATA #REQUIRED

          > 

          <!ELEMENT default-action-ref (param*)>

          <!ATTLIST default-action-ref

              name CDATA #REQUIRED

          > 

          <!ELEMENT global-results (result+)>

          <!ELEMENT global-exception-mappings (exception-mapping+)>

          <!ELEMENT action (param|result|interceptor-ref|exception-mapping)*>

          <!ATTLIST action

              name CDATA #REQUIRED

              class CDATA #IMPLIED

              method CDATA #IMPLIED

              converter CDATA #IMPLIED

          > 

          <!ELEMENT param (#PCDATA)>

          <!ATTLIST param

              name CDATA #REQUIRED

          > 

          <!ELEMENT result (#PCDATA|param)*>

          <!ATTLIST result

              name CDATA #IMPLIED

              type CDATA #IMPLIED

          > 

          <!ELEMENT exception-mapping (#PCDATA|param)*>

          <!ATTLIST exception-mapping

              name CDATA #IMPLIED

              exception CDATA #REQUIRED

              result CDATA #REQUIRED

          > 

          <!ELEMENT include (#PCDATA)>

          <!ATTLIST include

              file CDATA #REQUIRED

          > 

          <!ELEMENT bean (#PCDATA)>

          <!ATTLIST bean

              type CDATA #IMPLIED

              name CDATA #IMPLIED

              class CDATA #REQUIRED

              scope CDATA #IMPLIED

              static CDATA #IMPLIED

              optional CDATA #IMPLIED

          > 

          <!ELEMENT constant (#PCDATA)>

          <!ATTLIST constant

              name CDATA #REQUIRED

              value CDATA #REQUIRED   

          > 

          <!-- END SNIPPET: strutsDtd -->

          總結(jié)

                 Struts是一個(gè)時(shí)下非常流行并被許多企業(yè)級(jí)應(yīng)用程序采用的WEB框架,Struts2Struts1.x的基礎(chǔ)上進(jìn)行了大量改造,和WebWork合二為一,引進(jìn)了更多的新觀念、新思想和新技術(shù),使之更符合J2EE應(yīng)用程序開發(fā)的需要。

                 “工欲善其事,必先利其器”,掌握一兩種開發(fā)工具,能夠大大提高編程效率,也能增強(qiáng)開發(fā)者的信心。學(xué)習(xí)一門新技術(shù)時(shí),第一個(gè)應(yīng)用程序非常重要,如果第一個(gè)最簡(jiǎn)單的程序運(yùn)行不成功,會(huì)使得學(xué)習(xí)者的積極性大打折扣,這也是筆者不愿意看到的。所以,本章圖文并茂地詳細(xì)介紹了Struts2應(yīng)用程序的開發(fā)過程,并盡可能少的提及陌生的概念和術(shù)語。

          posted on 2008-07-08 22:11 李贊紅 閱讀(86028) 評(píng)論(26)  編輯  收藏

          評(píng)論

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境[未登錄] 2008-07-08 23:24 javaread.com

          寫的不錯(cuò)  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2008-07-09 00:03 fiestay

          寫得很詳細(xì),圖文并茂,生動(dòng)!
          最近也打算學(xué)習(xí)一下Struts2,希望博主能持續(xù)更新。謝謝!  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境[未登錄] 2008-07-09 08:22 飄雨

          我想學(xué)Struts2,看到博主寫的非常好,支持博主繼續(xù)更新!!  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2008-07-09 11:19 zhero

          很詳細(xì),寫的很認(rèn)真。  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2008-07-09 13:07 44you

          我沒用過,不過能看明白,不錯(cuò)  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2008-07-09 13:14 creasure

          寫得確實(shí)很詳細(xì)很認(rèn)真。不過上邊配置struts2環(huán)境那部分完全可以簡(jiǎn)寫下。感覺你把簡(jiǎn)單的東西寫復(fù)雜了。  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2008-07-09 17:18 如坐春風(fēng)

          很好!  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2008-07-09 22:23 Achilles

          一切按文章寫的操作,結(jié)果出錯(cuò)如下(但直接輸入http://http://localhost:8080/TestStruts/WebContent/result.jsp可以看到歡迎文字,我是把整個(gè)工程copy到tomcat的webapps目錄然后創(chuàng)建虛擬目錄的)

          HTTP Status 404 - /TestStruts/WebContent/helloworld.action

          type Status report

          message /TestStruts/WebContent/helloworld.action

          description The requested resource (/TestStruts/WebContent/helloworld.action) is not available.
          Apache Tomcat/6.0.16  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2008-07-10 10:03 龐永慶

          你好 我是出版社的編輯,我看到你博客中的內(nèi)容,感覺寫的非常好.
          現(xiàn)在正需要來寫一本Struts簡(jiǎn)單入門的書。
          如果想把這些內(nèi)容和更多的人分享,可以和我聯(lián)系,把這些東西寫成書。
          真誠希望和你合作。
          我的郵箱:books_522008@yahoo.com.cn
          或者加我的MSN:pyq_19852008@hotmail.com  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2008-07-10 15:37 于翔

          寫得確實(shí)不錯(cuò),講得很詳細(xì)到位,希望繼續(xù)寫下去!!!  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2009-02-17 22:41 neilalaer2

          @Achilles

          這個(gè)問題怎么解決呢? 是配置問題嗎?  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2010-03-13 01:42 calmton

          東西寫得不錯(cuò),  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2010-04-21 16:21 馬金澤

          作者的文章非常出色,有想轉(zhuǎn)載的沖動(dòng)。  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境[未登錄] 2011-08-24 16:59 啦啦啦

          寫的不錯(cuò),繼續(xù)努力  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2011-12-14 23:01 沉默反駁

          垃圾,現(xiàn)在都2.3版本了,一點(diǎn)用不上,而且里面含蓋的內(nèi)容基本上是基于已經(jīng)掌握了框架搭建技術(shù).根本對(duì)初學(xué)者很難理解.  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2011-12-15 11:59

          這是2008年的文章,真沒品德。@沉默反駁
            回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2012-08-28 22:45 whr

          我的運(yùn)行不了
            回復(fù)  更多評(píng)論   

          # erg 2013-03-30 13:00 wefw

          wegw  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境[未登錄] 2013-05-13 10:16 小亮

          太幫了、、、  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2013-07-06 16:39 幻影

          寫的真的很不錯(cuò)。強(qiáng)烈推薦。  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境[未登錄] 2014-01-06 19:12 zhang

          jar包內(nèi)容不全  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2014-02-19 15:37 琪琪

          good  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2014-10-08 09:52 xioabai

          66  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2014-12-08 20:47 移動(dòng)的馬桶

          莫道君行早,更有早行人···感慨頗深啊  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境 2015-03-24 18:15 zuidaima

          java struts框架demo使用實(shí)例教程源代碼下載地址:http://zuidaima.com/share/kstruts-p1-s1.htm  回復(fù)  更多評(píng)論   

          # re: Struts2教程--第一章 搭建Struts2開發(fā)環(huán)境[未登錄] 2015-12-05 17:04 abc

          博主用的是MyEclipse吧。。  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          <2015年12月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統(tǒng)計(jì)

          常用鏈接

          留言簿(12)

          隨筆檔案(28)

          相冊(cè)

          技術(shù)友情博客

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 巨野县| 股票| 来安县| 兴隆县| 鹤峰县| 古丈县| 江华| 太康县| 随州市| 张掖市| 长沙市| 迭部县| 偃师市| 海口市| 陕西省| 大城县| 根河市| 呼伦贝尔市| 临邑县| 思南县| 曲靖市| 房山区| 青铜峡市| 宾川县| 横山县| 渝北区| 永州市| 彭泽县| 焦作市| 澎湖县| 张家界市| 固镇县| 霍林郭勒市| 长治县| 新兴县| 紫云| 三门县| 巴中市| 芮城县| 南康市| 滕州市|