Struts1 框架簡介(轉)

<url>http://christhb.blog.163.com/blog/static/989824920117271123910/</url>

Struts1 框架簡介  

2011-08-27 11:23:09|  分類: JAVA |  標籤: |字號 訂閱

 Struts1 框架簡介
Struts1框架是apache公司的開源子項目,是基於mvc邏輯分層的web層框架實現。是出現最早的web層框架,應用最廣發。Struts1框架重點關注的是控制層,對於視圖層只是提供了大量的標籤;對於model層的影響微乎其微。第十一章Struts1簡介 - 皮皮 - 皮皮的小屋
 
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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章