Struct2相关

2014-11-24 00:41:32 · 作者: · 浏览: 0

加载struts.xml过程

\

< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+y7XD96O6PC9wPgo8cD48L3A+Cgox1NrG9LavtcTKsbryvNPU2MHLyP249sXk1sPOxLz+IHN0cnV0cy1kZWZhdWx0LnhtbKGic3RydXRzLXBsdWdpbi54bWyhonN0cnV0cy54bWzI57n71eLI/bj2zsS8/tPQz+DNrLXEz+6jrLrzw+a4srjHx7DD5rXEoaNzdHJ1dHMueG1szsS8/rHY0Ou3xdTac3Jjz8KyxcTc1dK1vaGjCjxwPjwvcD4KPHA+PHN0cm9uZz694bn7wODQzTwvc3Ryb25nPjwvcD4KPGJsb2NrcXVvdGU+CjxwPjwvcD4KPHA+y7XD9zwvcD4KPHA+PC9wPgo8cD48L3A+CgrDv7j2YWN0aW9ut723qLa8t7W72NK7uPZTdHJpbmfA4NDNtcQmIzIwNTQwO6Osc3RydXRz0ru0zsfrx/O3tbvYyrLDtCYjMjA1NDA7ysfTydXiuPYmIzIwNTQwO8i3tqi1xKGj1NrF5NbDzsS8/tbQo6zDv9K7uPZhY3Rpb27UqsvYtcTF5NbDtryx2NDr09ByZXN1bHTUqsvYo6zDv9K7uPZyZXN1bHS21NOm0ru49mFjdGlvbrXEt7W72CYjMjA1NDA7oaNSZXN1bHTT0MG9uPbK9NDUo7oKCm5hbWU6veG5+7XEw/vX1qOsus1hY3Rpb27W0LXEt7W72CYjMjA1NDA70rvR+aOsxKzIzyYjMjA1NDA7zqpzdWNjZXNzO3R5cGU6z+zTpr3hufvA4NDNo6zErMjPJiMyMDU0MDvOqmRpc3BhdGNoZXIuCgo8cD48L3A+CsDg0M3B0LHtPC9ibG9ja3F1b3RlPgo8YmxvY2txdW90ZT4KPGJsb2NrcXVvdGU+CjxwPjwvcD4KPHA+PC9wPgo8cD7U2nN0cnV0cy1kZWZhdWx0LnhtbM7EvP7W0KOsyOfPwsPmy/nKvqO6PC9wPgo8cD48aW1nIHNyYz0="https://www.cppentry.com/upload_files/article/76/1_41md3__.jpg" alt="\">

说明:

从上述可以看出总共10种类型默认类型为ServletDispatcherResult即转发。结果类型可以是这10种结果类型的任意一种。

Dispartcher类型

Dispatcher类型是最常用的结果类型,也是struts框架默认的结果类型。

\


Redirect类型

Redirect属于重定向。如果用redirect类型,则在reuqest作用域的值不能传递到前台。


RedirectAction类型

\


struts2中的action,只要访问一次就要实例化一个对象。这样就不存在线程安全的问题。这也是struts2框架的一个好处。


Struts2与serlvet接口

通过前面的练习大家都知道,在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开头的文件。
页面

利用 就可以把资源文件中的内容输出来。

\
说明:
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中的代码结构不是很好。模型驱动很好的解决了这个问题。