struts内容大概分为:
1.Action的实现方式:普通的java类,编写public String execute(); 实现action接口,实现execute()方法; 继承ActionSupport类,实现execute()方法,这种最为常用;action中处理请求的方式默认是execute(),<result>默认值为“success”.
2.valueStack:这个是view层和controller层沟通的桥梁。本身是一个List的结构栈,压栈使用add()方法,list里面每个下标对应的位置放一个map(key,value)结构,view层访问list里面的东西不加"#",访问map里面的东西就要加上这个"#"
3.OGNL :这个的资料不是很多,不过别人说里面有<s:property>等等这种标签的,能很方便的把值放进actionform里面,不知道是不是真的。OGNL访问的是valueStack里面的内容,Action类里面提供getter()和setter()方法
4.数据校验:前端校验是为了减少服务器的压力,提高用户体验,但是一样有黑客能绕过,就需要后端来把把关。
入门级别的验证方式:在execute()(备注:别的方法里也可以)里面进行代码验证,采用if(.....)结构进行正确性判断,this .addFieldError(key,value)用键值对的方式把错误信息补在value的位置上,方法的最后写上业务逻辑的代码。view层通过<s:filederror filedName="..."/>进行取错误信息。这种方式不好点在验证代码和业务逻辑代码写在了一起。
中间级别的验证方式:重写ActionSupport类的validate(),在方法体里进行验证,实现方法和入门级里面一样。这种优点是比较方便读,缺点是validate()方法是在业务方法之前被调用,这个方法验证不过,所有的业务逻辑方法都卡在这里不能执行。另外,我不可能每个方法都需要在这里验证一下。
优秀级别的验证方式:使用validateXXX()方法,XXX就是方法名,这是对单个方法进行验证,业务逻辑的方法另外单独写。比较优秀。
大神级别的验证方式:使用验证框架,编写XML文件UserAction-validation.xml。目前我没有试过用验证框架去验证过方法。验证view层的页面很简单,首先验证的地点,验证的条件,验证的内容,如果验证不通过显示的字符,别人说还有一个要放在的位置,我觉得是胡扯。分为field和validator验证,具体代码参考一下他的。http://blog.csdn.net/forwayfarer/article/details/2955173 这个验证框架是对类中的所有业务方法生效,如果只想对其中一个方法生效,使用UerAction-add-validation.xml的方式,也就是action名杠方法名杠validation.xml
5.拦截器:actionProxy吐出来的一个实例actionInvocation把action层层包裹起来,请求的数据总是最后到达action。拦截器在struts2的配置文件里面配置“defaultStack”,作用到actionInvocation里面,是可插拔的AOP。struts2的拦截器链组成一个栈的结构,后进先出。actionInvocation控制着他们生生不息的劳动。如果栈中还有拦截器则调拦截器,如果拦截器用完了,就调action,其他参考这个人的博客 http://blog.csdn.net/kiss_vicente/article/details/7597700
自己定义拦截器:实现接口interceptor,实现里面3个方法init(),destory(),intercept(ActionInvocation ai).到这里我才明白为什么ActionInvocation能够控制拦截器,因为它作为一个形参传进来了。或者实现抽象类abstractInterceptor,它已经实现过interceptor接口了,只实现intercept()方法就可以了。继承MethodFilterInterceptor类,但是这种方法我没有用过,也没有看别人用过。自定义的 拦截器在struts2配置文件里的位置要注意,写在<action></action>的最后,并且先把人家框架默认的拦截器写在前面,我的写在后面,不然业务层接不到数据,人家写了几年的struts2框架等于白写了。默认拦截器的写法为<interceptor-ref name="defaultStack">,参考一下他的文章 http://blog.csdn.net/jiudihanbing/article/details/7666970
6.文件上传:文件拦截主要是params的功劳,把view层的文件直接转到action中去,我再也业务代码决定把文件放到本地盘或者数据库里面。action里面一定要添加3个属性文件本身,文件类型,文件名。也就是 File upload,String uploadContentType,String uploadFileName,我也不明白为什么看到的代码都有这3个属性,view层的<form enctype="multipart/form-data">,多了一个标签其他一模一样。 这部分可以参考他的博客 http://www.2cto.com/kf/201202/118589.html
限制上传文件的大小:全局设置文件大小,添加<constant name="struts.multipart.maxSize" value="500000">,限制所有的地方最多能上传2M,有的文件都不止2M,就修改这个值。局部设置<interceptor-ref name="fileUpload"></interceptor-ref>写在这个中间,控制大小<param name="maximumSize">30000</param>,控制格式:<param name="allowedTypes">image/jpg,image/pjpeg</param>,我到今天才知道文件上传是依赖拦截器来实现的,没有拦截器文件就上传不了。其他可以参考下这个人的博客:
http://blog.sina.com.cn/s/blog_6a0cd5e501018d1o.html
多文件上传:view端多添加几个标签,action接受那里全部变成list接收,具体可以参考他的文章:http://www.2cto.com/kf/201202/118588.html