三 动作与结果: 深入浅出struts笔记

来源:互联网 发布:人工智能的今天 编辑:程序博客网 时间:2024/04/29 08:00

第三章 动作与结果

3.2 访问资源

   访问Servletcontext ,HttpSession,HttpServletRequest,HttpServletResponse 等资源可以通过ServletActionContext对象或者通过实现Aware接口

3.2.1 ServletActionContext对象

  public static javax.servlet.http.HttpServletRequest getRequest()

     返回当前HttpServletRequest对象

   public static javax.servlet.http.HttpServletResponse getResponse()

       返回当前HttpServletResponse对象

    public static javax.servlet.ServletContext getServletContext()

     返回当前ServletContext对象

可以通过在HttpServletRequest上调用getSession获得HttpSession对象。

注:不能从动作类的构造器直接调用 ServletActionContext方法,此时底层的ActionContext还没有传递过来

如代码,通过ServletAcitonContext 来获取HttpServletRequest 和HttpSession  对象。
public String execute(){  HttpServletRequest request=ServletActionContext.getRequest();  HttpSesson session=request.getSession(); if(session.getAttribute("user")==null){   return LOGIN;}else{     return SUCCESS;}

3.2.2 Aware 接口

 4种分别用来访问ServletContext, HttpServletRequest, HttpServletResponse, HttpSession 对象的接口

 org.apache.structs2.util.ServletContextAware;

 org.apache.structs2.interceptor.ServletRequestAware;

 org.apache.structs2.interceptor.ServletResponseAware;

 org.apache.structs2.interceptor.SessionAware;

 要想通过Aware 接口访问以上对象,只需动作类实现implements相应接口即可,同时将相应对象作为自己的属性,实现set方法,如:

public class user implements ServletContextAware,SessionAware,ServletRequestAware,ServletResponseAware{ private ServletContext servletContext;  private HttpServletRequest request;  private HttpServlteResponse response;  prvate Map session;  public void setServletContext(ServletContext servletContext){   this.servletContext=servletContext;}    public void setHttpServletRequest(HttpServletRequest request){  this.requst=request;}  public void setHttpServletResponse(HttpServletResponse response){  this.response=response;}  public void setSession(Map map){  this.session=map;}//此时动作类可以使用其相应对象

}

注:关于SessionAware接口

void setSession(java.util.Map map)


在调用setSession方法时,structs将传递一个org.apache.structs.dispatcher.SessionMap实例,此时不能直接访问HttpSession, SessionMap里有几个方法

 public void invalidate()   验证当前HttpSession 对象,即使还没有创建也不会抛出异常。

 public void clear() 清除HttpSession对象里的所有属性

 public java.util.Set entrySet() 返回属性集合

 public java.lang.Object get(java.lang.Object key)返回与指定key相关联的属性

 public java.lang.Object put(java.lang.Object key, java.lang.Object value)保存属性,并返回该属性值。

 public java.lang.Object remove(java.lang.Object key) 删除属性

3.3 静态参数传递给一个动作

  运用param元素。如:

<action name="MyAction" class="....">   <param name="id">ol</param>   <param name="password">123</param></action>

即每当触发MyAction,id即为ol, password为123

3.4 ActionSupport  类

 对ActionSupport类进行扩展有助于编写动作类

3.5 结果

运用result元素,有两个属性

name:结果名字,可选,默认为success

type: 结果类型,默认为dispatcher 其含义是将控制权交给某个jsp页面,内部资源

 3.5.1 chain

动作链:前一个动作将控制权传递给后一个运用,同时保持前一个动作的状态。如:

<package name="package1" extends="structs-default">   <action name="action1" class="...">      <result type="chain">action2</action> </action>  <action name="action2"  class="...">       <result type="chain">            <param name="actionName">action</param>            <param name="namespace">/namespace2</param>       </result>    </action></package><package name="package2" namespace="/namespace2" extends="structs-default">   <action name="action3" class="...">      <result>myview.jsp</result>         </action></package>

动作链,action1→action2→action3,

栈中状态:action3在栈顶,1在栈底,如果action1,2,3均有属性name,要访问该属性,可以使用[2].name ,[1].name, [0].name ,  依次访问

注:动作链少用,实在要用的话可将代码放入辅助类中,再进行调用。

3.5.2  Dispatcher

将控制权交给一个内部资源

 structs 中默认结果类型,有一个location参数,由于是指向内部资源,因此该参数值不能为一个绝对URL地址,要想指向外部资源,应用Redirect类型

<result name="">   <param name="location">resource</param></result>

3.5.3 FreeMarker

3.5.4 HttpHeader

用来将一个Http状态发送给浏览器,如:

<default-action-ref name="catchAll" /><action name="catchAll">   <result type="HttpHeader">     <param name="status">404</param>   </result></action>

其中default-action-ref定义默认动作, 如果某个URI没有与之匹配的动作,将触发default-action-ref里面的动作,上例中,如果触发catchAll,将会把一个404状态代码发送给浏览器。 

3.5.5 Redirect

重定向到外部资源:redirect  ,但是,如果不想让用户刷新浏览器的页面动作再次触发刚才被触发的动作,就应该使用重定向。

重定向到内部资源:dispatcher

Redirect结果类型由一个名为HttpServletResponse.sendRedirect的类进行处理,如果想取得上次操作的参数的话,只能通过在触发动作是传参,注意动态值要用${}括起来。如

<action  name="RedirectTest" class ="app03a.TestUser">    <result type="redirect">       User_input.action?userName=${userName}    </result></action>

注意:如果重定向的URL里面有&或者+等特殊字符,需要进行转义,如:URL为“http://www.test.com?user=1&site=4”,其中&字符必须写成&amp;写的时候必须为

<result type="redirect">   http://www.test.com?user=1&amp;site=4</result>

3.5.6 Redirect Action

重定向到一个动作,参数如下:

actionName:目的地动作名称,默认参数

namespace:目的地动作的命名空间。

如:将重定向到user_input动作:

<result type="redirect-action">   <param name="actionName">User_input</param></result>
actionName是默认参数,因此相当于
<result type="redirect-action">User_input</result>
又如
<result type="redirect-action">  <param name="actionName">User_input</param>  <param name="userId">xyz</param>  <param name="area">ga</param></result>
翻译成URL为:User_input.action?userId=xyz&area=ga

3.5.10 PlainText

 用来发送JSP页面的源代码,如Source-show动作将显示meun.jsp页面的源代码

<action name="Source-show" class="...">   <result name="success" type="plainntext">/jsp/menu.jsp</result></action>

3.6 异常处理exception-mapping元素

捕获动作类里中未能捕获的异常,可以嵌套定义

属性:exception 指定需要捕获的异常类型

           result :指定结果名,捕获异常时执行,可以来自当前动作的申明,也可以来自global-result申明

<action name="user_save" class="....">   <exception-mapping exception="java.lang.Exception" result="error" />   <result name="error">/jsp/error.jsp</result>   <result >/jsp/thanks.jsp</result></action>

还可以通过global-exception-mappings为应用程序提供一个全局性的异常捕获映射,但global-exception-mappings下声明的任何exception-mapping元素只能引用在global-results元素下申明的某个 result元素,如:

<global-resluts>   <result name="error">/jsp/Error.jsp</result>   <result name="sqlError">/jsp/sqlError.jsp</result></global-results><global-exception-mappings>  <exception-mapping exceptin="java.sql.SQLException" result="sqlError" />  <exception-mapping exception="java.lang.Exception" result="error" /></global-exception-mappings>

3.7 通配符映射

将多个彼此相似的映射关系简化成一个,允许使用多个通配符,如:

<action name="*_add" class="appl3a.book" method="add">   <resutl>/jsp/book.jsp</result></action>

所有*_add.action都将触发该动作,如book_add.action,author_add.action等等

再如:

<package name="wildcardMappingTest" namespace="/wild" extends="structs-defautl">  <action name="book_add" class="app03.book" method="add">     <result>/jsp/book.jsp</result>  </action>  <action name="book_edit" class="app03.book" method="edit">      <result>/jsp/book.jsp</result>  </action>  <action name="book_delete" class="app03.book" method="delete">      <result>/jsp/book.jsp</result>  </action>  <action name="author_add" class="app03.author" method="add">     <result>/jsp/author.jsp</result>  </action>  <action name="author_edit" class="app03.author" method="edit">     <result>/jsp/author.jsp</result>   </action>  <action name="author_delete" class="app03.author" method="delete">   <result>/jsp/author.jsp</result>  </action></package>

可将book_add,book_edit,book_delete合成book_* , 同理,可将book_add, author_add,合成*_add,所以上面6个action可合并成*_*, 如下所示:

<package name="wildcardMappingTest" namespace="/wild" extends="structs-default">   <action name="*_*" class="appo3a.{1}" method="{2}">       <result>/jsp/{1}.jsp</result>   </action></package>

如此,{1}可以取第一个*匹配的字符串,{2}取第二个*匹配的字符串,其中,{0}表示包含整个URI,*可以匹配0个或多个字符串,但不包括/字符,如果想将/包含在内,需要使用**,如果需要取得特殊字符,则需要转义。

注意:如果structs找到的通配符不止一个,最后找到的匹配符将胜出。,如果找到了多个匹配,没有使用通配符的将胜出,如

<package name="wildcardMappingTest" namespace="/wild" extends="structs-default">   <actio name="*_add" class=".."  method="add">       <resutl>...</result>   </action>   <actio name="*" class=".."  method="add">       <resutl>...</result>   </action>   <actio name="book_add" class=".."  method="add">       <resutl>...</result>   </action></package>

将优先执行最后一个action,如果没有最后一个action,将优先执行第二个action.

3.8 动态方法调用 ,!棒字符的使用

   动态调用 action里的方法,用!称为棒字符。如:

<action name="book" class="appo3a.book">

没有method属性,默认将调用 book类里的execute方法,但利用!可以调用该类里的其他方法,如值为/wild/book!edit.action将调用book类里的edit 方法

注:安全考虑,不要轻易运用!字符,由于可能开发者不想让用户调用一些隐藏的方法,默认情况下动态调用是激活状态,可以 修改structs.proproties或structs.xml将其设为false

<constant name="structs.enable.DynamicMethodIvocation" value="false" />


 



 


 

 








	
				
		
原创粉丝点击