近期因為負責的案子大多都是Java Web,所以也開始接觸了一些Java 的開源框架,也慢慢對Java有了更進一步的了解,而今天要介紹的就是Java Struts,Java Struts是一種走(MVC)架構的框架,跟之前學習過的Spring MVC在應用以及設定上其實有許多相似的地方,接下來就簡單的介紹一下Struts的Hello Worlds!!以及簡單的表單傳送~~~
- 開發工具 : Eclipse Java Neon.3 Release (4.6.3)
- Struts版本 : 1.3.10
- Server : Tomcat 9.0
step 1. 先下載Structs1.3.10 ( https://struts.apache.org/download.cgi )
step 2. 接著我們先從Eclipse新增一個Dynamic Web Project
step 3. 把剛才下載好的Struts 1.3.10( \struts-1.3.10-all\struts-1.3.10\lib ) 裡面的jar檔加入參考
- 在專案folder上面點右,選擇Bulid Path >> Add Library
- 選擇User Libraries點選Next,將( \struts-1.3.10-all\struts-1.3.10\lib ) 裡面的jar檔加入
step 4. 到剛才下載好的Struts1.3.10,找到 struts-blank-1.3.10.war ( struts-1.3.10\apps ) 將副檔名改成*.zip 並且解壓縮 ,將裡面的檔案複製到專案的WebContent下面
這個是一個空白的範例~可以直接使用~裡面包含了核心設定檔struts-config.xml及web.xml透過這個可以加速我們Web App的開發,這時候我們可以直接用Tomcat執行此專案如果出現下圖所示的畫面代表Struts基本設定已經成功了~
step 5. 接下來我們打開web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <display-name>StructWebDemo</display-name> <!-- Standard Action Servlet Configuration --> <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> <!-- Standard Action Servlet Mapping --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- The Usual Welcome File List --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> |
從web.xml中的<servlet>設定我們可以看到幾個重點
- 負責Controller工作的是ActionServlet,理論上只要是Client Request都會經過ActionServlet來發送
- ActionServlet會去讀取struts-config.xml這隻設定檔其中包含了Sturts的一些相關設定
- servlet-mapping設定,ActionServlet 會去處理所有來自*.do的Request
這些就是web.xml的幾個較為重要的設定~~~
step 6. 打開struts-config.xml,顧名思義這個檔案就是Struts的核心所在了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?xml version="1.0" encoding="ISO-8859-1" ?> <!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> <action-mappings> <action path="/Hello" type="com.appx.action.HelloAction"> <forward name="helloUser" path="/pages/Hello.jsp" /> </action> </action-mappings> <!-- ======================================== Message Resources Definitions --> <message-resources parameter="MessageResources" /> <plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/org/apache/struts/validator/validator-rules.xml, /WEB-INF/validation.xml" /> </plug-in> </struts-config> |
在struts-config.xml中,透過 action-mappings 的設定,來達成Client Request與Server的溝通
- action-mappings : 設定Request與Server Action的對應關係,path=”Hello” and type=”com.appx.action.HelloAction” 時,當我們的Request是Hello發出時,就會使用HelloAction來處理這個Request,而forward的設定則是HelloAction執行結速後要導向的對象,一個action中可以有多個forward對象,在action中將會去對應forward上的name來尋找並返回對應ActionForward 物件,ActionServlet會根據action傳回的ActionForward來將請求轉發至指定的對象。
- form-bean : 設定View(表單),與對應的Class,當表單被送到Server時會將表單的name,去對應form-bean是否有相同的name,如果有找到相同的name,就會將值注入該form-bean對應的Class
step 7. 由action-mappings 的設定我們可以知道,必須要有一個HelloAction來處理Hello發出的請求,而HelloAction是必須繼承org.apache.struts.action.Action且覆寫execute()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package com.appx.action; import java.util.HashMap; import java.util.Map; 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; public class HelloAction extends Action{ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { request.setAttribute("message", " Hello World !!! "); return mapping.findForward("helloUser"); } } |
如此一來~只要是Hello發出的請求,就都會交由HelloAction來處理,當我們處理完這個Action要做的事之後,必須呼叫ActionMapping的物件,ActionMapping就會去struts-config.xml尋找是否有這個forward對象,如果有找到,Servlet就使用回傳的ActionForward將Request轉發至指定的對象。
因為我們設定的<forward name=”helloUser” path=”/pages/Hello.jsp” />因此我們在相對應得路徑中加入Hello.jsp的頁面
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<%@page contentType="text/html" pageEncoding="UTF-8" errorPage="error.jsp"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>${message}</title> </head> <body> <H1>${message}</H1> </body> </html> |
然後就可以啟動Server,http://localhost:8080/${web.xml的display-name}/Hello.do,就可以看到以下畫面
這樣我們就完成了Struts 的HelloWorld!!!
另外Struts中還有一個ActionForm的應用,ActionForm可以把我們的表單以物件來表示,所以當我們在設計物件時必須繼承org.apache.struts.action.ActionForm,並且要提供getter及setter的方法,在ActionForm產生後會去與相對應的物件做比對,如果有相同的參數就會用setter將數值注入其中,以下提供簡單的ActionForm操作例子~~~
step 1. 我們先來建立表的物件 UserForm.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
package com.appx.form; import javax.servlet.http.HttpServletRequest; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; public class UserForm extends ActionForm{ private String username; private String password; public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } public String getUsername() { return username; } public String getPassword() { return password; } public void reset(ActionMapping mapping, HttpServletRequest request) { username = null; password = null; } } |
ps.要記得繼承org.apache.struts.action.ActionForm才會有效果喔~~~
step 2. 在struts-config.xml加入<form-bean>設定表單名稱以及與剛剛建立的UserForm對應,並且在action中加入對應的表單名稱
1 2 3 4 5 6 7 |
<form-beans> <form-bean name="userForm" type="com.appx.form.UserForm" /> </form-beans> <action path="/Login" type="com.appx.action.LoginAction" name="userForm"> <forward name="helloUser" path="/pages/Hello.jsp" /> <forward name="loginUser" path="/pages/LoginForm.jsp" /> </action> |
step 3. 接著處理Login的Action LoginAction.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
package com.appx.action; import java.util.HashMap; import java.util.Map; 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.springframework.beans.factory.annotation.Autowired; import com.appx.form.UserForm; import com.appx.service.UserService; public class LoginAction extends Action{ private UserService userService = new UserService(); public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { if( ((UserForm) form).getUsername().equals("test") && ((UserForm) form).getPassword().equals("test") ){ request.setAttribute("message", "Hi~~" + ((UserForm)form).getUsername()); return mapping.findForward("helloUser"); }else{ request.setAttribute("message", "帳號或密碼錯誤請重新輸入!!!"); return mapping.findForward("loginUser"); } } } |
經過設定,我們的表單會透過ActionForm傳進來,在這裡我們還需要把ActionForm轉型成UserForm才可以使用UserForm的getter方法,經過簡單的帳號密碼驗證,我們透過forward的方式導向登入成功就導向[helloUser]的頁面,失敗就回到登入頁面並顯示登入敗的訊息~~
step 4. 最後我們要加上登入表單的頁面 LoginForm.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<%@page contentType="text/html" pageEncoding="UTF-8" errorPage="error.jsp"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>${message}</title> </head> <body> <H1>Login</H1> <H1>${message}</H1> <form name="userForm" action="/StructWebDemo/Login.do" method="post"> username : <input type="text" name="username" /> <p> password : <input type="password" name="password" /> <p> <input type="submit" /> </form> <a href="/StructWebDemo/pages/AddUser.html">新增使用者</a> </body> </html> |
最後我們就可以啟動Server來測是囉~~
到這邊ActionForm的基本應用也告段落了~~~
最後附上程式連結供大家參考喔~https://github.com/jimmingOu/StrutsWebDemo/