国庆放假回来,接着开始我们的J2EE学习。从今天开始,我们将持续两天的Struts2学 习,前面我们学习了Struts1,那么既然有了Struts1,为何还要推出Struts2。主要因为Struts2有以下优点:①Struts2 API和Servlet API不存在紧密的耦合 ②Struts2提供了拦截器 ③Struts2提供了类型转换器 ④Struts2支持多种表现层技术 ⑤Struts2可以对指定方法进行输入校验
1. 搭建Struts2开发环境步骤:
1) 找到开发Struts2应用需要使用到的jar文件
2) 编写Struts2的配置文件
3) 在web.xml中加入Struts2 MVC框架启动配置
2. 在Struts.xml中配置包
在struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action 放在同一个包下。配置包时必须指定name属性,如果其他包要继承该包,必须通过该属性进行引用。包的namespace属性用于定义该包的命名空间。该 属性可以不配置,对本例而言,如果不指定该属性,默认的命名空间为“”(空字符串)。通常每个包都应该继承struts-default包, struts-default包是由struts内置的,它定义了struts2内部的众多拦截器和Result类型。而Struts2很多核心的功能都 是通过这些内置的拦截器实现
3. 访问路径:访问struts2中的action的URL路径由两部份组成:包的命名空间+action的名称
4. Action配置中的各项默认值:
1) 如果没有为action指定class,默认是ActionSupport
2) 如果没有为action指定method,默认执行action中的execute() 方法
3) 如果没有指定result的name属性,默认值为success
5. 指定需要Struts 2处理的请求后缀:<constant name="struts.action.extension" value="do,go"/>
6. Struts2提供了多种Result类型:dispatcher(默认值)、 redirect 、 redirectAction 、 plaintext
1) 如果重定向的action在别的命名空间下,需要指定Result的参数actionName和namespace
2) 在result中还可以使用${属性名}表达式,表达式里的属性名对应action中的属性,如:<result type="redirect">view.jsp?id=${id}</result>
7. 为应用指定多个配置文件:使用include标签
8. 定义Action可以使用!+方法名调用指定方法,如果不想使用动态方法调用,我们可以通过常量struts.enable.DynamicMethodInvocation关闭动态方法调用;也可以使用通配符定义action(指定action的name属性值为XXX_*,method属性值为{1})
9. 全局结果:当多个action中都使用到了相同result,这时我们应该把result定义为全局结果。通过<global-results>标签设置全局结果。
10. Struts2可以通过基本类型或复合类型接收请求参数
11. 自定义类型转换器:需要继承DefaultTypeConverter类。注册时在Action类所在的包下放置ActionClassName-conversion.properties文件,ActionClassName是Action的类名,后面的-conversion.properties是固定写法。在properties文件中的内容为:属性名称=类型转换器的全类名
12. 全局类型转换器:在WEB-INF/classes下放置xwork-conversion.properties文件 。在properties文件中的内容为:待转换的类型=类型转换器的全类名
13. 访问或添加request/session/application属性:有两种方法,方法一是使用ActionContext来得到相应作用域并添加和 访问属性;方法二是使用ServletActionContext来得到原始的Servlet作用域并实现对属性的添加和访问
14. 文件上传:
1) 在WEB-INF/lib下加入commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar
2) 把form表的enctype设置为:"multipart/form-data"
3) 在Action类中添加以下属性:
public String upload() throws Exception{
String realpath = ServletActionContext.getServletContext().getRealPath("/images");
File file = new File(realpath);
if(!file.exists()) file.mkdirs();
FileUtils.copyFile(uploadImage, new File(file, uploadImageFileName));
return "success";
}
}