- Struts复习
- Struts流程
-
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh、Plugin);
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action(2.1.3开始核心控制器是StrutsPrepareAndExecuteFilter);
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;
5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例(它应该对应到具体的Method<不确定>)使用命名模式(里面声明了一个接口,接口里面只有一个方法,使用到命名模式的主方法传入的“命令”就是这个接口参数,主方法直接调用接口里面的这个方法就行)来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts、xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。
-
- Struts文件加载顺序
- 第一个加载的是default.properties文件 ,主要是声明了struts2框架的常量
-
第二个加载的是一批配置文件
- Strtus-default.xml,主要是声明了默认的拦截器等
-
Strtus-plugin.xml 插件的配置声明
- 自己的Strutsxml
- package的namespace属性与.action标签的name属性联合使用来确定一个action 的访问路径
-
当一个请求来时,如果查找不到指定的class及对应的method就会执行ActionSupport类中的execute方法。
-
可以直接在strtus.xml文件中定义常量 (推荐)
- Action访问(通配符)
- Struts流程
-
- Action的创建方式三种 ActionSupport Action接口 POJO
- 接收参数
-
模型驱动
-
1.让Action类要实现一个指定接口ModelDriven
2.实例化模型对象(就是要new出来javaBean)
3.重写getModel方法将实例化的模型返回。
-
-
属性驱动
直接在action类中提供与请求参数匹配属性,提供get/set方法
-
-
- Struts2中获取Servlet API,ServletActionContext获取
-
如果从根中获取数据,不需要添加#号,如果不是从根中获取,需要#
-
在struts2框架中我们使用ognl表达式的作用是从valueStack中获取数据
-
想在jsp页面上使用ognl表达式,就需要结合struts2框架的标签,<s:property value=”表达式”>来使用
-
我们使用valueStack的主要目的是为我将我们action中产生的数据携带到页面上,也就是说valueStack它就是一个容器,接口,。我们主要使用的是它的实现类com.opensymphony.xwork2.ognl.OgnlValueStack,struts2框架将valueStack保存在request中。
当客户端向我们发送一个请求,服务器就会创始一个Action来处理请求,struts2中的action是一个多例,每一次请求都会有一个新的action对应。所以它不存在线程安全问题。
-
request---ActionContext----Action-----ValueStaci它们都对应着一次请求(一个线程).
- 获取Valuestack
-
第一种方式:可以直接通过request对象来获取.
-
第二种方式:使用ActionContext来获取
-
-
ActionContext它是action上下文,strtus2框架它使用actionContext来保存Action在执行过程中所需要的一些对象,例如 session, application…
ActionContext的获取 是通过它的静态方法getContext()得到。
Struts2会根据每一次的http请求来创建对应的ActionContext,它是与当前线程绑定的。
每一次请求,就是一个线程,对应着一个request,每一次请求,会创建一个Action,每一个action对应一个ActionContext.每一次请求也对应着一个valueStack.
request---ActionContext----Action-----ValueStaci它们都对应着一次请求(一个线程).
- 向Valuestack中存储数据 valueStack.set("username","tom"); 获取<s:property value="username"/>
-
问题:为什么el表达式可以从valueStack中获取数据?
org.apache.struts2.dispatcher.StrutsRequestWrapper
Struts2框架对request进行了增强,重写了getAttribute方法,如果在request域中查找不到数据,就会在valueStack中获取。
- 要想在页面上展示集合信息可以使用<s:iterator>标签来完成
- 拦截器
- 所有的Interceptor都要实现一个接口
com.opensymphony.xwork2.interceptor.Interceptor
-
在配置文件中声明Interceptor
我们也可以将多个interceptor封装成一个stack
-
可以在Action的配置中引入自己的interceptor
注意:当我们显示的引入了一个自定义的Interceptor,那么默认的defaultStack就不会在导入,需要手动导入
- 所有的Interceptor都要实现一个接口
- 文件上传
-
表单提交方式method=post
表单中必须有一个<input type=”file”>组件
表单中必须设置enctype=”multipart/form-data”
- 注意这里的servletContext就是application
- 还需要配置文件上传大小
- 多个文件
-
- FastJson
- 对于User对象
- 对于List<User>
-
如果对Date类型进行格式化输出
-
关于属性是否生成在json串中设置
- Jackson
-
设置如期
-
过滤属性
-
- 返回数据
- ServletActionContext.getResponse().getWriter().writer(json);
- 前端-->var jsonObj = eval(data);
- Struts返回json数据
-
将我们自己配置文件中的<package extends=”json-default”>
-
Action的返回视图<result name=”” type=”json”>配置了上面两步,那么struts2框架就会将valueStack中的栈顶元素转换成json响应到浏览器
- 服务器端
- 注解开发
- interceptor控制登录
- 创建一个类来实现Interceptor接口或继承MethodFilterInterceptor
- 在struts.xml文件中声明(注意有一个interceptor以及interceptor-stack都需要声明)
-
在action的配置中引用