Struts2的值栈和OGNL牛逼啊
一 值栈简介:
值栈是对应每个请求对象的一套内存数据的封装,Struts2会给每个请求创建一个新的值栈,值栈能够线程安全的为每个请求提供公共的数据存取服务。
二 OGNL介绍:
(1)基本数据:
OGNL 是对象图导航语言Object-GraphNavigationLanguage的缩写,它是一种功能强大的表达式语言。
OGNL 访问ValueStack数据
OGNL 访问ActionContext数据
访问某个范围下的数据要用#
#parameters 请求参数 request.getParameter(...);
#request 请求作用域中的数据 request.getAttribute(...);
#session 会话作用域中的数据 session.getAttribute(...);
#application 应用程序作用域中的数据 application.getAttribute(...);
#attr 按照 page request session application 顺序查找值
我们以例子理解这部分内容,设置HelloAction:
1 public class HelloAction extendsActionSupport{2 private static final long serialVersionUID = 1L;3 @Override4 public String execute() throwsException {5 //狭义上的值栈
6 ActionContext actionContext=ActionContext.getContext();7 ValueStack valueStack=actionContext.getValueStack();8 valueStack.set("name", "张三(ValueStack)");9 valueStack.set("age", 11);10 //session中的值
11 Map session=actionContext.getSession();12 session.put("name","王五(session)");13 session.put("age","13");14 //application中的内容
15 Map application=actionContext.getApplication();16 application.put("name", "赵六(application)");17 application.put("age","14");18 returnSUCCESS;19 }20 }
Struts.xml文件的配置:
1
2
3
4
5 success.jsp
6
7
8
前端页面success.jsp
1
2 pageEncoding="utf-8"%>
3
4
5
6
7
8
Insert title here9
10
11 request.setAttribute("name","李四(request)");12 request.setAttribute("age","12");13 %>
14
15 值栈 获取的数据:
16
17
18 前台传递的数据:
19
20
21 request中的数据:
22
23
24 session中的数据:
25
26
27 application的数据:
28
29
30 attr取值 :
31
32
33
34
首先,是取值方式,
①值栈 直接取 比如说是name age就可以使用这种方式value=”name” value=”age”
②page页面传递的数据 比如说是name age使用这种方式value="#parameters.name” value="#parameters.age”
③requset设置的值 使用的方式 value="#request.name" value="#request.age"
④session设置的值使用的方式 value="#session.name" value="#session.age"
⑤application设置的值使用的方式value="#application.name" value="#application.age"
之后attr的取值方式是按照page request session applicaiton这个顺序取得。
例如:attr获取的是request的值
(2)OGNL访问静态方法和属性
Mystatic类:
1 public classMyStatic {2
3 public static final String str="yxs";4
5 public staticString printUrl(){6
7 System.out.println("http://www.yxs.com");8
9 return "http://www.yxs.com";10
11 }12
13 }
Static.jsp直接访问:
1
2 访问静态属性:
3 访问静态方法:
4
结果:
(3)OGNL 访问复杂对象
我们以javaBean对象为例:Student类
1 public classStudent {2 privateString name;3 private intage;4 publicStudent() {5 super();6 //TODO Auto-generated constructor stub
7 }8 public Student(String name, intage) {9 super();10 this.name =name;11 this.age =age;12 }13 publicString getName() {14 returnname;15 }16 public voidsetName(String name) {17 this.name =name;18 }19 public intgetAge() {20 returnage;21 }22 public void setAge(intage) {23 this.age =age;24 }25 }
Success.jsp文件:
1
2
3 ognl的javaBean值:
4
5
6 ognl的List集合:
7
8
9
10
11
12
13
14
15 ognl的Map:
16
17
18
19
20
21
22
HelloAction文件代码:
1 public class HelloAction extendsActionSupport{2 private static final long serialVersionUID = 1L;3 private Student student;//javaBean
4 private Liststudents;//list
5 private MapstudentMap;//Map
6 publicStudent getStudent() {7 returnstudent;8 }9
10 public voidsetStudent(Student student) {11 this.student =student;12 }13
14 public ListgetStudents() {15 returnstudents;16 }17
18 public void setStudents(Liststudents) {19 this.students =students;20 }21
22 public MapgetStudentMap() {23 returnstudentMap;24 }25
26 public void setStudentMap(MapstudentMap) {27 this.studentMap =studentMap;28 }29
30 @Override31 public String execute() throwsException {32 //TODO Auto-generated method stub
33
34 students=new ArrayList();35 student=new Student("小八",12);36 students.add(new Student("小酒",13));37 students.add(new Student("小石",14));38 students.add(new Student("十一",15));39 studentMap=new HashMap();40 studentMap.put("goodStudent", new Student("学霸",20));41 studentMap.put("badStudent", new Student("学渣",19));42 returnSUCCESS;43 }44 }
显示结果: