ActionContext内容
- 格式:docx
- 大小:158.06 KB
- 文档页数:3
struts2的execute() 方法(实用版4篇)《struts2的execute() 方法》篇1在Struts 2 中,execute() 方法是Action 的核心方法,它负责处理HTTP 请求并返回一个Action 的执行结果。
当Struts 2 接收到一个HTTP 请求时,它会查找并实例化指定的Action 类,然后调用其execute() 方法。
execute() 方法的参数包括:- HttpServletRequest 请求对象- HttpServletResponse 响应对象- ActionContext 动作上下文对象execute() 方法的返回值通常是Action 的一个结果类型,例如String、Map、List 等。
在Struts 2 中,结果类型可以通过在Action 类上添加注解来指定,例如:```java@Result(type = "json")public String handle() {//...}```如果execute() 方法返回一个结果类型为String 类型的字符串,那么Struts 2 将将其作为HTML 页面的内容返回给客户端。
如果返回一个Map 类型的结果,那么Struts 2 将将其作为JSON 数据返回给客户端。
如果返回一个List 类型的结果,那么Struts 2 将将其作为一个表格返回给客户端。
《struts2的execute() 方法》篇2在Struts 2 中,execute() 方法是Action 类的核心方法,它是Action 处理请求的关键步骤。
当请求进入Action 类后,首先会调用execute() 方法。
execute() 方法负责处理用户的请求,执行相应的业务逻辑,并将处理结果返回给客户端。
Struts 2 的execute() 方法的参数包括:1. HttpServletRequest request:当前请求的ServletRequest 对象。
android context的理解在Android 开发中,`Context` 是一个重要的概念,它代表了应用程序的当前状态和环境。
`Context` 提供了访问应用程序资源和系统服务的接口,同时还允许应用程序执行一些基本的操作,比如启动活动、发送广播、创建视图等。
`Context` 是一个抽象类,其具体实现是由Android 系统提供的。
在Android 应用中,通常有三种主要的`Context`:1. Application Context(应用程序上下文):表示整个应用程序的环境。
它在应用程序的整个生命周期内都存在,通常用于获取应用程序级别的资源,比如数据库引用或应用程序配置信息。
2. Activity Context(活动上下文):表示特定活动的环境。
它的生命周期与相应的活动一致,通常用于执行与活动相关的操作,比如启动新的活动、创建视图等。
3. Service Context(服务上下文):表示服务的环境。
它的生命周期与相应的服务一致,通常用于执行与服务相关的操作。
`Context` 类提供了许多有用的方法,例如:-获取应用程序资源(`getResources()`)。
-启动活动(`startActivity()`)。
-发送广播(`sendBroadcast()`)。
-获取系统服务(`getSystemService()`)。
-获取文件目录和文件路径(`getFilesDir()`、`getCacheDir()`)。
在Android 应用中,`Context` 通常作为参数传递给各种方法,以便方法能够访问应用程序的资源和执行与应用程序环境相关的操作。
```java// 在Activity 中获取Activity ContextContext context = this;// 在Application 中获取Application ContextContext appContext = getApplicationContext();```请注意,由于`Context` 包含对应用程序环境的引用,因此在使用时需要小心,以避免内存泄漏。
Action访问Servlet API我们有三种方式可以访问Servlet API,通常第一种容易接受,第二种使用较少,最后一种最为简单。
1.方式一:使用ActionContext对象(在Action中解耦合方式间接访问Servlet API)在struts2中Action API已经与Servlet API 解耦合(没有依赖关系),开发简单,便于测试。
Servlet API 常见操作:表单提交请求参数获取,向request、session、application三个范围存取数据.常见方法:.ActionContext 上下文,提供对于Servlet对象访问方法,间接访问.getContext() 返回ActionContext实例对象.get(key) 相当于HttpServletRequest的getAttribute(String name)方法.put(String,Object) 相当于HttpServletRequest的setAttribute方法.getApplication() 返回一个Map对象,存取ServletContext属性.getSession() 返回一个Map对象,存取HttpSession属性.getParameters() 类似调用HttpServletRequest的getParameterMap()方法.setApplication(Map) 将该Map实例里key-value保存为ServletContext的属性名、属性值.setSession(Map) 将该Map实例里key-value保持为HttpSession的属性名、属性值.ActionContext actionContext = ActionContext.getContext();.1) actionContext.getParameters(); 获得所有请求参数Map集合.2) actionContext.put("company", "传智播客"); / actionContext.get("company") 对request范围存取数据.3) actionContext.getSession(); 获得session数据Map,对Session范围存取数据.4) actionContext.getApplication(); 获得ServletContext数据Map,对应用访问存取数据./**.* 第一种解耦合方式间接访问Servlet API.* @author seawind.*.*/.public class LoginAction1 extends ActionSupport{.@Override.public String execute() throws Exception {.ActionContext actionContext = ActionContext.getContext();.// 1、获取请求参数.Map<String, Object> parameters = actionContext.getParameters();.String[] value = (String[]) parameters.get("username"); // request.getParameter("username").System.out.println("username : " +value[0]);..// 2、读取request的Attribute.actionContext.put("company", "传智播客"); // request.setAttribute.System.out.println(actionContext.get("company")); // request.getAttribute..// 3、存取Session的Attribute.Map<String, Object> sessionMap = actionContext.getSession();.sessionMap.put("age", 20);// session.setAttribute.System.out.println(sessionMap.get("age")); // session.getAttribute..// 4 存取Application的Attribute.Map<String, Object> applicationMap = actionContext.getApplication();.applicationMap.put("info", "要下雨"); // application.setAttribute.System.out.println(applicationMap.get("info")); // application.getAttribute..return SUCCESS;.}.}2.方式二:使用接口注入的方式操作Servlet API(藕合)通过Aware接口,在构造Action时,自动注入需要操作Servlet对象(需要哪个对象就实现哪个Aware接口)./**.* 第二种接口注入的方式操作Servlet API.* @author seawind.*ServletContextAware :注入ServletContext对象 *ServletRequestAware :注入request对象.*ServletResponseAware :注入response对象.*/.public class LoginAction2 extends ActionSupport implements ServletRequestAware, ServletContextAware {..private HttpServletRequest request;.private ServletContext context;..@Override.public String execute() throws Exception {.// 1 获得请求参数.System.out.println(request.getParameter("username"));.// 2 存取request.request.setAttribute("company", "itcast");.// 3 存取Session.request.getSession().setAttribute("age", 18);.// 4 存取Application.context.setAttribute("info", "已经下雨了");..return SUCCESS;.}..@Override.// struts2框架会自动将request对象设置进来.public void setServletRequest(HttpServletRequest request) {.this.request = request;.}..@Override.public void setServletContext(ServletContext context) {.this.context = context;.}.}3.方式三:在Action中直接通过ServletActionContext 获得Servlet API静态方法返回request,不会有线程问题(使用了ThreadLocal来实现的) ./**.* 第三种通过ServletActionContext 访问Servlet API.* @author seawind.*.*/.public class LoginAction3 extends ActionSupport{.@Override.public String execute() throws Exception {.// 1 获得请求参数.System.out.println(ServletActionContext.getRequest().getParameter("username"));.// 2 保存request范围数据.ServletActionContext.getRequest().setAttribute("company", "传智");.// 3 保存session 范围数据.ServletActionContext.getRequest().getSession().setAttribute("age", 19);.// 4 保存application范围数据.ServletActionContext.getServletContext().setAttribute("info", "雨很大");..return super.execute();.}.}总结:理论来说,第一种方式最好,实现了解耦和,但是第三种我们使用最为简单,企业中没有很大的限制,自己熟悉哪种就使用哪种。
Action类详解1、Action类功能(1)Action类在MVC模式中充当的Controller角色。
(2)页面的action请求动作对应于Action,通过setter和getter负责处理和存储数据或状态,执行业务逻辑处理,将处理结果响应给用户。
2、Action类基本内容(1)提供基本属性及属性的getter和setter方法。
基本属性包括:请求参数(Form表单中标签name)和响应信息(提示信息<s:property />)。
(2)提供一个Action默认的处理方法,即public String execute(),用来执行业务逻辑的处理(调用数据库操作内容,比如hibernate或spring和hibernate整合内容),及根据处理结果的返回字符串。
(3)提供Action其他的处理方法,要求:无参;返回值类型为String,方法中处理的内容与execute ()方法内容基本一致。
实现时只需在配置<action>元素,指定action的method属性,这样就可以不使用execute方法处理用户请求。
struts.xml截图访问Action时。
在Action名后加上“ActionName!methodName.action”3、Action类扩展(1)Action接口com.opensysphony.xwork2.Action(2)ActionSupport类,提供了很多基本功能,比如错误信息处理4、实现session和servlet操作(1)非IoC方式利用了ActionContext类以及ServletActionContext 类实现,具体的方法如下所示:获取session对象:在Struts2中底层的session都被封装成了Map类型,我们称之为SessionMap,而jsp 和servlet中的session则是指HttpSession对象。
Map session=ActionContext.getSession();●获取request对象:HttpServletRequest request = ServletActionContext.getRequest ();(2)IoC方式●获取session对象:Action类实现SessionA ware接口,并创建一个MAP对象session。
struts2 OGNL,struts2 表达式语言,Struts2 中OGNL表达式的用法,Struts2 #,表达式语言的好处,Struts2 $,struts2 井号,星号,百分号表达式语言主要有以下几大好处:1. 避免(MyType) request.getAttribute()和myBean.getMyProperty()之类的语句,使页面更简洁;2. 支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能;3. 简单明了地表达代码逻辑,使用代码更可读与便于维护。
Struts2 中OGNL表达式的用法:OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;“#”主要有三种用途:1.访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:名称作用例子parameters 包含当前HTTP请求参数的Map #parameters.id[0]作用相当于request.getParameter("id")request 包含当前HttpServletRequest的属性(attribute)的Map #erName相当于request.getAttribute("userName")session 包含当前HttpSession的属性(attribute)的Map #erName相当于session.getAttribute("userName")application 包含当前应用的ServletContext的属性(attribute)的Map #erName相当于application.getAttribute("userName") attr 用于按request > session > application顺序访问其属性(attribute)#erName 相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止2. 用于过滤和投影(projecting)集合,如books.{?#this.price<100};3. 构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。
第8章?第9章Struts2标签库和OGNL学习内容Struts 2标签库OGNL能力目标熟练使用Struts 2常用标签熟练使用OGNL本章简介前面我们编写的案例使用的都是HTML 标签,这些标签并不能很好的与Struts 2框架结合,Struts 2和Struts 1一样都自带了功能强大、成熟完善的标签库供我们使用,通过使用这些标签库可以大大提高开发效率和代码的可维护性。
其实Struts 2的标签库是建立在OGNL 基础上的,OGNL 是一种功能强大的表达式语言,通过简单的语法即可存取对象的属性、调用对象的方法、遍历等功能。
本章将学习OGNL 和Struts 2标签库,包括数据访问标签、控制标签、表单标签和非表单标签等。
核心技能部分9.1 OGNL9.1.1 ActionContextStruts 2中的ActionContext 、ValueStack 和StackContext 对象与OGNL 密切相关,理解这三个对象时学习OGNL 的前提。
在前面的学习中,我们已经在使用ActionContext 、ValueStack 和StackContext 对象了,这三个对象的作用及其之间的关系如图8.1.1所示。
图8.1.1ActionContext1. ActionContext 对象ActionContextValueStackStackContextAction 其他Session Request Application Parameters Attribute 其他ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文。
我们可以把上下文可以看作是一个容器,用于存放Action执行时需要使用的对象,例如请求的参数(Parameter)、会话(Session)、Servlet上下文(ServletContext)等。
上下文(context)ActionContext介绍(在Struts2中)一种属性的有序序列,它们为驻留在环境内的对象定义环境。
在对象的激活过程中创建上下文,对象被配置为要求某些自动服务,如同步、事务、实时激活、安全性等等。
多个对象可以存留在一个上下文内。
也有根据上下文理解意思的意思。
ActionContext介绍(在Struts2中)在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 = newActionContextThreadLocal();,ActionContextThreadLocal是实现ThreadLocal的一个内部类.ThreadLocal可以命名为"线程局部变量",它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本, 而不会和其它线程的副本冲突.这样,我们ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的.下面我们看看怎么通过ActionContext取得我们的HttpSession:Map session = ActionContext.getContext().getSession();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 等,应该怎么做?在Strutx 2.0你可以有两种方式获得这些对象:非IoC(控制反转Inversion of Control)方式和IoC方式.A、非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)的对象.B、IoC方式要使用IoC方式,我们首先要告诉IoC容器(Container)想取得某个对象的意愿,通过实现相应的接口做到这点.具体实现,请参考例6 IocServlet.java.例6 classes/tutorial/NonIoCServlet.javapackage 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;Public class NonIoCServlet extends ActionSupport {private String message;public String getMessage() {return message;}HttpServletRequest request = ServletActionContext.getRequest();HttpServletResponse response =ServletActionContext.getResponse();HttpSession session = request.getSession();@Overridepublic String execute() {ActionContext.getContext().getSession().put("msg", "Hello World from Session!");[A2]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(); //转换为字符串。
ActionContext内容:
从其中可以看出有重复的比如com.opensymphony.xwork2.ActionContext.session和session,它们的value是一样的,却有不一样的名字。
其实后者是为了方便ognl查找,而前者是定义在strutsStatics中的常量。
可以从ActionContext获得:request session application
结果:
结论:在Action中有三种方法获得request
(1)实现ServletRequestAware接口
(2)通过ActionContext的get方法
(3)通过ServletActionContext的getRequest方法。
ServletActionContext是Actioncontext的子类
这三种方法的到的request是同一个对象。
得到session和application的方法:ActionContext的getSession方法和getApplication方法。
与servlet中获得的request、session、application相比较:
结果:
结论:struts2中获得的reqeust session application和servlet中的是不同的前者对后者进行了包装。
Actioncontext还可以得到其他的对象,包括:
(1)getActionInvocation()->ActionInvocation
(2)getLocale()->Locale
(3)getContextMap()->ActionContext的内容Map
(4)getName->Action的Name
(5)getParameters()->得到请求参数
(6)getConversionErrors()->得到转换的错误
(7)getValueStack()->得到值栈
(8)getActionInvocation().getAction()得到action对
象
(9)使用get()还可以得到其他的对象。