# STRUTS ## 第一支struts程式: 1. 先加入必要的jar包,至少須包含 **struts.jar commons-beanutils.jar commons-digester.jar commons-collections.jar commons-logging.jar** ,如果用Maven設定則可以參照以下設定,還須加上javax.servlet及servlet設定 ```xml <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts-core</artifactId> <version>1.3.10</version> </dependency> ``` 2. 寫一支表單物件繼承**ActionForm**的Java Bean ```java import org.apache.struts.action.ActionForm; //一支繼承ActionForm的Java Bean public class HelloStrutsForm extends ActionForm{ String id; String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } ``` 3. 寫一支**Controller**繼承Action,要override ActionForward excute() ```java 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 com.test.form.HelloStrutsForm; //一支繼承Action的Controller public class HelloStrutsAction extends Action{ //override execute()方法 public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) { String param = request.getParameter("name"); //將form強轉型為寫好的form HelloStrutsForm helloStrutsFormxxx = (HelloStrutsForm)form; helloStrutsFormxxx.setName("hello "+param); //return mapping.findForward("config內設定的forward name"),便會依照資料夾路徑轉導; return mapping.findForward("helloUser"); } } ``` 4. 寫一個預計轉導到的**JSP**檔 ```xml <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%> <html> <head> </head> <body> <h1><bean:write name="helloStrutsForm" property="name" /></h1> </body> </html> ``` 5. 設定**struts-config.xml**的對映,如**form-beans**及**action-mappings** ```xml <?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="helloStrutsForm" type="com.test.form.HelloStrutsForm"></form-bean> </form-beans> <action-mappings> <!-- input代表錯誤時會導到哪一頁--> <action path="/hello" type="com.test.action.HelloStrutsAction" name="helloStrutsForm" input="login"> <forward name="helloUser" path="/WEB-INF/pages/hello.jsp" /> </action> </action-mappings> </struts-config> ``` 6. 從**web.xml**的init-param中設定sturts-config.xml放置的地方,並告知*.do的action都由struts處理 ```xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app> ``` 7. 掛在**Servlet Container**上跑即可 ## 幾個重要的類別 **ActionServlet**: 擔任Front Controller,會將處理的控制權暫時交給Action物件 **RequestProcessor**: Struts 1.1後,有關於請求處理大部份交由**RequestProcessor**,只有需要客製生命週期需要做的動作才須繼承ActionServlet來定義自己的控制器 **Action**: 在請求來臨後,RequestProcessor 根據請求URI呼叫對應的Action物件,將工作交給它,並在最後由Action物件得到一個**ActionForward**物件, ActionServlet使用ActionForward得知將流程forward至指定的資源。 **ActionMapping**: 用來依據<action>標籤,對映所請求的URL所導向的控制器 **ActionForward**: ActionServlet使用ActionForward得知將流程forward至指定的資源 **ActionForm**: ActionForm是表單的物件化表示,它本身設計為JavaBean,需要被註冊在<form-beans> **DispatchAction**: 可以依情境打到controller的不同方法,主要在Controller繼承時由繼承Action改為繼承DispatchAction即可,且不需再override excute()方法,但注意在請求時須在url的.do後面加上?method=方法名稱 <bean: write>: 用於取得回傳form所存的值,注意bean第一個字為小寫非大寫,如: <bean: write name="someBean" property="beanProperty"/> <bean: message>: 用於取得messages.properties裡預存的訊息,如: <bean: message key="button.save"/> **LookupDispatchAction**: 與DispatchAction相似,主要差別在可以透過**查詢訊息資源檔**來確定相對應的動作 **DynaActionForm**: 直接在struts-config.xml初始化form,不用另外寫xxxform.java **Map-backed ActionForm**: 如專案部分欄位為**動態產生**,可使用此方案 Server端驗證: 主要依靠validate()方法,在表單物件繼承ActionForm後再override ActionErrors validate()方法
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up