12.Result结果类型
. 一个result元素,对应一个result类,类中接收不同的参数;
1)在result路径问题
在result映射的配置中,在指定实际资源的位置时,可以使用绝对路径也可以使用相对路径。
绝对路径是以斜杠(/)开头,相对于当前web项目的上下文路径,相对路径不以斜杠(/)开头,
相当于当前执行的action路径。
<package name="default" extends="struts-default" namespace="/admin"> <action name="login" class="cn.com.LoginAction"> <result>success.jsp</result> <result name="error">/error.jsp</result> </action> </package> 如果当前 Web应用程序的上下文路径是/test,那么请求/test/admin/login.action,执行成功后,转向的页面路径为 /test/admin/success.jsp,否则,执行失败后,转向的页面路径为 /test/error.jsp
2)Struts2支持的结果类型
chain 用于Action链式处理 dispatcher 转发 默认值
freemarker 用于FreeMarker的集成 httpheader 用于控制特殊的HTTP行为 redirect 用于重定向到另外的URL(web资源) redirectAction 用于重定向到别外的action映射 stream 用于向浏览器返回一个InputStream(用于文件下载) velocity 用于Velocity集成 xslt 用于XML/XSLTWYS DN plainText 用于显示某个特定页面(如jsp,html的原始内容)
//示例::redirect重定向 <package name="result" extends="struts-default"> <!-- 定义全局结果 --> <global-results> <result name="global">/jsps/res.jsp</result> </global-results> <!-- 定义一个action --> <action name="result" class="cn.xt.result.ResultAction"> <result name="global" type="redirect"> <param name="location">/jsps/res.jsp</param> <param name="name">${name}</param> //redirect下传参 <param name="age">90</param> <param name="addr">${addr}</param> <param name="sg">${#session.height}</param> <param name="parse">false</param> //parse是否解析串在url上做为参数的el表达式;不包括<param name="name">${name}</param> </result> </action> </package>
3)plainText 用于显示某个特定页面的原始内容(如jsp,html的原始内容) <action name="plain"> <result name="success" type="plainText"> <param name="location">/jsps/a.jsp</param> <param name="charSet">UTF-8</param> </result> </action> 4)Redirect:- 重定向到一个jsp页面。 5)redirectAction 用于重定向到别外的action映射 <!-- 从一个actioin转到另一个action上去执行 --> <action name="one" class="cn.xt.redirect.OneAction"> <result name="success" type="redirectAction"> <param name="actionName">two</param> <param name="namespace">/abc</param>//命名空间 <param name="nm">${name}</param> <param name="age">${age}</param> <param name="addr">${addr}</param> <param name="suppressEmptyParameters">true</param> //当获取不到参数时 参数的key也不显示在url上 </result> </action> 6)Chain: - dipatcherAction – 转发一个action <!--使用chain,chain1!save--> <!-- <action name="chain1_*_*" class="cn.xt.chain.Chain1Action"> <result type="chain"> <param name="actionName">{2}</param> //转发到那个action <param name="method">{1}</param> //执行什么方法 </result> </action> --> //转发到chain2 <action name="chain1" class="cn.xt.chain.Chain1Action"> <result type="chain"> <param name="actionName">chain2</param> </result> </action> <action name="chain2" class="cn.xt.chain.Chain2Action"> <!-- 通过aliases给参数设置别名,即myname这个参数来自于name的值 --> <param name="aliases">#{'name':'myname'}</param> //aliases取别名 ,当chain1中的属性名为name,chain2的属性名为myname //这时转发时设置别名#{'name':'myname'},就可以所chain1中的name 改名为myname //在chain2中使用; <result>/jsps/a.jsp</result> </action> 7)httpheader 用于控制特殊的HTTP行为 用于返回http响头 8)自定义result步骤: 第一步:实现一个Result接口的类。必须要实现一个方法 class MyResult implements Result{//xwork //ai对象是当前执行action的代理,通过ai.getAction可以返回当前正在执行的对象 public void execute(ActionInvocation ai) throws exception{ //处理代理。包括 使用request,response输出IO流。 } } 第二步:配置struts.xml中去 <result-types> <result name="myresult" class="MyResult"/> </result-types> 一个result仅对一个package有效。如果希望让所所有package有效,则其他的package应该extends它。 第三步:可以在MyResult中接收参数,并在sturts.xml中通过<pamam>元素设置值,如: class MyResult....{ private String name; //getxxx,setxxx } <action name="show" class="..."> <result name="myserult"> <param name="name">Jack</pamam> </result> </action> 在MyResult的exexute方法中建议不要使用某个Action的具体类名. 应该使用Object来操作。 可以回调某个Action的代码。 //示例:: 功能1 自定义result 生成验证码 // 功能2 获取正在执行的action对象 回调action中的方法 /** * ServletActionContext */ public class ImgResult implements Result{ int width=60; int height=30; public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } public void execute(ActionInvocation ai) throws Exception { /* //通过ai对象,获取正在执行的action对象 Object obj = ai.getAction(); System.err.println("正在执行的是:"+obj);//ImageAction if(obj instanceof ImageAction){ ImageAction ia = (ImageAction) obj; String ss = ia.aaa("xtksfm"); //调用action中的方法aaa并传参xtksfm System.err.println("返回的值是:"+ss); } */HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType("image/jpeg"); BufferedImage img = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); Graphics g = img.getGraphics(); Random r = new Random(); int code = r.nextInt(10000); ActionContext.getContext().getSession().put("code",code);//放到session中去 g.setFont(new Font("st",Font.BOLD,19)); g.drawString(""+code,0,30); g.dispose(); ImageIO.write(img,"JPEG",response.getOutputStream()); } } <!--使用自定义的结果 --> <action name="imgAction"> <result type="img"> <param name="width">160</param> <param name="height">300</param> </result> </action> 9)stream //示例::简单下载 public class DownAction extends ActionSupport{ //stream对应的结果类中会调用getInputStream()这个方法 public InputStream getInputStream() throws Exception{ System.err.println("开始下载。。。。"); String path = ServletActionContext.getServletContext().getRealPath("/down/1.jpg"); InputStream in = new FileInputStream(path); return in; } @Override public String execute() throws Exception { return SUCCESS; } } ---------------------------------------------- //示例2:: 设置了中文編码和改变了回调的下载 用于向浏览器返回一个InputStream(用于文件下载)\ <!-- 配置下载 --> <action name="down" class="cn.xt.down.DownAction"> <result type="stream"> <param name="contentType">image/bmp</param> //指定响应类型 <param name="contentDisposition">attachment;filename="${name}"</param>//指定下载为附件,和文件名 <param name="inputName">myimg</param>//指定回调action中的那个下载方法, //如果不写默认调用getInputStream方法--> </result> </action> -------- public class DownAction extends ActionSupport{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } //在配置文件中指它了回调 该方法进行下载 public InputStream getMyimg() throws Exception{ System.err.println("开始下载。。。。"); String path = ServletActionContext.getServletContext().getRealPath("/down/1.jpg"); InputStream in = new FileInputStream(path); return in; } @Override public String execute() throws Exception { System.err.println("开始下载....."); String nm = "开始下载.bmp"; nm = URLEncoder.encode(nm,"UTF-8"); setName(nm); return SUCCESS; } }