一、一般是在Action中定义一个成员变量,然后对这个成员变量提供get/set方法,在JSP页面就可以取到这个变量的值了。
1)在Action中定义成员变量
//定义一个成员变量
private String message;
//提供get/set方法
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
2)在JSP页面中取值
${message}
2、但是定义的成员变量多了,感觉整个Action的代码就很长了。这个时候可以使用一些Servlet API进行值的存取操作:HttpServletRequest、HttpSession和ServletContext。Struts2对这个三个对象用Map进行了封装,我们就可以使用Map对象来存取数据了。
1)在Action中存值
package cn.com.action;
public class testAction extends ActionSupport {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getDataSourceStat() {
ActionContext actionContext = ActionContext.getContext();// ValueStack可以使用requestScope
Map<String, Object> session = ActionContext.getContext().getSession();// 对应sessionScope
Map<String, Object> application = ActionContext.getContext().getApplication();// 对应applicationScope
actionContext.put("b", "123");
session.put("c", "456");
application.put("d", "789");
return SUCCESS;
}
}
2)在xml配置文件
<struts>
<package name="test" extends="struts-default">
<action name="getDataSourceStat" class="cn.com.action.testAction" method="getDataSourceStat">
<!-- <result name="success">/index.jsp</result> -->
<result name="success">/test/jsp/datasource.jsp</result>
</action>
</package>
</struts>
3)在JSP页面上取值
<body>
<%
//从小到大的4个容器
pageContext.setAttribute("aa", "aaa");//${pageScope.aa }
request.setAttribute("bb", "bbb");//${requestScope.bb }
session.setAttribute("cc", "ccc");//${sessionScope.cc }
application.setAttribute("dd", "ddd");//${applicationScope.dd }
%>
<%= request.getAttribute("b")%>
<br> ${a} <!-- 取值顺序pageScope->requestScope->sessionScope->applicationScope -->
<br> ${b} <!-- 取值顺序pageScope->requestScope->sessionScope->applicationScope -->
<br> ${c} <!-- 取值顺序pageScope->requestScope->sessionScope->applicationScope -->
<br> ${d} <!-- 取值顺序pageScope->requestScope->sessionScope->applicationScope -->
<br> ${pageScope.aa }
<br> ${requestScope.b }
<br> ${sessionScope.c }
<br> ${applicationScope.d }
<br>
<!-- ${pageContext.request.contextPath}获取项目根路径 -->
<script type="text/javascript" src="${pageContext.request.contextPath}/plugins/jquery-1.12.4.min.js"></script>
</body>
web标准的存放数据的范围有:
pageContext域,request域,session域,application域(ServletContext)。
struts2自己又定义了一个容器来存放数据,即:ActionContext。
ActionContext是个Map集合,它持有了web标准的4个域,通过它可以直接获取这四个标准容器。
不仅如此,它还引用了其它struts2自己定义的对象:
jsp的4个作用域 pageScope、requestScope、sessionScope、applicationScope的区别
1、区别:
1.page指当前页面有效。在一个jsp页面里有效
2.request 指在一次请求的全过程中有效,即从http请求到服务器处理结束,返回响应的整个过程,存放在HttpServletRequest对象中。在这个过程中可以使用forward方式跳转多个jsp。在这些页面里你都可以使用这个变量。
3.Session是用户全局变量,在整个会话期间都有效。只要页面不关闭就一直有效(或者直到用户一直未活动导致会话过期,默认session过期时间为30分钟,或调用HttpSession的invalidate()方法)。存放在HttpSession对象中
4.application是程序全局变量,对每个用户每个页面都有效。存放在ServletContext对象中。它的存活时间是最长的,如果不进行手工删除,它们就一直可以使用
总结:当数据只需要在下一个forward有用时,用request就够了;
若数据不只是在下一个forward有用时,就用session。
上下文,环境信息之类的,用application。