day39 struts2接口和ognl语法

  • 缓存问题:清空服务器项目(remove),选中项目-project-撤掉勾选buildauto-clean-选中项目右键buildproject-勾选自动创建- run
  • ctrl+alt+t关联源文件,导包就导zip就行
  • window-showview-other-Javadoc可以看自带文档


    day39 struts2接口和ognl语法_第1张图片
    image.png

1.结果跳转方式

-----------分四种

        
            /hello.jsp
        
    
        
            /hello.jsp
        
    
        
             
                    
                 Demo1Action
                    
                 /
             
        
        
        
            
                 
                 Demo1Action
                 
                 /
            
        

2.访问api方式

  • action是每次访问都会创建,servlet是有线程安全问题,多个请求会访问一个servlet


    day39 struts2接口和ognl语法_第2张图片
    image.png
  • 访问方式

- 最常用
public String execute() throws Exception {
        //request域=> map (struts2并不推荐使用原生request域)
        //不推荐
        Map requestScope = (Map) ActionContext.getContext().get("request");
        //推荐
        ActionContext.getContext().put("name", "requestTom");
        //session域 => map
        Map sessionScope = ActionContext.getContext().getSession();
        sessionScope.put("name", "sessionTom");
        //application域=>map
        Map applicationScope = ActionContext.getContext().getApplication();
        applicationScope.put("name", "applicationTom");
        
        return SUCCESS;
    }
------ServletActionContext工具类来获取
//并不推荐
    public String execute() throws Exception {
        //原生request
        HttpServletRequest request = ServletActionContext.getRequest();
        //原生session
        HttpSession session = request.getSession();
        //原生response
        HttpServletResponse response = ServletActionContext.getResponse();
        //原生servletContext
        ServletContext servletContext = ServletActionContext.getServletContext();
        return SUCCESS;
    }
-------------了解通过实现接口方式
//如何在action中获得原生ServletAPI
public class Demo7Action extends ActionSupport implements ServletRequestAware {
        
    private HttpServletRequest request;
    public String execute() throws Exception { 
                System.out.println("原生request:"+request);
        return SUCCESS;
    }
    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
    }   
}

3.获得参数

  • strutsMVC


    day39 struts2接口和ognl语法_第3张图片
    image.png
  • Action生命周期
    1.每次请求到来时,都会创建一个新的Action实例
    2.Action是线程安全的.可以使用成员变量接收参数
------------- 属性参数
用户名:
年龄:
生日:
//准备与参数键名称相同的属性 private String name; //自动类型转换 只能转换8大基本数据类型以及对应包装类 private Integer age; //支持特定类型字符串转换为Date ,例如 yyyy-MM-dd private Date birthday; --------------------对象参数
用户名:
年龄:
生日:
//准备user对象属性 private User user; ----------------------模型驱动
用户名:
年龄:
生日:
//struts2如何获得参数-方式2 public class Demo10Action extends ActionSupport implements ModelDriven { //准备user 成员变量 private User user =new User(); public String execute() throws Exception { System.out.println(user); return SUCCESS; } @Override public User getModel() { return user; }

4.集合类型封装

-------------list,map属性
//list
    private List list;
    //Map
    private Map map;
list:
list:
map:

5.添加客户

  • 注意:struts和hibernate包在合并时.javassist-3.18.1-GA.jar包是重复的,删除版本低的.
public class CustomerAction extends ActionSupport implements ModelDriven {
    private CustomerService cs = new CustomerServiceImpl();
    //添加客户
    public String add() throws Exception {
        //1 调用Service
        cs.save(customer);
        //2 重定向到列表action方法
        return "toList";
    }
    @Override
    public Customer getModel() {
        return customer;
    }       
}

6.ognl表达式

  • OGNL:对象视图导航语言. ${user.addr.name} 这种写法就叫对象视图导航.
    OGNL不仅仅可以视图导航.支持比EL表达式更加丰富的功能.
  • struts2 的包中已经包含了.所以不需要导入额外的jar包
  • 内部结构


    day39 struts2接口和ognl语法_第4张图片
    image.png
//准备工作
    public void fun1() throws Exception{
        //准备ONGLContext
            //准备Root
            User rootUser = new User("tom",18);
            //准备Context
            Map context = new HashMap();
            context.put("user1", new User("jack",18));
            context.put("user2", new User("rose",22));
        OgnlContext oc = new OgnlContext();
        //将rootUser作为root部分
        oc.setRoot(rootUser);
        //将context这个Map作为Context部分
        oc.setValues(context);
        //书写OGNL
        Ognl.getValue("", oc, oc.getRoot());
    }
