开发者学堂课程【Java Web开发系列课程 - Struts2框架入门:容器技术基础(4)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/537/detail/7311
回顾
目录:
一.获取 ServletAPL.
二.ActionContext
三.值栈和 ognl
一. 获取 ServletAPL.
(1)struts2有2种方式去获取 servletAPI:-种解耦一种耦合;
注:
解耦使得使用struts2来进行测试的时候不需要启动服务器。在一定程度上提高开发效率。
(2)使用解耦的方式来获取 servletapi 通过 ActionContext 对象获取。ActionContext.getContext().getSession().put("user",name);
//处理方法
public String execute()
System.out.println(name+"---"+pwd);
if("siggx".equals(name)&&"1111".equals(pwd))
/
/获取
session
ActionContext.getContext().getSession().put("user",name);
/
/获取
request---HttpServletRequest
对象的
attributes
Map<String,Object> request =
(Ma
p
)ActionContext.getContext()
.
get("request");
/
/
获取
application
Map<String,Object>
application=ActionContext.getContext().getApplication();
//获取
parameters
Map<String,Object> parameters =
ActionContext.getContext().getParameters();
//
相当于
request.getParameter("name");
System.out.println("name==== "+( (String[])parameters.get("name"))0)
return
"success";
else
return"login";
(3)通过 ActionContext 直接获取 HttpServletRequest//处理方法
public String execute()
System.out.println(name+"---"+pwd);
if("siggy".equals (name)&&"1111".equals(pwd))
HttpServletRequest
request=(HttpServletRequest)ActionContext.getContext().get(StrutsStatics.HTTP
_
REQUEST) ;
request.getSession().setAttribute("user",name);
System.out.println("name===="+request.getParameter("name"))
return"success";else
return "login";
(4)通过隅合的方法获取 HttpServletRequest,实现 ServletRequestAware 接口public class LoginAction2 implements s
e
rvletRequestAware
private String name;
private String pwd;
HttpServ1etRequest request;
//处理方法
public String execute()
System.out.println(name+"---"+pwd) ;
if("siggy".equals(name)&&"1111".equals(pwd))
request.getSession().setAttribute("user",name);
System.out.println("name===="+request.getParameter("name"))
return "success";
else
return "login";
public void setServletRequest(HttpServletRequest request)this.request=request;
public String logout()
ActionContext.getContext().getSession().remove("user");
System.out.println("
退出
");
return"success";
public String getName()
return name;
public void setName (String name)
this.name = name;
public String getPwd()
raturn
pwd;
public void setPwd(String pwd)
this.pwd = pwd;
(5)通过获取 ServletActionContext 获取 HttpServletRequest 对象public String execute()
System.out.println(name+"---"+pwd);
if("siggy".equals(name)&&"1111".equals (pwd))
HttpServletRequest request
ServletActionContext.getRequest();
request.getSession().setAttribute("user",name);
System.out.println("name==== "+request.getParameter("name" ))
return"success";
else
return "login";
二.ActionContext
(1)什么是 ActionContext?
ActionContext 是 map 结构的容器。ActionContext 是 Action 的上下文,存放 Action 执行过程中数据信息。ActionContext 存放 Action 的数据
Actionlnyocation request 的数据,session 的数据,application 的数据,locale 的数据 bonversion errors 等。
每次请求时会为当前线程创建一个新的 ActionContext 而 ActionContext 采用了ThreadLocal 的方式来存放 ActionContext 所以 ActionContext 是线程安全。
(2) 获取 ActionContext
ActionContext.getContext0获取。由于 ActionContext 是线程安全的,并且是通过静态方法获取的,所以在本线程中的非 Action 类中也可以直接访问。
注 ActionContext 是基于请求创建的,所以在非请求的线程中是不能使用ActionContext 对象的。如 filter 的 init0方法。
(3)ThreadLocal 模式public static void main(String[] args)
//ThreadLocal 存放线程局部变量的容器
//存放在 threadlocal 中的局部变量是线程安全的
final ThreadLucal<String> ac = new ThreadLocalkString>();
ac.set("siggy");
new Thread(new Runnable()
public void run()
System.out.println("thread:"+ac.get());
start();
System.out.println(ac.get());
(4)ActionContext 中包含的6大对象如下application
,
session
,
request
,
parameters
,
att(page--reques--session---application)
,
ValueStack(iit)
三.值栈和 ognl
(1)值栈 ValueStack 是 AgtionContext 中的一个对象。值栈是栈结构;特征:FILO(先进后出);Struts2中值栈存放的数据是 Action 对象
(2)ognl 表达式简介
表达式 el,re,ognl--用简洁的表达式完成比较复杂的功能。
OGNL 全称是 Object-Graph Navigation Language(对象图形导航语言),相对于 EL 语言,除了保持EL语言的优点外,他的其他优点如下:
能够访问对象的普通方法
能够访问类的静态属性和静态方法
强大的操作集合类对象的能力
支持赋值操作和表达式串联
访问 OGNL 上下文和 ActionContet
(3)使用 ognlpub1ic static void main(String[] args) throws OgnlException
//原则:数据分为2类---常用的和不常用的---常用的一般是小数据,
不常用的一般是大数据
//表达式:常用的数据直接取,不常用的数据加#取Map<String, object> map=new HashMap<String,object>();
map.put("name","张三疯");
map.put("age",125);
User user = new User();
user.setName("lisi");
object obj = Ognl.getValue("#name",map,user);
System.out.print1n(obj) ;
(4)取数据
用户名:<s:property value= "name"/>
[
action
中的属性
] <br>
用户名:<s:property
value= "#scssion.user"/>----<a
hr
e
f= "l
o
g
o
ut.
action
">
退出
</
a
>
</body>
</html>
注:使用 ognl 表达式访问 action 的属性时,可以直接访问。访问 actionContext 中的数据