Struct2相关

xiaoxiao2021-03-01  25

加载struts.xml过程

说明:

1在启动的时候加载了三个配置文件struts-default.xmlstruts-plugin.xmlstruts.xml 如果这三个文件有相同的项,后面覆盖前面的。 struts.xml文件必须放在src下才能找到。

结果类型

说明

每个action方法都返回一个String类型的值,struts一次请求返回什么值是由这个值确定的。在配置文件中,每一个action元素的配置都必须有result元素,每一个result对应一个action的返回值。 Result有两个属性: name:结果的名字,和action中的返回值一样,默认值为success;type:响应结果类型,默认值为dispatcher.

类型列表

struts-default.xml文件中,如下面所示:

说明:

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

Dispartcher类型

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

Redirect类型

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

RedirectAction类型

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

Struts2与serlvet接口

通过前面的练习大家都知道,在action的方法中与servlet的所有的API是没有任何关系的。所以在struts2中做到了acitonserlvet的松耦合,这点是非常强大的。但是如果没有HttpServletRequest,HttpServletSession,ServletContext有些功能是没有办法完成的。比如购物车程序,需要把购买的物品放入session中。所以就得找一些路径使得在struts2中和serlvetAPI相结合。

拦截器

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_enitem.password=password_en默认:resource.properties内容:item.username=usernameitem.password=password配置文件 需要在配置文件中加入:说明: 1、这样struts2就会去找你写的资源文件 2、name的值可以在org/apache/struts2/default.properties中找到。 3、如果放置的资源文件在src下,则value的值可以直接写,如果在包中则可以写成包名.resource。 4、在这里resource是个基名,也就是说可以加载以resource开头的文件。页面

利用<s:textname=”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中的属性必须有getset方法。 满足这两个条件就实现了属性驱动。

原理:

如果属性中要求接受的不是String类型,而是其他类型呢?struts2将做自动的转化。

类型转化

问题

通过属性驱动可以得出,只要在action中有agename属性,有setget方法就能得到页面上agename的值。如果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个属性添加setget方法。

这样会导致action中的代码结构不是很好。模型驱动很好的解决了这个问题。

相关资源:敏捷开发V1.0.pptx
转载请注明原文地址: https://www.6miu.com/read-4050006.html

最新回复(0)