1. 程式人生 > >第20講 struts2獲取狹義和廣義的值棧資料

第20講 struts2獲取狹義和廣義的值棧資料

值棧的理解:
值棧是對應每個請求物件的一套記憶體資料的封裝,Struts2 會給每個請求建立一個新的值棧。 值棧能夠執行緒安全地為每個請求提供公共的資料存取服務
1複製專案HeadFirstStruts2chapter03 ,改名為HeadFirstStruts2chapter04,新建HelloAction,重寫execute()方法,刪除其他多餘的包和類,通過ActionContext獲取actionContext物件,用actionContext物件獲取值棧物件(狹義的值棧),在值棧中設定值。以此類推:分別獲取request,session,application中的值,

package com.cruise.action;

import

 java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

public class HelloAction
 extends ActionSupport{
    
    
    @Override
    public String execute() throws Exception {
       ActionContext actionContext = ActionContext.getContext
();
       ValueStack valueStack = actionContext.getValueStack();
       valueStack.set("name", "張三(ValueStack)");
       valueStack.set("age", "11(ValueStack)");
       
       HttpServletRequest request = (HttpServletRequest) actionContext.get(ServletActionContext.HTTP_REQUEST);
       request.setAttribute("name", "李四(request)");
       request.setAttribute("age", "12(request)");
       
       Map session = actionContext.getSession();
       session.put("name", "王五(session)");
       session.put("age", "13(session)");
       
       Map application = actionContext.getApplication();
       
       application.put("name", "趙六(application)");
       application.put("age", "14(application)");
       
       return "success";
    }
}
2success.jsp檔案,刪除其他多餘的jsp檔案,引入struts標籤,獲取值棧的資料,
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
狹義上的值棧的資料:<s:property value="name"/><s:property value="age"/><br>
請求引數的的資料:<s:property value="#parameters.name"/><s:property value="#parameters.age"/><br>
request的資料:<s:property value="#request.name"/><s:property value="#request.age"/><br>
session的資料:<s:property value="#session.name"/><s:property value="#session.age"/><br>
application的資料:<s:property value="#application.name"/><s:property value="#application.age"/><br>
attr的資料:<s:property value="#attr.name"/><s:property value="#attr.age"/><br>
body>
html>

3struts.xml定義action,
xml version="1.0" encoding="UTF-8" ?>
DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<package name="manage" namespace="/" extends="struts-default">
    <action name="hello" class="com.cruise.action.HelloAction" >
       <result name="success" >success.jspresult>
    action>
package>
struts>

4測試
http://localhost:8080/HeadFirstStruts2chapter04/hello?name=cruise&age=26
ps:OGNL 是物件圖導航語言 Object-GraphNavigationLanguage 的縮寫,它是一種功能強大的表示式語言。 
OGNL 訪問 ValueStack 資料 
OGNL 訪問 ActionContext 資料 
訪問某個範圍下的資料要用# 
#parameters 請求引數request.getParameter(...);例如:http://www.baidu.com?name=cruise
#request 請求作用域中的資料 request.getAttribute(...); 
#session 會話作用域中的資料 session.getAttribute(...); 
#application 應用程式作用域中的資料 application.getAttribute(...); 
#attr 按照 pagerequestsessionapplication 順序查詢