struts2_06 struts2补充,值栈,属性驱动与模型驱动



1. struts2的好处优势是:
        1. 可以利用属性驱动和模型驱动简单的获取表单的数据
        2. 拦截器可以把各种不属于业务逻辑的内容(文件上传,校验,获取数据等)和action中的方法(业务逻辑)分离开来,从而改善代码结构(松耦合);
 
2. 在html标签中只能跟EL表达式,在struts2标签中只能跟ognl表达式


3. package作用:
        包括了intercepter,action,result,
        struts2的配置文件是根据包的形式进行管理的,这样可以通过继承机制,让一个新包具有一些包的特性
          
4. struts2的三大经典上下文:
        ActionContext:         是与action相关的内容                               
        ServletActionContext:  让struts2与servlet交互
        ActionInvocation:      struts2的上下文  
                                actionInvocation.getProxy().getConfig().getXXX() : XXX包括拦截器,action,结果集,包,方法等struts2的上下文


5. 有些情况下action既会在值栈中存一份,又会在map栈中存一份


6. valueStack
       值栈总够有俩种数据结构:  
            对象栈: 是一个arrayList,将数据放入该处;  
                    当前请求的action在栈顶,ss是栈顶的元素,所以可以使用setValue方法赋值
                    如果将一个对象放到栈顶,则当前对象的属性就会暴露出来。                   
                    如果一个属性在对象栈,在页面上可以使用ongl表达式,根据name属性进行回显。
            map  :

            值栈的结构图1 2 

   





       1、在后台把数据存放到valueStack中,在前台把数据取出来                        
              struts2利用他的值栈valueStack的API能直接操作对象栈,使对象栈的属性赋值。
              例:
                  ValueStack valueStack = ActionContext.getContext().getValueStack(); 获取值栈
                  valueStack.setValue("ss","ss"); // ss为动作类的字段 。
                  <s:property value="ss"/>        // 直接输出ss的值,因为在栈顶
                  <s:textfield name="ss"/>        // 不需写value即可进行数据回显,因为在对象栈中
                  
       2、充当传递数据的一种方式
       3、valueStack的生命周期
       4、值栈的数据安全性怎么样做到的
       5、怎么样去获取值栈
       
       
       总结:对象栈的作用
          1. 可以把一个数据放到对象栈中,在页面上可以根据name属性直接进行回显;
          2. 调用setValue方法可以直接给对象栈中的属性赋值,实现了属性驱动和模型驱动;
          3. 大大简化了集合的迭代书写
       
       
7. 属性驱动与模型驱动  
       属性驱动
            1. 属性驱动实现的条件:
                  当前请求的action在栈顶,所以action中的属性就暴露出来了;
                  获取页面上表单的元素,整合成一个map;
                  调用setValue方法赋值;
                  
            2. 缺点:
                  若字段过多,则set/get方法较多,累赘
                  
       模型驱动: 
            1:是ModelDrivenInterceptor拦截器实现的
               大致原理: 先获取action对象,判断其类型是否为ModelDriven,如果是,获取该model(所以必须创建model,否则会报空指针异常),并将其放到栈顶;
                        然后经过paramettingInterceptor即可获得值
            2: 把action中所有和页面表单有关的属性都封装到javaBean中了    
            3: 需实现ModelDriven接口
            
            步骤:
                1. 创建javaBean
                2. 创建action类,并实现ModelDriven接口,同时引入javaBean
                3. 在action类中创建javaBean对象
                4. 复写public User getModel() {}方法
            
            例:
                -----------------------------------------------------------------------
                public class User{
                   private Long uid;
                   private String username;
                   // set/get方法
                }
                
                public class UserAction implements ModelDriven<User>{
                   private User model = new User();
                   public User getModel(){
                      return this.model;
                   }
                   // execute等动作类的方法
                }
                -----------------------------------------------------------------------
       
       
 
