本篇博客以登錄實例,來看struts架構的實現思路。
1.登錄的jsp頁面
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
<form action="login.do" method="post">
姓名:<input type="text" name="username"><br>
密碼:<input type="password" name="password"><br>
<input type="submit" value="登錄">
</form>
</body>
</html>
說明:form表單中,根據action的值,在struts-config.xml文件中會找到<path="/action">的<action-mapping>標籤。根據這個標籤,找得到對應的action類。這裏是LoginAction類
2.loginActionForm類,負責收集實體信息
package com.bjpowernode.struts;
import org.apache.struts.action.ActionForm;
/**
* 登錄ActionForm,負責收集表單數據
* 表單的屬性必須和LoginActionForm中get、set的屬性一致
* @author xj
*
*/
@SuppressWarnings("serial")
public class LoginActionForm extends ActionForm {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
說明:
這個類繼承自struts架構中的ActionForm類。需要注意,類中的set方法名稱中的變量名,小寫首字母需要和JSP頁面裏提交的form表單中標籤的名一致。例如:getPassword中的password對應,form表單中name屬性爲password的標籤
3.Action類,取得表單信息,調用業務邏輯,返回轉向信息
package com.bjpowernode.struts;
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;
/**
* 登錄Action
* 負責取得表單數據,調用業務邏輯,返回轉向信息
* @author xj
*
*/
public class LoginAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
/*LoginActionForm laf = (LoginActionForm)form;
String username = laf.getUsername();
String password = laf.getPassword();
if("admin".equals(username)&&"admin".equals(password)){
return mapping.findForward("success");
}else{
return mapping.findForward("error");
}*/
LoginActionForm laf = (LoginActionForm)form;
String username = laf.getUsername();
String password = laf.getPassword();
UserManager userManager = new UserManager();
try{
//調用相應的業務邏輯處理類
userManager.login(username, password);
//跳轉到登錄成功頁面
return mapping.findForward("success");
//用自己封裝的異常類捕獲異常——用戶不能找到
}catch(UserNotFoundException e){
e.printStackTrace();
//將錯誤信息存放到request中
request.setAttribute("msg", "用戶不能找到,用戶名稱=【" + username +"】");
//用自己封裝的異常類捕獲異常——密碼錯誤
}catch(PasswordErrorException e){
//將錯誤信息放到request中
request.setAttribute("msg", "密碼錯誤!");
}
//跳轉到錯誤頁面
return mapping.findForward("error");
}
}
說明:這個類繼承Struts框架中的Action類,實現了execute方法.參數form存放了提交表單的信息。request存放了用戶的請求信息。在Action中對用戶請求進行業務處理,調用Model訪問數據庫,將操作數據庫的結果信息放到request中。最後返回要跳轉到的JSP頁面。將頁面展示給用戶。
4.配置文件
<?xml version="1.0" encoding="iso-8859-1"?>
<!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>
<form-beans>
<form-bean name="loginForm" type="com.bjpowernode.struts.LoginActionForm"></form-bean>
</form-beans>
<action-mappings>
<action path="/login"
type="com.bjpowernode.struts.LoginAction"
name="loginForm"
scope="request"
>
<forward name="success" path="/login_success.jsp"></forward>
<forward name="error" path="/login_error.jsp"></forward>
</action>
</action-mappings>
</struts-config>
說明:
在配置文件中,標籤<form-beans>包含所有的Form類。這裏是LoginActionForm類。
在<action-mappings>中配置了。用戶請求地址和Action類對應關係,以及Action類和ActionForm類的對應關係。
分析業務流轉:用戶輸入用戶名,密碼提交表單。通過分析請求地址找到對應的action。此例中爲loginAction。並將提交的表單信息,放到與loginAction匹配的LoginActionForm中。在Action中執行execute方法,進行業務處理。
5.實現效果
登錄頁面輸入用戶名和密碼,登錄成功則跳轉到登錄成功頁面,否則跳轉到登錄失敗頁面。登錄失敗時通過異常類捕獲了異常,提示相應的錯誤。
6.總結:
通過這個實例很清楚的瞭解了strust1的執行流程。