1.首先设置后台User数据
分别设置有id和name和地址
再用有参和无参将之初始化:
接着用SET、get方法将之对外封装
package ognl;
public class User {
private int id;
private String name;
private Adress adress=new Adress("广东","gz");
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(int id, String name) {
super();
this.id = id;
this.name = name;
this.adress = adress;
}
public Adress getAdress() {
return adress;
}
public void setAdress(Adress adress) {
this.adress = adress;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.设置后台action控制
首先继承actionsupport,再去重写里面的execute方法
再用struts2中比较万能的struts2的ActionContext取得联系上下文的request,再以map集合封装
最后用map集合来存储外部数据
也可以直接使用ActionContext来存储数据,既是利用ActionContext.getContextMap().put();在put中放入数据
案例:
package ognl;
import java.util.Map;
import org.junit.Test;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;
public class OgnlDemo2 extends ActionSupport{
//这里是有参方法封装利用
private User user=new User(100,"sam");
public User getUser() {
return user;
}
//set、get方法封装
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
ActionContext ac=ActionContext.getContext();
//映射数据
//这个是一个上下文的map,其实就是一个request
// ac.getContextMap().put("request_data", "request_data");
//数据存储数据
//传统来说:用 这种方法是比较好的
Map<String, Object>map=(Map<String, Object>) ac.get("request");
map.put("request_data", "request_data");
map.put("cn", "china");
ac.getSession().put("session_data", "session_data");
ac.getApplication().put("application_data", "application_data");
//二、值栈对象的存储数据的原理
ValueStack vs=ac.getValueStack();
//栈顶
/* vs.getRoot().push(new User(1002,"tom"));
//移除栈顶元素
vs.pop();*/
vs.set("user1", new User(1,"sam"));
vs.set("user2", new User(2,"yezi"));
System.out.println(vs);
return super.execute();
}
}
3.最后可以设置前台的jsp页面了
首先在jsp页面中必须要学会运用ognl表达式
取值分为:取根元素和非根元素两种区别
其一:什么是根元素什么是非根元素
根元素:即action对象和全局属性
访问这两者的区别在于根元素不需要加#直接拿来用而非根是需要加#号的
最后使用取值方法来直接呈现在jsp页面上
案例:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<!--页面,必须要拿到valuestack -->
<br/>1.取根元素的值<br/>
<s:property value="user.id"/>
<s:property value="user.name"/>
<s:property value="user.adress"/>
<s:property value="user.adress.city"/>
<s:property value="user.adress.province"/>
<br/>2.取非根元素的值<br/>
<s:property value="#request.cn"/><!--request数据也叫作上下文数据-->
<s:property value="#session.session_data" />
<s:property value="#application.application_data"/>
<br/>
<!-- 自动找request/session/application,找到后立刻返回-->
<!--attr是比较强大一些,因为attr是和他们是同一个对象的。-->
<s:property value="#request_data" />
<s:property value="#attr.session_data" />
<s:property value="#attr.application_data" />
<!-- 获取请求的参数数据-->
<br/>
<s:property value="#parameters.userName"/>
<!-- struts的调试标签 可以观测值栈数据 -->
<s:debug></s:debug>
</body>
</html>
然后部署文件启动tomcat,在浏览器里访问(当然在这里,我没有亮出配置web.xml方法)
这就是ognl取值的过程(其实也就是在jsp页面上呈现的代码而已利用s:property的value从action中获取的值)