![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
js可以通过OGNL表达式从struts的值栈中取值吗?
是可以实现的,具体如下:
值栈中存放着一些OGNL可以访问的数据,如下:
a:action的实例,这样就可以通过OGNL来访问Action实例中的属性的值了。
b:OGNL表达式运算的值,可以设置到值栈中,可主动访问值栈对象,强行设置。
c:OGNL表达式产生的中间变量,比如使用Struts2标签的时候,使用循环标签,自然会有循环的变量,这些都放在值栈中。
例子,修改用户输入的参数信息,如下图所示,
图:用户输入了aa的username
图:用户提交后发现username属性的值发生了变化
实现:
首先定义一个实现PreResultListener接口的类:MyPreResultListener
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.PreResultListener;
public class MyPreResultListener implements PreResultListener {
@Override
public void beforeResult(ActionInvocation invocation, String resultCode) {
System.out.println("现在处理Result执行前的功能, result=" + resultCode);
//在Result处理之前修改value stack里面的username对应的值
invocation.getInvocationContext().getValueStack().setValue("username", "被修改了");
}
}
然后在相应的Action中进行注册:
import com.capinfotech.listener.MyPreResultListener;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class PreResultAction extends ActionSupport {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute() {
System.out.println("用户输入的参数为,username:" + username + ", password:" + password);
ActionContext context = ActionContext.getContext();
MyPreResultListener preListener = new MyPreResultListener();
context.getActionInvocation().addPreResultListener(preListener);
return "success";
}
}