您的位置:首页 > 编程语言 > Java开发

Struts2 Result详解

2016-03-17 09:19 507 查看
1,Result原理
1) Result组件是Struts2中用于输出的组件,实际上就是Java代码。
2)Struts2中预制了10中类型的Result,这些Result什么在struts-default.xml中。
这些类实际上都事先了统一的接口:Result.

Java代码


<result-types>
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
<result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
<result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
<result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
<result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
</result-types>

3)重点讲解一下类型的Result
--dispatcher 默认类型,转发到一个页面)
当一个请求到来,服务器直接转发到另一个页面,不能是另一个action。由于这个过程在服务器内部完成,客户端(浏览器)并不知道,所以在地址栏不会显示真实访问的页面,而显示都是所请求的action的地址。在servlet中相当与forword转发。

--redirect (重定向到一个页面)。
当一个请求到来,服务端将实际地址response给浏览器,然后浏览器重新发起请求,这个过程,浏览器是知道访问的页面的实际地址的,所以在浏览器的地址栏显示的是实际访问的jsp页面地址。但是这种类型不能重定向到一个action.

--chain 转发到一个action,而不是页面

--redirectAction 重定向到一个action
跳转到其他包的action:

Java代码


<action name="login" class="...">
<!-- Chain to another namespace -->
<result type="chain">
<param name="actionName">dashboard</param>
<param name="namespace">/secure</param>
</result>
</action>

使用redirectAction 带参数

Java代码


<span style="font-size: 14px; font-family: 'Microsoft YaHei', 微软雅黑, SimHei, tahoma, arial, helvetica, sans-serif;"><action name="temp" class="com.lydia.web.action.TempAction">
<result type="redirectAction">
<param name="actionName">test.action</param>
<param name="name">${name}</param>
</result>
</action></span>

--stream
--json

4)使用方式
<result name="ok" type="类型">

</result>

2、Stream类型的Result详解
1)Stream是用于向页面直接输出二进制数据,比如登陆页面的验证码图片,就可以在服务端生成,然后由这种类型的Result输出
2) 使用
<result name="success" type="stream">

<param name="inputName">

输出属性名

</param>

</result>

--在struts.xml中,我们可以使用param来给组件的属性注入默认值

--<param name="inputName">,这里inputName对应的是StreamResult的inputName属性,这样配置相当于会调用StreamResult的setInputName方法给它注入属性值。

--注入的属性值,是Action中的某个属性的名称,如下图,inputName是StreamResult中的一个属性。在Action中作二进制输出的属性要求其类型为InputStream。



-- Result会创建一个输出流,接到Action中的输入流,向页面输出。

3) 验证码案例:
struts.xml中配置:

Java代码


<!-- 生成验证码的Action -->
<action name="createImage"
class="com.netctoss.action.CreateImageAction">
<result name="success" type="stream">
<param name="inputName">
imageStream
</param>
</result>
</action>

CreateImageAction.java

Java代码


public class CreateImageAction
extends BaseAction {

//ouput
private InputStream imageStream;

public String execute() {
//生成验证码图片
Map<String,BufferedImage> map =
ImageUtil.createImage();
//通过遍历得到唯一生成的验证码
String imageCode =
map.keySet().iterator().next();
//将验证码记录到session,在登录验证时使用
session.put("imageCode", imageCode);
//根据验证码,得到图片
BufferedImage image = map.get(imageCode);
//将图片转换为输入流,由result作输出
try {
imageStream =
ImageUtil.getInputStream(image);
} catch (IOException e) {
e.printStackTrace();
return "error";
}
return "success";
}

public InputStream getImageStream() {
return imageStream;
}

public void setImageStream(InputStream imageStream) {
this.imageStream = imageStream;
}

}

Java代码


<script language="javascript" type="text/javascript">
function change(imageObj) {
imageObj.src = "createImage?date=" + new Date().getTime();
}
</script>

<tr>
<td class="login_info">验证码:</td>
<td class="width70"><input name="code" type="text" class="width70" /></td>
<td><img src="createImage" alt="验证码" title="点击更换" onclick="change(this);"/></td>
<td><span class="required"></span></td>
</tr>

BaseAction.java 实现接口SessionAware

Java代码


/**
* 所有Action的父类,可以将通用的代码
* 提取出来放到父类中。
* 这里,我们让BaseAction实现接口SessionAware,
* 那么继承与BaseAction的Action就相当于实现了
* 这个接口。在实例化Action之后,Struts2会自动
* 调用setSession方法把session注入给Action,
* 这里我们利用全局变量session来接收,Action
* 可以在调用业务方法时使用它来调用session。
*/
public class BaseAction implements SessionAware {

protected Map<String, Object> session;

public void setSession(Map<String, Object> session) {
this.session = session;
}

}

3、Json类型的Result详解

1) 向页面输出json格式的字符串

2) struts2 并没有预制这种类型的Result,但是他非常常用,往往用于页面的异步校验。

3) 使用步骤

a,导包:struts2-json-plugin-2.1.8.1.jar

b,struts.xml中将要使用json类型Result的package继承json-default
c,在struts.xml中配置result
--最常用,只是输出单个属性

Java代码


<result name="success" type="json" >
<param name="root">
指定Action的一个属性名
<param>
</result>

注意: name="root"是固定用法;

如指定的属性是boolean类型,那么Result会把这个属性做成字符串"true";
如指定的属性是JavaBean,那么Result会把这个属性做成字符串{"code":"12"}

--输出多个属性

Java代码


<result name="success" type="json">
<param name="includeProperties">
属性名1,属性名2,...
</param>
</result>

注意:Result会将这一组属性做成一个json输出,

如Action中有属性code="aaa",name="zs"

可以将这2个属性做成一个json

{"code":"aaa","name":"zs"}

--输出Action中的所有属性

Java代码


<result name="success" type="json">

</result>

注意:Result会将Action中所有的属性做成一个

json输出{"":"","":""}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: