`

struts2学习

阅读更多
4.包配置

包的属性 name |extends | namespace |abstract

struts2的配置文件是从上到下处理的,所以父包应该在子包前面。

抽象包不能有Action的定义。

如果没有为包指定命名空间,包使用默认的命名空间””

当某个包指定命名空间后包下所有的Action处理的URL应该是命名空间+ACTION名。

<package namespage=”/book” extends=”struts-default” name=”get”>

  <action name=”getBook” class=”com.strutstest.GetBookAction”>

            <result name=”success”>showbook.jsp</result>

  </action>

</package>

访问该包里的getBook的Action的路径是(web应用的名称是strutstest)

http://localhost:8080/strutstest/book/getBook.action

如果请求为/book/getBook.action系统查找/book的命名空间对应的getBook的action

如果找不到,系统将会在默认命名空间里面找。如果找不到就出现系统错误。

如果请求为/login.action系统会在根命名空间”/”中查找名为login的action

如果找不到,系统将会在默认命名空间里面找。如果找不到就出现系统错误。



默认命名空间是”” 根命名空间是”/”

命名空间只有一个级别。



5.拦截器配置

拦截器结构

<interceptors>

<interceptor name=”拦截器名” class=”拦截器类名”/>

        <interceptor-stack  name=”拦截栈名”>

                            <interceptor-ref  name=”外面定义的拦截名”/>

                   </interceptor-stack>

     </interceptors>

   

Action中使用拦截器配置

<action name=”MyAction” class=”yilin.MyAction”>

<result name=”success”>myresult.jsp</result>

<interceptor-ref  name=”上面定义的拦截器名或者拦截栈名”/>

</action>



6.ActionSupport类解剖



public class ActionSupport implements Action,Validateable,ValidationAware,TextProvider,

LocaleProvider,Serializable



Action接口

public interface Action

{

                   public static final String ERROR=”error”;

                   public static final String INPUT=”input”;

                   public static final String LOGIN=”login”;

                   public static final String NONE=”none”;

                   public static final String SUCCESS=”success”;

                   public String execute ()throws Exception;

}



Validateable接口

public abstract interface Validateable

{

 

   public abstract void validate();

}

ValidationAware 接口

public abstract interface com.opensymphony.xwork2.ValidationAware

{

  //收集校验错误的方法

  public abstract void setActionErrors(java.util.Collection arg0);

  //返回校验错误的方法

  public abstract java.util.Collection getActionErrors();

//普通ACTION信息的集合

  public abstract void setActionMessages(java.util.Collection arg0);

  public abstract java.util.Collection getActionMessages();

//字段错误信息的集合

  public abstract void setFieldErrors(java.util.Map arg0);

  public abstract java.util.Map getFieldErrors();

//添加错误信息

  public abstract void addActionError(java.lang.String arg0);

  public abstract void addActionMessage(java.lang.String arg0);

  public abstract void addFieldError(java.lang.String arg0, java.lang.String arg1);

  public abstract boolean hasActionErrors();

public abstract boolean hasActionMessages();

  public abstract boolean hasErrors();

  public abstract boolean hasFieldErrors();

}

LocaleProvider接口

public abstract interface com.opensymphony.xwork2.LocaleProvider

{

//控制Locale的相关信息

  public abstract java.util.Locale getLocale();

}



TextProvider接口

public abstract interface com.opensymphony.xwork2.TextProvider

{

//返回国际化信息的方法

   public abstract java.lang.String getText(java.lang.String arg0);

   public abstract java.lang.String getText(java.lang.String arg0, java.lang.String arg1);

   public abstract java.lang.String getText(java.lang.String arg0, java.lang.String arg1, java.lang.String arg2);

   public abstract java.lang.String getText(java.lang.String arg0, java.util.List arg1);

   public abstract java.lang.String getText(java.lang.String arg0, java.lang.String[] arg1);

   public abstract java.lang.String getText(java.lang.String arg0, java.lang.String arg1, java.util.List arg2);

   public abstract java.lang.String getText(java.lang.String arg0, java.lang.String arg1, java.lang.String[] arg2);

   public abstract java.lang.String getText(java.lang.String arg0, java.lang.String arg1, java.util.List arg2, com.opensymphony.xwork2.util.ValueStack arg3);

   public abstract java.lang.String getText(java.lang.String arg0, java.lang.String arg1, java.lang.String[] arg2, com.opensymphony.xwork2.util.ValueStack arg3);

//返回国际化资源包的方法

   public abstract java.util.ResourceBundle getTexts(java.lang.String arg0);

   public abstract java.util.ResourceBundle getTexts();

}



7.ActoinContext类

static ActionContext getContext();获取系统的ActionContext实例

Object get(Object key)类似调用HttpServletRequest的getAttribute(String name)方法

Map getApplication();模拟ServletContext实例。

void setApplication(Map application)

Map getParameters();获取所有的请求参数。类似于调用HttpServletRequest对象的getParameterMap方法。

Map getSession();模拟HttpSession实例。

void setSession(Map session);

好处是与容器解藕。



8.ServletActionContext 类,用来返回容器的对象

static PageContext getPageContext();

static HttpServletRequest getRequest();

static HttpServletResponse getResponse();

static ServletConext getServletContext();

缺点,与容器耦合,优点,可以操作容器对象。更加方便。

必须指出,虽然可以在Acation类中获取HttpServletResponse;但是不能通过它来生成服务器的相应。

9.ServletResponseAware接口

通过实现此接口的setServletResponse(HttpServletResponse response)的方法,可以获取HttpServletResponse对象。

由于Action不能用Response对象来生成服务器相应,但是可以通过该对象来设置COOKIE。



10.Action配置详解



10.1  ACTION 属性 name|class|method

在设置name属性时,不要为在name中加入”.”或”-”,可能会引发一些异常.

在设置name属性时如果需要在name属性中使用”/”,则必须配置常量:

struts.enable.SlashesInActionNames=true

class属性不是必需的.如果我们不为<action>元素指定class属性,系统则默认使用系统的ActionSupport类,该类的execute方法默认返回SUCCESS;



10.2  动态方法调用一

1.配置STRUTS2常量

struts.enable.Dynamic.MethodInvocation=true

2.通过在页面设置form的action属性:

<form action=”ActionName!methodName.action”>

如<form action=”Login!login.action”>

javascript 代码

function register()

{

  this.form.action = “Login!register.action”;

  this.form.submit();

}

10.3为action元素配置method属性将一个action类映射到多个逻辑action元素

<action name=”login” class=”struts.LoginAction”>

  <result name=”success”….../ >

<result name=”error”….../ >

</action>

<action name=”register” class=”struts.LoginAction” method=”register”>

……

</action>

10.4 在action中使用通配符(动态方法调用二)

    在action元素中的属性,result子元素都可以设置通配符

         <action name=”*Action” class=”lee.LoginAction” method={1}>

         ……

         </action>

有时需要在classs属性和method属性同时使用表达式

         <action name=”*_*” method={2} class=”actions.{1}”>

     利用通配符返回对应的jsp页面

         <action  name=”*”>

     <result>/{1}.jsp</result>

多个匹配结果的处理方式:

如果有URL为abcAction.action的请求,如果struts.xml文件中有名为abcAction的action元素则由此action处理,如果没有,则才去匹配有通配符”*Action”或者”*”的action.排在前面的action元素先匹配.我们应该把名为”*”的action排在最后面.



10.5 默认的Action

<default-action-ref name=”一个有效的action的名”/>



11.配置结果

局部结果:将<result …/>作为<action…/>的子元素

全局结果:将<result…/>作为<global-results…/>的子元素

result属性 name|type

result子元素 param

  子元素属性 name(location|parse)

eg

  <result name=”success” type=”dispatcher”>//type默认就是dispatcher

  <param name=”location”>/thank.jsp</param>

//通常无需要设置param所以直接输出/thank.jsp就可以

  </result>

从struts-default.xml中可以看到dispatcher是默认的

<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>

struts2内建的结果类型:

chain: action链式处理的结果类型

chart:用于整合JFreeChart的结果类型

dispatcher:jsp整合的结果类型

freemarker:Freemarker整合的结果类型

httpheader:控制特殊的HTTP行为的结果类型

jasper:用于JasperReports整合的结果类型

jsf:用于JSF整合的结果类型

redirect:用于直接跳转到其他URL的结果类型

redirect-action:用于直接跳转到其他ACTION的结果类型

stream:用于向浏览器返回一个InputStream(用于文件下载)

tiles:用于与Tiles整合的结果类型

velocity:用于与Velocity整合的结果类型

xslt:用于与XML/XSLT整合

plaintext:用于现实某个页面的原始代码的结果类型.这种结果类型一般用来从页面发送邮件.



plaintext类型详解

STRUTS2允许为plaintext设置相应的编码

eg <result type=”plaintext”>

<param name=”location”>go.jsp</param>

<param name=”charSet”>GBK</param>

</result>

redirect-action类型详解

配置redirect-action的参数

actionName 重定向的action的名

namespace 重定向的action的命名空间



redirect 与 redirect-action两种结果类型都是重新生成一个新的请求,区别是前者通常用于生成一个对具体资源的请求,而后者通常用于生成一个对其他ACTION的请求.两个结果类型都会丢失请求参数,请求属性以及前一个ACTION的处理结果.



动态视图结果

配置<result…/>时可以通过OGNL表达式来${属性名.属性名.属性名}

<result type=”redirect”>eidt.action?skillName=${currentSkill.name}</result>

<result name=”success”>/${target}.jsp</result>

其中currentSkill和target必须是action的属性名.也就是说action必须提供currentSkill和target的getter和setter



全局结果

         <struts>

                   <package name=”lee” extends=”struts-default”>

                            <global-results>

                            <result name=”success”>${target}.jsp</result>

                            </global-results>

                   </package>

                   <action …>….</action>

         </struts>



12模型驱动与属性驱动



模型驱动利用javaBean来封装请求参数和处理结果

属性驱动是直接在action中封装请求参数和处理结果.



模型驱动必须实现ModelDriven接口

public class xxxAction implements Action,ModelDriven

{

  public String execute()throws Exception

  {…}

  public Object getModel()

  {…}

}

struts-default.xml中

<interceptor name="model-driven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>

struts2通过model-driven拦截器将请求参数封装到模型驱动的(model)JAVABEAN中

<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>

struts2通过params拦截器将请求参数封装到属性驱动的ACTION中



13异常处理

   struts2通过声明式异常捕获和处理

局部异常映射:

将<exception-mapping …/>作为<action…/>子元素

全局异常映射:

将<exception-mapping …/>作为<global-exception-mappings>的子元素

exception-mapping的属性

  exception|result

exception :异常类型

result:出异常时系统转入result属性所指向的结果

<struts>

<package name=”pack” extends=”struts-default”>

         <global-results>

                   <result name=”sql”>/exception.jsp</result>

                   <result name=”root”>/exception.jsp</result>

         </global-result>

         <global-exception-mappings>

                   <exception-mapping exception=”java.sql.SQLException” result=”sql”/>

                   <exception-mapping exception=”java.lang.Exception” result=”root”/>

         <global-exception-mappings>

         <action name=”login” class=”yilin.LoginAction”>

                   <result name=”my”>/exception.jsp</result>

                   <result name=”success”>/go.jsp</result>

<exception-mapping exception=”yilin.MyCustomException” result=”my”/>

         </action>

</package>

</struts>

输出异常

<s:property value=”exception”/>输出异常对象本身

<s:property value=”exception.message”/>输出异常信息

<s:property value=”exceptionStack”/>输出异常堆栈信息



struts-default.xml中定义的exception异常拦截器

<interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics