上课笔记:
笔记扩展:
Forward 和 Redirect的区别
简单的说Forward是发生在服务器内部,客户端不知道发生了request的转向。客户A向服务器B请求,服务器B处理完请求并发生forward转向,请求不会经过客户端,而是在内部请求另外一个服务器资源。对于客户A来说,该操作是透明的。
Redirect则是客户端A向B请求后,服务器B处理完请求结果,并把结果返回值客户端A,并要求客户端A向服务器C发出请求。对于客户端A来说,其实是发生了两次请求。一个重要的区别还在于,Redirect会重新发起请求,所以会丢失请求参数,请求属性,Action实例和Action中封装的属性。
一,result可以继续转发或者重定向一个action(一个java文件,class文件+)
result的type结果类型:redirectAction
redirectAction结果类型,注意的是redirectAction在浏览器中输入如:
调转之后的页面的url地址栏上的是:
下面的2个action为例子,第一个对应的servlet是LoginAction.java,其中有一个方法
execute(),返回值是:success
1.
最重要的一点把这个action中的result的name设置为success,type="redirectAction"
2.
在param中name="actionName",这是必须的,然后在param标签中设置这个namespace
3.这个namespace的内容就是你需要“转发”的请求目的地
<action name="LoginAction" method="execute" class="com.li.LoginAction">
<result name="success" type="redirectAction">
<param name="actionName">SecondAction</param>
</result>
</action>
<action name="SecondAction" class="com.li.SecondAction" method="execute">
<result name="success">/test2.jsp</result>
</action>
二,action链
<!--下面举个简单例子来说明下这个action链式处理结果:写2个package,第一个写要写好namespace
,第二个package我没写namespace(其实也可写)-->
<package name="er" extends="struts-default" namespace="/er">
//为了方便讲解,这里我用双//解释,当然你在Struts.xml中要用<!-- -->这样来注释
//注意在在这里name=“input-form”,我用了默认的class,默认的方法,当然这样
//之后这个action的结果result我用name="success",转发到/WEB-INF/pages/form.jsp
<action name="input-form">
<result name="success">/WEB-INF/pages/form.jsp</result>
</action>
</package>
//再看第二个package,首先把action的路径和方法出在com.li.sqlQueryAction(sqlQueryAction.java)
//sqlQueryAction.java中有一个方法:save,方法的返回值:success
//看 <result name="success" type="chain">type类型是chain,那么接下来简单了
//二个param。一个设置name="actionName",param标签对内容是上一个package中action的input- //input-form
// 第二个param设置就是刚才要求第一个package中name要写的namespace ,暂时理解则么多了0-0
<package name="myapp" extends="struts-default">
<action name="sqlQuery" class="com.li.sqlQueryAction" method="save">
<result name="success" type="chain">
<param name="actionName">input-form</param>
<param name="namespace">/er</param>
</result>
</action>
</package>
三,动态结果
这个动态结果首先明白这个含义:指的是在指定实际视图资源使用了表达式语法,通过这样的语法可以让action
处理完请求之后,动态的转入实际的视图资源。看下面的例子
我这里先写3个jsp页面:
//页面1
<body>
<a href="Second1_test">Second_execute request</a><br>
</body>
//页面2
<body>
<p>test2 哈哈</p>
</body>
//页面3
<body>
execute 啊啊啊啊啊 <br>
</body>
接下来配置struts.xml
<package name="er" extends="struts-default" namespace="/">
//注意这里的_*号的含义,当有一个请求是以Second1_开头的请求action模式情况下
//都将进行处理(前提交条件是有这个servlet)。这里我模拟Second1_test
//将这个请求发送到SecondAction.java后,method="{1}"会与test方法对应
//然后有2个结果之一出现,执行转发2或者3页面
//注意{1}.jsp,这个{1}就是test
<action name="Second1_*" class="com.li.SecondAction" method="{1}">
<result name="input">/test2.jsp</result>
<result name="success">/{1}.jsp</result>
</action>
<package/>
我在com.li包下写SecondAction.java文件,在这个类中有一个方法test(注意这里的test与页面1中href=“Second1_test”中的test对应
public class SecondAction
{
public String test()
{
//使用随机数测试结果返回值为:success或者input
double i = Math.random();
if(i<0.5)
{
System.out.println("i="+i);
return "success";
}
else
{
System.out.println("i="+i);
return "input";
}
}
}
四,全局结果
<global-results>
<!-- 全局的result对所有的action都起作用 -->
<result name="index">/index.jsp</result>
</global-results>