一:MVC思想
将一个应用分为三个基本部分 Model View Controler,
让这三个部分以最低耦合的方式进行协同工作,
从而提高应用的可拓展性及可维护性,充分体现了“高内聚,低耦合”
二:基本操作步骤
导入jar包
配置web.xml (核心过滤器 StrutsPrepareAndExecuteFilter)
创建HelloAction 并继承ActionSupport类 重写execute()方法
配置struts.xml
三:struts工作流程
1:通过action的name属性值访问到Action类
2:在Action类中重写execute方法,并返回一个字符串
3:将该字符串在result的name属性匹配,然后进入相应的需求页面
四:几种传值方式:
1:对象传值
2:get/set 方法传值【属性驱动】
3:实现ModelDriven 接口传值
五:action的实现方式:
1:继承ActionSupport类 重写execute方法
2:实现Action接口 重写execute方法
3:普通的Java类 定义一个名为 execute的方法
六:解决表单重复提交问题
第1步:<!-- 动态调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
第2步:type="redirectAction" 重定向
七:将map/List数据以String字符串的形式,json的方式输出
注意struts.xml文件配置
extends="json-default"
type="json"
<param name="map">map</param>
八:拦截器:Interceptor
1:Action拦截(一个一个拦)
1:定义拦截器
2:xml中配置拦截器
缺点:只能拦截某一个Action的部分请求,如果需要大面积拦截,就会代码冗余
2:全局拦截(一下全拦完)
解决代码冗余,最好的办法就是将指定的Action统一一起拦截
与Action拦截的区别就在于xml文件的配置,其它地方都不用改变
1:把自定义的拦截器放到拦截器栈里边
2: 为当前包中的所有Action配置默认拦截器栈
会出现的问题
2.1:返回值问题,因为全局拦截将当前包【package name="myinterceptor"】中
所有的Action都拦截掉,但拦截器的返回值只有固定的一个【fail】
那么此时,在所有被拦截的Action中都需要配置与拦截器返回值相同的result,怎么办呢?
可以将此返回值【fail】配置为全局结果集
2.2:包中的某些个别Action又不希望被拦截 譬如登录,退出,注册等等
解决方案1:--》将这些功能直接放入jsp页面【直接访问相关页面】 不经过Action
需注意:不要轻易暴露实际操作性的jsp页面地址
解决方案2:--》将这些不需要拦截的Action单独放入另一个package中
3:方法拦截【为了方便演示,struts.xml文件已恢复初始状态】
如果一个Action中有很多方法,拦截器默认会将这些方法全部拦截掉,
而我们有时候是不需要把全部拦截的,此时用方法过滤拦截
MethodFilterInterceptor
<param name="includeMethods">add,edit</param>
includeMethods --》指定拦截某些方法【多个方法用逗号隔开】
<param name="excludeMethods">add</param>
excludeMethods --》指定不拦截某些方法
九:表单验证:
分为三种,客户端格式验证,服务端格式验证,数据库中数据有效性验证。
但基于客户端的格式验证很不安全,如果软件安全系数要求比较高,通常需要在服务端进行验证
1:基于手工的表单验证
1.1:验证Action的所有方法
可能会出现的问题:Action中可能会存在多个方法,那么每个方法执行之前都会调用验证方法。。。
1.2:验证Action的指定方法
只需要将重写的validate方法改成 validate+要验证的方法名 即可【注意:方法名首字母大写】
2:基于xml的表单验证
2.1:验证Action的所有方法
基于配置文件的验证方式,可以减少Java代码的编写
如果要验证的Action是“LoginAction2”【必须继承ActionSupport】那么配置文件名要命名为“LoginAction2-validation.xml”
初始的文件头一定要写上
2.2:验证Action的指定方法
只需要将配置文件名改为类似如下格式:
ActionClassName-ActionMethodName-validation.xml
十:文件上传下载
1:文件上传
1.1:上传单个文件
form表单必写属性:enctype="multipart/form-data"
LoginAction必写属性:
文件字段的属性名+FileName
文件字段的属性名+ContentType
此时 完成的功能是:
只是将文件上传到一个临时目录中而已,
如果要实现将文件上传到指定路径,则需要对那个临时路径进行相关操作
接下来,就需要把临时文件复制到指定目录:
File destFile=new File("D:\\"+photoFileName);
FileUtils.copyFile(photo, destFile);
到此为止,简单的上传流程就结束了,但是,上传路径通常不是指定到别的盘符,而是跟着本项目去指定
1.2:上传多个文件
只需要将与文件相关的属性改为数组形式即可
2:文件下载
读取服务器端的指定文件,将此文件以输出流的方式响应给客户端
Action的默认返回类型【struts.xml文件中】是“转发dispatcher”,必须改成“流”的形式向客户端输出
小白第一次写博客,有什么不足的地方欢迎来提醒纠正 >_< ~