Struts2框架的总结一------Action&Result

根据视频及自己的学习进行的总结,以备以后利用查看。

Struts2的知识概览

  • Action
    • nameSpace
    • path
    • action类的编写
    • DMI
    • 配置文件通配符的使用
    • 参数传递
    • 访问页面元素
  • Result

    • 结果类型
    • 全局结果
    • 动态结果
  • OGNL表达式

    • $ # % 区别
  • Struts标签

    • UI标签
    • 通用标签
    • 控制标签
  • 声明式异常处理

  • i18N

  • Interceptor原理

  • Convert

    • 默认类型的转换器
    • 自定义类型转换器

————————————– 华丽的分隔符 ————————————————–

Action

 <package name="default" namespace="/Student" extends="struts-default">

Namespace:建议为”/”或者指定 ,他的作用是可以将不同的模块进行分类管理,一个配置文件中可以有多个package标签。
class:action标签中一般都是存在class属性指定对应的action类,如果不指定,则是默认依赖的 Actionsupport类,而actionsupport则依赖xwork框架,去xwork中查询。
Path:对于路径的问题,建议采用绝对路径进行处理,在我们将我们的项目部署到服务器时,相应的src则会对应到WEB-INF下的classes目录中,一些配置文件也是存放到WEB-INF中。在jsp页面添加如下代码,获取绝对路径,使用MyEclipse则会自动生成。

<%
    String path = request.getContextPath(); 
    String basePath =          
        request.getScheme()+"://"              //http
        +request.getServerName()+":"           //localhost
        +request.getServerPort()               //8080
        +path+"/";                             //项目的名称
%>
 <base href="<%=basePath %>">  //全局变量的引用

action类的编写:action类的编写有三种方式
a.自己编写类必须存在execute方法
b. 实现action接口,重写excute 方法
c. 继承actionsupport类 (企业开发用,因为里面封装了很多方法,方便,也实现了action接口)
Struts1与Struts2的重要区别之一: Struts1公用一个action对象,Struts2则是调用一次申请一次。

DMI:Action执行并不一定要执行execute方法,可以在struts.xml配置文件中进行action的method属性配置,但是这样会产生过多的action,所以不建议使用。DMI则是动态方法调用,是在url中动态指定的,建议使用。在struts.xml配置文件中引入以下代码,进行打开DMI 功能。默认是关闭

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

配置文件通配符的使用:使用通配符的目的主要是使配置量将到最低,具体还是看项目安排,但是通配符的使用,一定要遵循“约定优于配置”的原则。

 <package name="default" extends="struts-default"  namespace="/path" >
         <action name="Student*" class="com.wf.action.StudentAction" method="{1}">
            <result name="succ">/WEB-INF/jsp/Student_{1}.jsp</result> 
        </action> 
        <action name="*_*" class="com.wf.action.{1}Action" method="{2}">
            <result name="succ">/WEB-INF/jsp/{1}_{2}.jsp</result> 
        </action>
  </package>   
  <!--使用通配符*,进行action选择的匹配,Student*则会匹配带类似于Studentadd,Studentdelete等请求,而对于后面的{1}{2},则是对通配符进行选择,{1}表示第一个*代表的内容,{2}表示第二个*代表的内容。-->

需要注意的一点是匹配的优先权
(1)如果struts.xml里面有对应的action name .就算它有其他通配符匹配的,都优先对应完全相同的.
比如 有一个 action name 是 “user_add” 还有一个是 “user_*” .现在,来一个请求是 “user_add.action ” .那么,它会优先匹配”user_add ” //优先匹配精度高的
(2)如果一个action name对应于两个带通配符的action name 那么,需要看这个配置谁在前面.它匹配写在前面的。比如 有一个 action name 是 “_” 还有一个是 “user_*” .现在,来一个请求是 “user_add.action ” .那么,它会优先匹配写在前面的… 任何带”*”的action name 优先权都是一样的…看位置决定,谁在前面利用谁。
参数传递:三种方式
方法一 :在action中设置私有变量,利用get 和set方法获取
方法二 :Model模型接收参数(当Model模型的参数与传递的参数不同时,我们可以利用DTO(vo/do)来进行转化)
方法三:action类实现ModelDriver接口(ModelDriver接口会自动将参数封装成Model对象,然后进行调用,非常不常用,但是体现了一种思想MVC的M)

