`

6、Struts2_访问Web元素(request session application等)

 
阅读更多
struts2后台的Action跟我们前台的页面来通讯的时候,由于它不能直接拿到request,session,servletContext,比如当我们有人登陆了,我们要在session中设一个值,表示它登陆了,如何把相关的数据设到session里面?同样如何设置request、servletContext等?response不用访问它,因为我们的结果是通过result返回的.

访问Web元素可以有四种方法,下面依次列出
index.jsp
<?xml version="1.0" encoding="GB18030" ?>
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<% String context = request.getContextPath(); %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
        <title>Insert title here</title>
    </head>
<body>
    <form name="f" action="" method="post">
        用户名:<input type="text" name="name"/>
        密码:<input type="text" name="password"/>
        <br />
        <input type="button" value="submit1" onclick="javascript:document.f.action='login/login1';document.f.submit();" />
        <input type="button" value="submit2" onclick="javascript:document.f.action='login/login2';document.f.submit();" />
        <input type="button" value="submit3" onclick="javascript:document.f.action='login/login3';document.f.submit();" />
        <input type="button" value="submit4" onclick="javascript:document.f.action='login/login4';document.f.submit();" />
    </form>	
</body>
</html>

user_login_success.jsp
<?xml version="1.0" encoding="GB18030" ?>
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
    <%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
        <title>Insert title here</title>
    </head>
<body>
	User Login Success!
	<br />
	<s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br />
	<s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />
	<s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />
	<s:property value="#attr.a1"/><br />
	<s:property value="#attr.s1"/><br />
	<s:property value="#attr.r1"/><br />
	<s:debug></s:debug>
	<br />
</body>
</html>

struts.xml
<?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>
    <constant name="struts.devMode" value="true" />
    <package name="login" extends="struts-default" namespace="/login">
        <action name="login*" class="com.wwm.struts2.user.action.LoginAction{1}">
            <result>/user_login_success.jsp</result>
        </action>
    </package>
</struts>

1、通过struts2 中的ActionContext类来访问(不常用)
import java.util.Map;

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

public class LoginAction1 extends ActionSupport {
	
	private Map request;
	private Map session;
	private Map application;
	
	public LoginAction1() {
		request = (Map)ActionContext.getContext().get("request");
		session = ActionContext.getContext().getSession();
		application = ActionContext.getContext().getApplication();
	}
	
	public String execute() {
		request.put("r1", "r1");
		session.put("s1", "s1");
		application.put("a1", "a1");
		return SUCCESS; 
	}
	
}

Context直接翻译过来是:”上下文”。Context就是当前执行的环境,它会把周围环境帮你封转到Context这个对象里面,当你想访问这些东西的时候,通过Context去取。
原来学习过得ServletContext代表的就是servlet的运行环境,原来我们写程序就用ServletContext拿到各种各样的配置,ActionContext也就是Action周边运行的情况,Action运行的时候,首先接收到请求接收到request,response等等后面再接着调你的处理过程,Action处理的过程中,比如说那些配置怎么配的,执行环境怎么样等等都要通过ActionContext来拿。

ActionContext类中以下几个方法为其常用:
Static ActionContext getContext(): 获取ActionContext实例;
Object get(Object key): 类似于request.getAttribute(String  name);
Map getParameters():获取所有的请求参数,类似于request.getParameterMap();
Map getApplication():  相当于ServletContext实例,返回的是Map对象
Map getSession() :返回类似于HttpSession的实例
void setApplication(Map application): 直接传入一个Map实例,将Map实例里的key-value对转换成application的key-value
void setSession(Map session): 直接传入一个Map实例,将Map实例里的key-value对转换成session的key-value

我们的后台放了request,session,application这三个东西都是map,但是它反馈到前台之后居然用request,session,application可以拿到,所以struts2一定帮我们在Map和HttpRequest之间建立某种联系,对于我们自己设定的map类型的request这里面的属性在处理的过程中会全都复制到Http对象里边去。应该就是用void setApplication(Map application),void setSession(Map session)做的处理

在jsp中
第一种访问request里面的值:<%=request.getAttribute("r1") //原始的方式
第二种访问request里面的值:<s:property value="#request.r1"/>

2.IoC方式  IoC(控制反转)是Spring里面的特征之一(最常用)
import java.util.Map;

import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
	
	private Map<String, Object> request;
	private Map<String, Object> session;
	private Map<String, Object> application;
	
	//DI dependency injection
	//IoC inverse of control
	public String execute() {
		request.put("r1", "r1");
		session.put("s1", "s1");
		application.put("a1", "a1");
		return SUCCESS; 
	}

	@Override
	public void setRequest(Map<String, Object> request) {
		this.request = request;
	}

	@Override
	public void setSession(Map<String, Object> session) {
		this.session = session;
	}

	@Override
	public void setApplication(Map<String, Object> application) {
		this.application = application;
	}
	
}

一个请求过来Struts会new出一个Action出来;2.new完之后它会检查Action是否实现了RequestAware接口.3如果Action实现了RequestAware接口,就可以调用RequestAware接口的setRequest()方法.

而且其实request我们也很少去拿它,因为我们Action的成员变量默认会起到request的作用,它自己会放到valueStack里面, valueStack本身就是放到request里面,所以根本不用去拿request.

3、
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction3 extends ActionSupport {
	
	private HttpServletRequest request;
	private HttpSession session;
	private ServletContext application;
	
	public LoginAction3() {
		request = ServletActionContext.getRequest();
		session = request.getSession();
		application = session.getServletContext();
	}
	
	public String execute() {
		request.setAttribute("r1", "r1");
		session.setAttribute("s1", "s1");
		application.setAttribute("a1", "a1");
		return SUCCESS; 
	}
	
}


4、
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.interceptor.ServletRequestAware;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction4 extends ActionSupport implements ServletRequestAware {
	
	private HttpServletRequest request;
	private HttpSession session;
	private ServletContext application;
	
	
	
	public String execute() {
		request.setAttribute("r1", "r1");
		session.setAttribute("s1", "s1");
		application.setAttribute("a1", "a1");
		return SUCCESS; 
	}



	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
		this.session = request.getSession();
		this.application = session.getServletContext();
	}
	
}


总结:
第一种方法依赖于Struts2容器,取得相关对象数据;
第二种方法,依赖注入DI(dependency injection),控制反转IoC(Inverse of control),对象数据被容器注入;
第三种方法,依赖于容器取得相关对象数据;
第四种方法,依赖注入一个对象的数据后,再通过这个对象获取到其它对象数据。
推荐使用第二种方法。
[color=red][/color]
分享到:
评论

相关推荐

    Struts2访问request,session,application的四种方式

    总结来说,Struts2提供了多种途径来访问和管理request、session和application的数据,包括ActionContext、ValueStack、OGNL和拦截器。掌握这些方法将有助于提高开发效率和代码质量,同时也能更好地理解和优化基于...

    struts2访问application、session以及request等web资源的示例代码

    在Struts2中,访问Web资源,如application、session和request,是常见的操作,这有助于实现数据共享和传递。本示例代码将帮助开发者更好地理解和运用这些功能。 一、Application域对象 Application域对象在所有用户...

    struts2访问request,session,application作用域

    ### Struts2 访问 Request、Session 和 Application 作用域详解 #### 一、引言 Struts2 是一个基于 Java 的开源 Web 开发框架,它继承了 Struts1 的优秀特性并进行了改进,提供了更加灵活和强大的功能。在 Struts2...

    Struts2学习笔记(三) Struts2中访问request,session,和application对象

    在Struts2中,访问request、session和application对象是进行数据共享和传递的重要手段。这篇学习笔记主要探讨了如何在Struts2框架下有效地利用这三种域对象。 首先,request对象代表一次HTTP请求,它存储的数据仅...

    Struts2的Action中获得request response session几种方法

    默认情况下,Struts2已经配置了一些拦截器,例如`servletConfig`拦截器,它可以提供对servlet API的访问,包括request、response、session等。 在Action中,可以直接调用`ServletActionContext.getRequest()`、`...

    struts2创建 request response session application

    在Struts2框架中,理解并正确使用request、response、session和application范围对于有效地管理数据和状态至关重要。这些范围帮助我们在Web应用程序中实现逻辑和数据流的分离,提高代码的可维护性和可扩展性。通过...

    Struts2_OGNL

    4. 命名对象:包括在Servlet作用范围内的对象信息,如Request、Session、Application等。 在实际开发中,开发者可以通过OGNL表达式访问值栈中的Action属性、对象和其他信息。例如,使用标签可以输出Action中的属性...

    struts2_标签库

    Struts2是一个流行的Java web开发框架,其核心特性之一就是丰富的标签库,这些标签极大地简化了视图层的开发工作。在本教程中,我们将深入理解Struts2的标签库,包括它们的分类、使用方法以及与OGNL(Object-Graph ...

    struts2_OGNL表达式ActionContext及valuesStack

    在Struts2中,OGNL上下文被扩展为一个更复杂的结构,包含request、session、application、context map、OgnlValueStack等层次。OgnlValueStack(或简称为value stack)是核心,它是一个栈结构,通常包含用户对象、...

    struts2简单案例

    它有内置对象如request、response、session、application等,方便处理HTTP请求和响应。 - **EL(Expression Language)**:EL简化了在JSP中获取和设置属性值的方式,无需编写Java脚本,使得JSP更加简洁。 - **JSTL...

    Struts2学习笔记(7)-访问Web元素

    总结一下,Struts2中访问Web元素的主要方法是通过`ActionContext`获取`request`、`session`和`application`对象,从而实现数据的存储和共享。这些元素对于构建动态Web应用至关重要,因为它们使得服务器能够跟踪和...

    struts2标签介绍

    2. `s:debug`: 用于在页面上输出详细的调试信息,包括所有Action的属性、Session、Request和Application范围内的变量。 3. `s:iterator`: 迭代集合对象,如数组、列表或Map。可以遍历集合中的每个元素并显示。 三...

    struts2标签使用方法

    Struts2 标签可以访问不同的作用域的类,例如 request、session、application 等。 标签的优点 Struts2 标签库提供了主题、模板支持,极大地简化了视图页面的编写,而且,Struts2 的主题、模板都提供了很好的扩展...

    struts2之Action访问Servlet API

    Struts2 框架提供了多种方式来访问 Servlet API,包括使用 ActionContext 类、实现接口和使用 ServletActionContext 类等。在本文中,我们将详细介绍 Struts2 访问 Servlet API 的几种方法。 一、使用 ...

    STRUTS2获得作用域、参数响应对象及三种符号说明

    `AttributeMap`是一个特殊的类,它可以用来获取所有作用域内的值,包括`request`、`session`和`application`范围内的数据。 #### 三、接口实现 为了能够访问这些作用域,Struts2提供了几个接口,开发者可以根据...

    struts2学习心得

    6.struts2-core-2.2.1.jar 7.xwork-core-2.2.1.jar 注意,之前的版本使用ognl时不需要javassist这个类库,但是现在的版本则需要。 二、EL表达式(JSP EL) EL表达式的目的是为了使JSP写起来更加简单。 A、语法...

    访问Web页面元素

    通过`ServletActionContext.getRequest()`、`request.getSession()`和`session.getServletContext()`等方法,可以直接获取到这些对象的实例,从而进行更底层的操作,比如读取请求参数、管理会话状态或访问全局应用...

    Struts2通过使用ActionContext类获取request和response对象

    在Struts2中,ActionContext不仅仅是获取request和response的工具,它还包含了其他有用的上下文信息,如session、application等。例如,你可以通过ActionContext获取session中的数据: ```java Map, Object&gt; ...

    struts2标签库

    ValueStack是Struts2框架中的核心概念,它是一个对象栈,包含了Action对象、模型对象以及不同作用域的固定名称对象(如#application、#session、#request等)。值栈使得标签库可以直接访问对象,而不需要在视图层和...

Global site tag (gtag.js) - Google Analytics