Strut1框架的流程詳細解釋:
1. 客戶端發出*.do請求,ActionServlet獲取請求,從配置文件中查找path屬性與請求名相匹配的Action元素。通過type屬性找到用戶要請求的Action。總控制器需要檢查name屬性,如果沒有,則將請求直接分發到具體控制器中。
2. 如果name屬性存在,根據name屬性查找formBean的類型。在查看scope屬性,attribute屬性。調用 request(session).getAttribute(“attrName”) ,如果返回null,說明在請求域中formBean實例不存在。有總控制創建Formbean ,調用formBean的reset()方法,在將formBean實例綁定到作用域對象中。
再調用formBean的setter()方法,完成參數的封裝;在檢查validate屬性,如果true,則調用formBean的validate()方法進行表單校驗。校驗通過,則將請求分發到具體action中,將封裝了表單參數的formBean實例通過形參傳遞給action。
Struts1中控制器組件:ActionServlet、Action
其中ActionForm組件用來封裝傳值,其作用範圍侷限於視圖層和控制層之間使用,不應將ActionForm傳遞個Model層。ActionForm從本質而言屬與model層,ActionForward組件:轉發或者重定向對象
ActionMapping組件:輔助組件用來幫助action讀取相關的信息。
框架搭建:選擇web項目,右鍵->MyEclipse->Add Struts
Web.xml中內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<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>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
Struts-Config.xml配置文件配置單動作控制器與動作控制器:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<data-sources />
<form-beans >
<!-- formbean 元素表示FormBean組件的註冊;name屬性表示註冊名;type屬性表示formBean組件的全名 -->
<form-bean name="loginForm" type="com.bsb.struts.form.LoginForm" />
<!-- 動態formBean的設置,採取模型驅動封裝表單數據 -->
<form-bean name="studForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="stud" type="com.bsb.pojo.StudBean" />
</form-bean>
</form-beans>
<global-exceptions />
<global-forwards >
<forward name="loginok" path="/form/main.jsp" redirect="true"></forward>
<forward name="cscheck" path="/cs.do"></forward>
</global-forwards>
<action-mappings >
<!-- action元素表示控制器的註冊;path屬性表示控制器的映射名;type屬性表示控制器的全名
name屬性表示幫助action封裝表單參數的formBean的註冊名
scope屬性表示formBean的作用域,默認爲session
attribute屬性表示formBean在作用域中的屬性名
validate屬性表示formBean封裝完表單參數後是否需要進行表單校驗,默認爲true
input屬性定義用來展示異常信息的頁面 -->
<action attribute="loginForm" input="/form/login.jsp" name="loginForm"
path="/login" scope="request" validate="true"
type="com.bsb.struts.action.LoginAction" >
<forward name="loginfail" path="/form/login.jsp"></forward>
</action>
<!-- 查詢班級的控制器 -->
<action path="/cs" type="com.bsb.struts.action.CsAction" >
<forward name="checkcs" path="/form/stud.jsp"></forward>
</action>
<!-- 多動作控制器 parameter屬性指定參數名method;此參數method的值就是用戶請求的控制器的方法名
示例: action="/stud.do?method=save" Struts1中多動作控制器不能擁有默認的execute方法 -->
<action attribute="studForm" input="/form/stud.jsp" name="studForm"
parameter="method" path="/stud" scope="request"
type="com.bsb.struts.action.StudAction">
<forward name="saveok" path="/form/main.jsp" redirect="true"></forward>
<forward name="checkstuds" path="/form/show.jsp"></forward>
<forward name="checkbyid" path="/form/update.jsp"></forward>
<forward name="updateok" path="/stud.do?method=checkAll"></forward>
</action>
</action-mappings>
<!-- 註冊struts框架需要使用的資源包ApplicationResources.properties-->
<message-resources parameter="com.bsb.struts.ApplicationResources" />
</struts-config>
FormBean驗證:
public class LoginForm extends ActionForm {
private String lname;
private String lpass;
private String lid;
public String getLname() {return lname; }
public void setLname(String lname) { this.lname = lname; }
public String getLpass() {return lpass; }
public void setLpass(String lpass) {this.lpass = lpass; }
public String getLid() { return lid; }
public void setLid(String lid) {this.lid = lid; }
/* validate方法用來驗證表單參數的合法性
* 此方法如果返回null ,或者返回空的ActionErrors
* 表示驗證通過。如果驗證失敗,總控制器會將流程轉發到
* action元素中input屬性指定的頁面,展示異常提示信息*/
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errs =new ActionErrors();
if(this.lname.equals("")){
//創建包含異常提示信息的異常對象
ActionError err = new ActionError("error.jsp.name");
//將異常對象綁定到異常集合中(map)
errs.add("lname", err);
}
if(this.lpass.length()<6){
ActionError err = new ActionError("error.jsp.pass");
errs.add("lpass", err);
}
return errs; //errs通過request傳遞到input屬性指定的頁面
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
this.lname="";
this.lpass=""; }
}
LoginAction.action: 單動作控制器:
public class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;//獲取封裝了表單參數的formBean
// 創建javaBean
LoginBean lb = new LoginBean();
//通過BeanUtils輔助類,將formBean的屬性值賦值給javaBean
try {
BeanUtils.copyProperties(lb, loginForm);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//進行登錄驗證
boolean flag =new LoginService().loginValidate(lb);
if(flag){
return mapping.findForward("loginok");//重定向
}else{
ActionErrors errs = new ActionErrors();
ActionError err = new ActionError("error.user");
errs.add("usererror", err);
this.saveErrors(request, errs); //手工將errs綁定到request對象中
//return mapping.findForward("loginfail");
return new ActionForward(mapping.getInput());
}
}
}
StudAction.action:多動作控制器
public class StudAction extends DispatchAction {
public ActionForward save(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
DynaActionForm studForm = (DynaActionForm) form;
//獲取formBean中封裝了表單參數的studBean
StudBean stud = (StudBean) studForm.get("stud");
boolean flag = new StudService().saveStud(stud);
if(flag){
return mapping.findForward("saveok");
}else{
return new ActionForward(mapping.getInput());
}
}
public ActionForward update(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
DynaActionForm studForm = (DynaActionForm) form;
// 從動態formBean中獲取封裝了表單參數的javaBean
StudBean stud = (StudBean) studForm.get("stud");
boolean flag = new StudService().updateStud(stud);
return mapping.findForward("updateok");
}
public ActionForward checkAll(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
List studs = new StudService().checkAll();
request.setAttribute("studs", studs);
return mapping.findForward("checkstuds");
}
public ActionForward checkByID(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
DynaActionForm studForm = (DynaActionForm) form;
StudBean stud = (StudBean) studForm.get("stud");
stud = new StudService().checkByID(stud.getSid());
//將封裝了學生信息的studBean,綁定到動態formBean中
studForm.set("stud", stud);
List cs = new ClassesService().checkAll();//查班級
request.setAttribute("cs", cs);
return mapping.findForward("checkbyid");
}
}
Struts1標籤:
Login.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-template" prefix="template" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-nested" prefix="nested" %><html>
<head><title>JSP for LoginForm form</title></head>
<body>
<html:errors property="usererror" />
<html:form action="/login">
lname : <html:text property="lname"/><html:errors property="lname"/><br/>
lpass : <html:password property="lpass"/><html:errors property="lpass"/><br/>
<html:submit/><html:cancel/>
</html:form>
</body>
</html>
超鏈接
<a href="/struts1Test/cs.do">保存學生a</a><br>
<html:link page="/cs.do">保存學生page</html:link><br>
<html:link href="/ struts1Test /cs.do">保存學生href</html:link><br>
<html:link action="/cs">保存學生action</html:link><br>
<html:link forward="cscheck">保存學生forward</html:link><br>
<html:link action="/stud?method=checkAll">查詢</html:link>
迭代標籤:
<logic:present name="studs">
<logic:iterate id="stud" name="studs">
${stud.sname }${stud.sage }${stud.sexname }${stud.sbirthday }${stud.cname }
<html:link action="/stud?method=checkByID&stud.sid=${stud.sid}">修改</html:link><br>
</logic:iterate>
</logic:present>
添加學生表單:
<html:form action="/stud?method=save">
姓名:<html:text property="stud.sname"></html:text><br>
年齡:<html:text property="stud.sage"></html:text><br>
性別:<html:radio property="stud.ssex" value="0">男</html:radio>
<html:radio property="stud.ssex" value="1">女</html:radio><br>
生日:<html:text property="stud.sbirthday"></html:text><br>
班級:<html:select property="stud.cid">
<logic:iterate id="c" name="cs">
<html:option value="${c.cid}">${c.cname}</html:option>
</logic:iterate>
</html:select><br>
<html:submit/><html:cancel/>
</html:form>
修改也學生信息表單
<html:form action="/stud?method=update">
<html:hidden property="stud.sid" />
姓名:<html:text property="stud.sname"></html:text><br>
年齡:<html:text property="stud.sage"></html:text><br>
性別:<html:radio property="stud.ssex" value="0">男</html:radio>
<html:radio property="stud.ssex" value="1">女</html:radio><br>
生日:<html:text property="stud.sbirthday"></html:text><br>
班級:<html:select property="stud.cid">
<logic:iterate id="c" name="cs">
<html:option value="${c.cid}">${c.cname}</html:option>
</logic:iterate>
</html:select><br>
<html:submit/><html:cancel/>
</html:form>