1、课程名称:Struts2高级功能
2、知识点
2.1、上次课程的主要知识点
1、Struts2的参数接收
Struts1中通过ActionForm定义属性,并生成getter/setter方法来接收参数。
Struts2则是直接在Action中定义属性,并生成getter/setter方法来接收参数。
对于String类型来说,不管是用1还是2,都正常接收。
对于基本数据类型,Struts1可以自动转换,Struts2也可以自动转换。但Struts1如果输入错误,不自动验证,而是按照该参数的默认值处理(int类型就是0,double类型就是0.0),Struts2则是自动返回错误页,并将错误信息加入到fieldErrors 中,可以通过
对于日期类型(java.util.Date),Struts1不能自动转换,必须通过String,再手工使用SimpleDateFormat转型。
Struts2则可以自动根据输入的格式来进行转换,转换出错时,自动返回错误页,并提示错误信息(错误信息也可以按照基本数据类型的方式进行修改。),日期的格式是依据当前使用的区域和语言决定的(中文就是yyyy-MM-dd,英文就是MM/dd/yyyy),如果不想使用这种自动转换功能,可以参考Struts1,还使用String接收,手工通过SimpleDateFormat转型。
Struts1和Struts2都可以直接将参数设置到vo对象中,只需要将页面上的参数名改为:对象名.属性名即可。
Struts1在ActionForm中使用对象接收参数时,vo对象必须new对象来实例化,否则提示异常。
Struts2在Action中使用对象接收参数,vo对象可以不实例化,Struts2会自动完成对象的创建。
2、所有框架的配置文件
2.2、本次预计讲解的知识点
3、具体内容
3.1、OGNL和另一种分发。
分发Action除了使用!以外,还可以通过自行定义的方式来完成分发。
同时修改struts.xml,将Action配置也修改。
为每个方法和提交路径配置一个Action,这里的method表示执行的是newsaction中的对应方法。但这样配置比较麻烦,Struts2提供了通过通配符解决的方法。
*表示任意字符,{1}表示将第一个*的值取得,设置到这里。
这里就是method的值与news_*中的*的值一致。
OGNL是Struts2专用的表达式语言,只能在Struts2标签中使用。支持的语法与EL比较相似,但有区别。
EL是使用${属性名}取得属性,OGNL中是通过#属性范围.属性名的形式取得属性。
OGNL中不写属性范围,表示从Action的getter/setter方法中取得属性。
Struts2Action中的所有属性,会自动保存在一个Stack中,OGNL不写范围实际上就是从这个Stack中取值。
通过页面标签s:debug可以查看到。
EL不支持方法调用,但OGNL可以。
常用的Struts2标签:
判断:s:if,s:elseif,s:else,通过OGNL返回boolean类型数据来进行判断。
循环:s:iterator,通过value来设置要循环的对象,可以使用id定义临时保存的属性名,如果不写id,则可以直接将vo中的属性通过EL输出。
UI标签:s:form,s:textfield,s:textarea,s:submit,s:reset,s:select(直接将一个集合中的数据设置到select中,可以通过list属性设置,再通过listKey和listValue设置value和显示的文字),s:radio(使用方法与s:list相同。),s:checkboxlist(同s:radio),如果要设置默认选中或默认值,可以使用回填的形式。
UI标签使用前一定注意将theme设置为simple。
如果不使用UI标签也可以正常开发。
对于select和radio等选择框,如果不想通过集合来设置选项,也可以直接使用OGNL提供的类似JSON的语法来设置选项
其中:前是value值,:后是显示的文字。
Struts2也支持国际化,可以通过s:i18n和s:text标签来完成国际化功能。
也是编写多个属性文件,按照文件名_语言_国家.properies的形式来命名。
页面编写标签
错误信息也支持国际化,但要提前将全局属性文件拆分为多个。
同时写入错误信息时也不能直接使用中文,必须改为使用super.getText()方法来读取属性文件。
国际化还可以通过超连接选择语言来完成。
在Action中进行处理。
3.2、Struts2文件上传
Struts1文件上传时,在ActonForm中使用FormFile类型接收,并自定义输入和输出流,边读边写。Struts2与Struts1类似,只是接收的参数类型不再使用FormFile,直接用java.io.File接收。
注意,表单要封装。
在Action中定义同名的File属性接收。
测试后发现文件的确正确上传,但扩展名错误,改为了tmp临时文件。
Struts2上传时,并不是直接将文件保存,而是先保存到临时文件夹中,再从临时文件夹保存到要保存的upload目录下。在保存到临时文件夹时,文件的扩展名被自动替换为了.tmp。
为了处理这个问题,需要将文件的原有名称取得,这个原有名称在Struts2中通过一个属性自动保留,除了名称外还保留了类型。
可以定义两个属性来分别接收这两个值,属性名必须符合以下规则:
文件参数名+FileName
文件参数名+ContentType
Struts2还自带了文件大小和类型的验证功能。
但要使用就必须修改拦截器配置。
文件上传功能使用的是Struts2提供的FileUploadInterceptor。
需要将其配置修改,以便完成上传限制。
修改struts.xml,不再使用默认的拦截栈,改为自定义拦截栈
但错误信息还需要手工修改属性文件。
类型同样也可以通过配置来限制。
修改错误信息
以上可以完成大小限制和类型验证。
但Struts2默认只允许上传2M以内的文件,如果要修改这个限制,需要在struts.properties中加入文件上传大小限制。
4、总结
两种分发的使用,Struts2实现国际化,Struts2文件上传。
5、预习任务
Struts2的其他功能
iBATIS框架
6、作业