1.什么是Struts2?
2.使用Struts2需要的一些配置环境
@拷jar包,在Struts资源包的apps包下,bank项目
@拷配置文件,在apps包下,bank项目下的src
@拷过滤器配置,在apps包下,bank项目下web.xml
要点:作用相当于spring-mvc中的前端控制器,其中StrutsPrepareAndExecuteFilter为核心类
![](https://img.haomeiwen.com/i6378317/73d4ef50e3744e6c.png)
@编写action,并配置到主sturts2配置中
要点:该类的作用相当于spring-mvc中的控制器,用于执行一些逻辑操作;
编写action的三种方法:
1.自定义action类,创建execute方法,在程序进入到action类中时,有相应的方法时执行相应的方法,没有时则执行execute()方法,方法返回值为String;
2.实现action接口,重写execute方法,方法的返回值为SUCCESS,NONE...;返回值为none时,在主配置文件中可以不用配置相应的result标签,其他的值则需要配置相应的标签,没有配置则报错!
3.继承actionSupport类
@主配置文件
![](https://img.haomeiwen.com/i6378317/49aac990a6bf8611.png)
配置文件详解:
package标签:@ package用来区分多个相同action的name属性名,name为包名, @ 同一个配置文件中多个包名不可一致 @namespace属性和action标签中的name属性共同构成url地址,以本图为例url地址则为/hello @extends属性为默认值struts-default
action标签:@name属性,在浏览器中通过输入相应的值来匹配相应的action @class属性值为action类的全类名
result标签:@name属性值为逻辑视图,必须和action类中返回的值一致 @type属性可设置是否进行重定向或者转发,redirect和dispatcher可以用来实现jsp页面之间的跳转;action之间的跳转使用redirectAction和chain
@ 中间的值为该action要控制跳转到的jsp页面
![](https://img.haomeiwen.com/i6378317/3739ea863aece24d.png)
include标签:@用来引入其它配置文件(属性file),适合团队分模块开发
constant标签:
1.第一个为配置编码格式
2.第二个为设置配置文件更改不需要重新加载
3.更改action默认后缀,默认action或者不写
![](https://img.haomeiwen.com/i6378317/049e284d3f282039.png)
3.action的访问方法
@.传统访问,通过method属性指明
直接在action标签中指明要访问的action类中的方法,缺点是每一个逻辑都需要一个 action标签来实现
![](https://img.haomeiwen.com/i6378317/0dde7916be8c2dd2.png)
@.name属性的值使用通配符*,method属性中大括号+数字代表第几个星号为方法名(减少action类);最好不要直接使用*,在前面加一点标识,防止所有的请求会进入到同一个action中
使用通配符 * 来展现每个action的特有性质,同时可以使代码看起来更加简洁
![](https://img.haomeiwen.com/i6378317/cd1d7072b88c7bcf.png)
@.动态方法调用 映射路径+!+方法名.后缀,前提是要放开动态方法
4.动态结果页面配置
@在action类中定义一个字符串,不同的方法之中赋予不同的值(需要跳转的页面),在result标签中使用${}符号来取
5.servlet API的操作,也叫请求参数的获取
@耦合方式 使用ServletActionContext类来获取HttpServletRequest对象
@解耦和方式 ActionContext.getContext().getParamters()来将包装进map集合中的请求参数获取出来
![](https://img.haomeiwen.com/i6378317/a00a5b2f3035129c.png)
@IOC注入:外部导入HttpServletRequest对象,实现ServletRequestAware接口
6.数据校验
@ action类首先继承actionSupport
@ 校验全部方法 重写validate 方法; 如只需校验指定方法 自定义方法validate+校验的方法名(注意:方法名首字母大写),如上图
@ 校验错误信息:Action类继承actionSupport方法,调用addFiledError方法来传递信息给页面,需要配置配置文件中result标签中的name值为input
7.配置全局视图:
所有的action跳转到同一个页面,使用global-results标签,注意:@一定要放在action配置之前@全局结果只能在同包下才起作用
8.异常处理:
@全局异常处理 :使用global-exception-mappings捕获全局异常;注意:要在全局结果配置之后,当全局异常捕获到某个action中的异常时,首先会在该action下查找对应的页面,找不到则到全局中找
@局部异常处理:通过exception-mapping标签来实现,在action标签下来捕获异常;result属性:表示要跳转的逻辑视图名 exception属性:表示java异常的全路径名
9.参数封装
@属性封装:在action类中定义 与表单中name值一样的属性,并且提供set方法,会自动帮我们把表单中的数据封装到对应的属性中
@对象封装(表达式封装):在action中定义一个对象属性,提供get和set方法,表单中的name属性值为对象点属性
@模型驱动封装:实现接口ModelDriven<需要封装的对象>,重写其中的抽象方法返回要驱动的模型对象,对象要实例化再返回,表单中的name和该对象的属性值一致
@集合,数组的封装和spring-mvc类似
10.如何传递数据到前台界面
@放入request域对象中
@放入值栈中,在页面通过OGNL表达式来取
a.值栈的位置:位于每个acion,在每个action中的值栈唯一,不同的action不一样
b.值栈结构:CompountRoot(对象):root值栈(常用root栈,map栈取值麻烦),底层由list集合实现;OgnlContext : map栈,底层map结构
@map栈中可以取出request,session,application对象的引用,从而调用这些类中的方法和属性
c.如何向root值栈中存值
@ 使用set方法 :会向root栈中压入一个map集合对象,然后把值存入map集合中
@ 使用push方法:直接将对象的引用压入root中
@使用get方法装:不会存入新对象引用,直接存放在当前action引用的下面
![](https://img.haomeiwen.com/i6378317/eabb2fc114695a67.png)
@从root值栈中取出get方法存入的值
问题:为什么el表达式可以取出root值栈中的数据?
因为值栈是对域对象的增强,会从值栈中取出数据放到域对象中
* 通过<s:debug/>标签来显示值栈内容
* 通过<s:property/>标签来实现取值
1. 取出root中集合中的内容的方法
@ 通过<s:iterator/>迭代标签遍历:三种方法
![](https://img.haomeiwen.com/i6378317/462eb69c45e0451a.png)
![](https://img.haomeiwen.com/i6378317/ccc073232f2b09bc.png)
2. 取出字符串
3. 取出对象
@取出set方法压入的值
@取出push方法压入的值
@jstl表达式获取
11.文件的上传
a. 导jar包(commons-io,commons-fileupload);编写前端页面,上传数据的表单
![](https://img.haomeiwen.com/i6378317/9e64525e7dacae5b.png)
b.编写action 定义三个变量(固定格式) File src,上传文件的临时目录;String srcFileName ;文件名 String srcContentType
![](https://img.haomeiwen.com/i6378317/f708f665ea71efd1.png)
c.图片的上传路径配置
1.在web.xml中配置初始参数来配置一个真实的上传路径
![](https://img.haomeiwen.com/i6378317/395531e447c76655.png)
2.在action类中取出配置的初始参数值作为上传路径进行配置
12.OGNL表达式 对象导航语言
@ ***获取域对象的值:首先根据域对象的引用取出map值栈中相应的被包装过的域对象的map集合(不能强转成相应的域对象),然后再存入相应的域对象中;通过#号+域对象在map栈中的对象引用 . 域对象中的key
@ 构建map集合
@ %用来标识ognl表达式
@ $ 主要用于国际化验证和配置文件中取数据(例如:动态结构页面的配置)
@投影过滤:获取集合中所有对象的age属性的值
![](https://img.haomeiwen.com/i6378317/f6d3335a72e31ec5.png)
13.拦截器(和spring-mvc拦截器的区别):
概念:
1.理论上可以拦截一切资源
2.拦截器只能拦截方法
定义拦截器:调用invoke方法来给所有的方法放行
a1.自定义类,实现接口Interceptor 接口
a2.继承AbstractInterceptor
a3.继承MethodFilterInterceptor: 可以拦截到具体的方法,最常用
b.声明和使用拦截器
b1.声明拦截器,在package标签下配置
![](https://img.haomeiwen.com/i6378317/500c0d2556f38905.png)
b2.使用拦截器,在action标签下配置(局部拦截器)
c.如何放行不拦截的方法
![](https://img.haomeiwen.com/i6378317/92f49bd013106c86.png)
d.配置全局拦截器(注意一定要显示调用默认的拦截器栈,否则默认功能全部丢失)
![](https://img.haomeiwen.com/i6378317/890a7ce189d52d42.png)
d1.指明默认使用的action标签,action标签中的类名不写时,默认是ActionSupport类,返回的逻辑视图为success
![](https://img.haomeiwen.com/i6378317/b0fab4a29179bbd5.png)
14.struts常用标签的使用
@表单标签
![](https://img.haomeiwen.com/i6378317/deea85fbc08cb495.png)
@通用标签 (if,else if,else; iterator; debug; property)
15.servlet和action的区别:servlet是单实例,action是多实例
16.日期转换器
a 自定义类继承数据转换类 strutsTypeConvert
b 重写抽象方法
c. 编写配置文件:名字固定—— xwork-conversion.properties ; 固定位置——放在src下面
17.产生json数据
a.导入jar包,json数据插件包
![](https://img.haomeiwen.com/i6378317/24e09210748bdff3.png)
网友评论