struts2:lesson three:Annotation配置,实现request,session.application的四种方式,Result类型

使用注解来配置Action的最大好处就是可以实现零配置,但是事务都是有利有弊的,使用方便,维护起来就没那么方便了。

 

要使用注解方式,我们必须添加一个额外包:struts2-convention-plugin-2.x.x.jar。

 

虽说是零配置的,但struts.xml还是少不了的,配置如下:

 

<?xml version="1.0" encoding="UTF-8" ?> 

<!DOCTYPE struts PUBLIC 

    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" 

    "http://struts.apache.org/dtds/struts-2.1.7.dtd"> 

   

<struts>   

    <!-- 请求参数的编码方式--> 

    <constant name="struts.i18n.encoding" value="UTF-8"/> 

    <!-- 指定被struts2处理的请求后缀类型。多个用逗号隔开--> 

    <constant name="struts.action.extension" value="action,do,htm"/> 

    <!-- 当struts.xml改动后,是否重新加载。默认值为false(生产环境下使用),开发阶段最好打开  --> 

    <constant name="struts.configuration.xml.reload" value="true"/> 

    <!-- 是否使用struts的开发模式。开发模式会有更多的调试信息。默认值为false(生产环境下使用),开发阶段最好打开  --> 

    <constant name="struts.devMode" value="false"/>   

    <!-- 设置浏览器是否缓存静态内容。默认值为true(生产环境下使用),开发阶段最好关闭  --> 

    <constant name="struts.serve.static.browserCache" value="false" /> 

    <!-- 指定由spring负责action对象的创建    

    <constant name="struts.objectFactory" value="spring" /> 

    --> 

    <!-- 是否开启动态方法调用--> 

    <constant name="struts.enable.DynamicMethodInvocation" value="false"/> 

</struts> 

action类的注解:

 

 

package com.tjcyjd.web.action;   

   

import org.apache.struts2.convention.annotation.Action;   

import org.apache.struts2.convention.annotation.ExceptionMapping;   

import org.apache.struts2.convention.annotation.ExceptionMappings;   

import org.apache.struts2.convention.annotation.Namespace;   

import org.apache.struts2.convention.annotation.ParentPackage;   

import org.apache.struts2.convention.annotation.Result;   

import org.apache.struts2.convention.annotation.Results;   

   

import com.opensymphony.xwork2.ActionSupport;   

   

/** 

 * Struts2基于注解的Action配置

 *  

 */   

@ParentPackage("struts-default") 

@Namespace("/annotation_test") 

@Results( { @Result(name = "success", location = "/main.jsp"), 

        @Result(name = "error", location = "/error.jsp") }) 

@ExceptionMappings( { @ExceptionMapping(exception = "java.lange.RuntimeException", result = "error") }) 

public class LoginAction extends ActionSupport { 

    private static final long serialVersionUID = 2730268055700929183L;  

    private String loginName;   

    private String password;   

   

    @Action("login") //或者写成  @Action(value = "login")  

    public String login() throws Exception {   

   

        if ("yjd".equals(loginName) && "yjd".equals(password)) {   

            return SUCCESS;   

        } else {   

            return ERROR;   

        }   

    }   

    @Action(value = "add", results = { @Result(name = "success", location = "/index.jsp") })   

    public String add() throws Exception {   

        return SUCCESS;   

    }   

    public String getLoginName() {   

        return loginName;   

    }   

    public void setLoginName(String loginName) {   

        this.loginName = loginName;   

    }   

    public String getPassword() {   

        return password;   

    }   

    public void setPassword(String password) {   

        this.password= password;   

    }   

这样就完成了一个基于注解的action配置。

 

总结常用的注解如下:

 

Namespace:指定命名空间。

ParentPackage:指定父包。

Result:提供了Action结果的映射。(一个结果的映射)

Results:“Result”注解列表

ResultPath:指定结果页面的基路径。

Action:指定Action的访问URL。

Actions:“Action”注解列表。

ExceptionMapping:指定异常映射。(映射一个声明异常)

ExceptionMappings:一级声明异常的数组。

InterceptorRef:拦截器引用。

InterceptorRefs:拦截器引用组。

 

 

 

 

 

Action 实现request,session,application的四种方式

第一种,直接定义一个map request=(request)ActionContext.getContext.get("request");

                             map session=ActionContext.getContext.getSession();

                             map application=ActionContext.getContxt.getApplication();

第二种,实现 RequestAware,SesionAware,ApplicationAware 这三种接口 如下                           

   protected Map<String, Object> request;    

    protected Map<String, Object> session;    

    protected Map<String, Object> application;

