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 

   struts2_06 struts2补充,值栈,属性驱动与模型驱动_第1张图片



struts2_06 struts2补充,值栈,属性驱动与模型驱动_第2张图片

       1、在后台把数据存放到valueStack中,在前台把数据取出来                        
              struts2利用他的值栈valueStack的API能直接操作对象栈,使对象栈的属性赋值。
              例:
                  ValueStack valueStack = ActionContext.getContext().getValueStack(); 获取值栈
                  valueStack.setValue("ss","ss"); // ss为动作类的字段 。
                         // 直接输出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{
                   private User model = new User();
                   public User getModel(){
                      return this.model;
                   }
                   // execute等动作类的方法
                }
                -----------------------------------------------------------------------
       
       
 
8. : 当前迭代的元素在栈顶,且如果迭代的元素在栈顶,则不需要加value
            
            例1:
                ------------------------------------------------------------------------------
                Action{
                    public String execute(){
                        List userList = new ArrayList();
                        User user = new User();
                        user.setUid(1L);
                        user.setUname("aa");
                        userList.add(user);
                        ActionContext.getContext().put("userList",userList);
                        retrun "index";
                    }
                }
                JSP:
                   
                       
                           
                           
                           
                       

                   
                
                ------------------------------------------------------------------------------
            例2:
                ------------------------------------------------------------------------------
                 Action{
                    public String execute(){
                        List userList1 = new ArrayList();
                        List> userList2 = new ArrayList>();
                        User user = new User();
                        user.setUid(1L);
                        user.setUname("aa");
                        userList1.add(user);
                        userList2.add(userList2);
                        ActionContext.getContext().put("userList2",userList2);
                        retrun "index";
                    }
                }
                JSP:
                   
                       
                       
                           
                           
                               
                               
                               
                               
                           

                       

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


            例3:
                ------------------------------------------------------------------------------
                
                Action{
                    public String execute(){
                        List userList = new ArrayList();
                        User user = new User();
                        user.setUid(1L);
                        user.setUname("aa");
                        userList.add(user);
                        Map> map = new HashMap>();
                        ActionContext.getContext().put("map",map);
                        retrun "index";
                    }
                }
                JSP:
                   
                       
                           
                           
                               
                               
                           

                       

                   
                
                ------------------------------------------------------------------------------
       
       
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";
                      }                    
                  }
  
              配置文件:
               
                 
                 
                     
                 

                 
                     
                      /index.jsp
                 

               

              
              
              *************************************************************************************
          
       
     
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       





















你可能感兴趣的:(三大框架)