8. <s:iterator/> : 当前迭代的元素在栈顶,且如果迭代的元素在栈顶,则不需要加value
            
            例1:
                ------------------------------------------------------------------------------
                Action{
                    public String execute(){
                        List<User> userList = new ArrayList<User>();
                        User user = new User();
                        user.setUid(1L);
                        user.setUname("aa");
                        userList.add(user);
                        ActionContext.getContext().put("userList",userList);
                        retrun "index";
                    }
                }
                JSP:
                    <body>
                        <s:iterator value="#userList">
                            <!-- 当前迭代的元素在栈顶 -->
                            <s:property value="uid">
                            <s:property value="uname">
                        </s:iterator>
                    </body>
                
                ------------------------------------------------------------------------------
            例2:
                ------------------------------------------------------------------------------
                 Action{
                    public String execute(){
                        List<User> userList1 = new ArrayList<User>();
                        List<List<User>> userList2 = new ArrayList<List<User>>();
                        User user = new User();
                        user.setUid(1L);
                        user.setUname("aa");
                        userList1.add(user);
                        userList2.add(userList2);
                        ActionContext.getContext().put("userList2",userList2);
                        retrun "index";
                    }
                }
                JSP:
                    <body>
                       <!-- 此时迭代的是userList2 -->
                       <s:iterator value="#userList2">
                            <!-- 当前迭代的元素在栈顶,如果迭代的是栈顶的元素,不需要加value  -->
                            <!-- 此时迭代的是userList1 -->
                            <s:iterator>    
                                <!-- 此时在栈顶的是user -->
                                <s:property value="uid">
                                <s:property value="uname">
                            </s:iterator>
                       </s:iterator>
                    </body>
                ------------------------------------------------------------------------------


            例3:
                ------------------------------------------------------------------------------
                
                Action{
                    public String execute(){
                        List<User> userList = new ArrayList<User>();
                        User user = new User();
                        user.setUid(1L);
                        user.setUname("aa");
                        userList.add(user);
                        Map<String,List<User>> map = new HashMap<String,List<User>>();
                        ActionContext.getContext().put("map",map);
                        retrun "index";
                    }
                }
                JSP:
                    <body>
                        <s:iterator value="#map">
                            <S:iterator value="key">
                            <s:iterator value="value">
                                <s:property value="uid">
                                <s:property value="uname">
                            </s:iterator>
                        </s:iterator>
                    </body>
                
                ------------------------------------------------------------------------------
       
       
9. 结果集
      1.result按现象划分为俩种类型: 
          result标签中间写内容(action/jsp);
                共性的内容: 只要是页面跳转,都需要获取result标签中的内容
                特性的内容: 每一种跳转的处理都不一样
          
          result标签中间什么都不写(ajax);
                ajax操作中间可以什么都不写
                
      2.自定义结果集
            
          1. 继承StrutsResultSupport类,编写自己的结果集
          2. 注册自定义的结果集
          3. 使用自定义的 结果集
          例子:
              *************************************************************************************
              1.自定义的结果集
                  public class MyResult extends StrutsResultSupport {
                    @Override
                    protected void doExecute(String finalLocation, ActionInvocation invocation)
                        throws Exception {
                      HttpServletRequest request = ServletActionContext.getRequest();
                      HttpServletResponse response = ServletActionContext.getResponse();
                      // System.out.println("自定义的结果集");
                      request.getRequestDispatcher(finalLocation).forward(request, response);    
                    }
                  }
                  
              Action类:
                  public class UserAction extends ActionSupport {
                      private String uname;
                      // set/get属性
                      
                      public String showUname(){
                        System.out.println("uname=aaa");
                        return "index";
                      }                    
                  }
  
              配置文件:
                <package name="user" namespace="/" extends="struts-default">
                  <!-- 2.注册自定义的结果集 -->
                  <result-types>
                      <result-type name="myResult" class="cn.itcast.action.MyResult"></result-type>
                  </result-types>
                  <action name="userAction_*" method="{1}" class="cn.itcast.action.UserAction">
                      <!-- 3. 使用自定义的 结果集 -->
                      <result name="index" type="myResult">/index.jsp</result>
                  </action>
                </package>
              
              
              *************************************************************************************
          
       
     
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       





















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值