1、struts2环境准备 导入jar包 struts-2.3.24-all.zip------>apps--------->
web.xml配置filter <filter> <filter-name>struts2Filter</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> struts.xml <package name="default" namespace="/" extends="struts-default"> <action name="Login" class="com.itheima.action.LoginAction" method="Login"> <result name="success">/success.jsp</result> <result name="failer">/failer.jsp</result> </action> </package> 2、struts2的执行流程 (1)客户端浏览器发送一个请求,HttpServletRequest. (2)程序会调用StrutsPrepareAndExecuteFilter,然后会询问ActionMapper这个请求是否需要调用某个Action. (3)如果ActionMapper决定要调用某个Action,StrutsPrepareAndExecuteFilter会把请求的处理交给ActionProxy. (4)ActionProxy通过配置管理器(Configuration Manager)从配置文件(struts.xml)中读取框架的配置信息,从而找到需要调用的Action类. (5)ActionProxy会创建一个ActionInvocation的实例. (6)ActionInvocation使用命名模式来调用Action,在调用Action之前,会依次调用所有配置的拦截器(Intercepter1,Intercepter2....) (7)一旦Action执行完,返回结果字符串,ActionInvocation就会负责查找结果字符串对应的Result,然后执行这个Result.通常情况下Result会调用一些模板来呈现页面 (8)产生的Result信息返回给ActionInvocation,此过程中拦截器会再次被执行,顺序与之前的相反. (9)产生一个HttpServletResponse的响应行为,通过StrutsPrepareAndExecuteFilter反馈给客户端. 3、struts2封装数据的三种方式 属性驱动 --普通属性 --javabean属性 jsp上的name值必须是 a.username a.password 模型驱动 public class LoginAction implements Action,ModelDriven<User> { private User user = new User(); @Override public User getModel(){ return user; } } 1、实现modelDriven<泛型> 2、创建实例对象 private User user = new User(); 3、getModel方法 大多数时候,变量名 是根据get和set方法猜测到了 属性驱动时 赋值只要是通过set方法进行赋值 赋值是 赋一个实例对象(User user= 对象值 ) 模型驱动时 赋值是给 实例对象赋值 (User user = new User(); user.属性=值 ) 4、struts2加载配置文件的顺序 1.default.properties 位置:strtus2-core.jar包 org.apache.struts2包下 作用:主要是声明了struts2框架的常量 2.struts-default.xml 位置:struts2-corl.jar 作用:声明了interceptor result bean 3.struts-plugin.xml 位置:在struts2的插件包中 作用:主要用于插件的配置声明 4.struts.xml 位置:在我们自己的工程中 作用:用于我们自己工程使用strtus2框架的配置 5.自定义的struts.properties 位置:都是在自己工程的src下 作用:定制常量 6.自定义配置提供 7.web.xml 主要是加载strtus2框架在web.xml文件中的相关配置. 8.bean相关配置 5、struts2进行路径设置的三种方式 1. 直接写 路径 = package的namespace属性+action的name属性 2. *号通配符方式 {1} 1代表的是第一个星号 3. 动态调用方式 设置开启动态调用 访问时候 路径!方法 (不建议使用) 6、result常用的type值 dispatcher 请求转发 页面 chain 请求转发 action之间的 redirect 重定向 页面 redirectAction 重定向 action之间的 7、创建action类的三种方式 [size=10.5000pt]1. Pojo √ Plani Ordinary Java object 简单的Java对象 √ 没有实现任何接口,没有继承任何类 √ 无耦合,所有功能都要自己实现 2.实现action接口 √ 提供了几个常量 3.继承ActionSupport √ actionSupport为我们提供了很多的功能 8、struts2怎么设置常量和全局结果 <constant name="去default.properties中寻找" value=""> 写在package中<global-results> 设置了全局结果后,那么所有的actin都可以不用再设置这个值的result,可以直接使用 9、struts.xml中各个标签的作用 package 包标签用于定义一个包存放不同的action action action标签用于定义action result 结果标签 用于定义结果名称、路径和跳转方式等信息 include 用于引入其他的配置文件 param 参数标签 用于给其他的标签内属性赋值 global-results 全局结果设置 global-exception-mappings 全局异常设置 exception-mapping 异常设置 interceptor 拦截器标签 interceptor-stack 拦截器栈标签 用于定义多个拦截器同时使用 interceptor-ref 引用其他的拦截器 default-interceptor-ref 设置使用哪个拦截器 constant 用于常量设置 10、action标签的class属性和method属性的默认值 result标签的name属性的默认值 action配置: ² name属性:主要与package的namespace联合使用来确定一个action的访问路径 ² class属性:用于只是当前的action类 ² method属性:指示当前的action类中的哪个方法执行 result配置 ² name属性:与action类的method方法的返回值进行匹配,来确定跳转路径 ² type属性:用于制定跳转方式 11、获取Servlet API 加载Servlet api是通过什么加载的 拦截器 ServletConfig ServletActionContext.getRequest(); ServletActionContext.getResponse(); 使用注入的方式 implements ServletRequestAware private HttpServletRequest request; @Override public void setServletRequest(HttpServletRequest request) { this.request = request; } [size=16.5000pt]12、ognl表达式 OGNL 是Object-Graph Navigation Language( 对象图导航语言)的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。Strtsu2框架内置了OGNL OGNL本身也是一个项目,它是可以单独使用。 OGNL作用: 支持对象的操作,调用对象的方法 支持静态成员访问 支持赋值操作与表达串联 访问OGNL上下文,访问ActionContext 操作集合对象。 * OGNL三要素 表达式 上下文(Context) root 对对象进行操作 'hello'.length() 操作静态方法或属性 @java.lang.Math@方法 @java.lang.Math@属性 * # 是获取 context中的内容 不写#默认从root获取 创建list集合 map集合 "{1,2,3,4}" "{'username':'fox','password':30}" struts2 一个特点 重复的东西 都会覆盖 串联就是同时设置多个值 只会返回最后一个 * struts2 里面怎么使用ognl 1、导入标签库 2、s:property 输入指定值 值的获取方式使用的是ognl表达式 13、valueStack 值栈 一个request对应一个Action实例,一个action实例对应一个ActionContext实例,一个Action对应一个valueStack 1、request 请求 就是request 2、ActionContext ActionContext就是为Action服务的,因为每次的Action都是不同, 为了防止一个ActionContext服务多个Action出现问题 所以设置 每个Action都有一个单独的ActionContext Action相关的引用 周边 3、Action 为了解决多线程访问同时访问同一个出现线程死锁问题 所以 设计方案是 ,每次访问都创建一个新的Action Action类本身的操作 4、valueStack 为了防止放的数据重复使用时间不确定性,设计上 每个Action都有一个单独的valueStack 存放数据 valueStack是一个接口 OGNLValueStack是由一下组成的 root context 对象栈 context是 由一下组成的 _root _values _values存放的是键值对的信息 ActionContext 能够引用context *怎么获取ValueStack? 第一种获取方式:ServletActionContext.getRequest().getAttribute(SerlvetActionContext.STRUTS_VALUESTACK_KEY ) 第二种获取方式:ActionContext.getContext().getValueStack() 新建一个Action,方法中获取ValueStack,存储数据,页面访问 请求进来的时候携带的数据 会在遇到ModelDriven拦截器的时候 封装到model中并保存到valueStack中(保存的是一个地址),执行action中的execute方法,修改user变量的地址变成新的user对象的地址 model.的作用是调用getModel方法 14、怎么往valueStack中存数据 自动 action modelDriven中的泛型对象 手动 push set [size=16.5000pt]15、常量配置 default.properties文件中定义了struts2框架的常用常量 如何使用: [size=10.5000pt]1. 可以在src下创建一个struts.properties配置文件 [size=10.5000pt]2. 可以在web.xml中配置 [size=10.5000pt]3. 直接在struts.xml中定义常量(推荐) 16、ognl表达式中特殊字符 # 非root % 强制解析ognl表达式 $ 在配置文件中获取valueStack的值的 17、 interceptor 1、基于AOP思想 面向切面编程 2、扩展功能 3、底层递归的方式实现拦截器链 18、ActionContext是什么ActionContext它是action上下文,strtus2框架它使用actionContext来保存Action在执行过程中所需要的一些对象,例如 session, application… ActionContext的获取 是通过它的静态方法getContext()得到。 Struts2会根据每一次的http请求来创建对应的ActionContext,它是与当前线程绑定的。 每一次请求,就是一个线程,对应着一个request,每一次请求,会创建一个Action,每一个action对应一个ActionContext.每一次请求也对应着一个valueStack. request---ActionContext----Action-----ValueStaci它们都对应着一次请求(一个线程). valueStack与ActionContext本质上是可以获取 [size=16.5000pt]19、struts2的注解开发 要想使用注解开发就需要导入Struts2-conventional-plugin-2.3.24.jar @Namespace来代替<package namespace=””> @ParentPackage来代替<package extends=””> @Action来描述关于<action>配置 value属性<action name=””> 使用@Action的results来描述关于结果类型的配置<result> <result name=”” type=””> @Action(results={@Result(name=””,type=””,location=””)}) @Actions 作用:可以通过多个映射来访问同一个action @Results 类似于全局的结果视图 @InterceptorRef 它是用于处理拦截器的
|