-------------------------取出root直接取出
//取出root中user对象的name属性
        String name = (String) Ognl.getValue("name", oc, oc.getRoot());
        Integer age = (Integer) Ognl.getValue("age", oc, oc.getRoot());
-------------------------取出context加#取出
//取出context中键为user1对象的name属性
        String name = (String) Ognl.getValue("#user1.name", oc, oc.getRoot());
        String name2 = (String) Ognl.getValue("#user2.name", oc, oc.getRoot());
        Integer age = (Integer) Ognl.getValue("#user2.age", oc, oc.getRoot());
-------------------------赋值直接在取值语法上书写,有多个返回值返回最后一个,赋值可以多个一起写逗号隔开
//将root中的user对象的name属性赋值
        Ognl.getValue("name='jerry'", oc, oc.getRoot());
        String name = (String) Ognl.getValue("name", oc, oc.getRoot());     
        String name2 = (String) Ognl.getValue("#user1.name='张三',#user1.name", oc, oc.getRoot());
------------------//调用root中user对象的setName方法     
        Ognl.getValue("setName('lilei')", oc, oc.getRoot());
        String name = (String) Ognl.getValue("getName()", oc, oc.getRoot());        
        String name2 = (String) Ognl.getValue("#user1.setName('lucy'),#user1.getName()", oc, oc.getRoot());
-----------------调用静态方法
String name = (String) Ognl.getValue("@cn.itheima.a_ognl.HahaUtils@echo('hello 强勇!')", oc, oc.getRoot());
        //Double pi = (Double) Ognl.getValue("@java.lang.Math@PI", oc, oc.getRoot());
        Double pi = (Double) Ognl.getValue("@@PI", oc, oc.getRoot());
-----------------ognl创建对象-list|map
//创建list对象
        Integer size = (Integer) Ognl.getValue("{'tom','jerry','jack','rose'}.size()", oc, oc.getRoot());
        String name = (String) Ognl.getValue("{'tom','jerry','jack','rose'}[0]", oc, oc.getRoot());
        String name2 = (String) Ognl.getValue("{'tom','jerry','jack','rose'}.get(1)", oc, oc.getRoot());
//创建Map对象
        Integer size2 = (Integer) Ognl.getValue("#{'name':'tom','age':18}.size()", oc, oc.getRoot());
        String name3  = (String) Ognl.getValue("#{'name':'tom','age':18}['name']", oc, oc.getRoot());
        Integer age  = (Integer) Ognl.getValue("#{'name':'tom','age':18}.get('age')", oc, oc.getRoot());        

7.ognl与Struts2结合

  • 结合原理:原来的ognlcontext在struts2中改了一个名字为valuestack值栈。其中root默认是当前访问action,context被包装成了actioncontecxt数据中心,并且root和context是相互引用关系
  • 栈原理是先进后出,栈是arraylist创建的


    day39 struts2接口和ognl语法_第5张图片
    image.png

    day39 struts2接口和ognl语法_第6张图片
    image.png
  • Context部分就是ActionContext数据中心


    day39 struts2接口和ognl语法_第7张图片
    image.png
  • struts2与ognl结合体现


    day39 struts2接口和ognl语法_第8张图片
    image.png

    day39 struts2接口和ognl语法_第9张图片
    image.png

    day39 struts2接口和ognl语法_第10张图片
    image.png
  • 想要赋值就需要在action之前将user压入栈中,一张方法是实现接口(20个过滤器之一的) 不建议,另外一个就是实现modeldriver接口(这个接口也在action调用之前)
  • 配置文件中重定向传参${name}(ognl专用在配置文件中的)

            
                Demo1Action
                /
                
                ${name}
            
        
  • 扩展:request对象的getAttribute方法


    day39 struts2接口和ognl语法_第11张图片
    image.png
  • jsp和struts,ognl
-----------------------有var的会将循环后取到的对象放在context中
- #list(ognl语法)
<%@ taglib  prefix="s" uri="/struts-tags" %>

    
    
    
    

-----------------------没有var的会将循环后取出的对象压在root中
<%-- 
        
        
        
        

--------整体使用规则类似在java中的使用

你可能感兴趣的:(day39 struts2接口和ognl语法)