Struts2学习笔记(六):值栈(value Stack)浅析中对值栈进行了简介,本文主要讲述如何通过
仍然采用代码加注释的形式进行说明。
首先有一个登录页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
页面中userAction对应的action为:
package com.jiajia.actions;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import com.jiajia.model.User;
public class UserAction implements ApplicationAware, SessionAware, RequestAware, ParameterAware{
private User user;
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
}
public String addUser(){
if(user==null)
user = new User();
//获取请求参数,并为user属性赋值
user.setUserName(((String[])parameters.get("userName"))[0]);
user.setUserAge(Integer.valueOf(((String[])parameters.get("userAge"))[0]));
user.setUserGender(((String[])parameters.get("userGender"))[0]);
List classes = new ArrayList();
classes.add("语文");
classes.add("数学");
classes.add("英语");
user.setClasses(classes);
Map scores = new HashMap();
scores.put("语文", 90);
scores.put("数学", 95);
scores.put("英语", 89);
user.setScores(scores);
//设置相关消息
request.put("requestMsg", "requestMsg");
session.put("sessionMsg", "sessionMsg");
application.put("applicationMsg", "applicationMsg");
System.out.println(user);
return "success";
}
private Map request;
private Map session;
private Map application;
private Map parameters;
@Override
public void setParameters(Map arg0) {
this.parameters = arg0;
}
@Override
public void setRequest(Map arg0) {
this.request = arg0;
}
@Override
public void setSession(Map arg0) {
this.session = arg0;
}
@Override
public void setApplication(Map arg0) {
this.application = arg0;
}
}
UserAction中有一个User对象,User的定义为:
package com.jiajia.model;
import java.util.List;
import java.util.Map;
public class User {
private String userName;
private int userAge;
private String userGender;
private List classes;
private Map scores;
public User() { }
public Map getScores() {
return scores;
}
public void setScores(Map scores) {
this.scores = scores;
}
public List getClasses() {
return classes;
}
public User(String userName, int userAge, String userGender,
List classes, Map scores) {
super();
this.userName = userName;
this.userAge = userAge;
this.userGender = userGender;
this.classes = classes;
this.scores = scores;
}
public void setClasses(List classes) {
this.classes = classes;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getUserAge() {
return userAge;
}
public void setUserAge(int userAge) {
this.userAge = userAge;
}
public String getUserGender() {
return userGender;
}
public void setUserGender(String userGender) {
this.userGender = userGender;
}
public String sayHello(){
return "hello "+userName;
}
@Override
public String toString() {
return "User [userName=" + userName + ", userAge=" + userAge
+ ", userGender=" + userGender + "]";
}
}
这样在提交了表单以后,经过action的处理值栈对应的结果是这样的:
Object | Property Name | Property Value |
---|---|---|
com.jiajia.actions.UserAction | application | There is no read method for application |
session | There is no read method for session | |
request | There is no read method for request | |
parameters | There is no read method for parameters | |
user | User [userName=jiajia, userAge=20, userGender=female] | |
com.opensymphony.xwork2.DefaultTextProvider | texts | null |
context Map太占空间,这里就不再列出。value stack中包含了与action相关的所有信息,那么如何获取他们是我们非常关心的。
struts2提供了OGNL(Object Graph Navigation Language)来进行这项工作,
下面结合具体代码详细说明。
下面这个jsp页面时action处理后转发到的页面success.jsp。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
Insert title here
Struts 的 标签用来输出object Stack中的一个属性值.有三种方式可以使用:
- object.propertyName
- object["propertyName"]
- object['propertyName']
object通常用下标来表示,例如[0]代表object Stack中的第一个对象。
访问对象栈中第一个对象的user属性:[0].user
注:若在指定的对象里没有找到指定的属性, 则到指定对象的下一个对象里继续搜索. 即 [n] 的含义是从第 n 个开始搜索, 而不是只搜索第 n 个对象
同时user属性必须是public的,或者存在public的getUser()方法
[0].user:
从栈顶对象开始搜索user属性:user
注:若从栈顶对象开始搜索, 则可以省略下标部分
user:
从栈顶对象开始搜索user属性,并获取user中的userName属性:user.userName
注:只有当userName属性为public或者存在getUserName()方法时才能够得到
user.userName:
获取user中的List类型的classes属性,并调用list中相关方法
user.classes:
user.classes.size():
user.classes.get(1):
获取user中的Map类型的scores属性,并调用Map中相关方法
user.scores:
user.scores.size():
user.scores["语文"]:
从栈顶对象开始搜索user属性,并调用user中的sayHello方法:user.sayHello()
注:sayHello()方法必须是public的
user.sayHello():
user.setUserName('meimei')
user.sayHello():
访问静态属性的格式: @全类名@静态属性名
com.opensymphony.xwork2.ActionSupport.SUCCESS:
访问静态方法的格式: @全类名@静态方法名(参数)
注:需要先打开允许访问静态方法的开关。在struts.xml中添加常量配置: "
java.lang.Math.cos(0):
用EL表达式获取user属性:
${user}
注:这里的值其实还是来自于值栈。
Struts 的 标签也可以用来访问context map中的一个属性值.仍然有三种方式可以使用:
- #object.propertyName
- #object["propertyName"]
- #object['propertyName']
但是这里的object不能用下标表示。
#request.requestMsg访问request中的属性
#request.requestMsg:
#session.sessionMsg访问session中的属性
#session.sessionMsg:
#application.appliactionMsg访问application中的属性
#application.appliactionMsg:
#parameters.userName访问parameters中的属性
#parameters.userName:
上面为了让运行后的结果更加方便阅读,注释性的内容采取的仍是HTML语法,如果读者看起来不习惯,可以下载本文的详细代码,运行后可以看起来更加直观。
这里给出success.jsp在网页中的效果。
本文实例完整代码在这里:http://download.csdn.net/detail/jiajia333666/9052423