1、配置struts

       * 拷贝struts/lib文件夹下的所有的jar包到WEB-INF/lib

       * 修改web.xml文件,配置ActionServlet(把下面代码添加到web.xml)

             <!-- Standard Action Servlet Configuration -->

                <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>  //跟文件名struts-config.xml有关,可有可无

                  </init-param>

                  -->

                     <!-- 如果>=0,表示Tomcat在启动时就初始化ActionServlet -->

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

               </servlet>

             

             

                <!-- Standard Action Servlet Mapping -->

                <servlet-mapping>

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

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

                </servlet-mapping>

       * 创建struts-config.xml文件(放到WEB-INF文件夹下)

      

基于strutsweb应用的开发步骤

1,对应用环境进行配置

2,创建web应用的结构,需要将struts应用的jar文件进行部署。

3,在web服务器部署struts

4,配置struts-config.xml文件,配置Actoin

5,写自定义Action,实体,以及业务类

 不要在Action中进行业务逻辑的处理,业务逻辑应交给专门的Model层去做

在业务逻辑层抛出异常,在Action中捕获和处理

 

六、strutshtml标签

 

strutshtml标签的使用类似于html标签,但是少有区别,指定类型的方式变成使用不同的标签,这样会绑定struts,所以旨在需要时使用。

<html:form method="post" action="/basic-validate/login">

<!--

   strutshtml标签中的action可以只写转到的actionpathstruts会在解析是自动添加需 要的部分 

-->

       <html:text property="userName" />

       <html:password property="password" redisplay="false"/>

        <!--redisplay="false"不进行回写,只有html:password标签可用-->

        <html:radio property="hibbos">

       <html:submit value="login" />

</html:form>

 

自动产生HTML文件的内容

使用这样的标签,必须使用ActionForm 

 

 

七、消息标签

 

<bean:message key="errors.username.required">这个标签可以从指定的资源文件中根据指定的key值来取得可以对应的值,但是需要在

struts-config.xml中进行配置。

配置资源,这些资源可以在ActionMessage中使用,也就是在构造ActionMessage是指定资源文件中的key这样,在发现校验错误时,就可以

先在资源文件中指定的key的值了。可以使用struts<html:errors>

<html:message><bean:message>标签都可以显示指定错误的消息。

<struts-config>

    .....

    <message-resources parameter="alan.struts.message.MessageResource" />

    <!--使用message标签时配置资源文件的位置-->

</struts-config>                       

 

 

DispatchAction

(org.apache.struts.actions.DispatchAction)

DispatchAction类是Action类的子类,他提供了有实现的execute方法。

 

我们写的自定义Action类,可以继承DispatchAction类,但不要覆盖execute方法,可以在自定义类中写反回值和参数表都与execute方法相同的方

法,可以通过在struts-congfig.xml中为这个action的配置中添加一个参数,来判断调哪一个方法,实际上DispatchAction类就是通过反射机制,

通过form中参数调用了自定义Action中的方法,当然这些方法的定义要符合规范,使用继承DispatchAction类的自定义的Action类,也就会共享同

一的Action路径。

 

注意:使用继承DispatchAction类的自定义的Action,只会匹配一个action路径,只能共享一个ActionForm,如果加上校验,会产生form表单的参数不一致的情况,会导致校验无法通过。

例:

public class MyAction extends DispatchAction{

       ActionForward add(ActionForm form,HttpServletRequest request,HttpServletResponse response ActionMapping mapping) throws Exception

        {

                    return mapping.findForward("sucess")                    

        }

}

 

<action path="/add"  type="MyAction" parameter="methodName">

    <!--parameter属性是和form中隐藏域的名字相对应的-->

    <forward name="sucess" path="/sucess.jsp"/>

</action>

 

<from action="add.do" method="post">

   <input type="hidden" name="methodName" value="add"/>

   <!--

      使用隐藏域为struts传递要调用自定义Action中方法的方法名,是通过与struts-config.xml

      action标签中的parametername属性相对应来获取隐藏域的value

   -->

   <input type="submit" value="submit"/>

</from>

 

LookupDispatchAction

 

(org.apache.struts.actions.LookupDispatchAction)

 

LookupDispatchAction类也是DispatchAction类的子类,他所实现的功能是解决一个表单多种提交问题的

,他是通过使用资源文件,用submit按钮的value来作为资源文件中的key所对应的值,通过这个值来找到对用的key,在使用这个key来获得指定Map中所对应的值,这个值就是要调用的方法名。

 

submitvalue---->MessageResource.properties中的key----->Mapkey对相应的值---->action

 

例:

<%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>

 

<form method="post" action="${pageContext.request.contextPath}/lookup/adddel.do">

       <input type="submit" value="<bean:message key="button.add" />" name="methodName">

        <!--注意name="methodName"是和strut-config.xmlaction标签中的parameter属性-->

       <input type="submit" value="<bean:message key="button.delete" />" name="methodName">

</form>

 

MessageResource.properties

 

button.add=add new user

button.delete=delete user

 

注意:在继承LookupDispatchAction时,要覆盖getKeyMethodMap()方法,并定义Map,向Map中放入指定的键值对。

 

public class AddDelLookupDispatchAction extends LookupDispatchAction

{

       public Map getKeyMethodMap(){

              Map keyMethodMap= new HashMap();

              keyMethodMap.put("button.add", "add");

              keyMethodMap.put("button.delete", "delete");

              return keyMethodMap;

       }    

    public ActionForward add(ActionMapping mapping,ActionForm form,

                   HttpServletRequest request,HttpServletResponse response) throws Exception

    {   

        return mapping.findForward("add");

    }

    public ActionForward delete(ActionMapping mapping,ActionForm form,

                   HttpServletRequest request,HttpServletResponse response) throws Exception

    {

           return mapping.findForward("delete");

    }

}

 

<action   path="/lookup/adddel"  type="alan.struts.actions.AddDelLookupDispatchAction"

                        parameter="methodName">

            <forward name="add" path="/add.jsp"/>

            <forward name="delete" path="/delete.jsp" />

</action>

<message-resources parameter="alan.struts.message.MessageResource" />

 

自定义的Action类的一些规则

1,尽量不要在Action类中使用(静态)成员变量,如果使用要加上同步。

2,尽量使各模块间的耦合性降低,最大限度的针对接口编程。

3,可以将共代码方在覆盖父类的方法中,最后可以用super.xxx(xxx)来调用父类的方法,使用父类的实现,并加上了自定义的功能。

                         

 

1、动态ActionForm的编写

       动态ActionForm是为了避免过多的ActionForm类膨胀而设计的,使用动态ActionForm可以获得标准ActionForm的所有功能

       * Struts-config.xml配置动态AcitonForm

         <form-beans>

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

                     <form-property name="name" type="java.lang.String"/>  <!-- name属性要和表单中的name一致 -->

                     <form-property name="age" type="java.lang.Integer"/>  <!-- 必须用包装类 -->

           </form-bean>

         </form-beans>

        

       * Action中使用动态ActionForm,需要强制转换为DynaActionForm类型,同时使用get方法来获取

           如:

                  DynaActionForm dynaform = (DynaActionForm)form;

                  String name = (String)dynaform.get("name");

                  Integer age = (Integer)dynaform.get("age");

                 

         动态ActionForm其实是把html页面中元素的值放到了map,所以可以通过get方法取得

         动态ActionForm采用EL表达式的输出方式: ${dynabean.map.prop}

        

----------------------------------------------------------------------------------------------------------------------

2、采用struts上传文件

       * 页面中form的配置,如:<form action="upload.do" method="post" enctype="multipart/form-data">

       * ActionForm中使用FormFile来接收上传文件,参见:UploadActionForm.java

       * Action中调用FormFile即可取得上传文件的相关数据,采用流进行输出,完成上传,参见:UploadTestAction.java

      

       注意:对文件上传大小的配置:<controller maxFileSize="10M"/>

 

----------------------------------------------------------------------------------------------------------------------

3、空字段处理

       * 如果html页面中没有写<input>,用jsp脚本接收到的字符串为null,如果用EL表达式,则为空串""

       * 如果html页面中存在<input>,但没有输入值,那么JSP脚本和EL表达式输出的都是空串

 

----------------------------------------------------------------------------------------------------------------------

4StrutsActionForm类型的自动转换:

boolean: yes,y,1,trueon这些都可以转换为true类型,而且是忽略大小写的;其它情况会转换为false类型

Date类型转换

       * 如果为java.sql.Date,页面的日期类型必须为yyyy-MM-dd才可以转换

       * 如果为java.util.Date,默认情况下struts无法转换,要定义自己的converter来转换

 

