框架之struts2(二)

╰+攻爆jí腚メ 2022-07-12 08:48 396阅读 0赞

一.Struts2的模型驱动

  1. 1.编写要求:
  2. \*动作类必须实现ModelDriven接口,并提供抽象方法实现
  3. \*必须我们自己实例化模型对象
  4. 动作类:
  5. public class CustomerAction extends ActionSupport
  6. implements ModelDriven<CstCustomer>{
  7. private ICustomerService customerService =new CustomerServiceImpl();
  8. private CstCustomer customer =new CstCustomer();
  9. public CstCustomer getModel(){
  10. return customer;
  11. }
  12. /**
  13. * 添加客户
  14. */
  15. public String addCustomer(){
  16. //保存操作
  17. customerService.saveCustomer(customer);
  18. return"addCustomer";
  19. }
  20. /**
  21. * 添加客户页面的展示
  22. */
  23. public String addCustomerUI(){
  24. //1.获取客户来源的列表
  25. List<CstBaseDict> basedicts = customerService.findAllCustomerSource();
  26. //2.把查询出来的结果存入请求域中
  27. HttpServletRequest request =ServletActionContext.getRequest();
  28. request.setAttribute("baseDicts",basedicts);
  29. return"addCustomerUI";
  30. }
  31. }

二.OGNL表达式和OGNL上下文(ContextMap)

  1. 1.OGNL:Object-Graph Navigation Language(对象图导航语言),它是一种功能强大的表达式语言,
  2. 它比EL功能强大的多:
  3. EL只能从域对象中获取值,EL表达式只能获取数据
  4. OGNL: \*支持对象的普通方法的调用,使用对象.方法名
  5. \*支持访问静态属性,使用@包名.类名@属性名称
  6. \*支持静态方法的调用,使用@包名.类名@方法名称
  7. 注意:静态方法调用需要在配置文件中单独开启,未开启时不能使用(struts.ognl.allowStaticMethodAccess)
  8. \*支持赋值操作
  9. \*支持访问OGNL上下文对象(OGNLContext)
  10. \*支持操作集合对象(listmap)
  11. <%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
  12. <%@ taglib uri="/struts-tags" prefix="s"%>
  13. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  14. <html>
  15. <head>
  16. <title>OGNL的入门</title>
  17. </head>
  18. <body>
  19. <%--1.要想使用OGNL,必须在struts2的标签中配置
  20. 2.OGNL支持普通的方法调用
  21. <s:property value=""/>它就相当于把标签中value属性的取值输出到浏览器上
  22. value属性的取值是一个OGNL表达式,注意不是一个字符串
  23. 如果要想让OGNL表达式就当成普通的字符串来处理的话,需要在外面套上单引号
  24. --%>
  25. <s:property value="OGNL-Expression"/><br/>
  26. <s:property value="'OGNL-Expression'"/><br/><%--由于套上了单引号,所以value的取值就变成了一个普通的字符串--%>
  27. <hr/>
  28. <%--3.OGNL访问静态属性
  29. 使用的是@包名.类名@静态属性名称
  30. --%>
  31. <s:property value="@java.lang.Integer@MAX_VALUE"/>
  32. <hr/>
  33. <%--4.普通方法调用--%>
  34. <s:property value="'OGNL-Expression'.length()"/>
  35. <s:property value="'OGNL-Expression'.substring(0,5)"/>
  36. <hr/>
  37. <%--5.静态方法调用:
  38. 注意要想访问静态方法,必须开启配置:struts.ognl.allowStaticMethodAccess
  39. --%>
  40. <s:property value="@java.lang.Math@random()"/>
  41. <hr/>
  42. <%--6.使用OGNL操作List
  43. 注意:使用struts2的表单标签,必须提供name属性
  44. s:radio标签是创建了一组单选按钮
  45. list属性的取值是一个OGNL表达式,把大括号内的每个元素都当成list中的元素。
  46. --%>
  47. <s:radio list="{'男','女'}" name="gender" label="性别"></s:radio>
  48. <hr/>
  49. <%--7.使用OGNL操作Map
  50. #{ key:value,key:value}就相当于创建了一个map集合
  51. 无论使用struts2的表单哪个标签,最终在浏览器上能解析的都是html标签。
  52. html标签的value取值是mapkey,显示浏览器上的信息是mapvalue
  53. --%>
  54. <s:radio list="#{'male':'男','female':'女'}" name="gender" label="性别"></s:radio>
  55. </body>
  56. </html>
  57. 2.OGNL上下文(ContextMap)
  58. \*关于动作类的生命周期:
  59. 动作类是多例的,每次动作访问,动作类都会实例化,所以线程是安全的,
  60. \*关于请求动作的数据存放
  61. 在每次动作执行前,核心控制器StrutsPreparedAndExecuteFilter都会创建一个ActionContextValueStack对象,并且动作类是多例的,每次访问都会被创建,
  62. 这两个对象储存了整个动作访问期间用到的数据,并且把动作绑定到了线程局部变量(ThreadLocal)上,所以线程是安全的.
  63. 3.ContextMap的组成

Center










































ContextMap中存放的主要内容

Key

Value

说明

ValueStack (root)

java.util.List

它是一个list。key不是ValueStack,而是:

com.opensymphony.xwork2.util.ValueStack.ValueStack 。但是我们不用!

application

java.util.Map<String,Object>

ServletContext中的所有属性。

session

java.util.Map<String,Object>

HttpSession中的所有属性。

request

java.util.Map<String,Object>

