现在的位置: 首页 > 综合 > 正文

Struts1.1完整实战开发例子

2012年04月30日 ⁄ 综合 ⁄ 共 16135字 ⁄ 字号 评论关闭
Struts1.1的新功能
    Struts1.1与1.0相比加了一些很不错的功能。最主要是表单验证上功能增强。在Struts1.1数据的验证不象以前在Action中在validator具体实现,而是在validation.xml通过配置实现这样做的好处就是重用性加强了很多。 

Struts1.1实现的主要组成
    主要包括:Action,ActionForm,ActionMapping,ActionForward,开发当中最主要写的是Action,ActionForm根据需要可以写或不写。下面我就一一具体介绍。
    Action
        An Action is an adapter between the contents of an incoming HTTP request and the corresponding 

business logic that should be executed to process this request.  
    上面是Struts开发小组对Action的描述,说Action实际上Request和Business Logic中间的适配器.通俗的说就是从表单中取到数据并穿给商业逻辑操作进行一系列的操作,然后返回相应的操作信息。
    
    ActionForm
        An ActionForm is a JavaBean optionally associated with one or more ActionMappings.  Such a bean 

will have had its properties initialized from the corresponding request parameters before the 

corresonding action's execute() method is called.
    ActionForm实际上就是把从Request取到的数据封装并进行校验,然后把合法的数据给Action进行处理。实际上ActionForm除了进行数据校验之外另外更重要的是在表单回写的时候作用很大。反而在1.1以后数据校验的大部分工作在validation.xml去实现。
    
    ActionMapping,ActionForward
    ActionMapping主要是用与配置和描述相关属性使用的。先看下在struts-config.xml
    中的配置文件一段配置描述:
    <action-mappings>
        <!-- Registration Action -->
        <action    path="/usereg"
                   type="com.bingo.finance.action.UseregAction"
                   name="useregForm"
                   scope="request"
                   validate="true"
                   input="/usereg.jsp">
           <forward name="success"              path="/msg.jsp"/>
        </action>
   </action-mappings>
   ActionMapping就是用来描述一个Action的URL、具体实现的文件、相对应的ActionForm 数据属性(request or session)、是否需要进行数据校验和回写、以及处理完成后可能跳转的URL.
   而ActionForward你就可以理解为Action 操作完成后的跳转URL,Action在处理完相关操作后,返回的是一个ActionForward也就是告诉Struts我做完这个操作下一步到哪儿去。

