文档章节

Struts2---->result

小强斋太
 小强斋太
发布于 2016/11/09 20:07
字数 1069
阅读 9
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

result

一、result类型  
     <result type="dispatcher">/r1.jsp</result>  服务器端跳转 跳转到视图
     <result type="redirect">/r2.jsp</result>       客户端跳转 跳转到视图
     <result type="chain">r1</result>                 服务器端跳转 跳转到action
     <result type="redirectAction">r2</result>   客户端跳转 跳转到action

<package name="default" namespace="/" extends="struts-default">

		<action name="r1">
			<result type="dispatcher">
				/r1.jsp
            </result>
		</action>

		<action name="r2">
			<result type="redirect">
				/r2.jsp
            </result>
		</action>

		<action name="r3">
			<result type="chain">
				<param name="actionName">r1</param>
				<param name="namespace">/</param>

			</result>
		</action>

		<action name="r4">
			<result type="redirectAction">
				<param name="actionName">r2</param>
				<param name="namespace">/</param>
			</result>
		</action>

	</package>

二、chain跳转时 跳转到别的namespace下面的action

<action name="r3">
   <result type="chain">
    <param name="actionName">r1</param>   指定要跳转的action
    <param name="namespace">/np1</param>  指定要跳转的action的namespace
   </result>
 </action>

三、服务器跳转和客户端跳转的区别
客户端跳转时用HttPservletResopse对象的sendRedirect函数实现,服务器端跳转是使用RequestDispather对象的forward方法实现的。这两者之间的区别主要体现在三个方面:
1. 使用服务器端跳转时,客户浏览器的地址栏并不会显示目标地址的URL,而是用客户端跳转时,地址栏当中会显示目标资源的URL;
2. 服务器端跳转是由客户端发送一个请求,请求一个服务器资源—如JSP和Servlet,这个资源又将请求转到另一个服务器资源,然后再给客户端发送一个响应,也就是说服务器转发全程是没有客户端参与的,都在web container容器内部进行,没有任何服务器和客户端的通信,实际就是服务器内部的跳转服务器端跳转是客户端发送一次请求,服务器端给出一次响应;而客户端跳转的流程则不同。客户端同样是发送一个请求给服务器端资源,这个服务器资源会首先给客户端一个响应,客户端再根据这个响应当中所包含的地址,再次向服务器端发送一个请求,也就是说客户端跳转是两次请求,两次响应

四、全局result 对本package里面的action都起作用。
    <global-results>
      <result name="mainpage">/main.jsp</result>
   </global-results> 
  如果其他的package也想用这个result的话,必须继承这个包
  <package name="admin" namespace="/admin" extends="user">

<package name="user" namespace="/user" extends="struts-default">
  <global-results>
   <result name="mainpage">/main.jsp</result>
  </global-results>

  <action name="user" class="com.ncepu.struts2.UserAction">
   <result name="success">
    /user_success.jsp
            </result>
   <result name="error">
    /user_error.jsp
            </result>
  </action>
 </package>


 <package name="admin" namespace="/admin" extends="user">
  <action name="admin" class="com.ncepu.struts2.AdminAction">
   <result name="success">
    /admin_success.jsp
            </result>
  </action>
 </package>

五、动态result(利用 action中的所有属性都会被存在value stack里面)
在action对应的类中定义一个属性r
execute方法中

public String execute() throws Exception {
  if(type == 1) r="/user_success.jsp";
  else if (type == 2) r="/user_error.jsp";
  return "success";
 }

 配置文件中

<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
      <result>${r}</result>
    </action>

六、传递参数

一次客户端请求对应一个value stack,所以客户端跳转只能从action Context中获得参数,而不能从value Stack中获得,因为客户端跳转是两次请求,两次响应,客户端跳转的时候才用传递参数  ${}表达式取值。  
index.jsp   

<a href="user/user?type=1">传参数</a>

action配置       

<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
               <result type="redirect">/user_success.jsp?t=${type}</result>
</action>

其中type为action中的东西,结果页面可以从action context中取值
user_success.jsp   

from valuestack:    <s:property value="t"/>              取不到
 from actioncontext: <s:property value="#parameters.t"/>  能取到


原因:redirect时候,第二阶段,发出的第二次请求到一个jsp页面,没有action,故value stack为空。而在第一阶段有action,stack context 即action 上下文存着变量t的内容。

七、ValueStack 和Stack Context(没理解透彻)

