下圖為一個Struts的簡單原理流程圖,其中在web.xml中會設定什麼樣的url要交由ActionServlet來轉發給處理邏輯(例如 *.do),JSP File相當於View的可視化介面,當JSP File要把表單(Form)中的參數傳給商業邏輯處理時,ActionServlet會去struts-config.xml中尋找對應Form裡指定目標url的Action(相當於Control)和相應要物件實例化Form的Bean類別,ActionForm(相當於Model)。之後在Action中處理商業邏輯,並指定一個轉送目標url,這時就會轉送到struts-config.xml中對應轉送標的JSP或Action等。
我們的範例專案檔案配置如下:
- login.jsp : 身份認證的輸入畫面。
- loginSuccess.jsp : 認證成功的畫面。
- struts-config.xml : Struts的配置設定。
- LoginCheckAction : 處理身份認證商業邏輯的Action。
- LoginFormBean : 用來實例物件Form的Bean類別。
以下為程式碼,相關的解釋都在註解裡:
一、首先是login.jsp的程式碼:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%-- 引進Struts的bean及html標籤庫 --%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登入頁面</title>
</head>
<body>
<h1>請輸入名字</h1>
<%-- 使用html:form來建立一個form,action為資料要送往的url --%>
<html:form action="/loginCheckAction">
<%-- 使用bean:write來從名為LoginFormBean的Bean類別中取得名為errorMessage的資 --%>
<%-- 料,如找不到則忽略 --%>
<bean:write name="LoginFormBean" property="errorMessage" filter="false"/>
<%-- 使用html:text來紀錄為name的值,之後利用html:submit來將name值傳給action指定的url --%>
請輸入名字:<html:text property="name" />
<html:submit value="登入" />
</html:form>
</body>
</html>
二、再來是loginSuccess.jsp:<%@page contentType="text/html" pageEncoding="UTF-8"%> <%-- 引進Struts的bean及html標籤庫 --%> <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>登入成功</title> </head> <body> <h1>登入成功!</h1> <%-- 將LoginFormBean物件中名為name的屬性顯示出來 --%> 您好:<bean:write name="LoginFormBean" property="name" filter="false"/> </body> </html>
三、接著實作用來實例物件Form的Bean類別,LoginFormBean,其中的name屬性對應到login.jsp中<html:form>裡<html:text>的name property:
package com.myapp.struts;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
public class LoginFormBean extends org.apache.struts.action.ActionForm {
private String name;
private String errorMessage;
public String getName() {
return name;
}
/**
* @param string
*/
public void setName(String string) {
name = string;
}
public String getErrorMessage() {
return errorMessage;
}
//設置名字錯誤的errorMessage之html
public void setNameErrorMessage() {
this.errorMessage = "<span style='color:red'>名字錯誤!你是誰?</span></br>";
}
public void clearErrorMessage(){
this.errorMessage = null;
}
public LoginFormBean() {
super();
// TODO Auto-generated constructor stub
}
//用於驗證Form參數的method
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (getName() == null || getName().length() < 1) {
errors.add("name", new ActionMessage("error.name.required"));
//驗證有無輸入name的參數,如果沒有則加入顯示相應錯誤的html到errorMessage中
this.errorMessage = "<span style='color:red'>你沒輸入任何名字!</span></br>";
// TODO: add 'error.name.required' key to your resources
}
return errors;
}
}
四、這裡我們在LoginCheckAction設計了簡單的身份認證商業邏輯:
package com.myapp.struts;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class LoginCheckAction extends org.apache.struts.action.Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//獲得由Form實例化的物件,LoginFormBean,其中包含了對應到<html:form>裡<html:text>中的name參數
LoginFormBean loginFormBean = (LoginFormBean) form;
//如果是表單輸入的名字是Hugo的話,轉送"success"對應的JSP或Action
if ("Hugo".equals(loginFormBean.getName())) {
return mapping.findForward("success");
} else {
//如果是表單輸入的名字不是Hugo的話,轉送"failure"對應的JSP或Action
loginFormBean.setNameErrorMessage();
return mapping.findForward("failure");
}
}
}
五、最後,我們要在struts-config.xml裡進行設定,將以上的各檔關係聯繫起,在struts-config.xml中,我們要加上以下片段程式碼,其中在<action>中,scope為處理的domain、path為要處理轉送的url路徑、type為要從JSP送到哪個Action或JSP、name為要實例物件化Form的Bean類別、validate為參數要不要在Bean類別中執行validate()方法來進行先行驗證、input為指定validate()不通過時要返回的JSP。而在<action>中可以設定<forward>標籤,用來設定從Action中要利用mapping.findForward()轉送時,不同的輸入參數要送到哪個目標:
<action-mappings> <action name="LoginFormBean" input="/login.jsp" path="/loginCheckAction" scope="request" type="com.myapp.struts.LoginCheckAction" validate="true"> <forward name="success" path="/WEB-INF/loginSuccess.jsp"/> <forward name="failure" path="/login.jsp"/> </action> </action-mappings>
成品展示:
一開始的網頁如下圖:
如果沒有輸入任何名字並按下鈃入按鈕後,會出現相應的提示訊息:
如果輸入錯誤的名字的話(非Hugo時),也會出現相應的提示訊息:
如果輸入正確的名字的話(輸入Hugo),將會被導向loginSuccess.jsp頁面:
最後附上源始碼:
MyStrutsWebApp.7z






沒有留言 :
張貼留言