访问页面元素:Strut2与页面进行交互数据的传递最常用的六种: request、Session、application,httpservletRequest、HttpSession、ServletContext。
常用的数据交互方式也是有四种:
1. 利用Struts2提供的ActionContext来进行获取 (前三种)

        private Map request;
        private Map session;
        private Map application;
        request = (Map) ActionContext.getContext().get("request");
        session = ActionContext.getContext().getSession();
        application = ActionContext.getContext().getApplication(); //可以写在构造函数中进行初始化

2.利用实现接口RequestAware,sessionAware,applicationAware接口实现(前三种,重点记忆)

    private Map<String,Object> request;
    private Map<String,Object> session;
    private Map<String,Object> application;

    public void setApplication(Map<String, Object> arg0) {
        this.application=arg0;
    }
    public void setSession(Map<String, Object> arg0) {
        this.session=arg0;
    }
    public void setRequest(Map<String, Object> arg0) {
        this.request = arg0;
    }
    在实现了上述接口之后,会重写三个方法,然后就可以直接进行使用,利用上述重写进行赋值

3 利用Struts2提供的ServletActionContext来进行获取(后三种)

        private HttpServletRequest request;
        private HttpSession session;
        private ServletContext application;

        request = ServletActionContext.getRequest();
        session = request.getSession();
        application = session.getServletContext();  //可以写在构造函数中进行初始化

4 利用接口ServletRequestAware来实现(后三种)

private HttpServletRequest request;
    private HttpSession session;
    private ServletContext application; 
    public void setServletRequest(HttpServletRequest request) {
            this.request = request;
            session = request.getSession();
            application = session.getServletContext();
    }
//实现接口重写上述方法,进行设定

Result

结果类型:result标签主要是用在配置文件中的action返回结果,其中返回类型包括:dispatchredirectchainredirectActionfreemarkerhttpHeaderstreamvelocityxsltplaintexttiles等十一种,最最重要的斜体的四种:
dispatch:在不设置type的时候,默认的是dispatch,url显示action名称
redirect:直接跳转,url显示的是result对应的jsp页面
chain:action跳转对应的action名称,url显示的是第一次匹配的action的result对应的action名称
redirectAction:重定向,url显示的为最后的一个action所对应的jsp页面

全局结果:Global标签的使用,可以将所有action指定的结果返回到特定的页面,常常用于返回到主页面或者是404页面

        <global-results>
            <result name="main">/main.jsp</result>
        </global-results>
        <!-- 在所有action处理的结果中,只要返回的字符串为"main",则就返回到主页面,配置在package中,只是提供此包下的action使用,不可以配置在全局中 -->

但是 package标签的extends属性,则可以进行package继承,这样就可以使用其他包中的属性资源了。

<package name="student" namespace="/student" extends="struts-default">
        <global-results>
            <result name="main">/main.jsp</result>
        </global-results>
        <action name="student" class="com.wf.action.student.Student">
            <result>/student_success.jsp </result>
            <result name="error">/student_error.jsp</result>
        </action>
        <action name="student" class="com.wf.action.student.Student01">
            <result>/student_success.jsp </result>
            <result name="error">/student_error.jsp</result>
        </action>
</package>
<package name="teacher" namespace="/teacher" extends="student">
        <action name="teacher" class="com.wf.action.teacher.Teacher">
            <result>/teacher.jsp</result>
        </action>
</package>
    <!-- 注意teacher继承于student,所以对于全局属性,teacher同样使用,
            但是,在根节点必须是继承默认的struts-default -->

动态结果:动态结果集,并不经常使用,在配置文件中利用${result}来决定页面的跳转,
而result则是为action中的一个仅在内部使用的私有变量。在完成action处理后在,将要返回的页面路径赋值给result,然后在action的配置文件中进行引用,可以忘掉,

//action中存在私有变量为result,必须存在getset方法
public String execute() throws Exception {
        // TODO Auto-generated method stub
        if(type==1){
            result="/student_success.jsp";
        }else if(type==0){
            result="/student_error.jsp";
        }
            return "success";
    }

//配置文件
<package name="student" namespace="/student" extends="struts-default">
        <action name="student" class="com.wf.action.student.Student">
            <result>${result}</result>
        </action>
</package>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值