黑马程序员郑州中心编著黑马程序员:三大框架Struts2-day02笔记第1章Struts2中获取ServletAPI简单说,可以在action类中获取requestresponsesession...对象有两种方案:1.1ServletActionContext获取1.2采用注入方式Struts2框架在运行时,请求会被StrutsPrepareAndExecuteFilter拦截,会根据请求,去strtus.xml文件中查找到匹配的action,在action执行前,会走一些interceptor默认执行的拦截器是struts-default.xml文件中定义的。黑马程序员郑州中心编著在默认执行的拦截器中有一个查看一下ServletConfigInterceptor源代码以下是部分源代码ServletRequestAware,实现这个接口可以获取HttpServletRequestServletResponseAware,实现这个接口可以获取HttpServletResponseServletContextAware实现这个接口可以获取ServletContext第2章OGNL表达式OGNL是Object-GraphNavigationLanguage(对象图导航语言)的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。Strtsu2框架内置了OGNLOGNL本身也是一个项目,它是可以单独使用。黑马程序员郑州中心编著OGNL作用:支持对象的操作,调用对象的方法支持静态成员访问支持赋值操作与表达串联访问OGNL上下文,访问ActionContext操作集合对象。搭建环境:单独使用OGNL来完成示例。OGNL三要素:表达式OgnlContext上下文Root根黑马程序员郑州中心编著2.1支持对象操作2.2支持静态成员访问黑马程序员郑州中心编著2.3访问Ognl上下文如果从根中获取数据,不需要添加#号,如果不是从根中获取,需要#2.4操作集合支持赋值操作与表达式串联黑马程序员郑州中心编著2.5Strtus2框架中如何使用ognl表达式在struts2框架中我们使用ognl表达式的作用是从valueStack中获取数据。我们在struts2框架中可以使用ognl+valueStack达到在页面(jsp)上来获取相关的数据。要想在jsp页面上使用ognl表达式,就需要结合struts2框架的标签s:propertyvalue=”表达式”来使用第3章valueStack值栈3.1valueStack介绍我们使用valueStack的主要目的是为我将我们action中产生的数据携带到页面上,也就是说valueStack它就是一个容器。在Struts2框架中将valueStack设计成一个接口。黑马程序员郑州中心编著com.opensymphony.xwork2.util.ValueStack我们主要使用的是它的实现类com.opensymphony.xwork2.ognl.OgnlValueStack。当客户端向我们发送一个请求,服务器就会创始一个Action来处理请求,struts2中的action是一个多例,每一次请求都会有一个新的action对应。所以它不存在线程安全问题。一个valueStack对应一个action,valueStack贯穿整个action的生命周期。rquest-------Action------ValueStackstruts2框架将valueStack保存在request中。3.2valueStack内部结构valueStack主要有两部分组成:黑马程序员郑州中心编著CompoundRoot:它就是一个ArrayList它主要存储的是action的相关数据MapString,Objectcontext:就是一个MapContext中主要存储了一些引用,这个引用主要是关于web开发中相关信息pameters:请求参数request:请求对象中所有属性session:会话对象中所有属性application:application对象中的所有发展以上都是Map在struts2框架中我们通过ognl表达式来获取valueStack中数据,没有使用#就会从CompoundRoot中获取数据,如果使用#来获取,这时就会从context中来获取.3.3获取ValueStack第一种方式:可以直接通过request对象来获取.第二种方式:使用ActionContext来获取黑马程序员郑州中心编著3.4ActionContext是什么ActionContext它是action上下文,strtus2框架它使用actionContext来保存Action在执行过程中所需要的一些对象,例如session,application…ActionContext的获取是通过它的静态方法getContext()得到。Struts2会根据每一次的http请求来创建对应的ActionContext,它是与当前线程绑定的。每一次请求,就是一个线程,对应着一个request,每一次请求,会创建一个Action,每一个action对应一个ActionContext.每一次请求也对应着一个valueStack.request---ActionContext----Action-----ValueStaci它们都对应着一次请求(一个线程).valueStack与ActionContext本质上是可以获取3.5valueStack操作---存储数据注意:我们使用valueStack来存储数据时,主要是向root中存储。介绍两部分:3.5.1手动向valueStack存储数据黑马程序员郑州中心编著3.5.2Struts2框架自动向valueStack中存储数据每次请求,访问action,这个对象会存储到valueStack中。在DefaultActionInvocation的init方法内在ModelDrivernInterceptor中以上代码会将模型对象存储到valueStack中。3.6valueStack操作-获取数据在页面中获取Action中属性黑马程序员郑州中心编著使用模型驱动访问时的路径=tom&password=123在action类中的业务处理时,又对user对象重新赋值在页面上获取数据黑马程序员郑州中心编著3.7EL表达式从valueStack中获取数据El表达式可以从valueStack中获取信息问题:为什么el表达式可以从valueStack中获取数据?org.apache.struts2.dispatcher.StrutsRequestWrapper黑马程序员郑州中心编著Struts2框架对request进行了增强,重写了getAttribute方法,如果在request域中查找不到数据,就会在valueStack中获取。3.8Ognl表达式中特殊字符OGNL是通常要结合Struts2的标志一起使用。主要是#、%和$这三个符号的使用#号:它是从非root中获取数据%用于强制是否要解析ognl表达式$它主要是从配置文件中来获取valueStack中数据3.9valueStack练习3.9.1关于登录失败处理如果用户登录时,用户名或密码错误,将错误信息存储到valueStack中黑马程序员郑州中心编著在login.jsp页面上获取错误信息展示注意:在实际开发中,我们一般会让action去继承ActionSupport类。让action类继承ActionSupport类可以使用父类提供的对于错误操作的处理在页面上可以直接使用struts2提供的标签来显示错误信息总结:在struts2中处理简单的信息(字符串)在页面上可以使用对应的标签来获取错误信息黑马程序员郑州中心编著3.9.2展示商品信息在success.jsp页面上创建action在product.jsp页面上展示数据要想在页面上展示集合信息可以使用s:iterator标签来完成如果使用var,它存储在context中,所以在使用时要添加#号黑马程序员郑州中心编著也可以使用以下方案我们将ListProductps声明成action的属性,并提供了get/set方法也可以在页面上获取到ps数据第4章Interceptor拦截器4.1Interceptor介绍Struts2中的interceptor它是基于springaop思想,而aop思想它本质上是通过动态代理来实现。我们strtus2的拦截器它主要是拦截Action的操作,在action的执行前或执行后进行一些其它的功能操作。拦截器链(拦截器栈)简单说,就是可以将多个拦截器形成一个链,在访问它们时依次访问。以下是struts2的执行流程图黑马程序员郑州中心编著执行的过程:当我们发送请求访问Action时,会被StrutsPrepareAndExecuteFilter拦截在其doFilter方法内执行了execute.executeAction(request,response,mapping);这个代码执行后dispatcher.serviceAction(request,response,mapping);serviceAction方法执行在这个方法执行过程中会创建Action代理对象ActionProxyproxy=黑马程序员郑州中心编著getContainer().getInstance(ActionProxyFactory.class).createActionProxy(namespace,name,method,extraContext,true,false);通过proxy去执行了proxy.execute();在execute方法内returninvocation.invoke();invocation它是ActionInvocation一个对象在invoke方法内会去加载我们的配置文件,将配置文件中所有的interceptor得到进行遍历。在struts-default.xml文件中定义了默认加载的拦截器栈defaultStack在每一个拦截器的interceptor方法内,又调用了DefaultActionInvocation的invoke方黑马程序员郑州中心编著法,其实就是递归调用。4.2Interceptor作用与自定义Interceptor我们使用intercep[tor可以在action执行前后进行处理工作。例如,完成权限控制。问题:如何定义Interceptor?所有的Interceptor都要实现一个接口com.opensymphony.xwork2.interceptor.Interceptor在配置文件中声明Interceptor我们也可以将多个interceptor封装成一个stack可以在Action的配置中引入自己的interceptor在使用时name也可以引入一个interceptorstack.注意:当我们显示的引入了一个自定义的Interceptor,那么默认的defaultStack就不会在导入,需要手动导入。4.3Interceptor练习如果用户没有登录,不可以查看所有的商品信息。黑马程序员郑州中心编著创建一个Interceptor在struts.xml文件中声明,并在指定的action中引用完成功能修改登录action中操作将用户存储到session中。在interceptor中完成权限控制黑马程序员郑州中心编著问题1:如何在login指定的视图页面上展示错误信息,例如权限不足。问题2:我们在struts.xml文件中配置action时,可以使用*通配置符,这时它可以处理多个方法,你指定的interceptor