Struts2-Action概述和在Action中访问WEB资源

来源:互联网 发布:淘宝学历提升是真的吗 编辑:程序博客网 时间:2024/04/29 18:10

  前边讲过了Struts2概述,今天来讲一讲Struts2中在struts.xml配置文件中用到的用于反射创建对象和提供操作方法的Action类,还有在Action类中如何访问WEB资源。

  1.Action类

  我们知道在struts.xml配置文件中,每个action节点都有一个class属性,要填写上用于处理action请求的处理类的全类名。

  创建一个Action类需要满足什么条件呢?这个Action类可以使任何一个普通的Java类,类中必须包含一个无参的构造器(用于反射创建对象)、至少一个处理action请求的方法、多个属性(和表单参数一一对应且需符合JavaBean的属性命名规则,属性类型可以任意,因为非字符串到字符串的转换自动发生)。

  2.在Action类中访问WEB资源

  ①WEB资源:是指在访问WEB程序时产生的一些源生的Servlet的API,如HttpServletRequest、HttpSession、ServletContext等。

  ②为何访问WEB资源:我们做的WEB项目都是B/S架构的,所以无可避免的必须访问WEB资源,如从域对象中读取属性、获取cookie、获取realPath等。

  ③如何访问WEB资源

  大体上分为两类,一是通过和Servlet解耦的方式,二是通过和Servlet耦合的方式。

  解耦的方式又可以分为两类,通过ActionContext访问预对象对应的Map;通过Action类实现XXXAware接口来访问WEB资源。

  通过ActionContext:我们知道每个action请求都会对应一个Action类的实例,同时都有一个ActionContext的对象可用于获取域对象对应的Map。我们通过ActionContext的静态方法getContext()先获取这个Actioncontext对象,然后通过AcctionContext对象获取域对象对应的Map,四种getSession(),getApplication(),get("request"),getParameters(),返回各自对应的Map<String,Object>对象。其中需要注意的是我们可以将Session对应的Map转换成(SessionMap),然后调用invalidate()方法是这个session失效。

  通过实现XXXAware接口的方法来访问WEB资源:实现的接口有四种,ApplicationAware,SessionAware,RequestAware,ParameterAware。实现接口之后定义一个私有变冷了private Map<String,Object> requestMap,会重写setRequest(Map request)方法(以RequestMap来举例),这个方法会被Struts2框架自动调用,相当于将Struts2框架封装好的RequestMap框架注入到这个Action类中,就可以使用了。

  耦合的方式也可以分为两种:使用ServletActionContext和实现ServletXXXAware接口。

  使用ServletActionContext:和上边使用ActionContext的方式基本一致。

  实现ServletXXXAware接口:和上边的实现XXXAware接口的方式基本一致。

  需要注意的是:

  ① 解耦的方式获取的仅仅是Struts2框架帮助我们将域对象封装成的Map集合,这些集合中key对应的对象是无法像源生的WEB域对象那样有很多方法的。而通过和Servlet耦合的方式获取的WEB对象,就是源生的Servlet的域对象,拥有完整的Servlet域对象的方法,如getRealPath()等。解耦和耦合的使用情况需要看你的需求来定。

  ② 同时,使用(Servlet)ActionContext和实现(Servlet)XXXAware接口这两种方式也要分情况:因为Servlet)ActionContext只能在Action方法中使用,所以当一个Action中有多个用于处理请求的action方法时,我们用实现接口的方式比较方便,这样就不必再每个方法中都通过(Servlet)ActionContext.getContext()方法来获取对象了。






















  

原创粉丝点击