可以通过在页面中添加<s:debug/>标签察看ValueStack 和Stack Context中有哪些具体的内容。

value stack contents ognl       值栈,值栈里存储的是一些action里的变量,
stack context                           action上下文,和每一个action对应。

action上下文是一个map对象,通过#key获得对象内容,在#request又可以得到值栈,
于是获得action变量内容有三种方式
1,从值栈中直接获得
     <s:property value="type"/>
     ${type }
2,从action上下文获得值栈的属性
     <s:property value="#request['type']"/>或者<s:property value="#request.type"/>

  

 

小强斋太
粉丝 0
博文 181
码字总数 0
作品 0
广州
私信 提问
加载中
请先登录后再评论。
通过Android源代码分析startActivity()过程(上)

通过Android源代码分析startActivity()过程(上) 一 概述 在Android中,我们去调用startActivit()来启动一个Activity,经过复杂的代码跳转后,最终是由ActivityManagerService(简称ams,下...

Cundong
2016/04/05
1.1K
3
Python使用xslt提取网页数据

1,引言 在Python网络爬虫内容提取器一文我们详细讲解了核心部件:可插拔的内容提取器类gsExtractor。本文记录了确定gsExtractor的技术路线过程中所做的编程实验。这是第一部分,实验了用xsl...

fullerhua
2016/05/16
676
0
Flatscript: ES7 `async`/`await` 替代实现

在经历了 JS 的 callback hell 后看过 , 于我而言这仍不能很好解决一些特定用况, 加之其写起来仍然很冗长, 各种匿名函数横飞. 于是就没有继续使用了, 但又不方便说 "反感 Promise" 或 "对 Pr...

neuront
2016/01/13
395
1
Vert-x-通过异步的方式使用JDBC连接SQL

欢迎关注http://quanke.name/ 交流群: 转载请注明出处,谢谢 在这篇文章中,我们将会看到怎样在vert.x应用中使用HSQL,当然也可以使用任意JDBC,以及使用vertx-jdbc-client提供的异步的API...

quanke_
2016/01/17
5.3K
24
Struts2 漏洞分析及如何提前预防

2016年4月26日,Apache Struts2官方又发布了一份安全公告:Apache Struts2 服务在开启动态方法调用的情况下可以远程执行任意命令,官方编号 S2-032,CVE编号 CVE-2016-3081。这是自2012年Str...

赛克蓝德
2016/05/01
1.2K
2

没有更多内容

加载失败,请刷新页面

加载更多

Azure Application Gateway(一)对后端 Web App 进行负载均衡

一,引言   今天,我们学习一个新的知识点-----Azure Application Gateway,通过Azure 应用程序网关为我么后端的服务提供负载均衡的功能。我们再文章头中大概先了解一下什么是应用程序网关...

osc_lc4icfkt
56分钟前
10
0
WoLai(我来) 注册码 ——国内版 notion 【笔记】

注册码: SQGYG23 ❤ W4T9PKP JLTHNJP KMTXK7P JDHKJEM KRJXX5P 6M7PPAP DEGLMG3 N3BZMRI 87BR22I GSIWGWP GNGBNTI QA8URIM UDUV9VM IHKJA7P MD9ZA3M 3XR67ZI TBUP9JX TI4TYMM 注册完了可以把......

osc_c05lkk3u
57分钟前
21
0
2020hdu多校第二场比赛及补题

这一场我们队只A了一题 1010 Lead of Wisdom 直接爆搜,但是T了好几发,剪了下枝 如果一个物品的a,b,c,d都比不上另外一个同种物品的a,b,c,d,那这个物品就可以直接淘汰掉了 #include<iostrea...

osc_usgpahnw
59分钟前
21
0
为什么Java有瞬态字段? - Why does Java have transient fields?

问题: 为什么Java有瞬态字段? 解决方案: 参考一: https://stackoom.com/question/3opS/为什么Java有瞬态字段 参考二: https://oldbug.net/q/3opS/Why-does-Java-have-transient-fields...

富含淀粉
59分钟前
16
0
轻松搭建CAS 5.x系列(6)-在CAS Server上增加OAuth2.0协议

概述说明 CAS Server默认搭建出来,客户端程序只能按照CAS自身的协议接入。CAS的强大在于,有官方的插件,可以支持其他的协议。本章节就让CAS Server怎么增加OAuth2.0的登录协议。 安装步骤 ...

osc_inj0cicw
今天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部