加载struts.xml过程
说明:
结果类型
说明
类型列表
- 每个action方法都返回一个String类型的值,struts一次请求返回什么值是由这个值确定的。
- 在配置文件中,每一个action元素的配置都必须有result元素,每一个result对应一个action的返回值。
- Result有两个属性:
- name:结果的名字,和action中的返回值一样,默认值为success;
- type:响应结果类型,默认值为dispatcher.
在struts-default.xml文件中,如下面所示:
说明:
Dispartcher类型
- 从上述可以看出总共10种类型
- 默认类型为ServletDispatcherResult即转发。
- 结果类型可以是这10种结果类型的任意一种。
Dispatcher类型是最常用的结果类型,也是struts框架默认的结果类型。
Redirect类型
Redirect属于重定向。如果用redirect类型,则在reuqest作用域的值不能传递到前台。
RedirectAction类型
struts2中的action,只要访问一次就要实例化一个对象。这样就不存在线程安全的问题。这也是struts2框架的一个好处。
通过前面的练习大家都知道,在action的方法中与servlet的所有的API是没有任何关系的。所以在struts2中做到了aciton与serlvet的松耦合,这点是非常强大的。但是如果没有HttpServletRequest,HttpServletSession,ServletContext有些功能是没有办法完成的。比如购物车程序,需要把购买的物品放入session中。所以就得找一些路径使得在struts2中和serlvet的API相结合。
拦截器
在struts2中,用拦截器(interceptor)完美的实现了这一需求。在struts2中,
内置了很多拦截器,在struts-default.xml文件中可以看出。用户还可以自定义自己的拦截器。自定义拦截器需要以下几点:
1、 在配置文件中:
包括两个部分:声明拦截器栈和使用拦截器栈
2、 在拦截器类中
一个类如果是拦截器,必须实现Interceptor接口。
国际化
一个系统的国际化就是根据操作系统的语言,页面上的表现形式发生相应的变化。比如如果操作系统是英文,页面的文字应该用英语,如果操作系统是中文,页面的语言应该是中文。
- 建立资源文件
- 资源文件的命名规则:
默认的命名为:
文件名前缀.properties
根据语言的命名为:
文件名前缀.语言种类.properties
例如:
中文:
resource_zh_CN.properties
内容:
item.username=用户名
item.password=密码
英文:
resource_en_US.properties
内容:
item.username=username_en
item.password=password_en
默认:
resource.properties
内容:
item.username=username
item.password=password
- 配置文件
- 需要在配置文件中加入:
- 说明:
1、这样struts2就会去找你写的资源文件
2、name的值可以在org/apache/struts2/default.properties中找到。
3、如果放置的资源文件在src下,则value的值可以直接写,如果在包中则可以写成包名.resource。
4、在这里resource是个基名,也就是说可以加载以resource开头的文件。
- 页面
利用<s:text name=”item.username”/>就可以把资源文件中的内容输出来。
- 说明:
1、标红色部分的是要从资源文件中找的内容。item.username和item.password代码key的值。
2、也可以利用%{getText(‘item.username‘)}方式来获取资源。采取的是OGNL表达式的方式。
3、getText的来源:
从源代码可以看出ActionSupport实现了TextProvider接口。
Provides access to {@link ResourceBundle}s and their underlying text messages.意思是说提供了访问资源文件的入口。而TextProvider中提供了getText方法,根据key可以得到value。- action
可以利用ActionSupport中的getText()方法获取资源文件的value值。
在servlet中获取页面传递过来的数据的方式是:request.getParameter(“username”);这个代码可以获取到页面的username的数据。在action中可以通过属性驱动的方式来获取页面的值。
上面时jsp代码,下面时action,嫌麻烦就放一块了说明:
原理:
- 页面中name的属性和action中的属性必须保持一致。
- Action中的属性必须有get和set方法。
- 满足这两个条件就实现了属性驱动。
如果属性中要求接受的不是String类型,而是其他类型呢?struts2将做自动的转化。
类型转化
问题
通过属性驱动可以得出,只要在action中有age和name属性,有set和get方法就能得到页面上age和name的值。如果action中是日期类型呢?
在struts2中可以自动隐式得到转化。比如在struts2中可以把字符串类型转化为日期类型。但是必须要求是yyyy-mm-dd的格式。其他格式转换不了。
如果页面上传过来的是yyyyMMdd,应该怎么办呢?类型转化将解决这个问题。
DateConverter类
说明:
1、 这个类必须继承DefaultTypeConverter或者实现TypeConverter接口。
2、 在TypeConverter接口中,声明的方法是这样的:
可以看出里面实际上有六个参数。但是这个类中,只有三个参数。
在DefaultTypeConverter类中:
可以看出在实现了converValue的方法中调用了convertValue有三个参数的方法,所以能够执行。这样做的好处是程序员即可以用三个参数的方法,也可以用6个参数的方法。
3、 在convertType方法中:
value为从页面上传递过来的值
toType为转换以后的类型
properties文件
做了前面的事情后,DateConverter类仅仅是一般的类,struts2框架不能把这个类看作为数据结构的转换类。所以需要把DateConverter类用配置文件进行注册。
注意事项:
1、 这个文件必须和相应的action类放在同一个目录下。
2、 文件的名称为:类名-conversion.properties。
3、 配置文件中的内容为:
action中的属性名称=DateConverter全名
4、 在执行的时候,一定要让浏览器的环境是中文的执行环境。在默认情况下,yyyy-MM-dd只有在中文的浏览器环境下才能识别,如果是英文识别不了。
可以参照XWorkBasicConverter这个类说明问题。
全局properties文件
模型驱动
除了上述做法,还可以考虑全局的配置文件
步骤:
1、 在src下新建一个properties文件,为xwork-conversion.properties。
2、 在文件中键值对是这样的:
java.util.Date= struts2.action.converter.DateConverter
这样配置,只要是java.util.Date类型都会通过DateConverter这个类进行转化。适合于所有的action中的属性。
假设你正在完成一个网站的注册功能。在后台需要得到20多个属性,才能完成注册。如果用action中的属性获取值,就是这样的情况:
1、 在action中会写20个属性
2、 这20个属性添加set和get方法。
这样会导致action中的代码结构不是很好。模型驱动很好的解决了这个问题。
原文:http://blog.csdn.net/u013239111/article/details/21965207