上一章节学习记录了OGNL的表达式等运用,本章节就OGNL表达式和Struts2的结合使用进行学习,详细笔记如下~
Struts2与OGNL表达式的结合
1、Struts2与OGNL表达式的结合
1.1、Struts2与OGNL表达式的结合原理
OGNL表达式想要运行必须要有OGNLContext,在struts2中有OGNLContext但其名字是ValueStack(值栈),它同样是两部分组成,分别是Root和Context,Root是栈,栈中存放的是当前访问的Action,Context中存放的是ActionContext(数据中心);
1.2、Root栈的原理
原理很简单,只要知道“先进后出,后进先出,无论栈值怎么样变化索引连续”就OK了,进栈名为压栈,出栈名为弹栈,描绘图如下:
在struts2中压栈使用的方法是“push()”,弹栈时实用的方法是“pop()”,这些方法在ValueStack类中存在(创建action时继承的ActionSupport,ActionSupport中继承的ValueStack),可以直接调用;
1.3、Struts2与OGNL结合的体现
Struts2与OGNL结合体现在以下几个方面:
- 参数的获取
- 配置文件
- Struts2标签(本章节不进行详细的记录,下一章节进行学习)
下面进行逐个学习~
1.3.1 、参数的获取
参数的获取在struts2中总共有四种,分别是属性驱动、对象驱动和模型驱动以及集合封装传递,使用方法之前已经学过了,现在主要学的是其参数获取的原理流程,不用逐个细讲,在平时开发中使用的模型驱动的比较多,因此以模型驱动为例子进行学习;
Demo_stack2.java代码:
public class Demo_stack2 extends ActionSupport implements ModelDriven<User>{
private User u = new User();
public String execute() throws Exception {
System.out.println(u);
return SUCCESS;
}
@Override
public User getModel() {
return u;
}
}
在此段代码中隐藏的有个知识点,就是获得栈,ActionContext是中心数据库,里面有着各种数据,在struts2中栈(ValueStack)包含了ActionContext,但同样的ActionContext中也包含了ValueStack的数据信息,因此可以直接调用ActionStack的getContext()方法的getValueStack()方法来获得栈;
拓展:
在使用模型驱动时如果按一般的流程是不行的,要保证在赋值前将接收的参数压入栈内才行,一旦赋值成功参数就无法再存入站内,而要想将参数在赋值前压入栈内就必须在调用赋值的action之前就将参数压入栈内,struts2中是由filter过滤器调用action,也就是说要在filter过滤器调用相应action之前就要完成压栈,而在struts2中filter执行顺序是比较靠前的,这就需要找一个执行顺序更靠前的来将参数压栈,一般选用prepare()方法来进行这些业务,因此我们可以在我们手写的action中实现prepare接口,并在手写的action中重写一下prepare()方法,并将参数压栈的方法写进重写的prepare()方法中,这样就能保证参数先压栈再赋值;
但是!!!在struts2中由于这种方法比较麻烦,因此struts2团队将此块操作封装进了另一个接口中,这个接口就是ModelDriven<>,直接省略了压栈的步骤(封装的接口中已经在后台自动调用prepare()方法进行了压栈处理),因此我们操作时只有上面的几行代码;
valueStack2.jsp代码:
<form action="${pageContext.request.contextPath }/Demo_stack2" method="post">
name:<input type="text" name="name" ><br>
age:<input type="number" name="age"><br>
<input type="submit" value="OK">
</form>
struts.xml代码:
<!-- OGNL与struts2结合 === 模型驱动传递参数 -->
<action name="Demo_stack2" class="com.java.b_ValueStack.Demo_stack2" method="execute">
<result name="success" type="dispatcher">/valueStack.jsp</result>
</action>
测试:
Jsp界面参数输入如下所示的数据:
控制台输出:
1.3.2 、配置文件方面
使用OGNL表达式进行数据的传递,传递的位置很特殊,是在action和配置文件之间的传递,其代码如下所示:
Demo_stack3.class代码:
// 动态传递参数到配置文件中 --- struts2与OGNL结合的体现之配置文件
public class Demo_stack3 extends ActionSupport{
private String game_name;
public String execute() throws Exception {
game_name = "SUCCESS_1";// 假装是从数据库中获得的数据
return SUCCESS;
}
public String getGame_name() {
return game_name;
}
public void setGame_name(String game_name) {
this.game_name = game_name;
}
}
Struts.xml代码:
<!-- 通过OGNL动态的将数据添加到路径后作为传递参数 -->
<action name="Demo_stack3" class="com.java.b_ValueStack.Demo_stack3"
method="execute">
<result name="success" type="redirectAction">
<param name="actionName">Demo_stack2</param>
<param name="namespace">/</param>
<!--在配置文件中配置的信息struts无法识别,就会默认为参数附加在传递的路径之后 如果想要设置参数是动态的可以使用"${}"包裹OGNL表达式进行动态取值; -->
<param name="name">${game_name}</param>
</result>
</action>
这种操作只在重定向到action的跳转类型中使用;
里面涉及到“Demo_stack2”这个action的配置文件,上面有详细的代码配置,就不再赘述~
测试:
输入Demo_stack3.class的路径在地址栏里:
点击回车查看地址栏:
成功~
pass:struts2标签在下一章节中进行学习~