Struts2技术详解(转)

1, 当Action设置了某个属性后,Struts将这些属性封装一个叫做Struts.valueStack的属性里。获取valueStack对象: ValueStack vs = (ValueStack) request.getAttribute("struts.valueStack");
   调用ValueStack 的vs.findValue("books")方法(books为Action中的属性);

2, struts2的Action类是一个普通的POJO类(通常包含一个无参的execute方法)从而很 好的重用代码。

4,struts2通常直接使用Action来封装HTTP请求参数,所以Action中要定义与请求参数对应的属性,并且为该属性提供相应的 getter和setter方法。

5,即使Action需要处理的请求name和pass两个HTTP请求参数,Action类也可以不包含name和pass属性,因为系统是通过对应的 getter和setter方法来处理请求参数。而不是通过属性来处理请求参数的。所以Action类是否包含name和pass属性不重要, 重要的是需要setter和getter方法。

6,Action类的属性,不仅可以封装请求参数,还可以用于封装处理结果,通过Struts2标签来输出对应的属性值。如 。

7,ActionContext类。Struts2的Action并未直接与任何Servlet api耦合,从而更加方便测试该Action(可以通过脱离web容器测试Action)。但是对于Web应用的控制器来说,不访问Servlet api 几乎是不能的。例如跟踪HTTP session状态等。访问的Servlet Api 就 是HttpServeltRequest、HttpSession、ServletContext,这三个类分别jsp内置对象中的request、session、application。Web应用中提供了一个ActionContext类,Struts2的Action可以通过该类来访问Servlet api。
该类的ActionContext提供getContext方法得到ActionContext实例,
  该类的方法:
   ①Object get(Object key),该方法类似于HttpServletRequest的getAttribute(String name)方法;
   ②Map getApplication(),返回Map对象,该对象模拟了应用的ServletContext的实例
   ③static ActionContext getContext(),静态方法,获得系统提供的ActionContext实例。
   ④Map getParameters()获取所有的请求参数,类似于调用HttpServletRequest对象的getParammeterMap方法。
   ⑤Map getSession()该Map对象模拟了HttpSession实例。
   ⑥void setApplication(Map application)直接传入一个Map实例,将该Map实例的key-value对转换成application的属性名、属性值。类似的还有setSession(Map session)
   ⑦put(Object key, Object value)直接为HttpServletRequest设置属性。相当于request.setAttribute(key,value).可通过EL表达式输出。

8,ServletActionContext类(是ActionContext类的子类)。 虽然Struts2提供了ActionContext来访问Servlet Api,但是这种访问毕竟不能直接获得Servlet Api实例,为了Action中 直接访问Servlet api,Struts2提供了如下的接口:ServletContextAware、ServletRequestAware、ServletResponseAware 。如果Action实现这些接口,能分别直接访问用户请求的ServletContext、HttpServletRequest、HttpServletResponse实例。
  并且,为了直接访问Servlet api。Struts2提供了一个ServletAction类。通过ServletActionContext类可以更加方便的地直接访问Servlet api。这类的主要方法(全是static):
   ①getActionContext(HttpServletRequest req)得到当前的ActionContext实例。
   ②getActionMapping()得到ActionMapping实例(得到 action mapping为context)。
   ③getRequest()得到HttpServletRequest实例(Gets the HTTP servlet request object)。
   ④getResponse()得到HttpServletResponse实例(Gets the HTTP servlet response object.)
   ⑤getServletContext()得到ServletAction实例(Gets the servlet context.)
   ⑥getValueStack(HttpServletRequest req)得到ValueStack实例。
   ⑦setRequest(HttpServletRequest request)(Sets the HTTP servlet request object)相应的有setResponse(HttpServletResponse response)、setServletContext(ServletContext servletContext)。

9,虽然可以在Action类获取HttpServletResponse,但如果希望通过HttpServletResponse来生成服务器响应是不可能的,因为Action只是控制器(它并不直接对浏览器生成任何相应)。即如果在Action中写如下代码:response.getWriter().println("hello world");
是没有意义的。

