Struts 1基础入门
?
?
學習內容
??框架的概念
??Struts 1體系結構
??Struts 1運行流程
能力目標
??了解MVC模式的優缺點
??理解框架的概念
??會使用MyEclipse進行Struts 1開發
?
本章簡介
在上一階段的學習中,我們通過使用MVC模式進行了多個項目的開發。在MVC模式中,JavaBean實現業務邏輯,Servlet實現流程控制,JSP負責數據顯示,這樣的設計使程序的層次更加清晰,項目分工更加明確,代碼耦合度也大大降低。但是在實際應用中,MVC模式也逐漸暴露出了諸多缺陷:開發效率低、結構不一致、難以重用等等。
Struts框架的誕生可以在很大程度上彌補這些缺陷??蚣?#xff08;framework)是某種應用的半成品,是一個可重用、可定制的組件。通過使用框架,我們可以更加簡單、高效的進行開發,并且能夠保證程序具有良好的健壯性、重用性和擴展性。
本章將重點學習基于MVC模式的Struts 1框架,包括Struts 1的體系結構和運行流程,最后會介紹如何使用MyEclipse進行Struts 1開發。
核心技能部分
1.1?MVC模式的優缺點
MVC是Model、View、Controller的縮寫,分別代表了三個組成部分:模型、視圖、控制器。在上一階段的學習中,我們使用JavaBean作為Model實現業務邏輯,使用JSP作為View實現數據顯示,使用Servlet作為Controller實現流程控制,我們把這種開發模型稱之為Model2。顯然,Model2開發模型是基于MVC模式的。大家可以通過圖1.1.1復習一下Model2的工作原理。
?
圖1.1.1 Model2工作原理
MVC是一種軟件設計模式,它把應用程序分割成了模型、視圖、控制器三個部分,每個部分各司其職,這種設計使得視圖和業務實現了分離,代碼耦合性大大降低,有利于工程化項目管理。
MVC模式具有組件化特點,適合大規模應用的開發,但是在實際應用中,特別是在WEB開發中,MVC模式逐漸暴露出了開發效率低、結構不一致、難以重用等等諸多缺陷,而Struts框架的誕生可以在很大程度上彌補這些缺陷。
1.2?初識框架
框架這個詞最早出現在建筑領域,指的是在建造房屋的前期構建建筑骨架。在軟件開發中,框架的意義與此類似??蚣?#xff08;framework)是某種應用的半成品,是一個可重用、可定制的組件。它凝結了前人或大師們的經驗和智慧,使用框架就等于是站在了巨人的肩上??蚣芸梢允刮覀兊拈_發更加簡單和高效,并且能夠保證程序具有良好的健壯性、重用性和擴展性。
框架一般具有以下幾個優點:
??框架一般設計良好,能夠增強程序的健壯性和可擴展性
??框架封裝了大量的底層操作,提高了重用性,使開發人員能夠更加簡單、高效的進行開發
??使用框架有利于項目管理和分工
??框架結構統一,便于學習和維護
目前比較流行的WEB框架主要包括Struts、Hibernate、Spring等,這三個框架也是我們本階段學習的重點內容。
?
1.3?Struts框架
1.3.1?Struts框架簡介
Struts?是?Apache軟件基金會(ASF)贊助的一個開源項目。它最初是Jakarta項目中的一個子項目,并于2001年發布Struts 1.0版本。Struts是一個采用?Servlet/JSP 技術,基于MVC設計模式的應用框架,后來成為MVC設計模式中的一個經典產品。
2006年,致力于WebWork?與Struts這兩個優秀框架的團體,合作共同開發了一個新的、整合了?WebWork?與?Struts 優點,并且更加優雅、擴展性更強的框架,命名為?Struts 2,原Struts的1.x 版本產品稱為Struts 1。因此,現在Struts項目并行提供與維護兩個版本的框架產品——Struts 1 與?Struts 2。
Struts是一個開源框架,從一開始就得到了全世界范圍內開發者的推崇,經過這么多年的發展,Struts 已經成為了世界上使用最廣泛的MVC框架,擁有豐富的開發人群?,F在使用Java技術新開發的WEB軟件應用基本上都使用Struts 2,但是之前也有很多已經投入使用的軟件工程用的是Struts 1。Struts的官方網站是http://struts.apache.org/,目前Struts 1的最新版本是Struts 1.3.10,Struts 2的最新版本是Struts 2. 3.4.1。
?
圖1.1.2 Struts官方網站
1.3.2?Struts 1體系結構
前面我們講過Struts是基于MVC模式的應用框架,所以MVC模式中的控制器、視圖和模型在Struts中都存在,詳見圖1.1.3所示的Struts1體系結構。
?
?
圖1.1.3 Struts 1體系結構
?
??模型(Model)
Struts 1的模型由JavaBean組成,一般可以分為兩類:實體類和業務邏輯類。實體類用來存儲和傳遞數據,業務邏輯類封裝底層的業務邏輯,例如數據庫操作。
??視圖(View)
Struts 1的視圖通常由JSP實現,但是Struts 1提供了豐富的標簽庫,可以最大限度的減少Java腳本的使用,并增強了視圖功能。另外,Struts 1中的ActionForm也屬于視圖,它一般對應表單,用來封裝客戶端請求的參數。
??控制器(Controller)
Struts 1的控制器由兩部分組成:核心控制器和業務邏輯控制器。核心控制器就是圖1.1.3中的ActionServlet,由Struts 1框架提供。該控制器繼承自HttpServlet類,用來負責攔截所有來自客戶端的請求,并根據Struts配置文件(struts-config.xml)把請求轉發給相應的業務邏輯控制器(Action)或視圖(JSP)。
業務邏輯控制器就是圖1.1.3中的Action,該控制器通常由開發人員創建,并通過調用相應的模型(Model)來處理客戶端請求。
1.4?Struts 1快速上手
1.4.1?使用Struts 1實現登錄功能
下面我們以登錄為例介紹開發Struts 1應用程序的基本步驟。用戶首先訪問登錄頁面,當用戶輸入的用戶名和密碼都正確時跳轉到主頁面,否則跳轉到錯誤提示頁面。
(1)?創建WEB工程并導入Struts 1框架的Jar包
本課程統一使用Struts 1.3.8版本,我們可以從Struts官方網站上下載相應版本的Jar包,解壓后把lib文件夾中的文件復制到工程的lib文件夾中。更簡單的方法是通過MyEclipse來實現,MyEclipse集成了Struts框架,并通過插件為開發人員提供了完美的Struts支持。在WEB工程上單擊右鍵彈出快捷菜單,如圖1.1.4所示。
?
圖1.1.4 導入Struts
在右鍵快捷菜單中依次單擊【MyEclipse】→【Add Struts Capabilities…】彈出如圖1.1.5所示的對話框。
?
圖1.1.5 配置對話框
??圖中①處用來設置Struts配置文件的路徑,通常采用默認值放在WEB-INF文件夾中
??圖中②處用來選擇Struts的版本,這里選擇Struts 1.3
??圖中③處用來設置ActionServlet的名字和攔截以哪個擴展名結尾的HTTP請求,通常采用默認設置即可
??圖中④處用來設置包名,可以自定義,但是要注意命名規范
??圖中⑤處用來設置資源文件名,會在后面講解,這里暫時不作介紹
??圖中⑥處暫時不要選中,以后會進行介紹
另外還需要導入Oracle所需的Jar包,按照上述說明配置好后單擊【Finish】按鈕就可以看到如圖1.1.6所示的項目結構。
?
圖1.1.6 項目整體結構
通過上圖可以看到MyEclipse已經把Struts所需的Jar包導入到了項目中,并且自動生成了配置文件struts-config.xml。我們在圖1.1.5中進行的配置已經以代碼的形式在web.xml中自動生成,如示例1.1所示。
示例1.1
<?xml version="1.0" encoding="UTF-8"?> <servlet> <!--Servlet名稱--> <servlet-name>action</servlet-name> <!--Servlet類 --><servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <!--加載Struts配置文件 --> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <!--配置Servlet映射 --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>通過上一階段的學習,我們知道web.xml是Java Web應用程序的配置文件,可以配置歡迎頁面、Servlet、過濾器等。在進行Struts開發時,我們需要在這個文件中配置Struts的核心控制器ActionServlet及其映射。上述代碼中配置的ActionServlet負責攔截所有擴展名為“.do”的請求。
(2)?創建模型(Model)
本示例需要兩個JavaBean,一個是實體類Admin.java,另一個是操作數據庫的業務邏輯類AdminDao。示例1.2給出了實體類的參考代碼。
示例1.2
package com.yourcompany.struts; public class Admin { private int id; //登錄ID private String name; //登錄名稱 private String pwd; //登錄密碼 public Admin() { } public Admin(String name, String pwd) { this.name = name; this.pwd = pwd; } //省略Getter/Setter方法 }實體類Admin對應了數據庫中的管理員表,該類比較簡單,不再多述。
(3)?創建實現數據庫操作的Dao類,代碼如示例1.3所示。
示例1.3
public class AdminDao { public boolean checkLogin(String name,String pwd) { Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; boolean jg=false; try { Class.forName("oracle.jdbc.driver.OracleDriver"); String connURL="jdbc:oracle:thin:@localhost:1521:orcl"; conn = DriverManager.getConnection(connURL, "system", "orcl"); stmt=conn.prepareStatement("select * from admin where name=? and pwd=?"); stmt.setString(1, name); stmt.setString(2, pwd); rs=stmt.executeQuery(); if(rs.next()) { jg=true; } } catch (Exception e) { e.printStackTrace(); } finally{//部分代碼省略 } return jg; } }該類使用JDBC實現了登錄驗證功能,如果用戶名和密碼正確就返回true,否則返回false。
(4)?創建登錄頁面login.jsp,代碼如示例1.4所示。
示例1.4
<form action="login.do" method="post" name="loginForm"> <table width="397" height="169" border="0" align="center"> <tr> <td colspan="2" align="center">管理員登錄</td> </tr> <tr> <td width="163" align="right">登錄名稱:</td> <td width="218"><input name="logname"type="text" class="txt"></td> </tr> <tr> <td align="right">登錄密碼:</td> <td><input name="logpwd" type="password" class="txt"></td> </tr> <tr> <td colspan="2" align="center"><input type="submit" name="Submit" value="提交"></td> </tr> </table> </form>該登錄頁面比較簡單,但是需要注意表單中加粗斜體部分的代碼。在<form action="login.do" method="post" name="loginForm">中的action="login.do"用來設置表單被提交至哪個程序進行處理,以擴展名“.do”結尾可以保證能被Struts核心控制器ActionServlet攔截。登錄名稱和登錄密碼表單元素的名字可以自定義,但是需要與下面第5步中ActionForm中的屬性名保持一致。
(5)?創建ActionFrom,代碼如示例1.5所示。
示例1.5
import org.apache.struts.action.ActionForm; public class LoginForm extends ActionForm{ private String logname; private String logpwd; public String getLogname() { return logname; } public void setLogname(String logname) { this.logname = logname; } public String getLogpwd() { return logpwd; } public void setLogpwd(String logpwd) { this.logpwd = logpwd; } }LoginForm是我們創建的一個ActionForm,它繼承了org.apache.struts.action.ActionForm類。ActionFrom的主要作用是自動封裝表單數據。需要注意的是:該類中的屬性名必須與表單中的元素名保持一致。當用戶提交登錄表單時,表單中的登錄名稱和登錄密碼會被自動封裝并保存到LoginForm類的對應屬性中,我們可以通過getter方法獲得這些數據。
(6)?創建主頁面和錯誤頁面,代碼如示例1.6所示。
示例1.6
//主頁index.jsp <%@ page language="java" import="java.util.*,com.yourcompany.struts.*" pageEncoding="utf-8"%> <html> <head> <title>主頁</title> </head> <body> <% Admin a=(Admin)request.getAttribute("admin");%> <center>登錄成功,歡迎<%= a.getName() %>進入主頁面</center> </body> </html> //錯誤頁面fail.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <html> <head> <title>錯誤頁面</title> </head> <body> <center>登錄失敗,請重試!</center> </body> </html>當用戶登錄成功后將跳轉到主頁面index.jsp,否則跳轉到錯誤頁面fail.jsp。
(7)?創建業務邏輯控制器,繼承Action,并重寫其execute方法,代碼如示例1.7所示。
示例1.7
public class LoginAction extends Action { public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest req,HttpServletResponse res) { LoginForm lf=(LoginForm)form; String logname=lf.getLogname(); String logpwd=lf.getLogpwd(); AdminDao ad=new AdminDao(); if(ad.checkLogin(logname, logpwd)) { req.setAttribute("admin", new Admin(logname,logpwd)); return mapping.findForward("success"); } else return mapping.findForward("fail"); } }LoginAction類是我們創建的一個業務邏輯控制器,該類繼承了org.apache.struts.action.Action并重寫了execute方法,幾乎所有的業務處理代碼都放在該方法中。當客戶端請求被ActionServlet配發到某個業務邏輯控制器時,Struts會自動調用該控制器中的execute方法進行業務處理。該方法有四個參數,詳見表1-1-1所示。
表1-1-1 execute方法參數列表
參數名 | 參數說明 |
ActionMappingmapping | 對應Struts配置文件中的forward元素,主要用來根據業務處理結果實現頁面跳轉,下面會做詳細介紹 |
ActionForm ?form | 對應項目中的某個ActionForm,例如本例中的LoginForm |
HttpServletRequest ?req | 當前HTTP請求對象 |
HttpServletResponse res | 當前HTTP響應對象 |
在上述代碼的execute方法中,我們首先從封裝了表單數據的LoginForm中取出登錄名和登錄密碼,然后調用AdminDao對象的checkLogin方法進行登錄驗證,最后根據結果通過ActionMapping實現頁面跳轉。
(8)?通過上面的步驟我們已經把項目所需的控制器、模型和視圖全部創建完畢,下面開始在struts-config.xml中進行集中配置,這是進行Struts開發的重中之重。struts-config.xml是Struts專用的配置文件,默認放在WEB-INF文件夾中,主要用來配置業務邏輯控制器Action、ActionForm、視圖以及它們之間的執行關系。表1-1-2列出了Struts配置文件中常用的配置元素。
表1-1-2 Struts配置元素
配置元素 | 說明 |
<struts-config> | Struts 1配置文件的根元素 |
<form-beans> | 用來配置項目中的ActionFrom,包含<form-bean>子元素,一個子元素配置一個ActionFrom |
<action-mappings> | 用來配置項目中的業務邏輯控制器Action,包含<action>子元素,一個子元素配置一個Action |
<message-resources> | 用來配置本地化消息資源文件,可以實現國際化 |
下面我們開始配置本項目中的struts-config.xml文件,首先配置ActionForm,部分參考代碼如下所示。
<form-beans> <form-bean name="LoginForm" type="com.yourcompany.struts.LoginForm" /> </form-beans>ActionForm主要通過<form-bean>元素進行配置,表1-1-3列出了<form-bean>元素的主要屬性。
表1-1-3 <form-bean>元素的主要屬性
屬性 | 說明 |
name | 用來設置ActionForm的名字,該名字必須是唯一標識符 |
type | 用來設置ActionForm的完整類名 |
接下來配置業務邏輯控制器Action,Action主要負責從ActionForm中取出用戶提交的數據,然后調用相應的模型進行業務處理,最后根據處理結果跳轉到不同的視圖。因此,Action與ActionFrom、模型和視圖都有關聯,所以在配置Action時略顯復雜。下面是配置本項目中Action的部分參考代碼。
<action-mappings> <actionname="LoginForm"path="/login"scope="request"type="com.yourcompany.struts.LoginAction"> <!-- 部分代碼省略 --> </action> </action-mappings>所有的Action都配置在<action-mappings>元素中,一個<action>元素配置一個Action,表1-1-4列出了<action>元素的常用屬性。
表1-1-4 <action>元素的常用屬性
屬性 | 說明 |
name | 此屬性并不是Action的名字,而是與之關聯的ActionFrom的名字,即在<form-bean>元素中的名字 |
type | 用來設置Action的實現類,必須給出完整類名 |
path | 用來設置路徑名,ActionServlet攔截此路徑并轉發給Action,此路徑名必須與<form>表單action屬性的值保持一致 |
scope | 用來設置相關聯的ActionForm的作用域,可以取值request和session,默認值為request |
然后通過<forward>元素配置視圖跳轉,<forward>元素是上面<action>元素的子元素。在本項目中,當用戶登錄成功后跳轉到主頁面(index.jsp),否則跳轉到錯誤頁面(fail.jsp),部分參考代碼如下所示。
<action <!-- 部分代碼省略 --> > <forward name="fail" path="/fail.jsp" /> <forward name="success" path="/index.jsp" /> </action>表1-1-5列出了<forward>元素的常用屬性。
表1-1-5 <forward>元素的常用屬性
屬性 | 說明 |
name | 用來設置一個邏輯名,在Action類中使用,例如:mapping.findForward("success");可以跳轉到nam為“success”的forward的path中設置的”/index.jsp”頁面。 |
path | 用來設置某個視圖的路徑 |
redirect | 用來設置是否使用重定向。取值為true時,表示在跳轉過程中使用重定向的方式,取值為false時表示使用轉發的方式,默認值為false |
示例1.8給出了本項目中struts-config.xml文件的完整代碼,請大家結合上面的講解進行分析。
示例1.8
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"><struts-config> <form-beans > <form-bean name="LoginForm" type="com.yourcompany.struts.LoginForm" /> </form-beans><action-mappings> <actionname="LoginForm"path="/login"scope="request"type="com.yourcompany.struts.LoginAction"> <forward name="fail" path="/fail.jsp" /> <forward name="success" path="/index.jsp" /> </action> </action-mappings><message-resources parameter="com.yourcompany.struts.ApplicationResources" /> </struts-config>至此,我們使用Struts 1開發的一個項目已經完工。下面把該項目部署到Tomcat服務器上后進行測試。首先打開登錄頁面login.jsp,如圖1.1.7所示。
?
圖1.1.7 登錄頁面
當用戶輸入正確的登錄名稱和密碼并單擊【提交】按鈕后,我們發現程序跳轉到了主頁面index.jsp,如圖1.1.8所示。
?
圖1.1.8 登錄成功
當用戶輸入錯誤的登錄名稱和密碼并單擊【提交】按鈕后,我們發現程序跳轉到了錯誤頁面fail.jsp,如圖1.1.9所示。
?
圖1.1.9 登錄失敗
?
1.4.2?Struts 1運行流程
前面我們已經使用Struts 1開發了一個簡單的登錄程序,下面我們以這個程序為例來介紹Struts 1的運行流程,從而更進一步的了解Struts 1框架,我們看圖1.1.10。
?
圖1.1.10 Struts1框架運行流程
下面我們按照上圖中的運行流程詳細分析登錄過程。
(1)?客戶端瀏覽器打開login.jsp頁面,輸入登錄名稱和登錄密碼后提交表單,這時客戶端向服務器端發送了一個HTTP請求,該請求包含表單數據并以“.do”結尾。
(2)?服務器端的ActionServlet接收并攔截來自客戶端的HTTP請求,同時讀取struts-config.xml文件并按照action配置中的name屬性配置將請求中的表單數據封裝到一個FormBean中,即LoginForm。
(3)?ActionServlet按照type屬性配置把HTTP請求轉發給相應的Action(LoginAction)進行處理。
(4)?Action(LoginAction)接收到HTTP請求后立即執行execute方法,先從LoginForm中取出表單數據。
(5)?調用JavaBean(AdminDao)實現登錄驗證。
(6)?根據驗證結果返回相應的ActionForward給ActionServlet。
(7)?ActionServlet根據配置和返回的ActionForward轉發請求到相應的視圖。如果登錄成功轉發到index.jsp,否則轉發到fail.jsp。
(8)?如果轉發到了index.jsp,那么該頁面調用JavaBean(Admin)取出了登錄名稱并顯示。
1.4.3?使用MyEclipse簡化Struts開發
我們在開發上面的登錄項目時,其中的Action(LoginAction)、ActionForm(LoginForm)等都是手工創建并配置的,這無疑會影響開發效率,還容易出錯。MyEclipse充分考慮到了這一點,并在較高的版本中提供了圖形化開發支持。
我們打開上面項目中的struts-config.xml文件,進入設計(Design)視圖,如圖1.1.11所示。
?
圖1.1.11 設計視圖
通過上圖可以看到,MyEclipse能夠以圖形化的方式來展現Struts配置文件,同時也支持以圖形化的方式進行開發。下面我們以圖形化的方式創建一個ActionForm,在設計視圖的空白處單擊右鍵彈出快捷菜單,如圖1.1.12所示。
?
圖1.1.12 新建Form
依次單擊【New】→【Form】菜單,彈出如圖1.1.13所示的對話框。在這個對話框中通過相應的設置即可完成ActionForm的創建。
?
圖1.1.13 設置Form
圖中①處用來設置ActionForm在Struts配置文件中的名字,即<form-bean>元素name屬性的值。圖中②處用來設置創建FromBean的方式,默認選擇第一項,即新建一個。圖中③處用來設置ActionForm的父類,默認選擇第一項org.apache.struts.action.Action
.Form。圖中④處用來設置ActionForm的完全類名。單擊圖中的【Add】按鈕會彈出一個新的對話框,通過這個對話框可以給ActionForm添加屬性,如圖1.1.14所示。
?
?
?
?
圖1.1.14 添加屬性
圖中①處用來設置屬性的名字,圖中②處用來選擇屬性的數據類型,圖中③處用來設置該屬性對應的表單元素的類型。所有操作結束后,單擊【Finish】按鈕就可以在工程中看到RegForm類已經創建成功,在struts-config.xml中可以看到相應的配置代碼已經自動生成。
下面我們創建一個Action,在圖1.1.12中的右鍵快捷菜單里,依次單擊【New】→【Action】,彈出如圖1.1.15所示的對話框。
?
圖1.1.15 新建Action
圖中①處用來設置該Action負責處理哪個路徑的客戶端請求。圖中②處用來設置Action的類型,默認選中【Type】。圖中③處用來設置創建Action的方式,默認選中【Create new Action class】,即新建一個Action。圖中④處用來設置Action的父類,默認選擇第一項。圖中⑤處用來設置該Action的完全類名。圖中⑥處用來設置該Action要使用哪個ActionForm,單擊后面的【Browse…】按鈕即可選擇項目中任意一個ActonForm。其他地方均采用默認設置即可,最后單擊【Finish】按鈕就可以在項目中看到RegAction已經創建成功,在struts-config.xml中可以看到相應的配置代碼已經自動生成。
此外,在圖1.1.15下半部分的幾個選項卡頁中,【Forwards】頁可以設置這個Action中的跳轉動作,在【Forwards】選項卡中點擊【Add】按鈕,彈出的對話框中輸入forward的Name和Path,再點擊【Add】即可添加一個forward,可連續添加多個forward,完成后點擊【Close】即可,如圖1.1.16所示。
?
?
注意:
雖然MyEclipse對Struts開發提供了很好的支持,但是建議大家在學習階段盡量使用手工方式開發,以更加牢固得掌握Struts運行的過程和原理。
?
本章總結
??框架(framework)是某種應用的半成品,是一個可重用、可定制的組件。框架可以使我們的開發更加簡單和高效,并且能夠保證程序具有良好的健壯性、重用性和擴展性。
??Struts是基于MVC模式的應用框架,所以MVC模式中的控制器、視圖和模型在Struts中都存在。
(1)模型(Model)
Struts 1的模型由JavaBean組成,一般可以分為兩類:實體類和業務邏輯類。實體類用來存儲和傳遞數據,業務邏輯類封裝底層的業務邏輯,例如數據庫操作。
(2)視圖(View)
Struts 1的視圖通常由JSP實現,但是Struts 1提供了豐富的標簽庫,可以最大限度的減少Java腳本的使用,并增強了視圖功能。另外,Struts 1中的ActionForm也屬于視圖,它一般對應表單,用來封裝客戶端請求的參數。
(3)控制器(Controller)
Struts 1的控制器由兩部分組成:核心控制器和業務邏輯控制器。由Struts 1框架提供。該控制器繼承自HttpServlet類,用來負責攔截所有來自客戶端的請求,并根據Struts配置文件(struts-config.xml)把請求轉發給相應的業務邏輯控制器(Action)或視圖(JSP)。
業務邏輯控制器通常由開發人員創建,并通過調用相應的模型(Model)來處理客戶端請求。
??開發Strust1應用的步驟:
(1) 創建WEB工程并導入Struts 1框架的Jar包。
(2 ) 創建模型(Model)。
(3) 創建登錄頁面。
(4) 創建ActionFrom封裝表單數據。
(5) 創建業務邏輯控制器,繼承Action,并重寫其execute方法。
(6) 在struts-config.xml中進行集中配置。
?
?
任務實訓部分
1:查詢管理員
訓練技能點
使用MyEclipse手工編碼配置進行Struts1開發
需求說明
使用理論部分的數據庫,并實現查詢功能。使用一個頁面把所有的管理員信息顯示出來。
實現步驟
(1)?使用MyEclipse創建工程并添加Struts支持
(2)?創建對應管理員表的實體Bean(Admin)
(3)?由于在多個地方都要使用JDBC進行數據庫操作,所以需要創建一個DAO工廠類DaoFactory,實現數據庫連接和關閉
(4)?創建實現查詢功能的JavaBean(AdminDao),把所有數據封裝到List中
(5)?創建業務邏輯控制器(QueryAction),在execute方法中調用AdminDao查詢所有的管理員信息保存到集合,并將集合對象存儲到request中,參考代碼如下所示。
public class QueryAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { AdminDao ad=new AdminDao(); List<Admin> adminList=ad.getAllAdmin(); request.setAttribute("adminList", adminList); return mapping.findForward("list"); } }(6)?創建顯示管理員信息的視圖list.jsp,首先從request對象中取出集合對象,然后通過循環把集合中的管理員信息輸出到頁面上,參考代碼如下所示。
<body> <table width="350" border="1" align="center"> <caption>管理員列表</caption> <tr bgcolor="darkgray"> <td align="center">管理員編號</td> <td align="center">管理員名稱</td> </tr> <% List<Admin> adminList=(List<Admin>)request.getAttribute("adminList"); for(int j=0;j<adminList.size();j++) { Admin admin=adminList.get(j);%> <tr> <td align="center"><%=admin.getId() %></td> <td align="center"><%=admin.getName() %></td> </tr> <% }%> </table> <br> <center><a href="addAdmin.html">添加管理員</a></center> </body> (7) 在struts-config.xml中進行Action配置,參考代碼如下所示。 <actionpath="/query"type="com.yourcompany.struts.QueryAction"> <forward name="list" path="/list.jsp" /> </action>(8)?部署項目并訪問http://localhost:8080/Web應用名/query.do,運行效果如圖1.2.1所示。
?
圖1.2.1 運行效果
2:添加管理員
訓練技能點
使用MyEclipse手工編碼配置進行Struts 1開發
需求說明
在上一任務的基礎上實現添加管理員功能,創建一個視圖addAdmin.html,用戶輸入登
錄名稱和登錄密碼后可以把這些數據信息保存到數據庫中
實現步驟
(1)?在AdminDao類中增加一個使用JDBC添加管理員的方法addAdmin()
(2)?創建視圖addAdmin.html,提供添加管理員的界面
(3)?創建ActionForm對應視圖addAdmin.html
(4)?創建業務邏輯控制器(AddAction),在execute方法中調用AdminDao里添加管理員的方法,參考代碼如下所示。
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { AddForm addForm = (AddForm) form; AdminDao ad=new AdminDao(); if(ad.addAdmin(addForm.getLogName(), addForm.getLogPwd1())) return mapping.findForward("list"); else return null; }(5)?在struts-config.xml中進行相關配置,添加成功后跳轉到list.jsp頁面,參考代碼如下所示。
<form-beans > <form-bean name="AddForm" type="com.yourcompany.struts.AddForm" /> </form-beans> <actionname="AddForm"path="/add"scope="request"type="com.yourcompany.struts.AddAction"> <forwardname="list"path="query.do"redirect="true" /> </action>(6)?運行效果如圖1.2.2和1.2.3所示。
?
圖1.2.2 添加管理員
?
圖1.2.3 成功跳轉
3:刪除管理員
訓練技能點
使用MyEclipse手工進行Struts 1開發
需求說明
在上一任務的基礎上,實現刪除管理員功能。在管理員列表里,單擊每行后邊的【刪除】 超鏈接可以刪除本行的管理員
實現步驟
(1)?在AdminDao類中增加一個使用JDBC刪除管理員的方法delAdmin()
(2)?在視圖list.jsp中增加【刪除】超鏈接,代碼如下所示
<a href="del.do?id=<%=admin.getId() %>">刪除</a>
(3)?創建業務邏輯控制器(DelAction),在execute方法中調用AdminDao里刪除管理員的方法。
(4)?刪除成功后跳轉到視圖list.jsp,效果如圖1.2.4所示。
鞏固練習
一、選擇題
1. 以下不屬于Struts 1組件的是()。
A.?Action
B.?ActionServlet
C.?HTML頁面
D.?JavaBean
2.在struts-config.xml中配置Action時,scope屬性的值可以是()。
A.?session
E.?application
F.?request
G.?page
3.以下()需要在struts-config.xml中進行配置。
A.?ActionForm
H.?ActionServlet
I.?Action
J.?ActionForward
4.以下關于Struts 1運行流程說法正確的是()。
A.?Action攔截客戶端請求并處理
B.?ActionServlet可以把客戶端請求轉發給某個Action,也可以轉發給某個視圖
C.?Action在業務處理完后會根據結果直接跳轉到某個視圖
5.以下說法正確的是()。
A.?一個Action必須對應一個ActionForm
B.?<form-bean>元素的name屬性必須和表單的name屬性的值一致
C.?<action>元素的name屬性表示自身的邏輯名
D.?struts-config.xml文件必須在web.xml文件中進行配置
?
?
?
?
?
二、上機練習
在任務實訓的基礎上,實現修改密碼的功能。在管理員列表頁面增加【修改】超鏈接,當用戶單擊某個【修改】超鏈接時跳轉到修改密碼頁面,在這個頁面用戶必須先輸入原密碼,然后再輸入兩次新密碼。如果原密碼正確才進行修改。運行效果如圖1.3.1和1.3.2所示。
?
圖1.3.1 增加【修改】超鏈接
?
圖1.3.2 密碼修改頁面
實現思路:
(1)?新建一個根據ID查詢管理員信息的Action,例如ModifyAction。把查詢出來的管理員信息封裝到ActionForm中,可以新建一個ActionForm或者直直接使用AddForm。
(2)?管理員列表頁面中的【修改】超鏈接把選擇的管理員的id傳到ModifyAction。
(3)?在修改密碼頁面中,使用EL表達式直接從request中取出ActionForm對象,并顯示相應的屬性值,這里只顯示登錄名稱。
?
提示:
所有關于信息修改的步驟都可以參考上述思路進行。
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Struts 1基础入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GPS用户定位
- 下一篇: Struts 1高级应用