在Web应用程序开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息, 甚至需要直接对JavaServlet Http的请求(HttpServletRequest),响应(HttpServletResponse)操作.
我们需要在Action中取得request请求参数"username"的值:
ActionContext context = ActionContext.getContext();
Map params = context.getParameters();
String username = (String) params.get("username");
ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放放的是Action在执行时需要用到的对象
一般情况,我们的ActionContext都是通过:ActionContext context = (ActionContext) actionContext.get();来获取的.我们再来看看这里的actionContext对象的创建:static ThreadLocal actionContext = new ActionContextThreadLocal();,ActionContextThreadLocal是实现ThreadLocal的一个内部类.ThreadLocal可以命名为"线程局部变量",它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突.这样,我们ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的.
下面我们看看怎么通过ActionContext取得我们的HttpSession:
Map session = ActionContext.getContext().getSession();
ServletActionContext
ServletActionContext(com.opensymphony.webwork. ServletActionContext),这个类直接继承了我们上面介绍的ActionContext,它提供了直接与JavaServlet相关对象访问的功能,它可以取得的对象有:
1, javax.servlet.http.HttpServletRequest:HTTPservlet请求对象
2, javax.servlet.http.HttpServletResponse;:HTTPservlet相应对象
3, javax.servlet.ServletContext:Servlet 上下文信息
4, javax.servlet.ServletConfig:Servlet配置对象
5, javax.servlet.jsp.PageContext:Http页面上下文
下面我们看看几个简单的例子,让我们了解如何从ServletActionContext里取得JavaServlet的相关对象:
1, 取得HttpServletRequest对象:
HttpServletRequest request = ServletActionContext. getRequest();
2, 取得HttpSession对象:
HttpSession session = ServletActionContext. getRequest().getSession();
ServletActionContext和ActionContext有着一些重复的功能,在我们的Action中,该如何去抉择呢?我们遵循的原则是:如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问JavaServlet的相关对象.在使用ActionContext时有一点要注意:不要在Action的构造函数里使用ActionContext.getContext(),因为这个时候ActionContext里的一些值也许没有设置,这时通过ActionContext取得的值也许是null.
如果我要取得Servlet API中的一些对象,如request,response或session等,应该怎么做?这里的execute不像Struts 1.x的那样在参数中引入."开发Web应用程序当然免不了跟这些对象打交道.在Strutx 2.0你可以有两种方式获得这些对象:非IoC(控制反转Inversion of Control)方式和IoC方式.
非IoC方式
要获得上述对象,关键Struts 2.0中com.opensymphony.xwork2.ActionContext类.我们可以通过它的静态方法getContext()获取当前Action的上下文对象. 另外,org.apache.struts2.ServletActionContext作为辅助类(Helper Class),可以帮助您快捷地获得这几个对象.
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
如果你只是想访问session的属性(Attribute),你也可以通过ActionContext.getContext().getSession()获取或添加session范围(Scoped)的对象.
IoC方式
要使用IoC方式,我们首先要告诉IoC容器(Container)想取得某个对象的意愿,通过实现相应的接口做到这点.具体实现,请参考例6 IocServlet.java.
例6 classes/tutorial/NonIoCServlet.java
package tutorial;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
publicclass NonIoCServlet extends ActionSupport {
private String message;
public String getMessage() {
return message;
}
@Override
public String execute() {
ActionContext.getContext().getSession().put("msg", "Hello World from Session!");
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
StringBuffer sb =new StringBuffer("Message from request: ");
sb.append(request.getParameter("msg"));
sb.append("<br>Response Buffer Size: ");
sb.append(response.getBufferSize());
sb.append("<br>Session ID: ");
sb.append(session.getId());
message = sb.toString();
return SUCCESS;
}
}
例6 classes/tutorial/IoCServlet.java
package tutorial;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
publicclass IoCServlet extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware {
private String message;
private Map att;
private HttpServletRequest request;
private HttpServletResponse response;
public String getMessage() {
return message;
}
publicvoid setSession(Map att) {
this.att = att;
}
publicvoid setServletRequest(HttpServletRequest request) {
this.request = request;
}
publicvoid setServletResponse(HttpServletResponse response) {
this.response = response;
}
@Override
public String execute() {
att.put("msg", "Hello World from Session!");
HttpSession session = request.getSession();
StringBuffer sb =new StringBuffer("Message from request: ");
sb.append(request.getParameter("msg"));
sb.append("<br>Response Buffer Size: ");
sb.append(response.getBufferSize());
sb.append("<br>Session ID: ");
sb.append(session.getId());
message = sb.toString();
return SUCCESS;
}
}
例6 Servlet.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<h2>
<s:property value="message" escape="false"/>
<br>Message from session: <s:property value="#session.msg"/>
</h2>
</body>
</html>
例6 classes/struts.xml中NonIocServlet和IoCServlet Action的配置
<action name="NonIoCServlet" class="tutorial.NonIoCServlet">
<result>/Servlet.jsp</result>
</action>
<action name="IoCServlet" class="tutorial.IoCServlet">
<result>/Servlet.jsp</result>
</action>
运行Tomcat,在浏览器地址栏中键入http://localhost:8080/Struts2_Action/NonIoCServlet.action?msg=Hello%20World! 或http://localhost:8080/Struts2_Action/IoCServlet.action?msg=Hello%20World!
在Servlet.jsp中,我用了两次property标志,第一次将escape设为false为了在JSP中输出<br>转行,第二次的value中的OGNL为"#session.msg",它的作用与session.getAttribute("msg")等同.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/alex197963/archive/2008/03/26/2219912.aspx
分享到:
相关推荐
在Struts2中,`struts.xml`是核心配置文件,它是整个应用的入口点,负责定义动作(Actions)、结果(Results)、拦截器(Interceptors)等关键元素。让我们深入探讨一下`struts.xml`的基本配置: 1. **Action配置**...
6. **JSP视图**:在Struts2中,JSP通常作为视图来展示数据。你可以使用Struts2的标签库,如`s:property`、`s:form`、`s:submit`等,来简化视图层的开发。 7. **Model**:模型层通常包含业务对象和数据访问对象,...
Struts2是Java Web开发中的一个强大框架,它在MVC(Model-View-Controller)设计模式的基础上,为开发者提供了一种高效、灵活且可扩展的解决方案。本篇文档将深入探讨Struts2的核心概念、架构以及实际应用,旨在帮助...
在实际开发中,你可能还会遇到一些关键概念,如ValueStack,它是OGNL在Struts2中的核心数据结构,存储了所有可以被表达式访问的对象。ActionContext则提供了上下文信息,包括请求、响应、session等。Struts2的异常...
1. **Action与结果类型**:在Struts2中,Action是业务逻辑的载体,它接收请求,处理数据,并返回一个Result。Result定义了请求处理后的输出方式,可以是重定向、转发或者生成一个视图。源码中可以看到Action的实现...
SwfUpload 是一个开源的JavaScript库,用于在Web应用程序中实现文件上传功能,它与Java后端技术如Struts2框架结合使用,可以提供高级的文件上传体验。在这个项目中,SwfUpload 被用来展示文件上传的进度、速度以及...
1. **Action类**:在Struts2中,Action类是业务逻辑处理的中心。它接收来自用户的请求,执行相应的操作,并通过Result返回响应。开发者需要创建自定义的Action类,继承自`com.opensymphony.xwork2.ActionSupport`或...
4. **ValueStack**:值栈是Struts2中的一个重要概念,它是一个存储Action及ActionForm对象的栈,可以方便地在视图层访问模型数据。 5. **Interceptor(拦截器)**:拦截器是Struts2的一个强大特性,它允许在Action...
本学习笔记主要探讨了Struts2中的校验器(Validator)和校验框架,帮助开发者理解如何有效地实现数据验证,确保应用程序的健壮性。 首先,我们来看Struts2的校验框架。这个框架提供了强大的功能,可以对用户输入...
使用MyEclipse 2014作为开发环境,这是一款集成开发环境(IDE),专为Java EE应用程序开发而设计,支持包括Struts 2在内的多种框架。部分代码的库可能被删除是因为文件大小的限制,但不影响主要的代码逻辑。 Struts...
1. **Action类**:在Struts2中,业务逻辑通常由Action类执行。Action类是用户请求与模型交互的入口点,它实现了`com.opensymphony.xwork2.Action`接口或其子接口,如`ActionSupport`。 2. **配置文件**:Struts2的...
在Struts2中,Action是业务逻辑的载体,而XWork则提供了一套强大的机制来处理这些Action。它包括ActionInvocation、ActionProxy、Interceptor等关键组件。ActionInvocation是执行链的核心,它负责调用一系列...
在Struts2中,我们可以使用自定义拦截器、全局结果或配置文件来捕获和处理这种错误。 1. **自定义拦截器**: 在Struts2中,拦截器是处理请求和响应的重要组件。我们可以创建一个专门处理404错误的拦截器,当请求...
Struts2的ActionSupport类、ActionContext以及Result类型等都是学习的重点。 最后,实际项目开发中的最佳实践和案例分析也是必不可少的。通过阅读本书,读者不仅可以掌握Struts框架的基本用法,还能了解到在实际...
在这个登录程序中,Struts2框架可能被用来接收表单数据、验证用户输入、管理会话状态以及处理登录逻辑。Struts2的动作配置文件(struts.xml)定义了动作映射,关联URL路径到特定的Action类,还可能包含拦截器,用于...
5. ActionContext:在Action执行过程中,提供了访问上下文信息的接口,如Request、Response、Session等。 6..struts1.2_en.chm:这是一个帮助文档,包含了Struts1的详细API和开发者指南。对于初学者来说,是学习和...
在Struts2中,类型转换是一个重要特性,xwork2提供了强大的类型转换机制。在`com.opensymphony.xwork2.converters`包下,可以看到各种类型的Converter实现,如StringConverter、IntegerConverter等,它们负责将请求...
值栈是Struts2的一个核心概念,它是一个基于栈的数据结构,存储了请求处理过程中的模型对象。`ValueStack`通过OGNL(Object-Graph Navigation Language)表达式语言,使得在视图层可以直接访问模型数据。 通过深入...
在深入理解XWork源码之前,我们先来了解一下XWork的基本概念和它在Struts2中的角色。 **1. XWork的概述** XWork提供了一种强大的命令模式实现,它使得业务逻辑可以独立于视图和控制器进行处理。XWork的核心是Action...
- **框架:** Struts2 - **数据库:** MySQL #### 七、项目总结 通过本项目的实施,不仅实现了学生选课的核心功能,还提高了学生的选课体验。系统的设计和实现过程中,充分考虑了用户体验和数据安全性,确保了系统的...