上一章节学习记录了OGNL的表达式等运用,本章节就OGNL表达式和Struts2的结合使用进行学习,详细笔记如下~



Struts2与OGNL表达式的结合



1、Struts2与OGNL表达式的结合

1.1、Struts2与OGNL表达式的结合原理

OGNL表达式想要运行必须要有OGNLContext,在struts2中有OGNLContext但其名字是ValueStack(值栈),它同样是两部分组成,分别是Root和Context,Root是栈,栈中存放的是当前访问的Action,Context中存放的是ActionContext(数据中心);
ValueStack(值栈)图片描述


1.2、Root栈的原理

原理很简单,只要知道“先进后出,后进先出,无论栈值怎么样变化索引连续”就OK了,进栈名为压栈,出栈名为弹栈,描绘图如下:
Root栈的原理图片描述
在struts2中压栈使用的方法是“push()”,弹栈时实用的方法是“pop()”,这些方法在ValueStack类中存在(创建action时继承的ActionSupport,ActionSupport中继承的ValueStack),可以直接调用;


1.3、Struts2与OGNL结合的体现

Struts2与OGNL结合体现在以下几个方面:

  1. 参数的获取
  2. 配置文件
  3. Struts2标签(本章节不进行详细的记录,下一章节进行学习)

下面进行逐个学习~

1.3.1 、参数的获取
参数的获取在struts2中总共有四种,分别是属性驱动、对象驱动和模型驱动以及集合封装传递,使用方法之前已经学过了,现在主要学的是其参数获取的原理流程,不用逐个细讲,在平时开发中使用的模型驱动的比较多,因此以模型驱动为例子进行学习;

代码:

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执行顺序是比较靠前的,这就需要找一个执行顺序更靠前的来将参数压栈,一般选用方法来进行这些业务,因此我们可以在我们手写的action中实现接口,并在手写的action中重写一下方法,并将参数压栈的方法写进重写的方法中,这样就能保证参数先压栈再赋值;

但是!!!在struts2中由于这种方法比较麻烦,因此struts2团队将此块操作封装进了另一个接口中,这个接口就是,直接省略了压栈的步骤(封装的接口中已经在后台自动调用方法进行了压栈处理),因此我们操作时只有上面的几行代码;

代码:

<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>

代码:

<!-- 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和配置文件之间的传递,其代码如下所示:

代码:

// 动态传递参数到配置文件中 --- 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;
	}
}

代码:

<!-- 通过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的路径在地址栏里:
输入Demo_stack3.class的路径在地址栏里图片描述
点击回车查看地址栏:
查看地址栏图片描述

成功~


pass:struts2标签在下一章节中进行学习~


《END》