10,对于使用Struts2框架的应用而言,尽量不要让超级链接链接到某个视图资源,
因为这种方式增加了额外的风险,推荐将所有请求都发给Struts2框架,让该框架来处理用户的请求,
即使是简单的超级链接。

11,逻辑视图名是指:Action返回的字符串;物理视图是指:页面的实际名称。
Struts2通过配置逻辑视图名和物理视图之间的映射关系,一旦系统收到Action返回的某个逻辑视图,系统就会把相应的物理视图呈现给用户。

12,默认值:如果配置元素时没有指定location参数,系统将会把...中间的字符串当成实际视图资源。如果没有配置parse参数,则默认值为true(该参数指定实际视图名是否可以使用OGNL表达式);如果没有指定name属性则默认值为Struts2的默认处理结果类型(dispacher).

13,归纳起来,Struts2内建支持结果类型如下(14):
   ①chain结果类型:Action链式处理结果类型。
   ②chart结果类型:用于整合JFreeChart的结果类型。
   ③dispatch结果类型:用于jsp整合的结果类型。
   ④freemarker结果类型:FreeaMarker整合的结果类型。
   ⑤httpheader结果类型:用于控制Http行为的结果类型。   
   ⑥jasper结果类型:用于JasperReports整合的结果类型。
   ⑦jsf结果类型:用于整合JSF整合的结果类型。
   ⑧redirect结果类型:用于直接跳转到其他的URI的结果类型。
   ⑨redirectAction结果类型:用于直接跳转到其他的Action的结果类型。
   ⑩stream结果类型:用于向浏览器返回一个InputStream(一般用于文件下载)。
   ⑾tiles结果类型:用于与Tiles整合的结果类型。
   ⑿velocity结果类型:用于与Velocity整合的结果类型。
   ⒀xslt结果类型:用于与XML/XSLT整合的结果类型。
   ⒁plainText结果类型:用于显示某个页面的原始代码的结果类型。

14,【redirect】结果类型。
   这种结果类型与dispatch结果类型相对,dispatch结果类型是将请求Forward(转发)
到指定的jsp资源。而redirect结果类型,则意味着将请求Redirect(重定向)
到指定的视图资源。
   dispatch结果类型与redirect结果类型的差别就是转发和重定向的差别:
重定向会丢失所有的请求参数和请求属性---当然也会丢失Action的处理结果。
   使用redirect结果类型的效果是:系统将调用HttpServletResponse的sendRedirect(String)方法来重定向指定的视图资源,这种重定向的效果就是重新产生一个请求。所以所有的请求参数、请求属性、Action实例和Action中封装的属性全部丢失。

15,【redirectAction】结果类型.
   使用redirectAction结果类型时,系统将重新生成一个新的请求,
只是该请求的URI不是一个具体的试图资源,而是一个Action。因此前一个Action处理结果
,请求参数,请求参数都会丢失。

16,除了可以通过通配符来配置Action(result),还可以使用OGNL表达式,这种
用法允许让请求参数来决定结果
。如:

/..jsp
edit.action?skillName=${currentSkill.name}

对于上面的表达式语法,要求对应的Action实例里应该包含currentSkill属性,且currentSkill属性必须包含name属性--否则,${currentSkill.name}表达式为null。

17,模型驱动:
对于Struts1的ActionForm对象而言。它的唯一作用就是封装请求参数,当Struts1拦截到用户的请求后,Struts1负责将请求参数封装成ActionForm对象。
如果Struts2的开发者怀念这种开发方式,则可以使用Struts2提供的模型驱动模式,
这种模式也通过专门的JavaBean来封装请求参数。
    相比于Struts1的Action类,Struts2的Action承担了太多的责任,既用于封装来回请求的参数,也保护了控制逻辑---这种模式实在不太清晰。出于清晰的考虑,应该采用单独的Model实例来封装请求参数和处理结果,这就是所谓的模型驱动。
   作用:Struts2的模型对象可以封装更多的信息,它不仅可以封装用户的请求参数,而且还可以封装Action的处理结果。用单独的JavaBean实例来贯穿MVC流程。
   使用模型驱动时,Action必须实现ModelDriven接口,且必须实现getModel方法,
