Result
Result类型
1. dispatcher:类似于转发,是result的默认type类型,不能转发到其他action中。
2. redirect:类似于重定向,不能重定向到其他action中。
3. chain:类似于转发,可以转发到其他action中。
4. redirectAction:类似于重定向,可以重定向到其他action中。
5. 跳转到其他包中的action的方式
6. 使用重定向的方式时,如何解决参数传递
1) 在action中设置一个变量存储传递过来的变量。
2) 在struts2中配置,在重定向的页面地址后加入参数。?t=${type}
3) 在重定向的页面获取:通过<s:property value=”#parameters.t”/>
OGNL(对象图导航语言)
1. 只有通过user.xxx的方式,strut2才会去调用DemainModel的构造器。
2. 想要初始化domain model,可以自己new,也可以传递参数值(上面),但这时需要保存空的构造器。
3. Ognl的使用
1) 静态访问:@+类全路径名称+@+静态方法/静态属性
2) 访问set集合时不同能通过下标访问元素,因为set是无序的。
4. 通过bean标签初始化一个对象
<s:beanname="com.bjsxt.struts2.ognl.action.Dog" var="myDog">
<s:paramname="name" value="'oudy'"></s:param>
</s:bean>
1) Bean标签有两个属性:name和var
2) Name:给出类的全路径名称。
3) Var:如果设置了var表示用var的变量指向类的实例对象,并把这个实例放到actionContext中。
如果没有设置var表示将类的实例放入到值栈中,当bean结束后,出栈。
5. Set标签
1) 包含两个属性:var和value
2) <s:set var=”age” value=”#parameters.age[0]”/>将长变量设置为段变量。并将变量放入到actionContext中。
3) 使用时通过#age即可获取到parameters.age[0]对应的值。
6. $、#、%区别
1) $ 用于struts配置文件,获取变量值
2) # 获取ActionContext中的值
3) %将原本属性的文本解析为ognl,对于本来就是ognl的属性不起作用
<s:propery> <s:include>
7. 获取错误信息fieldError标签
1) 在action中通过this.addFieldError(name,value);添加错误信息。
2) 在jsp中使用struct标签:<s:fieldError name=”name”/>取出错误信息。
3) 或者:<s:property value=”errors.name[0]”/>
声明式异常
1. 在struts2中处理action中抛出的异常:
<exception-mapping result=”error” exception=”java.sql.SQLException”>
表示当action抛出java.sql.SQLException异常时,显示result为error的视图。
2. 设置全局的异常处理
1) 编写一个bbs2009_default包
2) 在包中设置global-resluts和global-exception-mapping
3) 在其他包中继承这个包:extends=”bbs2009_default”。
4) 处理过程:
a) Action抛出异常,在自己的result中有没有能处理这个异常的exception
b) 没有则到父类包中找,即bbs2009_default中找
c) 找到后通过global-result找到相应的result,然后显示视图。
3. 原理:(由拦截器实现)
1) 所有的包都继承structs-default,在这个包中定义了许多拦截器。
2) 其中有一个Exception的拦截器。
3) 在这个拦截器中的拦截方法intercept,参数是ActionInvocation,这个参数封装了action的执行。
4) 执行ActionInvocation#invoke(),即执行action的execute()方法。得到result。
5) 当action中抛出异常时,会被拦截器以catch方式捕获到这个异常,之后再找到对应的exceptionMapping,将这个result为最终的result,返回。
6) 找到相应的result,显示视图。