Struts2知识汇总二

Struts2中的调试

在Struts2中可以使用

<s:debug/>

用来查看页面信息和找错,可以用来查看但前值栈中的内容

Struts2中的国际化(i18n):

使用i18们需要在struts.xml中写上

<constant name="struts.custom.i18n.resources" value="global" />

在Struts2中实现国际化,需要新建properties文件,properties文件内容格式为键值对
如下:
key = value
properties文件的命名格式:
bundlename_language_country.properties
bundlename为资源包名称:可以为globa、struts、model等
language为语言缩写:zh(中文)、en(英语)、fr(法语)
country为国家缩写。
properties文件放在类目录下,但是不能和类一起放在包里
Struts2默认使用英文环境
然后使用Struts2提供的标签设置name,一边Struts框架找到对应内容替换
properties文件放在类目录下,框架会默认自动寻找该文件。
可以使用Struts2标签获取值:

<s:property value="getText('key')"/>

大多数UI标签的key属性可用于从资源束检索信息

<s:textfield key="some.key" name="textfieldName"/>

i18n标签会将任意资源束推送到值栈,而i18n标签内的其他标签可以显示来自该资源束的信息:

<s:i18n name="bundle">
     <s:text name="key" />
</s:i18n>
Struts2 类型转换:

在html中,节手的数据类型默认为String,而在Struts2中,不需要进行转换就可以接收多个类型(使用转换器):
默认转换器:

Integer,Float,Double,Decimal
Date,Datetime
Arrays,Collections
Enumerations
Boolean
BigDecimal

如果类中有自己定义的对象实例,取出对象实例则显示默认调用toString()
这时不要覆写toString()方法
因为Struts2默认调用toString,如果直接覆写toString()方法,实例里的属性就会丢失。
(猜测:可能是因为框架检查代码,没有发现有将数据从值栈取出的操作,所以判断数据没有使用到,就直接将过程优化,不将值放入值栈,所以就取不到了)
这里就需要使用struts2提供的转换器:
(需要创建一个新的类,继承自StrutsTypeConverter):
覆写两个方法:

public Object convertFromString(Map map, String[] strings, Class type) {
//从字符串到对象转换,数据在strigs里,返回一个对象

}
public String convertToString(Map map, Object o) {
//将对象变为字符串,对象为o,需要强制转换
}

创建完新的转换器,还需要注册(在类目录下,新建一个properties文件):

xwork-conversion.properties

//内容
('被转换类路径') = ('转换器类路径')

//例
com.echo.some.SomeThing = com.echo.converter.SomeThingConverter

使用该命名的文件可以保证转换器全局可用。

Struts2 主题和模板和标签:

标签:
Struts2中的标签由Struts框架提供,运行时会替换扩展成html代码
例如:

//struts2标签
<s:textfield name="name" label="Name" />
//转化为
<tr>
<td class="tdLabel">
   <label for="name" class="label">Name:</label>
</td><td>
   <input type="text" name="name" value="" id="name"/>
</td>
</tr>

表单输入标签属性id默认为:表单id_属性名
如果标签属性没有赋值,则框架会默认从其他属性或者父标签获得默认值
如id和name属性

模板:
一些标签和合集,主要表示写在freemarker上,可复用的模板
主题:
一系列模板组成一个主题

Struts2中的内置主题:

simple theme:基本和普通html一样
xhtml theme:框架默认主题,增加了一些小功能和布局调整,基于html的两列表格布局
css_xhtml theme:同上,增加了css样式,基于css的两列表格布局

全局主题设置:

struts.properties文件中的struts.ui.theme的属性(默认为xhtml)
struts.ui还有其它属性可以设置

也可以使用部分标签的theme属性单独设置

也可以自定义主题:

struts2-core-x.y.z.jar/template

复制该目录下的主题到类目录下当作模板,修改内容
然后在struts.xml中添加以下内容:

//目录名
struts.ui.theme=
//父目录
struts.ui.templateDir=
struts.ui.templateSuffix=ftl
Struts2中异常应对:

当发生再代码中发生未知异常时,为了保证用户体验,可以使用Struts2提供的异常处理机制来保证发生异常时跳转到界面友好的页面而不是跳转到错误信息页面。
Struts2提供拦截器来拦截来自action类的异常,并将action的result结果设置为error返回,使action继续正常运行,所以每个action都要确保有一个error结果的页面。
在struts.xml中添加语句:
如下所示,为空指针异常处理:
如果处理其他异常,只需要修改 “java.lang.NullPointerException” 字段即可。

<global-exception-mappings>
	<exception-mapping exception="java.lang.NullPointerException" result="error" />
</global-exception-mappings>
Struts2中的注释(慎用):

通过使用Struts2中提供的注释,可以不需要配置struts.xml
@Results:结果集必须写在类和包声明之间用({})包围@Result结果项:

@Results({
		@Result(name = "success",location = "/success.jsp"),
		@Result(name = "error",location = "/error.jsp")
})

@Action(value="/action"):规定Action请求的URL,必须写在execute方法上面:

@Action(value="/action")
public String execute() {
	return SUCCESS;
}

验证注释:
验证注释有多个类型,都必须写在属性的getter上面:
@RequiredFieldValidator( message = “” ):不能为空
@IntRangeFieldValidator(message = “”, min = “”, max = “”):int类型结果范围验证
其他验证注释可查看文档
如果同时在struts.xml文件和Action类中声明验证注释,则注释都会生效。

为什么说注释慎用?
如果项目规模不大,那么其实无所谓使用注释或者是xml配置,如果项目变得庞大,action类的数量倍增,如果在action类里大量使用这种注释会使代码维护性变差,特别是在重构的时候,如果项目目录结构需要发生变化、action名称需要发生变化,调整注释则是一件相当困难的事情,如果所有信息统一使用xml配置,则会使调整变得容易。

Struts2标签(部分):

if、else、elseif标签可以直接获取值栈信息

<s:if test="age <= 10">
   <p>age is smaller than 10</p>
</s:if>
<s:elseif test="age <= 20 ">
   <p>age is smaller than 20</p>
</s:elseif>
<s:else>
    <p>age is bigger than 20</p>
</s:else>

迭代器:
其中list可以是java.util.Collection,java.util.Iterator

<s:iterator value="list">
  <p>item is: <s:property/></p>
</s:iterator>

其他标枪详见文档。

发布了68 篇原创文章 · 获赞 12 · 访问量 5211

猜你喜欢

转载自blog.csdn.net/qq_40963076/article/details/104570861