该方法用于把Action和与之相对应的Model实例关联起来。
    简单的说,模型驱动使用单独的VO(值对象)来封装请求参数和处理结果。

18,【属性驱动】:
使用属性(Property)作为贯穿MVC流程的信息携带者,当然属性无法独立存在,他必须依附于一个对象,这个对象就是Action实例,
    简单的说,属性驱动使用Action实例来封装请求参数和处理结果。

19,Struts2的【处理异常机制】:
   在execute方法中手动捕捉异常,当捕捉到特定的异常时,返回特定的视图--但是
这种方式很是繁琐,需要在execute中书写大量的catch块,最大的缺点
还在于异常与代码耦合,一旦需要改变异常处理方式,必须修改代码!
   Struts2提供了一种声明式的异常处理方式。
在输出错误信息的jsp页面,有两种输出方式:
   ①通过struts2标签输出异常对象的message属性。。
   ②通过struts2标签输出堆栈信息。。
注意:全局异常映射的result属性通常不要使用局部结果,局部异常映射的result属性可以使用全局结果,也可以不使用。

20,对于WEB应用而言,所有的请求参数都是字符串类型的。

21,【类型转换器】:
struts2的类型转换器实际上是基于OGNL实现的,在OGNL项目中有一个TypeConverter接口,因其实现的方法过于麻烦,所以OGNL项目还提供了一个该接口的实现类:DefaultTypeConverter,通过继承该类来实现自己的转换器。
  实现自定义的类型转换需要重写DefaultTypeConverter类的convertValue方法。

22,上面的类型转换器都是基于OGNL的DefaultTypeConverter类实现的,基于
该类实现类型转换器的时候时,将字符串转化成符合类型要通过convertValue方法实现
因此我们必须先通过toType参数来判断转换的方向,然后分别实现不同的转换逻辑。
  为了简化类型转换的实现,struts2提供了一个StrutsTypeConverter抽象类(基于struts2的类转换器)
这个抽象类是DefaultTypeConverter类的子类.

23,对于以上的类型转换,我们一直只处理字符串数组的第一个元素---我们都假设请求参数是单个值。实际上,必须考虑请求参数是字符数组的情形, 假设用户信息的请求参数,名称都是user。那么这两个请求参数必须通过getParameterValues方法来获取参数。此时user请求参数必须是数组类型,或者List类型(实际上,List和数组是完全相通的)。

24,因为struts2内建的OGNL表达式的支持,那么可以用另一种方式将请求参数转换成复合类型,如(JSP页面中):
,这样就不需要转换器了。
  通过这种方式也可以把字符串转换成复合类型。但需要注意以下几点:
    ①因为struts2是需要直接创建一个复合类(User类)的实例,因此系统必须为该复合类构建一个无参的构造方法。
    ②如果希望使用user.name请求参数的形式为Action实例的user属性和pass属性赋值,则必须为user属性对应的复合类型提供setName方法,因为struts2是通过该方法类为属性赋值的。当然Action类还应该包含setUser方法。

25,表单元素enctype属性指定的是表单数据的编码方式。属性有如下3个值:
    ①application/x-www-form-urlencoded:这是默认的编码方式。它只处理表单中的value属性值,采用这种编码方式会将表单域的值处理成URL编码方式。
    ②multipart/form-data:这种编码方式会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定的文件内容也封装到请求参数里。
    ③text/plain:这种编码方式当表单的action的属性为mailto:URL的形式时比较方便,这种方式主要适用于直接通过表单发送邮件的方式。

26,通过Action在jsp页面输出提示信息,我们可以
   ①在Action中添加一个属性(通过setXx方法设置属性值),然后通过struts2的标签()在jsp页面输出。
   ②通过ActionContext类来处理,如:ActionContext.getContext.put(key,value);然后通过EL表达式进行输出。

27,在Form表单中action属性的值要得到【上下文路径】:
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值