构建Struts1.1运行环境
    我的配置是居于Tomcat4.0以上版本讨论,其他的AppServer大致相同。
    1:得到Struts1.1 
    http://jakarta.apache.org/builds/jakarta-struts/release/v1.1-b1/jakarta-struts-1.1-b1.zip
    2:设置
    把Struts.jar Copy到$Tomcat_home/common/lib 或你使用Struts的Appaction下的WEB-INF/lib下
    在你使用Struts的Appaction下web.xml中增加下列配置
    
    <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>2</load-on-startup>
   </servlet>
   
  <taglib>
    <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
  </taglib>

  <taglib>
    <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
  </taglib>

  <!-- Nested Tag Library Descriptor -->
  <taglib>
    <taglib-uri>/WEB-INF/struts-nested.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-nested.tld</taglib-location>
  </taglib>

  <!-- Template Tag Library Descriptor -->
  <taglib>
    <taglib-uri>/WEB-INF/struts-template.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-template.tld</taglib-location>
  </taglib>
  Struts1.1中提供了很详细的例子,你可以仔细看看.
  接下来你该根据需要配置struts-config.xml,以下是一个简单的例子
  <?xml version="1.0" encoding="ISO-8859-1" ?>

    <!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>
    
      <!-- ========== Form Bean Definitions =================================== -->
      <form-beans>
    
        <!-- Registration form bean -->
        <form-bean      name="useregForm"
                        type="com.bingo.finance.action.UserForm"/>
    
      </form-beans>
    
      <!-- ========== Global Forward Definitions ============================== -->
      <global-forwards>
        <forward   name="error"             path="/error.jsp"/>
      </global-forwards>
    
      <!-- ========== Action Mapping Definitions ============================== -->
      <action-mappings>
    
        <!-- Registration Action -->
        <action    path="/usereg"
                   type="com.bingo.finance.action.UseregAction"
                   name="useregForm"
                   scope="request"
                   validate="true"
                   input="/usereg.jsp">
           <forward name="success"              path="/msg.jsp"/>
        </action>
      </action-mappings>
    
      <!-- ========== Message Resources Definitions =========================== -->
    
      <message-resources
        parameter="com.bingo.finance.common.DisplayMsg"/>
    
      <!-- ========== Plug Ins Configuration ================================== -->
    
      <!-- Add multiple validator resource files by setting the pathname property -->
      <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
        <set-property property="pathname" value="/WEB-INF/validator-rules.xml"/>
        <set-property property="pathname" value="/WEB-INF/validation.xml"/>
      </plug-in>
    
    </struts-config>
    上面的英文我相信你能够看懂。我就不做解释了。你需要继续配置validation.xml了,看如下
    简单的例子.
    <form-validation>
       <formset>
          <form    name="useregForm">
             <field    property="username"
                    depends="required,mask,minlength,maxlength">
                      <arg0 key="common_username"/>
                      <arg1 name="minlength" key="${var:minlength}" resource="false"/>
                      <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
                         <var>
                           <var-name>mask</var-name>
                           <var-value>^/w+$</var-value>
                         </var>
                         <var>
                           <var-name>minlength</var-name>
                           <var-value>5</var-value>
                         </var>
                         <var>
                           <var-name>maxlength</var-name>
                           <var-value>20</var-value>
                         </var>
             </field>
             <field    property="password"
                    depends="required,mask,minlength,maxlength">
                      <arg0 key="common_password"/>
                      <arg1 name="minlength" key="${var:minlength}" resource="false"/>
                      <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
                         <var>
                           <var-name>mask</var-name>
                           <var-value>^/w+$</var-value>
                         </var>
                         <var>
                           <var-name>minlength</var-name>
                           <var-value>5</var-value>
                         </var>
                         <var>
                           <var-name>maxlength</var-name>
                           <var-value>20</var-value>
                         </var>
             </field>
             <field    property="nickname"
                    depends="required,mask,minlength,maxlength">
                      <arg0 key="common_nickname"/>
                      <arg1 name="minlength" key="${var:minlength}" resource="false"/>
                      <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
                         <var>
                           <var-name>mask</var-name>
                           <var-value>^/w+$</var-value>
                         </var>
                         <var>
                           <var-name>minlength</var-name>
                           <var-value>5</var-value>
                         </var>
                         <var>
                           <var-name>maxlength</var-name>
                           <var-value>20</var-value>
                         </var>
             </field>
             <field    property="superpass"
                    depends="required,mask,minlength,maxlength">
                      <arg0 key="common_superpass"/>
                      <arg1 name="minlength" key="${var:minlength}" resource="false"/>
                      <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
                         <var>
                           <var-name>mask</var-name>
                           <var-value>^/w+$</var-value>
                         </var>
                         <var>
                           <var-name>minlength</var-name>
                           <var-value>10</var-value>
                         </var>
                         <var>
                           <var-name>maxlength</var-name>
                           <var-value>20</var-value>
                         </var>
             </field>
          </form>
       </formset>
     </form-validation>
     上面validation.xml就是告诉Struts我的useregForm取到的数据应该做下面的验证
     username是必须不能为空的并且最小长度为5,最大长度是20.
     ................
     password,nickname,superpass基本一样我就不做更多说明.至次配置基本结束,我们要开始写第一个Struts 了。
 
