十、Struts2结果集
|
1、Struts.xml配置文件
result元素:指定动作类的动作方法执行完后的结果视图.
属性:
name:字符串,与动作方法返回的值一致。默认是success
type:指定处理结果的结果类型的别名。(struts-default.xml有定义)。默认值是dispatcher
2、局部和全局结果视图
public @Override public String execute() { // 输入你好到页面上面去
// 把显示内容的代码写在这里
//配置文件根据返回的字符串,转发到对应的jsp页面 return }
public String execute2() { return
} } |
<package <!--全局结果视图:包中所有的action都能使用同一个视图 --> <global-results> <result </global-results> <action method="execute"> <!--局部结果视图:配置在了action的内部 --> <result </action>
<action method="execute2" </package> |
3、补充知识:动作类的生命周期
Struts2每次请求,都会实例化动作类的对象,因此它是线程安全的。
4、Struts2提供的结果视图
- chain:转发到另外一个动作
转发到包内的动作:
<action <!-- 转发到另外一个动作:同一个包中的 --> <!-- 位于result标签元素内部的值会调用chain处理类的setActionName("a2") --> <result
<!-- <result type="chain"> <param name="actionName">a2</param> </result> --> </action> |
转发到另外一个带有名称空间的包中的动作
<package <action <!--转发到另外一个动作:不同包且另外还有命名空间 --> <!-- 以下的写法是不对的 --> <!-- <result type="chain">/hello/a33</result> -->
<result 个方法: setNamespace(String str) setActionName(String name) --> <param <param </result> </action> </package>
<package <action <result </action> </package> |
- dispatcher:转发到一个页面,jsp
<action <!-- <result type="dispatcher">/3.jsp</result> --> <result> <param </result> </action> |
- redirect:重定向到一个页面
<result <param </result> |
- redirectAction:重定向到一个动作
<action <!--重定向到另外一个包中的动作 --> <result <param <param </result> </action> |
<package <action <result </action> <action <result </action> </package> |
- stream:文件下载(此处不讲,文件上传和下载再讲)
- plainText:以纯文本的形式显示结果
<action <!--以纯文本的形式显示目标页面:直接显示源码 --> <result </action> |
5、自定义结果视图
目标:用一个叫做image的视图,输入随机验证码图片
步骤:
-
定义一个类,实现com.opensymphony.xwork2.Result接口
/*
* 该类实现Rusult接口,实现自定义结果视图
*/
public
class CaptchaResult implements Result {/**
*
*/
private
static
final
long
serialVersionUID = 1L;private
int
width = 110;private
int
height = 25;public
void setWidth(int
width) {this.width = width;
}
public
void setHeight(int
height) {this.height = height;
}
@Override
public
void execute(ActionInvocation arg0) throws Exception {//验证码的代码
// BufferedImage:代码内存图片
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// Graphics:画笔
Graphics g = image.getGraphics();
// 画边线
g.setColor(Color.GREEN);
g.drawRect(0, 0, width, height);
// 填充背景色
g.setColor(Color.YELLOW);
g.fillRect(1, 1, width - 2, height - 2);
// 干扰线
Random r = new Random();
g.setColor(Color.GRAY);
for (int
i = 0; i < 15; i++) {g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width),
r.nextInt(height));
}
// 验证码
g.setColor(Color.RED);
g.setFont(new Font("宋体", Font.BOLD | Font.ITALIC, 18));
int
x = 19;for (int
i = 0; i < 5; i++) {g.drawString(r.nextInt(10) + "", x, 20);
x += 20;
}
// ImageIO:输出图片给指定的流
OutputStream output = ServletActionContext.getResponse()
.getOutputStream();
ImageIO.write(image, ".jpg", output);
}
}
-
在配置文件中定义结果类型
<package
name="p3"
extends="struts-dafault"><result-types>
<result-type
name="image"
class="com.itheima.results.CaptchaResult"></result-type></result-types>
</package>
-
现在就可以在动作中使用该结果类型
<!-- 使用自定义结果视图 -->
<action
name="imageAction"><result
name="success"
type="image"><param
name="width">400</param><param
name="height">300</param></result>
</action>
小技巧:很多包中都要使用该结果视图怎么办?
<package
name="mydefault"
extends="struts-dafault"><!--自定义结果视图 -->
<result-types>
<result-type
name="image"class="com.itheima.results.CaptchaResult">
</result-type>
</result-types>
</package>
<!--继承配置了结果视图的包 -->
<package
name="p4"
extends="mydefault"><!-- 使用自定义结果视图 -->
<result
name="success"
type="image"><param
name="width">400</param><param
name="height">300</param></result>
</package>