    @Override     public void setRequest(Map<String, Object> request)     {         this.request = request;     }

    @Override     public void setSession(Map<String, Object> session)     {         this.session = session;     }

    @Override     public void setApplication(Map<String, Object> application)     {         this.application = application;     }

 

第三种方式:利用传统Servlet

   protected HttpServletRequest request=ServletActionContext.getrequest();

   protected HttpSession session=reuest.getsession();

   protected ServletContext  appliation=session.getcontext();

第四种方式:实现两个接口:ServletRequestAware,ServletContextAware

  protected HttpServletRequest request;   

  protected HttpSession session;    

  protected ServletContext application;

    @Override     public void setServletRequest(HttpServletRequest request)   

  {         this.request = request;         this.session = request.getSession();     }

    @Override     public void setServletContext(ServletContext context)   

  {         this.application = context;     }

 

 

Resulst类型

 chain   

      用来处理Action链,将一个action的执行与另外一个配置好的action串连起来。用第一个action的getter方法和第二个action的setter方法来完成action之间属性的复制。 

    com.opensymphony.xwork2.ActionChainResult  

 

dispatcher     

    用来转向JSP页面,这是默认的结果类型,假如在action配置中没有配置其他的结果类型,它就会被使用   

    org.apache.struts2.dispatcher.ServletDispatcherResult  


 

freemaker   

      处理FreeMarker模板   
      org.apache.struts2.views.freemarker.FreemarkerResult  

 

httpheader   

      控制非凡HTTP行为的结果类型     

    
org.apache.struts2.dispatcher.HttpHeaderResult  

 

redirect   

      重定向到一个URL     

     
org.apache.struts2.dispatcher.ServletRedirectResult  

 

redirectAction   

    重定向到一个Action   

   
org.apache.struts2.dispatcher.ServletActionRedirectResult  

 

stream   

      向浏览器发送InputSream对象,通常用来处理文件下载,还可用于返回AJAX数据   

     org.apache.struts2.dispatcher.StreamResult  


 

velocity   

      处理Velocity模板   

    
org.apache.struts2.dispatcher.VelocityResult  

 

xslt   

     处理XML/XLST模板   

     org.apache.struts2.views.xslt.XSLTResult  

 

plainText   

      显示原始文件内容,例如文件源代码   

    org.apache.struts2.dispatcher.PlainTextResult 

 

 

redirect-action   
      重定向到一个Action   
     org.apache.struts2.dispatcher.ServletActionRedirectResult  
 
plaintext   
     显示原始文件内容,例如文件源代码   
     org.apache.struts2.dispatcher.PlainTextResult 

注:redirect与redirect-action区别

一、使用redirect需要后缀名 使用redirect-action不需要后缀名

二、type="redirect" 的值可以转到其它命名空间下的action,而redirect-action只能转到同一命名空下的 action,因此它可以省略.action的后缀直接写action的名称。

如:

<result name="success" type="redirect">viewTask.action</result>

<result name="success" type="redirect-action">viewTask</result>

附:redirect-action 传送参数

Xml代码

  1. <action name="enterpreinfo" class="preinfoBusinessAction"    method="enterPreinfoSub">       
  2.   <result name="success" type="redirect-action">       
  3.      showpreinfo?preinfo.order_number=${preinfo.order_number}&amp;preinfo.company_name=${preinfo.company_name}        
  4.   </result>       
  5.  <result name="error" type="redirect">       
  6.     <param name="location">/error.jsp</param>       
  7.  </result>       
  8. </action>  

   因为使用了redirect-action,所以要注重不能将showpreinf?preinfo.order_number=${preinfo.order_number}写成showpreinf.action?preinfo.order_number=${preinfo.order_number}

其中${}为EL表达式,获得action:enterpreinfo中属性的值;在这个配置文件里,多个参数的连接符使用了"&amp;",但XML的语法规范,应该使用"&amp;"代替"&",原理和HTML中的转义相同.

redirect配置例子

<action   name= "delete "   class= "com.zeng.action.UserManageAction "   method= "delete ">
    <result   name= "success "   type= "redirect-action ">
        <param   name= "actionName "> list </param>
        <param   name= "pageBean.pageNumber "> ${pageBean.pageNumber} </param>
    </result>
</action>

或者

<action   name= "delete "   class= "com.zeng.action.UserManageAction "   method= "delete ">
    <result   type= "redirect "> list.action?pageBean.pageNumber=${pageBean.pageNumber} </result>

 

posted on 2013-05-10 20:32  peter.peng  阅读(200)  评论(0编辑  收藏  举报