Struts中静态动态ActionForm的使用(一)


登录例子

区别

时间属性

验证机制


Struts1中,我们经常接触ActionForm为静态ActionForm。静态是指开发者在使用struts框架时必须写对应的ActionForm

在介绍动态ActionForm使用之前,我们回忆struts常用的ActionForm的方式,以便做对比。

举个完整的登录例子。

第一:配置web.xml

[html]view plaincopyprint?

  1. <servlet>

  2. <servlet-name>action</servlet-name>

  3. <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

  4. <init-param>

    1. <param-name>config</param-name>

    2. <param-value>/WEB-INF/struts-config.xml</param-value>

</init-param>

</servlet><servlet-mapping>

  1. <servlet-name>action</servlet-name>

  2. <url-pattern>*.do</url-pattern>

</servlet-mapping>

<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>

</servlet>

<servlet-mapping>

<servlet-name>action</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

第二:新建jsp页面(在login文件夹)

[html]view plaincopyprint?

  1. <formaction="../login.do"method="get">

  2.  用户名: <inputname="username"type="text"><br>

  3.  密     码: <inputname="password"type="text"><br>

  4. <inputtype="submit">

  5. </form>

 <form action="../login.do" method="get">    用户名:

   <input name="username" type="text"><br>

    密     码: <input name="password" type="text"><br>

    <input type="submit" >

</form>

第三:新建ActionForm

[html]view plaincopyprint?

  1. package com.login;  


  2. import java.util.Date;  


  3. import javax.servlet.http.HttpServletRequest;  


  4. public class LoginForm  extends ActionForm{  

  5.           public String getUsername() {  

  6.        return username;  

  7.    }  

  8.    public void setUsername(String username) {  

  9. this.username = username;  

  10.    }  

  11.    public String getPassword() {  

  12.        return password;  

  13.    }  

  14.    public void setPassword(String password) {  

  15. this.password = password;  

  16.    }  

  17.  private String username;  

  18.  private String password;  

  19. }  

package com.login;import java.util.Date;import javax.servlet.http.HttpServletRequest;public class LoginForm  extends ActionForm{           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;}  private String username;  private String password;}

第四:新建Action

[html]view plaincopyprint?

  1. package com.login;  


  2. import java.util.Date;  


  3. import javax.servlet.http.HttpServletRequest;  

  4. import javax.servlet.http.HttpServletResponse;  


  5. import org.apache.struts.action.Action;  

  6. import org.apache.struts.action.ActionForm;  

  7. import org.apache.struts.action.ActionForward;  

  8. import org.apache.struts.action.ActionMapping;  

  9. import org.apache.struts.action.DynaActionForm;  


  10. public class LoginAction extends Action {  


  11. public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {  


  12.         LoginForm loginForm=(LoginForm)form;  


  13.         boolean flag=false;  

  14.         if("admin".equals(loginForm.getUsername())&&"admin".equals(loginForm.getPassword())){  

  15. flag=true;  

  16.         }  


  17.         request.setAttribute("username",loginForm.getUsername());  

  18.         if(flag)  

  19.         {  

  20.             return mapping.findForward("success");  

  21.         }else{  

  22.             return mapping.findForward("false");  

  23.         }  


  24.    }  

  25. }  

package com.login;

import java.util.Date;

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;

import org.apache.struts.action.DynaActionForm;

public class LoginAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

   LoginForm loginForm=(LoginForm)form;

   boolean flag=false;                         if("admin".equals(loginForm.getUsername())&&"admin".equals(loginForm.getPassword())){

flag=true;

}

request.setAttribute("username",loginForm.getUsername());

if(flag)         {

return mapping.findForward("success");

}else{

return mapping.findForward("false");

}

}

}

第五:配置struts核心配置文件struts-config.xml

[html]view plaincopyprint?

  1. <?xmlversion="1.0"encoding="UTF-8"?>


  2. <!DOCTYPE struts-config PUBLIC  

  3.          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"  

  4.          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">


  5. <struts-config>


  6. <!-- 静态form -->

  7. <form-beans>

  8. <form-beanname="loginForm"type="com.login.LoginForm"></form-bean>

  9. </form-beans>


  10. <action-mappings>

  11. <actionpath="/login"type="com.login.LoginAction"name="loginForm"

  12. scope="request">

  13. <forwardname="success"path="/login/success.jsp"></forward>

  14. <forwardname="false"path="/login/false.jsp"></forward>

  15. </action>

  16. </action-mappings>

  17. </struts-config>

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts-config PUBLIC          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

<struts-config>

   <!-- 静态form -->

   <form-beans>

       <form-bean name="loginForm" type="com.login.LoginForm"></form-bean>

   </form-beans>

   <action-mappings>

    <action path="/login" type="com.login.LoginAction" name="loginForm"scope="request">            <forward name="success" path="/login/success.jsp"></forward>

       <forward name="false" path="/login/false.jsp"></forward>

    </action>

   </action-mappings>

</struts-config>

使用以上常用方式,最大的麻烦就是,几乎为每个表单创建一个ActionForm。导致ActionForm数量多。

而使用动态ActionForm,最大的优点就是,不必手动为每个表单创建ActionForm

使用动态ActionForm的方式:

上述的第一步、第二步不变、第三步取消、修改第四步、第五步。

为了让方便大家理解,首先修改第五步:

[html]view plaincopyprint?

  1. <!-- 动态form -->

  2. <form-beans>

  3. <form-beanname="loginForm"type="org.apache.struts.action.DynaActionForm">

  4. <form-propertyname="username"type="java.lang.String"></form-property>

  5. <form-propertyname="password"type="java.lang.String"></form-property>

  6. </form-bean>

  7. </form-beans>

