开发者学堂课程【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))//获取 sessionActionContext.getContext().getSession().put("user",name);//获取 request---HttpServletRequest 对象的 attributes
Map<String,Object> request =(Map)ActionContext.getContext().get("request");
//获取applicationMap<String,Object>application=ActionContext.getContext().getApplication();//获取 parametersMap<String,Object> parameters =ActionContext.getContext().getParameters();
//相当于 request.getParameter("name");System.out.println("name==== "+( (String[])parameters.get("name"))0)return "success";
elsereturn"login";
(3)通过 ActionContext 直接获取 HttpServletRequest//处理方法public String execute()System.out.println(name+"---"+pwd);if("siggy".equals (name)&&"1111".equals(pwd))HttpServletRequestrequest=(HttpServletRequest)ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST) ;request.getSession().setAttribute("user",name);System.out.println("name===="+request.getParameter("name"))return"success";elsereturn "login";
(4)通过隅合的方法获取 HttpServletRequest,实现 ServletRequestAware 接口public class LoginAction2 implements servletRequestAware
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";
elsereturn "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";elsereturn "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:propertyvalue= "#scssion.user"/>----<ahref= "logout.action ">退出</a></body></html>
注:使用 ognl 表达式访问 action 的属性时,可以直接访问。访问 actionContext 中的数据