ServletRequest中的所有属性。

parameters

java.util.Map

参数

attr

java.util.Map

把页面、请求、会话、应用范围内的所有属性放到一起。按照从小到大的范围搜索。

  1. 4.jsp中查看OGNL上下文中的数据:
  2. <s:debug></debug>
  3. 5.ContextMapActionContextValueStack之间的关系
  4. \*ContextMap:它是OGNL上下文对象,是一个MAP结构,里面包含了web阶段的三个域对象中的数据(请求域,会话域和应用域),以及一个ValueStack(值栈)中的数据
  5. \*ValueStack:它是一个list结构,里面存入的都是对象,实现了栈的特点,先进后出,它是OGNL上下文的一部分
  6. \*ActionContext:它是一个工具类,是struts2为了方便我们快速获取和操作三个域以及值栈所提供的一个类
  7. 6.获取map中的数据:
  8. \*获取ContextMap中的数据,使用<s:property value=""/>
  9. \*获取ActionContext中的数据,使用\#key的方式
  10. 7.ValueStack中的存取操作
  11. \*获取ValueStack和压栈操作:
  12. ActionContext context = ActionContext.getContext();
  13. ValueStack vs = context.getValueStack()
  14. vs.push(Object);
  15. \*获取ValueStack中的值:
  16. 借助<s:property value=""/>,使用OGNL表达式,只能根据property name来获取ValueStack中的property value,不能使用\#
  17. 获取ValueStack中指定位置元素的属性: \[x\].propertyName,x是从0开始
  18. 8.原来EL表达式从四大域对象中依次查找属性,搜索的范围是由小到大
  19. pageScope --> requestScope --> sessionScope --> applicationScope
  20. 9.OGNL表达式查找属性顺序:
  21. pageScope --> requestScope --> ValueStack --> contextMap --> sessionScope --> applicationScope

三.模型驱动再分析

  1. 由于我们的动作类实现了ModelDriven接口,并且在执行动作类之前会有一个默认的拦截器栈DefaultStack为我们工作,里面有一个拦截器名称是:ModelDriven
  2. 它判断了当前的动作类是否是ModelDriven类型,如果是的话,转成该类型,并且调用了getMode()方法,这时其实调用的是我们动作类重写接口的方法。
  3. 拦截器判断了得到的模型是否为null,如果不为null,进行压栈。(而并没有判断为null的情况,这也就是我们为什么要自己实例化模型的原因)。
  4. 接下来,就是JSP页面上form表单了,它的input元素中name属性取值全都变成了OGNL表达式,那么就会从栈顶逐个元素往下查找属性名称,并通过params拦截器给属性赋值。由于我们的模型被拦截器压栈了,所以模型跑栈顶去了,这也就是params拦截器能给我们封装成功的原因。

四.struts2的拦截器

  1. 1.拦截器:interceptor,它是struts2的一个重要组成部分,是针对我们访问action进行拦截
  2. 2.FilterInterceptor之间的区别:
  3. \*过滤器拦截的是请求级别
  4. \*拦截器拦截的是对action的访问,拦截器不能拦截jsp,拦截是对action的访问,拦截到action内部所指向的方法
  5. \*Filterjavaweb三大组件之一(另外两个:servletlistener)
  6. \*Interceptorstruts2框架的
  7. 3.拦截器的重要性:struts2中的很多功能是由拦截器完成的,它是对我们动作方法的增强,是AOP编程思想的一种应用方式
  8. 4.默认的拦截器栈:是一个叫defaultStack的拦截器栈,它是struts-default.xml中定义的
  9. 5.自定义拦截器:
  10. \*编写步骤:
  11. \*编写一个普通的类,继承自AbstractInterceptor,实现里面的抽象方法.
  12. \*配置拦截器,声明拦截器,然后使用拦截器
  13. 声明:<interceptors><interceptor name="" class=""/> 使用:<interceptor-ref name="">
  14. 注意:当我们声明了拦截器,那么默认的拦截器就失效了
  15. \*拦截器放行:invocation.invoke(),方法的返回值其实就是动作类中动作方法的返回值
  16. \*多个拦截器的执行顺序:与声明顺序无关,与使用顺序有关
  17. 6.其他标签
  18. \*<interceptor-stack name=""><interceptor-ref name=""></interceptor-stack>:定义拦截器栈
  19. \*<default-intercepor-ref name=""> :定义默认的拦截器栈
  20. \*<global-results> : 定义全局的结果变量

五.OGNL中特殊符号的使用

  1. **\#**
  2. a、取ActionContextkey时使用
  3. 例如<s:property value="\#name" />
  4. bOGNL中创建Map对象时使用,例如:<s:radio list="\#\{'male':'男','female':'女'\}" />
  5. **$**
  6. a、在JSP中使用EL表达式时使用,例如$\{name\}
  7. b、在xml配置文件中,编写OGNL表达式时使用。
  8. %
  9. struts2中,有些标签的value属性取值就是一个OGNL表达式
  10. 例如<s:property value="OGNL Expression" />
  11. 还有一部分标签,value属性的取值就是普通字符串
  12. 例如<s:textfield value="username"/>
  13. 如果想把一个普通的字符串强制看成时OGNL,就需要使用%\{\}把字符串套起来。
  14. 例如<s:textfield value="%\{username\}"/>。
  15. 当然在<s:property value="%\{OGNL Expression\}" />也可以使用,但不会这么用。

发表评论

表情:
评论列表 (有 0 条评论,396人围观)

还没有评论,来说两句吧...

相关阅读