自定义转换器的实现步骤:

       * 实现Converter接口,实现convert方法

       * 将实现的converter注册,通常情况采用servlet进行注册(也可以采用struts plugin的方式进行注册)

       * 注意servlet标签中的<load-on-startup>标签的值必须大于等于0

      

StrutsActionForm自动搜集过程

       * 将页面数据放到map中,其中mapkey为页面中的名称,map中的value为页面中value的值

       * 调用BeanUtils.setProperties方法,将map中的值逐个设置到ActionForm实例上

       * 对于ActionForm中的每一个属性,根据属性的类型调用相应的Converter,然后调用Converterconvert方法,将相应的字符串转换成ActionForm中指定的类型

      

       可以通过BeanUtils.copyProperties(目标对象,源对象) 方法,在ActionForm对象和实体对象之间复制,避免过多的调用get/set方法

 

ActionForward

1、理解全局ActionForward和局部ActionForward的概念

2、理解redirect的使用

   * 设为true时表示执行重定向操作

   * 设为false时,表示执行请求转发操作

 

3、理解动态ActionForward,动态ActionForward可以修改参数

 

4、不能在代码中更改配置文件的属性

 

Mapping

  1、在struts-config.xml中。每个<action>对应一个ActionMapping实例

2struts建议最好所有的转向都由Struts来控制

3、理解ActionMappingforward的含义

4、理解ActionMappingunknow配置的作用

5、了解采用jstlstruts html标签保持页面数据

 

Struts国际化

      

缺省的Locale是由什么决定的 (取决于操作系统),Locale是由国家和语言代码组成的

 

国际化资源文件是由basename + Locale组成的,如:MessagesBundle_zh_CN.properties

    * basename可以是任意合法的字符串

   

native2ascii的位置和使用方法

    * 位置:jdk1.6.0_03/bin/

    * native2ascii 输入文件(源文件) 输出文件(目标文件) 如:

        native2ascii.exe o.properties MessageBundle_zh_CN.properties

 

  1struts国际化配置

    * struts-config.xml中加入:

    <message-resources parameter="MessageResources" />

   

2、提供国际化资源文件,并且采用native2ascii.exe将中文转换为unicode编码

 

3、在JSP中使用<bean:message key=""/>读取国际化消息文本

 

4、利用struts默认把Locale放到session中的特性,采用编程方式手动切换语言的设置

      String lang = request.getParameter("lang");

      Locale currentLocale = null;

      if("zh".equals(lang)) {

          currentLocale = new Locale("zh","CN");

      }

      else if("en".equals(lang)) {

          currentLocale = new Locale("en","US");

      }

      //request.getSession().setAttribute(Globals.LOCALE_KEY, currentLocale);

      this.setLocale(request, currentLocale);

     

5、如何创建消息?

      区分ActionMessages对象和ActionMessage对象,这两个对象的意义

          * ActionMessages是一个集合,把ActionMessage对象addActionMessages

            ActionMessages messages = new ActionMessages();

            ActionMessage msg = new ActionMessage(key);<key为资源属性文件中的key>

           messages.add(message_id,msg)

           第一个参数表示本ActionMessage对象在ActionMessages对象中区别于其他ActionMessage对象的标识符

 

6、如何传递消息?

      调用saveMessages(传递普通消息);saveErrors(传递错误消息)方法

     

7、如何显示消息?

      通过<html:messages id="msg" message="true" property="error_1"/>标签来显示消息

          * (设成message="true"他就会读messagekey上的值, <既可以显示普通消息也可以显示错误消息>

      通过<html:errors/>标签显示错误消息(只能显示错误消息)

 

Struts异常处理

       1、编程式异常

       * 截获某个异常

       * 创建相应的异常消息

       * 传递异常消息

       * 转到相应的错误页面

   

2<exception path=""/>

    ⑴.key属性:对应错误提示消息文本的key,需要在资源属性文件中定义

⑵.path属性和<action-mappings input=""/>input属性的优先级

            * 既配了input,又配了path之后,以path为第一优先级

            * 没有配path,那么就转向input所指向的页面

        ⑶.Type属性:需要处理哪种类型的Exception

3<html:errors/>标签在JSP页面显示错误消息

 

DispatchAction使用

1.     paramter指定的参数不能为executeperform

2.       了解<action>中的parameter属性

3.       不能覆写execute方法,如果要覆写,必须显式的调用父类的execute方法

4.       了解unspecified方法的含义