开发Struts1.1
    
     usereg.jsp
     为了考虑页面的灵活性,在页面中显示的所有元素我都放在properties文件中并由com.bingo.finance.common.HtmlMsg这个文件取到.
     ===================================================================
     <%@&nbsp;page contentType="text/html;charset=GBK" %>
    <%@&nbsp;page import="java.io.*"%>
    <%@&nbsp;page import="com.bingo.finance.common.HtmlMsg"%>
    <%@&nbsp;taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
    <%@&nbsp;taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
    <%@&nbsp;taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>

    <html>
    <head>
    <title><%=HtmlMsg.TITLE_REGISET%></title>
    < meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    </head>
    
    <body bgcolor="#FFFFFF" text="#000000">
    <form name="usereg" method="post" action="usereg.esp">
    <!--在Struts中默认的后缀是.do你可以根据需要自己修改-->
      <table width="100%" border="0" cellspacing="1" cellpadding="1">
        <tr align="center">
          <td colspan="2"><%=HtmlMsg.TITLE_REGISET%></td>
        </tr>
        <tr>
          <td width="49%" align="right"><%=HtmlMsg.COMMON_USERNAME%>:</td>
          <td width="51%">
            <!--为了实现回写在Struts中建议你使用Tag使用如下写法代替一般的写法
            <html:text property="username" size="20" maxlength="30" styleClass="css" styleId="userId"/>
            上面的代码你看不懂你需要进一步了解Tag.
            -->
            <input type="text" name="username" size="20" maxlength="20">
          </td>
        </tr>
        <tr>
          <td width="49%" align="right"><%=HtmlMsg.COMMON_PASSWORD%>:</td>
          <td width="51%">
            <input type="password" name="password" size="20" maxlength="20">
          </td>
        </tr>
        <tr>
          <td width="49%" align="right"><%=HtmlMsg.COMMON_NICKNAME%>:</td>
          <td width="51%">
            <input type="text" name="nickname" size="20" maxlength="20">
          </td>
        </tr>
        <tr>
          <td width="49%" align="right"><%=HtmlMsg.COMMON_SUPERPASS%>:</td>
          <td width="51%">
            <input type="password" name="superpass" size="20" maxlength="20">
          </td>
        </tr>
        <tr>
          <td width="49%" align="right">
            <input type="submit" name="Submit" value="<%=HtmlMsg.ACTION_REGISET%>">
          </td>
          <td width="51%">
            <input type="reset" name="Submit2" value="<%=HtmlMsg.COMMON_RESET%>">
          </td>
        </tr>
      </table>
    </form>
    </body>
    </html>
     
     
     UseregActiom.java
     ===========================================================
     package com.bingo.finance.action;

    //java import
    import java.io.IOException;
    import java.util.Locale;
    
    //servlet import
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpSession;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    //struts import
    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.apache.struts.util.MessageResources;
    
    //finance import
    import com.bingo.finance.action.UserForm;
    import com.bingo.finance.manager.UserManager;
    import com.bingo.finance.entity.User;
    
    public class UseregAction extends Action {
        //在Struts1.1以前使用perform
        //struts1.1使用execute替代perform
        public ActionForward execute(ActionMapping mapping,
                     ActionForm form,
                     HttpServletRequest request,
                     HttpServletResponse response)
        throws IOException, ServletException {
            try{
                UserForm userForm=(UserForm)form;
                UserManager userManager=new UserManager();
                User     user=userManager.formToEntity(userForm);        
                userManager.add(user);
                //Insert into DataBase a Userinfo
            }catch(Exception ex){
                return mapping.findForward("error");
            }
            return mapping.findForward("success");
            //ForWard is "/msg.jsp"
        }
    }
    
    UserForm.java
    =========================================================================
    package com.bingo.finance.action;
    import java.util.*;
    import java.io.Serializable;
    //servlet import
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpSession;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    //struts import
    import org.apache.struts.action.ActionMapping;
    import org.apache.struts.validator.ValidatorForm;
    public class UserForm extends ValidatorForm implements Serializable{
    //在Struts1.1以前通常Form继承ActionForm
    //实际上ValidatorForm是继承ActionForm
    //为什么要加一层ValidatorForm是为了校验而做的
        private String  id;
        private String  username;
        private String  password;
        private String  nickname;
        private String  superpass;
    
    
        public UserForm(){
    
        }
    
        /****/
        public String  getId(){
            return this.id;
        }
    
        /****/
        public  void setId(String  _id){
            this.id=_id;
        }
    
        /****/
        public String  getUsername(){
            return this.username;
        }
    
        /****/
        public  void setUsername(String  _username){
            this.username=_username;
        }
    
        /****/
        public String  getPassword(){
            return this.password;
        }
    
        /****/
        public  void setPassword(String  _password){
            this.password=_password;
        }
    
        /****/
        public String  getNickname(){
            return this.nickname;
        }
    
        /****/
        public  void setNickname(String  _nickname){
            this.nickname=_nickname;
        }
    
        /****/
        public String  getSuperpass(){
            return this.superpass;
        }
    
        /****/
        public  void setSuperpass(String  _superpass){
            this.superpass=_superpass;
        }
    
        /**show this class info**/
        public String toString(){
            StringBuffer info=new StringBuffer();
            info.append("....id is:"+id);
            info.append("....username is:"+username);
            info.append("....password is:"+password);
            info.append("....nickname is:"+nickname);
            info.append("....superpass is:"+superpass);
            return info.toString();
        }
    
        public void reset(ActionMapping mapping, HttpServletRequest request) {
               id=null;
            username=null;
            password=null;
            nickname=null;
            superpass=null;
        }
    }
  
    UserManager.java ,User.java文件我就不提供了,这一部分在实际的开发当中根据需要自己去处理,也就是为了把数据插入数据库。
    现在一个简单的注册用户你就开发完成了。很简单吧。呵呵,继续努力...但其中还有很多 细节你需要进一步了解,我只把你领到门了,你必须自己去研究一些东西,比如说,我希望我的用户多一个Email字段和一个年龄字段我应该如何做,而且我希望validation.xml的验证有Email合法验证,年龄必须大于0而且一定是整数。那我应该如何做?我只能告诉你加两个字段你需要修改Form 增加字段,同时相应文件也要修改。在struts中Email的验证非常简单。好好看例子吧,好好研究validator-rules.xml,这个我认为struts1.1最好的功能增加(Struts1.0没有这个文件)。Struts中提供了一个非常灵活而且重用极高的验证机制。

Struts和其他开发方式的比较
    使用Struts开发至少带来如下好处:
    1:层次结构非常清晰,也使得分工很明确。
    2:重用度很高,连数据验证都可以重用,还有一个更好的重用就是Form,Action是可以很好的重用的。
    3:可维护性好。这是居于第一点的。
    .................

抱歉!评论已关闭.