Action访问ServletAPI的三种方式
一、前言
Struts是一种基于MVC设计模式的web应用框架,主要担任C的角色,用于分离页面显示和业务逻辑处理,那其实在我们学习jsp的时候学过一个具有类似功能的东西——servlet。其实Struts本质上相当于servlet,可以理解Struts是对servlet的进一步封装和抽象。那么在servlet里面使用的对象,在Struts里面同样也是可以使用的,这也是这一章的主要内容。
二、传统的Web程序和Web容器传递数据的方法
- HttpServletRequest的getParameter(String name)方法
- HttpSession的getAttribute(String Object)方法
三、Action为什么需要调用Servlet API?
- Action需要存取request、session、application数据区中数据
- 例如:在Action中将用户数据保存到Session中
- 例如:跟踪用户的状态,例如购物车功能
四、Action访问servlet API的方式
- 提供了ServletActionContext类完成直接访问HttpServletRequest,HttpServletResponse,ServletContext 对象
缺点:Action组件和这些ServletAPI耦合在一起,不利于软件维护。
//第一种方式:ServletActionContext类,直接访问servletAPI对象
HttpServletRequest request=ServletActionContext.getRequest();
HttpSession session=request.getSession();
ServletContext application=ServletActionContext.getServletContext();
// request.setAttribute("user",uname);//将user对象放到request作用域中
// session. setAttribute("user",uname);//将user对象放到session作用域中
// application. setAttribute("user",uname);//将user对象放到application作用域中
if("ross".equals(this.uname) && "111".equals(this.upass)){
request.setAttribute("user",uname);//将user对象放到request作用域中
return "success";
}else{
request.setAttribute("msg","用户名或密码错误");//将user对象放到request作用域中
return "error";
}
- 提供ActionContext类
特点:Struts2将ServletAPI(HttpServletRequest,HttpSession,ServletContext)分别封装在Map中,完成了Action组件和ServletAPI的解耦。
所以如果ActionContext能实现我们的功能就不要去使用ServletActionContext,让我们的action尽量不要去直接访问servlet的相关对象,更符合面向对象编程的思想。
注意:不要在构造函数当中使用ActionContext,因为此时ActionContext里面的值也许还没有设置。同理,ServletActionContext也一样不要在构造函数当中使用。这就有了我们的第三种访问方式。
//第二种方式:actioncontext类
ActionContext context=ActionContext.getContext();
Map<String,String> request=(Map<String,String>)context.get("request");//获得request对象 Map<String,Object> session=(Map<String,Object>)context.getSession();
Map<String,Object> application=(Map<String,Object>)context.getApplication();
request.put("user",uname);//将user对象放到request作用域中
if("ross".equals(this.uname) && "111".equals(this.upass)){
request.put("user",uname);//将user对象放到request作用域中
return "success";
}else{
request.put("msg","用户名或密码错误");//将user对象放到request作用域中
return "error";
}
- 实现RequestAware,SessionAware,ApplicationAware接口。【推荐使用】
特点:装配request,session,application对象的时机早,在检测Action组件的实现接口时就完成了装配。
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;
@Override
public void setApplication(Map<String, Object> arg0) {
this.application=arg0;
}
@Override
public void setSession(Map<String, Object> arg0) {
this.session=arg0;
}
@Override
public void setRequest(Map<String, Object> arg0) {
this.request=arg0;
}
/**
* 处理用户登录请求
*/
public String execute() {
// 模拟用户登录处理(登录正确)
if ("ross".equals(uname) && "111".equals(upass)) {
session.put("uname", uname);
// 返回逻辑视图名
return SUCCESS;
// 登录失败
} else {
request.put("loginError", "登录名称或者密码错误");
// 返回逻辑视图名
return ERROR;
}
}
页面上使用el表达式${ loginError}获取即可。
Action访问ServletAPI的三种方式的更多相关文章
- Struts2访问ServletAPI的三种方式
web应用中需要访问的ServletAPI,通常只有HttpServletRequest,HttpSession,ServletContext三个,这三个接口分别代表jsp内置对象中的request, ...
- struts2学习笔记之六:struts2的Action访问ServletAPI的几种方式
方法一:通过ActionContext访问SerlvetAPI,这种方式没有侵入性 Action类部分代码 import com.opensymphony.xwork2.ActionContext; ...
- Struts2(四.注册时检查用户名是否存在及Action获取数据的三种方式)
一.功能 1.用户注册页面 <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- 【深入Struts2】获取ServletAPI的三种方式
一:获取servletAPI的三种方法 在传统的Web开发中,经常会用到Servlet API中的HttpServletRequest.HttpSession和ServletContext.Strut ...
- ssh框架总结之action接收参数的三种方式
页面将参数传递给action的三种方式 一是通过属性传值: 将页面和action的的属性值保持一致,在action上写上该属性的set和get方法,这样在页面提交参数的时候,action就会调用set ...
- spring mvc 通过配置xml访问控制器的三种方式
(一)通过 name 来一一映射(默认) (二)通过简单url 来指定映射,key 表示访问url value 是bean的ID (三)通过控制类的类名控制器,访问时类名首字母需要小写 <!-- ...
- Struts2学习(二)运行Action中方法的三种方式
1.运行execute()方法 一般的能够直接在action中书写execute,调用action时会自己主动运行此方法 2.配置method方法 在struts.xml中配置action时.写met ...
- COS中访问文件的三种方式
1.通过FID来访问文件(比如EF,DF) 2.通过SFI来访问文件(有些COS命令可以通过SFI来快速访问文件,而不需要事先选中文件) 3.通过文件名来访问文件(只能是DF文件)
- 解决dubbo注册zookepper服务IP乱入问题的三种方式
最近做一个项目引入了dubbo+zookepper的分布式服务治理框架.在应用的发布的时候出现一个怪问题.zookepper服务是起在开发服务器192.168.23.180上.本机起应用服务提供者注册 ...
随机推荐
- poj 2955 区间dp入门题
第一道自己做出来的区间dp题,兴奋ing,虽然说这题并不难. 从后向前考虑: 状态转移方程:dp[i][j]=dp[i+1][j](i<=j<len); dp[i][j]=Max(dp[i ...
- BZOJ 2818 Gcd (莫比乌斯反演 或 欧拉函数)
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MB Submit: 2534 Solved: 1129 [Submit][Status][Discu ...
- 数据结构(Java语言)——LinkedList简单实现
下面是一个能够使用的LinkedList泛型类的实现.这里的链表类名为MyLinkedList,避免与类库中反复. MyLinkedList将作为双链表实现,并且保留到该表两端的引用.这样仅仅要操作发 ...
- 构建基于Javascript的移动CMS——生成博客(二).路由
在有了上部分的基础之后.我们就能够生成一个博客的内容--BlogPosts Detail.这样就完毕了我们这个移动CMS的差点儿基本的功能了,有了上节想必对于我们来说要获取一个文章已经不是一件难的事情 ...
- 0x27 A*
终于完全了解A*到底是什么玩意儿了 对于当前的决策,选取当前花费+预估花费最小来拓展. 因为假如预估出现失误,那么很可能就会延伸到一个错误的决策点,而这个决策点偏偏就是ed,而由于预估失误,其他点的当 ...
- 51nod-1462: 树据结构
[传送门:51nod-1462] 简要题意: 给出一棵n个点的树,每个点有两个权值v,t 有Q个操作,有两种操作: 1.将x到根上的路径上的点的v值都加上d 2.将x到根上的路径上的点的t值都加上每个 ...
- 杂项-分布式:Hadoop
ylbtech-杂项-分布式:Hadoop Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和 ...
- HTML5学习笔记(四):关于表格
在一个实例中碰到表格,总结下,先上代码,例: <table border="1"> <thead> <th>表头</th> < ...
- 37.Qt网络与通信
1 获取本机网络与通信 在网络应用中,经常需要获得本机的主机名.IP地址和硬件地址等网络信息.运用QHostInfo,QNetWorkInterface,QNetworkAddressEntry可获得 ...
- luogu 1593 因子和
因子和 题目描述 输入两个正整数a和b,求\(a^b\)的因子和.结果太大,只要输出它对9901的余数. 解法 基本算数定理,每一个数都可以被分解成一系列的素数的乘积,然后你可以分解出因数了. 如何求 ...