1. ActionContext
在Struts2开发中,除了将请求参数自动设置到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");
on执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个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();
2. ServletActionContext ServletActionContext(com.opensymphony.webwork. ServletActionContext),这个类直接继承了我们上面介绍的ActionContext,它提供了直接与Servlet相关对象访问的功能,它可以取得的对象有:
(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里取得Servlet的相关对象:
<1>取得HttpServletRequest对象:
HttpServletRequest request = ServletActionContext. getRequest();
<2>取得HttpSession对象:
HttpSession session = ServletActionContext. getRequest().getSession();
3. ServletActionContext和ActionContext联系
ServletActionContext和ActionContext有着一些重复的功能,在我们的Action中,该如何去抉择呢?我们遵循的原则是:如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问Servlet的相关对象.
注意:在使用ActionContext时有一点要注意: 不要在Action的构造函数里使用ActionContext.getContext(),因为这个时候ActionContext里的一些值也许没有设置,这时通过ActionContext取得的值也许是null;同样,HttpServletRequest req = ServletActionContext.getRequest()也不要放在构造函数中,也不要直接将req作为类变量给其赋值。至于原因,我想是因为前面讲到的static ThreadLocal actionContext = new ActionContextThreadLocal(),从这里我们可以看出ActionContext是线程安全的,而ServletActionContext继承自ActionContext,所以ServletActionContext也线程安全,线程安全要求每个线程都独立进行,所以req的创建也要求独立进行,所以ServletActionContext.getRequest()这句话不要放在构造函数中,也不要直接放在类中,而应该放在每个具体的方法体中(eg:login()、queryAll()、insert()等),这样才能保证每次产生对象时独立的建立了一个req。
4. struts2中获得request、response和session
(1)非IoC方式
方法一:使用org.apache.struts2.ActionContext类,通过它的静态方法getContext()获取当前Action的上下文对象。
ActionContext ctx = ActionContext.getContext();
ctx.put("liuwei", "andy"); //request.setAttribute("liuwei", "andy");
Map session = ctx.getSession(); //session
HttpServletRequest request = ctx.get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);
HttpServletResponse response = ctx.get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);
细心的朋友可以发现这里的session是个Map对象, 在Struts2中底层的session都被封装成了Map类型. 我们可以直接操作这个Map对象进行对session的写入和读取操作, 而不用去直接操作HttpSession对象.
方法二:使用org.apache.struts2.ServletActionContext类
public class UserAction extends ActionSupport {
//其他代码片段
private HttpServletRequest req;
// private HttpServletRequest req = ServletActionContext.getRequest(); 这条语句放在这个位置是错误的,同样把这条语句放在构造方法中也是错误的。
public String login() {
req = ServletActionContext.getRequest(); //req的获得必须在具体的方法中实现
user = new User();
user.setUid(uid);
user.setPassword(password);
if (userDAO.isLogin(user)) {
req.getSession().setAttribute("user", user);
return SUCCESS;
}
return LOGIN;
}
public String queryAll() {
req = ServletActionContext.getRequest(); //req的获得必须在具体的方法中实现
uList = userDAO.queryAll();
req.getSession().setAttribute("uList", uList);
return SUCCESS;
}
//其他代码片段
}
(2)IoC方式(即使用Struts2 Aware拦截器)
要使用IoC方式,我们首先要告诉IoC容器(Container)想取得某个对象的意愿,通过实现相应的接口做到这点。
public class UserAction extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware {
private HttpServletRequest request;
private HttpServletResponse response;
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
public String execute() {
HttpSession session = request.getSession();
return SUCCESS;
}
}
转载自:http://blog.csdn.net/tianlingai/archive/2010/07/02/5708433.aspx
分享到:
相关推荐
【文献综述】连锁企业危机管理研究——以宁波味千拉面为例 连锁企业在现代商业环境中扮演着重要的角色,它们通常具有广泛的分布网络、统一的品牌形象和标准化的运营模式。然而,这种规模化的运营模式同时也使得连锁...
拉面说成功地在速食拉面市场中脱颖而出,成为了一家独角兽企业。它的品牌策略主要体现在三个方面:卡位空白赛道、升维打击传统市场和瞄准特定人群。 1. 卡位空白赛道:拉面说巧妙地定位在传统方便面与线下拉面店...
【连锁企业危机管理】是企业管理领域的一个重要课题,特别是在快速发展的餐饮行业中,如宁波味千拉面这样的连锁品牌。危机管理旨在预防、应对和恢复企业面临的各种潜在风险,以保护企业的声誉、财务状况和运营稳定性...
连锁企业危机管理是商业运营中的重要课题,尤其在餐饮行业中,食品安全、服务质量、品牌信誉等问题一旦处理不当,都可能导致企业陷入危机。宁波味千拉面作为一家知名的连锁餐饮品牌,其危机管理策略对于整个行业的...
2. **以常规为主打**:拉面说的产品矩阵中,常规款待煮面作为主打产品,通过袋装款、速食乌冬面等产品线的补充,确保了产品的多样性和可及性。 ### 营销策略 拉面说的营销策略可以总结为以下几点: 1. **自传播...
兰州拉面在这样的文化氛围中融合了不同地域的烹饪技艺,形成了独特的风味。同时,兰州地区民族众多,不同民族的饮食习惯也影响了兰州拉面的风味和制作方法。 兰州拉面的特点可以从多个方面加以概述。首先,兰州拉面...
兰州拉面调味料中的食品添加剂包括呈味核苷酸二钠、琥珀酸二钠等。食品添加剂的质量应符合相应的标准和有关规定。食品添加剂的品种和使用量应符合GB 2760有关规定。呈味核苷酸二钠按生产需要适量使用,琥珀酸二钠≤...
2. **XML数据库**:由于项目使用XML作为数据库,这意味着所有的拉面销售记录、库存信息等都将以XML文件的形式存储。XML文件结构清晰,易于理解和解析,对于小型或中型应用来说,这种方式足够灵活且易于维护。 3. **...
《手工拉面(食品安全企业标准)》是一份详细规定了手工拉面生产、检验和质量控制的标准文件。该标准适用于以小麦粉为主料,添加水和食盐,经过一系列制作流程,如和面、压面、搓面、醒面、上面、烘面、卸面、包装等...
2020年,拉面说推出了高端产品——蟹黄面,以季节限定和餐厅级别的品质吸引了消费者。这款产品采用新鲜手延面,选用江苏水域的大闸蟹,每份面包含一只2两的母蟹,搭配特制蟹酱,口感鲜美。在2020年,线上销量达到了...
拉面说品牌是通过一系列策略和创新的营销方式在速食拉面市场上迅速崭露头角的,下面将详细介绍如何成为一个速食拉面独角兽的详细策略。 品牌策略方面,拉面说采取了卡位空白赛道、升维打击传统市场以及瞄准特定人群...
牛肉拉面专用粉的食品安全企业标准Q/WHTY0001S—2017主要涉及了该产品从原料到成品的整个生产过程中的各项技术要求、检验规则以及包装和储存的规定。此标准适用于以优质小麦为原料,经过清理、润麦、研磨和配粉等...
《2023-2028年兰州拉面馆市场现状与前景调研报告》深入分析了当前兰州拉面馆行业的市场状况和发展趋势,为行业内的企业和从业者提供了宝贵的决策依据。报告共分为四个章节,全面涵盖了行业的发展脉络、机遇挑战以及...
《日本“味千拉面”健康餐饮》品牌突围策划案主要探讨的是如何在激烈的中西快餐市场竞争中,利用品牌策略实现差异化,以提升品牌影响力和市场份额。策划案的核心在于把握产品品质和打造独特品牌价值,特别是在健康...
1999年,年轻的冯三峰听闻厨师学校招生的消息后,决定投身于面食制作的学习中,选择了所谓的“白案”——即专门制作面食的领域。当时,他并没有什么特别的技艺,但凭借着对拉面的热爱和对烹饪艺术的天分,他在这条...
在2楼的京都旅游案内可以购买一日或多日旅游票,适用于地铁和巴士,如果行程密集,购买这些票会更划算。京都站还有观景台、京都塔、拉面小路等特色景点。拉面小路集合了各地的知名拉面,供游客品尝。 第二天的行程...
2. **阴影效果**:`box-shadow`和`text-shadow`可以为元素添加阴影,增加视觉层次感。盘子边缘和拉面可能会有微妙的阴影效果,使它们看起来更真实。 3. **动画**:`@keyframes`规则用于定义CSS动画,可以控制元素在...
数据共享,集中管理”的设计思想,在企业多级网络中建立一条虚拟数据通道,使得企业高层可以直接、实时了解整个企业各分公司各门店实际销售及库存状况,使企业组织实现“扁平化”,提高企业系统的通讯性能和运作效率...
这种设备可能采用了创新的设计,以确保电信设备在物流过程中的安全和便捷性,就如同方便鲜拉面托盘在食品行业中发挥的作用一样。 在电信领域,设备的安全和高效是至关重要的。托盘作为基础的物流单元,必须能够承受...
描述中的"纯CSS3 绘制的日式拉面筷子卡通效果源码.zip"进一步强调了这个设计完全依赖于CSS3技术,而不是使用图片或者JavaScript等其他技术。源码以ZIP文件的形式提供,意味着用户可以下载并研究其中的代码,了解实现...