<!-- 动态form --><form-beans>

   <form-bean name="loginForm" type="org.apache.struts.action.DynaActionForm">  

       <form-property name="username" type="java.lang.String"></form-property>

       <form-property name="password" type="java.lang.String"></form-property>

   </form-bean>

   </form-beans>

第五步中使用form-property指明表单中的属性,其中标签内的name是表单jsp中的控件name值,两者必须相同。type是指控件值的类型。

修改第四步:

[html]view plaincopyprint?

  1. package com.login;  


  2. import javax.servlet.http.HttpServletRequest;  

  3. import javax.servlet.http.HttpServletResponse;  


  4. import org.apache.struts.action.Action;  

  5. import org.apache.struts.action.ActionForm;  

  6. import org.apache.struts.action.ActionForward;  

  7. import org.apache.struts.action.ActionMapping;  

  8. import org.apache.struts.action.DynaActionForm;  


  9. public class LoginAction extends Action {  


  10. public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {  


  11.    DynaActionForm loginForm=(DynaActionForm)form;  

  12.    String username=(String)loginForm.get("username");  

  13.    String password=(String)loginForm.get("password");  


  14.    boolean flag=false;  

  15.    if("admin".equals(username)&&"admin".equals(password)){  

  16. flag=true;  

  17.    }  

  18.    request.setAttribute("username",username);  

  19.    if(flag)  

  20.    {  

  21.     return mapping.findForward("success");  

  22.    }else  

  23.    {  

  24.     return mapping.findForward("false");  

  25.    }  

  26.    }  

  27. }  

package com.login;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;

import org.apache.struts.action.DynaActionForm;

public class LoginAction extends Action {public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

DynaActionForm loginForm=(DynaActionForm)form;

String username=(String)loginForm.get("username");

String password=(String)loginForm.get("password");

boolean flag=false;    if("admin".equals(username)&&"admin".equals(password)){

flag=true;

}

request.setAttribute("username",username);

if(flag)    {    return mapping.findForward("success");

}else    {

return mapping.findForward("false");

}

}

}


静态ActionForm方式,使用get/set方法,

而动态ActionForm方式,使用的mapget key方式。其中的key就是标签name值。

使用动态ActionForm的另一个优点是,若是更改表单和ActionForm时,不需要重新部署。

而使用静态ActionForm时,则需要修改ActionForm.java文件,还必须重新部署。

但是使用动态ActionForm,配置文件太长。不如静态ActionForm清晰明了。

使用时间属性

动态ActionForm使用时间类型

第一种方式:使用java.sql.Date类型。但是界面必须是yyyy-MM-dd这种形式。

第二种方式:使用String类型。但是在后台自己转换。

静态ActionForm使用时间类型

ActionForm有自行匹配,检验的功能。自动把表单上的数据转化成ActionForm相应的数据类型。但是默认的java.sql.Date类型,但是对于java.util.Date类型则不能自动转化。

所以为了使用java.util.Date类型,我们手动开发时间转化类,然后注入到框架中

[html]view plaincopyprint?

  1. package com.util;  


  2. import java.text.ParseException;  

  3. import java.text.SimpleDateFormat;  

  4. import java.util.Date;  


  5. import org.apache.commons.beanutils.Converter;  


  6. public class UtilDateConvert implements Converter {  


  7.    @Override  

  8.    public Object convert(Class type, Object value) {  

  9.        if(value==null){  

  10.            return value;  

  11.        }  

  12.        if(value instanceof Date){  

  13.            return value;  

  14.        }  

  15.        Date dateConvert=null;  

  16.        if(value instanceof String){  

  17.            SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");  

  18.            try {  

  19. dateConvert =(Date)sdf.parse((String)value);  

  20.            } catch (ParseException e) {  

  21.                // TODO Auto-generated catch block  

  22.                e.printStackTrace();  

  23.            }        

  24.        }  

  25.        return dateConvert;  

  26.    }  


  27. }  

package com.util;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import org.apache.commons.beanutils.Converter;public class UtilDateConvert implements Converter {@Overridepublic Object convert(Class type, Object value) {if(value==null){return value;}if(value instanceof Date){return value;}Date dateConvert=null;if(value instanceof String){SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");try {dateConvert =(Date)sdf.parse((String)value);} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return dateConvert;}}

   其中转化类中定义什么格式,界面输入什么格式。如上文中,定义yyyy/MM/dd 界面输入1988/10/11.若输入1988-10-11格式,则提示转化错误。另外转化类中可以定义yyyy-MM-dd格式。

[html]view plaincopyprint?

  1. package com.util;  


  2. import java.util.Date;  


  3. import javax.servlet.ServletException;  

  4. import javax.servlet.http.HttpServlet;  


  5. import org.apache.commons.beanutils.ConvertUtils;  


  6. public class UtilDateServlet extends HttpServlet {  


  7.    @Override  

  8.    public void init() throws ServletException {  

  9.        // TODO Auto-generated method stub  

  10.        ConvertUtils.register(new UtilDateConvert(), Date.class);  

  11.    }  

  12. }  

package com.util;

import java.util.Date;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import org.apache.commons.beanutils.ConvertUtils;

public class UtilDateServlet extends HttpServlet {@Overridepublic void init() throws ServletException {

// TODO Auto-generated method

stubConvertUtils.register(new UtilDateConvert(), Date.class);

}

}

  在配置文件中配置servlet

[html]view plaincopyprint?

  1. <servlet>

  2. <servlet-name>dateConvert</servlet-name>

  3. <servlet-class>com.util.UtilDateServlet</servlet-class>

  4. <load-on-startup>2</load-on-startup>

  5. </servlet>