Struts2进阶学习3
OGNL表达式与Struts2的整合
核心配置文件与页面
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="show" namespace="/" extends="struts-default" > <action name="ShowAction" class="com.struts2.action.ShowAction" method="execute" > <result name="success" type="dispatcher" >/show.jsp</result> </action> <action name="ShowAction2" class="com.struts2.action.ShowAction" method="getParam" > <result name="success" type="dispatcher" >/form.jsp</result> </action> <action name="redirect" class="com.struts2.action.RedirectAction" method="redirect" > <result name="success" type="redirectAction" > <param name="namespace">/</param> <param name="actionName">ShowAction</param> <!-- 路径携带参数;以及利用OGNL表达式动态绑定参数 --> <param name="name">${name}</param> </result> </action> </package> </struts>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="${pageContext.request.contextPath}/ShowAction"> name:<input type="text" name="name"/><br> <input type="submit" value="提交"/> </form> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Title</title> </head> <body> <s:debug></s:debug> </body> </html>
package com.struts2.pojo;
/**
* @author: 肖德子裕
* @date: 2018/11/20 21:05
* @description:
*/
public class User {
private String name;
private Integer age;
/**
* 回音方法:传什么值返回什么值,一般用于测试
* @param o
* @return
*/
public static Object test(Object o){
return o;
}
public User() {
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
OGNL表达式基本语法
package com.struts2.ognl; import com.struts2.pojo.User; import ognl.Ognl; import ognl.OgnlContext; import org.junit.Test; import java.util.HashMap; import java.util.Map; /** * @author: 肖德子裕 * @date: 2018/11/20 21:03 * @description: 测试OGNL表达式(对象视图导航语言),支持比EL表达式更丰富的语法 */ public class Demo { /** * OGNL基本语法 * @throws Exception */ @Test public void test() throws Exception{ //准备Root(可放置任意对象) User rootUser=new User("xdzy",18); //准备Context(放置map) Map<String,User> context=new HashMap<String,User>(); context.put("user1",new User("jack",17)); context.put("user2",new User("rose",27)); //准备OGNLContext OgnlContext oc=new OgnlContext(); oc.setRoot(rootUser); oc.setValues(context); //书写OGNL //获取rootUser的name和age(第一个参数就是OGNL的语法) String rootName = (String) Ognl.getValue("name", oc, oc.getRoot()); Integer age = (Integer) Ognl.getValue("age", oc, oc.getRoot()); System.out.println(rootName); System.out.println(age); //获取context的name与age String name = (String) Ognl.getValue("#user1.name", oc, oc.getRoot()); System.out.println(name); //对rootUser属性进行赋值 String rootName1 = (String) Ognl.getValue("name='张三'", oc, oc.getRoot()); System.out.println(rootName1); //对context属性进行赋值 String name1 = (String) Ognl.getValue("#user1.name='李四'", oc, oc.getRoot()); System.out.println(name1); //调用rootUser的属性方法 Ognl.getValue("setName('王五')", oc, oc.getRoot()); String rootName2 = (String) Ognl.getValue("getName()", oc, oc.getRoot()); System.out.println(rootName2); //调用context的属性方法 String name2 = (String) Ognl.getValue("#user1.setName('赵六'),#user1.getName()", oc, oc.getRoot()); System.out.println(name2); //调用静态方法;访问静态属性 String name3 = (String) Ognl.getValue("@com.struts2.pojo.User@test('hello')", oc, oc.getRoot()); Double pi = (Double) Ognl.getValue("@java.lang.Math@PI", oc, oc.getRoot()); System.out.println(name3); System.out.println(pi); } /** * OGNL基本语法2 * @throws Exception */ @Test public void test2() throws Exception{ //准备Root(可放置任意对象) User rootUser=new User("xdzy",18); //准备Context(放置map) Map<String,User> context=new HashMap<String,User>(); context.put("user1",new User("jack",17)); context.put("user2",new User("rose",27)); //准备OGNLContext OgnlContext oc=new OgnlContext(); oc.setRoot(rootUser); oc.setValues(context); //书写OGNL //通过OGNL创建list Integer size = (Integer) Ognl.getValue("{'肖','德','子','裕'}.size()", oc, oc.getRoot()); System.out.println(size); //通过OGNL创建map Integer size1 = (Integer) Ognl.getValue("#{'name':'xdzy','age':12}.size()", oc, oc.getRoot()); String name = (String) Ognl.getValue("#{'name':'xdzy','age':12}['name']", oc, oc.getRoot()); Integer age = (Integer) Ognl.getValue("#{'name':'xdzy','age':12}.get('age')", oc, oc.getRoot()); System.out.println(size1); System.out.println(name); System.out.println(age); } }
测试整合使用
package com.struts2.action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import com.opensymphony.xwork2.Preparable; import com.opensymphony.xwork2.util.ValueStack; import com.struts2.pojo.User; /** * @author: 肖德子裕 * @date: 2018/11/21 9:40 * @description: 测试OGNL表达式与struts2结合 * OGNL表达式的root在struts2中为栈,栈中保存的是当前访问的action * 队列:先进先出;栈:先进后出(list) * OGNL表达式的root在struts2中为ActionContext * implements Preparable:在参数赋值之前实现 */ public class ShowAction extends ActionSupport implements ModelDriven<User> { /** * 重写默认方法 * @return * @throws Exception */ @Override public String execute() throws Exception { System.out.println("hello action"); return SUCCESS; } private User user=new User(); /** * 如果在参数赋值之前压栈,将无法获取参数值 * @return */ public String getParam(){ System.out.println(user); return SUCCESS; } /** * 该拦截器在参数赋值之前实现,所以可以获取参数值 * @throws Exception */ /*@Override public void prepare() throws Exception { //获取值栈 ValueStack stack = ActionContext.getContext().getValueStack(); //压入栈顶 stack.push(user); }*/ @Override public User getModel() { return user; } }
package com.struts2.action; import com.opensymphony.xwork2.ActionSupport; /** * @author: 肖德子裕 * @date: 2018/11/21 10:40 * @description: 重定向时携带参数 */ public class RedirectAction extends ActionSupport { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public String redirect(){ name="xdzy"; return SUCCESS; } }