手把手教你在Eclipse中配置開發Struts
原文地址:http://blog.csdn.net/baggio785/archive/2006/03/10/620535.aspx(轉載請註明出處)
日期:2006-3-9
關鍵詞:Eclipse,MyEclipse,Struts,Java
前言
本文根據執行個體詳細介紹了如果在Eclipse中配置並開發Struts。此前在網上也看到過不少此類文章,而且還是有不少網友問此類問題。所以想根據自己的實際經驗,並結合例子寫一篇詳細的文章,一個是方便大家,再一個也是檢驗一下自己的知識。
本文是偶的一些拙見,有不正確的地方請大家多多評論指正。
開發環境
JDK1_4_03,點擊下載
tomcat5.0.28,點擊下載
Eclipse3.1.2,點擊下載;下載中文包,中文包是3.1.1,但是也適用3.1.2
MyEcilpse4.1,點擊下載MyEcilpse4.1及破解補丁
TomcatPlugin外掛程式,點擊下載TomcatPlugin外掛程式
更多Eclipse外掛程式下載,點擊進入
需求
本文所要結合的Struts應用執行個體為使用者登入(logon),使用者登入(logon)的需求為:
1 接收使用者名稱和密碼,跳轉到成功頁面,並提示“<username>歡迎您登入!”。
2 如果使用者名稱為空白就提交表單,則提示“請輸入使用者名稱!”。
3 如果密碼為空白就提交表單,則提示“請輸入密碼!”。
4 如果輸入非法使用者名稱,則提示“請輸入正確的使用者名稱!”。
5 通過模型組件,儲存登入資訊。
登入應用執行個體的架構介紹
使用者登入(logon)應用由以下模組組成:
1 模型(M):模型為一個JAVABEAN組件-SaveLogon,包含username(使用者名稱)和userpassword(密碼)兩個屬性,提供讀取和設定屬性的方法get/set,以及儲存登入資訊的方法saveToDb()。saveToDb的任務是把登入資訊儲存到持久化儲存系統(例如資料庫)。
2 視圖(V):視圖包括兩個JSP檔案,以及一個ActionForm Bean-logonForm。JSP檔案分別為:logon.jsp、success.jsp。logon.jsp負責接受使用者輸入的使用者名稱和密碼以及顯示出錯資訊,success.jsp負責顯示登入成功資訊。
3 控制器(C):控制器為Action類logonAction。對資料進行商務邏輯驗證、調用模型組件儲存登入資訊、選擇視圖組件返回給使用者。
Struts的工作機制
使用者在視圖組件(logon.jsp)中輸入使用者名稱和密碼並提交HTML表單,Struts架構會先讀取WEB.XML中關於servlet的配置,然後自動將表單資料封裝到ActionForm Bean中,在本例中是logonForm。logonForm會對提交的資料進行資料合法性驗證(例如最短長度、是否包含非法字元等)。如果ActionForm Bean驗證未通過,則logonForm返回ActionErrors對象,Struts架構會把ActionErrors對象儲存在request範圍內,並把請求轉寄到視圖組件,並在視圖組件中通過<html:errors/>標籤,展示request範圍內的ActionErrors對象所包含的錯誤資訊;如果通過ActionForm Bean驗證,則logonForm返回的ActionErrors對象為NULL,Struts架構將表單資料提交到控制器組件logonAction,控制器對錶單資料進行商務邏輯驗證,如果logonAction驗證未通過,則建立包含錯誤資訊的ActionMessages對象,並通過saveErrors方法把ActionMessages對象儲存到request範圍內,並把請求轉寄到視圖組件,並在視圖組件中通過<html:errors/>標籤,展示request範圍內的ActionErrors對象所包含的錯誤資訊;如果logonAction驗證通過,則Struts架構訪問模型組件,然後Struts架構會返回ActionFoward對象,並根據Struts-config.xml檔案的配置情況,決定將ActionFoward對象包含的轉寄資訊傳遞到那一個視圖組件。
部署Struts架構
Struts的工作機制大家都有了一定的瞭解了,現在介紹如何在Eclipse中部署Struts架構。
本文的環境前文已經提到,Eclipse以及其外掛程式MyEclipse和TomcatPlugin的安裝本文不介紹,請參考其他文章。關於Eclipse的相關文章請看:http://blog.csdn.net/baggio785/category/148174.aspx。
1 建立一個項目
1) 選擇Java >> Tomcat Project,下一步,一
(圖一)
2)填寫項目名稱,如果不採用項目所在目錄的預設值,請修改,點擊完成。二
(圖二)
2 建立Struts架構
1) 右鍵選擇項目 >> 建立 >> 其他 >> MyEclipse >> Web-Struts >> Struts 1.2 >> Struts 1.2 Form,Action & JSP。三。如果這一步出現錯誤,本文不做描述,請參考我的另一邊文章-MyEclipse中建立Struts出現錯誤的解決辦法。
(圖三)
2) 配置Struts ActionForm
因為本文的Struts應用執行個體為使用者登入,所以Use case選用logon。Superclass選擇,其他預設。四
(圖四)
接下來填寫Optional Details,輸入Form表單項,本例為使用者名稱(username)和密碼(userpassword)。點擊Add,輸入請參考圖五、圖六。
(圖五)
(圖六)
輸後完畢,Optional Details的Form Properties中會顯示。七
(圖七)
Methods選項卡的設定我們採用預設設定,不去修改。
點擊JSP選項卡,將“Create JSP form”選項的勾選中,採用預設設定“/form/logon.jsp”。八
(圖八)
3) 配置Struts Action
以上步驟完成了對Form的配置,下面配置Action。
在圖八中點擊下一步,採用預設即可。九
(圖九)
Parameter和Methods選項也採用預設。
點擊Forwards選項卡,點擊Add,配置成功頁面資訊。本文選取根目錄的success.jsp作為成功頁面,Name為logon_sc。十
(圖十)
輸後完畢,Optional Details的Forwards中會顯示。十一
(圖十一)
點擊完成。
Struts已經配置完畢。看看Eclipse中,項目中多了一些東東,例如struts相關的jar,以及struts-config.xml和tld檔案。struts-config.xml的代碼如下:
代碼清單一(struts-config.xml)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <data-sources /> <form-beans > <!--這裡是ActionForm的配置資訊,ActionForm Bean的name為logonForm,對應的類為com.mystruts.struts.form.LogonForm--> <form-bean name="logonForm" type="com.mystruts.struts.form.LogonForm" /> </form-beans> <global-exceptions /> <global-forwards /> <action-mappings > <!--這裡是Action組件的配置資訊,描述了從特定的請求路徑到響應的Action的映射--> <!--attribute設定Action關聯的ActionForm在request或者session範圍內的key.就是在request或者session共用內的名稱--> <!--input指定包含表單的URL,當表單驗證失敗的時候發送的URL--> <!--name指定和該Action關聯的Form名字.該名字必須是在form-bean中定義過的,可寫可不寫--> <!--path指定請求訪問Action的路徑,必須以/開頭--> <!--scope指定Form的存在範圍,例如request--> <!--type指定Action組件對應的類--> <action attribute="logonForm" input="/form/logon.jsp" name="logonForm" path="/logon" scope="request" type="com.mystruts.struts.action.LogonAction"> <!--這裡是forward,即局部轉寄配置資訊,登入成功後轉向/success.jsp,name為logon_sc--> <forward name="logon_sc" path="/success.jsp" /> </action> </action-mappings> <!--這裡是訊息資源檔的配置資訊,用來配置Resource Bundle.用於存放本地簡訊檔案。parameter指定檔案名稱,不包含尾碼名。--> <message-resources parameter="com.mystruts.struts.ApplicationResources" /> </struts-config> |
建立訊息資源檔
視圖組件將使用標籤來輸出常值內容,這些內容來自於Resource Bundle。Resource Bundle對應訊息資源檔。
代碼清單二(ApplicationResources.properties)
# 這裡是注釋 logon.page.title = 我的第一個Struts logon.username.error = 請輸入使用者名稱! logon.userpassword.error = 請輸入密碼! logon.badusername.error = 使用者名稱不能為admin! logon.baduserpassword.error = 密碼不能為123456! logon.success = 歡迎您登入! |
為了實現國際化,訊息資源檔中的漢字採用的是UTF-8編碼。查看如何?漢字轉化為UTF-8。
建立JSP檔案
logon.jsp(所在路徑為/form/)接收使用者輸入的使用者名稱和密碼,並顯示表單驗證失敗的錯誤資訊。success.jsp顯示登入成功的資訊。
JSP檔案全部使用客戶化標籤,無JAVA代碼,輸入的常值內容完全由標籤提供。
代碼清單三(logon.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java"%> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%> <html> <head> <!--title使用客戶化標籤,常值內容對應的是訊息資源檔中logon.page.title的值--> <title><bean:message key="logon.page.title"/></title> </head> <body> <html:form action="/logon" method="POST"> 使用者名稱:<html:text property="username"/><html:errors property="username"/><br/> 密 碼:<html:password property="userpassword"/><html:errors property="userpassword"/><br/> <html:submit value="登入"/><html:reset value="取消"/> </html:form> </body> </html> |
代碼清單四(success.jsp)
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%> <html:html lang="true"> <head> <html:base /> <title>success.jsp</title> </head> <body> <logic:present name="savelogon" scope="request"> <bean:write name="savelogon" property="username"/> <bean:message key="logon.success"/> </logic:present> </body> </html:html> |
建立ActionForm Bean組件logonFrom
使用者提交HTML表單後,Struts架構會自動把表單資料封裝到ActionForm Bean(本例是logonForm)中。ActionForm Bean的屬性必須與HTML表單的欄位一一對應。ActionForm Bean會對錶單資料進行驗證,並提供將HTML表單的欄位值重設為預設值的方法(等同於HTML中Form表單的Reset)。
代碼清單五(logonFrom.java)
package com.mystruts.struts.form; import javax.servlet.http.HttpServletRequest; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionMessage; /** * MyEclipse Struts * Creation date: 02-27-2006 * * XDoclet definition: * @struts.form name="logonForm" */ public class LogonForm extends ActionForm { // --------------------------------------------------------- Instance Variables /** userpassword property */ private String userpassword; /** username property */ private String username; // --------------------------------------------------------- Methods /** * Method validate * @param mapping * @param request * @return ActionErrors */ //用於表單驗證的validate方法 public ActionErrors validate( ActionMapping mapping, HttpServletRequest request) { //聲明一個ActionErrors對象 ActionErrors errors = new ActionErrors(); //如果使用者名稱驗證失敗,將ActionMessage對象儲存到ActionErrors對象errors中。logon.username.error對應訊息資源檔中的logon.username.error的值。 if(username==null || username.length()<3){ errors.add("username", new ActionMessage("logon.username.error")); } //如果密碼驗證失敗,將ActionMessage對象儲存到ActionErrors對象errors中。logon.userpassword.error對應訊息資源檔中的logon.userpassword.error的值。 if(userpassword==null || userpassword.length()<3){ errors.add("userpassword", new ActionMessage("logon.userpassword.error")); } // TODO Auto-generated method stub //返回ActionErrors對象errors,Struts架構會把errors儲存在request範圍內,並將請求轉寄到視圖組件logon.jsp中,通過<html:errors/>來顯示錯誤資訊 return errors; } /** * Method reset * @param mapping * @param request */ public void reset(ActionMapping mapping, HttpServletRequest request) { // TODO Auto-generated method stub this.username = null; this.userpassword = null; } /** * Returns the userpassword. * @return String */ public String getUserpassword() { return userpassword; } /** * Set the userpassword. * @param userpassword The userpassword to set */ public void setUserpassword(String userpassword) { this.userpassword = userpassword; } /** * Returns the username. * @return String */ public String getUsername() { return username; } /** * Set the username. * @param username The username to set */ public void setUsername(String username) { this.username = username; } } |
建立控制器Action組件logonAction
logonAction對錶單資料進行商務邏輯驗證。
代碼清單六(logonAction.java)
package com.mystruts.struts.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionMessage; import org.apache.struts.action.ActionMessages; import com.mystruts.struts.SaveLogon; import com.mystruts.struts.form.LogonForm; /** * MyEclipse Struts * Creation date: 02-27-2006 * * XDoclet definition: * @struts.action path="/logon" name="logonForm" input="/form/logon.jsp" scope="request" validate="true" * @struts.action-forward name="logon_sc" path="/success.jsp" */ public class LogonAction extends Action { // --------------------------------------------------------- Instance Variables // --------------------------------------------------------- Methods /** * Method execute * @param mapping * @param form * @param request * @param response * @return ActionForward */ //通過ActionForm Bean的驗證後,Struts架構會自動調用execute方法 public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { // TODO Auto-generated method stub //獲得表單資料中的username String username = (String)((LogonForm)form).getUsername(); //獲得表單資料中的userpassword String userpassword = (String)((LogonForm)form).getUserpassword(); //定義非法使用者名稱 String badusername = "admin"; //定義非法密碼 String baduserpassword = "123456"; //聲明一個ActionMessages對象 ActionMessages errors = new ActionMessages(); if(badusername.equals(username)){ //如果使用者名稱驗證失敗,將ActionMessage對象儲存到ActionMessages對象errors中。logon.badusername.error對應訊息資源檔中的logon.badusername.error的值。 errors.add("username",new ActionMessage("logon.badusername.error",badusername)); //儲存ActionMessages對象errors到request範圍。 saveErrors(request,errors); //返回ActionForward對象,Struts架構會把請求轉寄到視圖組件logon.jsp中,通過<html:errors/>來顯示錯誤資訊。 return(new ActionForward(mapping.getInput())); } if(userpassword.equals(baduserpassword)){ errors.add("userpassword",new ActionMessage("logon.baduserpassword.error",baduserpassword)); saveErrors(request,errors); return(new ActionForward(mapping.getInput())); } //定義模型組件SaveLogon SaveLogon sl = new SaveLogon(); sl.setUsername(username); sl.setUserpassword(userpassword); sl.saveToDb(); //控制器組件將SavaLogon對象儲存到request範圍,savalogon對應視圖組件success.jsp中<login:present>標籤的name以及<bear:write>標籤的name request.setAttribute("savelogon",sl); //清除request範圍內的ActionForm Bean,因為後面的請求已經不需要了 request.removeAttribute(mapping.getAttribute()); //控制器組件將資訊轉交到視圖組件logon.jsp,logon_sc對應struts-config.xml中的forward元素的name return(mapping.findForward("logon_sc")); } } |
建立模型組件SaveLogon
本模型提供get/set方法,以及saveToDb方法。在例子中並未實現saveToDb方法。
代碼清單七(SaveLogon.java)
package com.mystruts.struts; /** * @author Administrator * */ public class SaveLogon { private String username = null; private String userpassword = null; public void setUsername(String username){ this.username = username; } public String getUsername(){ return this.username; } public void setUserpassword(String userpassword){ this.userpassword = userpassword; } public String getUserpassword(){ return this.userpassword; } public void saveToDb(){ } } |
運行
如果使用者名稱和密碼為空白,運行結果十二、圖十三、圖十四所示。
(圖十二)
如果使用者名稱為admin,運行結果十三
(圖十三)
如果通過驗證,運行結果十四
(圖十四)
小結
1 為了降低偶合度,應該建立一個存放常量的JAVA檔案。例如logonAction.java中的String badusername = "admin",或者request.setAttribute("savelogon",sl)的第一個參數。
2 要實現Struts的國際化,支援多國語言,編碼方式一定要為UTF-8。
3 在配置Action時,見圖九,如果選取redirect,則在struts-config.xml中的action元素會多一個屬性,redirect="true"。啟動並執行結果是success.jsp中無法獲得request範圍內的savelogon對象。