深入Struts2(二)

主要从下面几个方面讲解
- 访问Servlet API
- Action搜索顺序
- 动态方法调用
- 指定多个配置文件
- 默认Action
- Struts2后缀
- 接收参数
- 处理结果类型

1. 访问Servlet API

Struts2提供了三种方式去访问Servlet API:
1. ActionContext

  1. 实现***Aware接口

  2. ServletActionContext

2. Action搜索顺序

http://localhost:8080/struts2/path1/path2/path3/student.action

第一步:判断package是否存在,如:path1/path2/path3/

存在的情况

第二步:判断action是否存在,如果不存在则去默认namespace的package里面寻找action

第三步:如果没有,则报错

不存在的情况

第二步:检测上一级路径的package是否存在(直到默认namespace),重复第一步

第三步:如果没有,则报错

3. 动态方法调用

为了解决一个Action对应多个请求的处理,以免Action太多。

三种方式:
1. 指定method属性

  1. 感叹号方式
<!-- 让struts2支持动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
  1. 通配符方式

4. 指定多个配置文件

使用include指令包含多个文件

<include file="login.xml"></include>
<include file="system.xml"></include>

5. 默认Action

6. Struts2后缀

在struts.xml中配置

<constant name="struts.action.extension" value="html"></constant>

在struts.properties中配置

struts.action.extension=do,action,html,

在web.xml中配置

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>      
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    </filter-class>
    <init-param>
        <param-name>struts.action.extension</param-name>
        <param-value>do</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

7. 接收参数

  1. 使用Action的属性接收参数

需要提供get、set方法,属性名和前端页面的表单中name一致

  1. 使用DomainModel接收参数
    提供实体类get、set方法,前端实体类名.属性名(user.username)

  2. 使用ModelDriven接收参数(==推荐==)

    • 继承ModelDriven(T为需要封装的实体类)

    • 提供实体类的get、set方法,在getModel()中实例化该类的实例

    • 前端直接使用属性名(username)提交

8. 处理结果类型

Struts2处理流程:

用户请求–>Struts框架–>控制器(Action)–>Struts2框架–>视图资源

处理结果是==字符串==

Struts1和Struts2区别:
1. Struts1返回的处理结果是ActionForward类
2. Struts2返回的处理结果是String字符串

Struts2相对于Struts1的优点:
- 提供代码复用性
- 有利于框架分离

<!-- result元素中name就是result的逻辑视图名称 -->
<result name="success">/success.jsp</result>

<!-- 如果省略了name属性,系统将采用默认的name属性值,默认的name值是success -->
<result>/success.jsp</result>

内置属性(字符串常量):

==com.opensymphony.xwork2.Action==
- SUCCESS:Action正确的执行完成,返回相应的视图,success是name属性的默认值
- NONE:表示Action正确的执行完成,但并不返回任何视图
- ERROR:表示Action执行失败,返回到错误处理视图
- LOGIN:Action因为用户满意登录的原因没有正确执行,将返回该登录视图,要求用户进行登录验证
- INPUT:Action的执行,需要从前端页面获取参数,IINPUT就是代表这个参数输入的界面,一般在应用中,会对这些参数进行验证,如果验证没有通过,将自动返回到该视图。

result标签

处理结果是通过在struts.xml使用标签配置结果。根据位置的不同,分为两种结果:

  • 局部结果:将作为元素的子元素配置
  • 全局结果:将作为元素的子元素配置

result子标签param

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

子标签具有两个属性:
1. location:该属性定义了该视图对应的实际视图资源
2. parse:该参数指定是否可以在实际视图名字中使用OGNL表达式,Struts2框架默认该属性为true,即支持OGNL表达式。
例子如下:

<result name="add">
    <param name="location">/{2}.jsp</param>
    <param name="parse">false</param>
</result>

type属性

Result还有一个最重要的属性type,Struts2支持多种视图技术,例如JSP、Valocity、FreeMarker等,当我们没有定义type的时候,默认值为==dispatcher==,这个类型支持JSP视图技术。

struts-default中有支持如下result的type属性:

<result-types>
    <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
    <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
    <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
    <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
    <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
    <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
    <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
    <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
    <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
    <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
    <result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult" />
</result-types>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值