Struts2-01没有成功:请求转发到另一个Action和请求转发jsp

33 篇文章 0 订阅
4 篇文章 0 订阅
  1. struts2目录结构:
    apps:该文件夹包含了基于struts2 的示例应用,这些示例应用对于学习者是非常有用的
    docs:该文件夹下包含了struts2 相关文档,包括struts2 快速入门、struts2的文档以及API文档等
    lib:该文件夹下包含了Struts2框架和核心类库,以及struts2第三方插件类库
    src: 该文件夹下包含了Struts2框架的全部源代码

  2. Strust2 核心功能:
    允许POJO(Plain Old Java Objects)对象 作为Action.
    Action的execute 方法不再与Servlet API耦合,更易测试
    支持更多视图技术(JSP、FreeMarker、Velocity)
    基于Spring AOP思想的拦截器机制,更易扩展
    更强大、更易用输入校验功能
    整合Ajax支持

  3. Struts2第一个程序的开发步骤:
    1.拷贝/apps/struts2-blank/WEB-INF/lib中的jar到项目的lib中.
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    2.在web.xml中配置Struts2的前端控制器-StrutsPrepareAndExecuteFilter.
    3.拷贝struts.xml文件到项目的source folder中.
    --------------------------------------前3步,在搭建Struts2环境--------------------------
    4.定义一个POJO类:HelloAction,并提供一个公共无参数的execute方法.

    5.在struts.xml文件中,配置HelloAction.(把HelloAction交给Struts2框架管理).

    6.部署Web项目,访问Action.
       访问格式: http://ip:port/contextPath/namespace/actionName[.action]
       上图的访问格式:http://localhost:80/pss/hello[.action]

  4. Struts运行必要jar包:
    struts2-core-2.3.1.1.jar:Struts 2框架的核心类库
    xwork-core-2.3.1.1.jar:Command模式框架,WebWork和Struts2都基于xwork
    ognl-3.0.3.jar:对象图导航语言(Object Graph Navigation Language),  struts2框架通过其读写对象的属性
    freemarker-2.3.18.jar:Struts 2的UI标签的模板使用FreeMarker编写
    commons-logging-1.1.x.jar:ASF出品的日志包,Struts 2框架使用这个日志包来支持Log4J和JDK 1.4+的日志记录。
    commons-fileupload-1.2.2.jar: 文件上传组件,2.1.6版本后需要加入此文件
    commons-io-2.0.1.jar:传文件依赖的jar包
    commons-lang-2.5.jar:对java.lang包的增强

  5. 下面的struts.xml通过<include>元素指定多个配置文件:
    <struts>
          <include file="struts-part1.xml"/>
          <include file="struts-part2.xml"/>
    </struts>

  6. Struts2中的6大配置文件:
    -----------------------------------------
    Struts2框架按照如下顺序加载struts2配置:
    1.default.properties 该文件保存在 struts2-core-2.3.7.jar 中 org.apache.struts2包里面:包含了Struts2的默认常量配置
    2.struts-default.xml 该文件保存在 struts2-core-2.3.7.jar:包含了框架依赖的对象配置和结果类型,拦截器等配置.
    3.struts-plugin.xml   该文件保存在Struts2框架的插件中:struts-Xxx-plugin-2.3.7.jar.由插件提供
    上述三个文件时框架自带的,我们不能修改,只能使用.
    ---------------------------------------------------------
    4.struts.xml             该文件是web应用默认的struts配置文件.重点.配置自定义的Action和其他信息.
    5.struts.properties 该文件是Struts的默认配置文件-->可以修改default.properties 的常量配置.
    6.web.xml 该文件是Web应用的配置文件
    上述三个文件是我们可以修改操作的.
    ---------------------------------------------------------
    如果多个文件配置了同一个struts2 常量,则后一个文件中配置的常量值会覆盖前面文件配置的常量值.
    注意:一般的,我们只在struts.xml中做常量配置.

  7. Struts2中常见常量:
    ---------------------------------------
      1):指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出
      <constant name="struts.i18n.encoding" value="UTF-8"/>   post请求参数的编码方式现在默认就是UTF-8,get应该和以前一样
     2):该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。
       如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开
      <constant name="struts.action.extension" value="action,,"/>
      3):设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭
        <constant name="struts.serve.static.browserCache" value="false"/>
      4):当struts的配置文件修改后,系统是否自动重新加载该配置文件,默认值为false(生产环境下使用),开发阶段最好打开
        <constant name="struts.configuration.xml.reload" value="true"/>
      5):开发模式下使用,这样可以打印出更详细的错误信息 (包含4功能)
       <constant name="struts.devMode" value="true" />:修改struts.xml之后,不要重启Tomcat.
      6):默认的视图主题
      <constant name="struts.ui.theme" value="simple" />
      7):是否支持动态方法调用
      <constant name="struts.enable.DynamicMethodInvocation" value="false"/>

  8. <package>元素: 是<struts>根元素的子元素.
        <package name="" extends="" namespace="" abstract=""></package>
    用来对多个<action>元素分类管理,和Java中的package没有关系.
    常见的属性:
    name:       表示<package>的名字,但是要保证不同的<package>元素的name不同. 可以通过该名字被其他的包所继承.
    extends:   表示当前<package>继承哪一个<package>,一般都是:struts-default.
               而struts-default其实就是struts-default.xml中<package>元素的名字.
               继承struts-default之后,就拥有了该<package>定义的所有资源.(结果返回类型,拦截器..)
    namespace: 表示命名空间,一般的以"/"打头,命名一般以模块名.如: /crm, /oa. 和<action>的name决定了一个Action类的访问路径.
    abstract:  抽象的,缺省值是false. 若一个<package>的abstract="true",那么该<package>中的<action>元素就不能被直接访问,只能用来继承.

  9. <action>元素:是<package>元素的子元素.
    专门用来配置Action对象的.
    <action name="" class="" method=""/>
    常见的属性:
    name: action的名称,在同一个<package>中,action的名字必须唯一. 和<package>的namespace共同决定了一个Action类的访问路径.
          注意:action的name值不能以"/"打头.
    class:一个Action类的全限定名.    缺省值:ActionSupport类.
    method:当前Action动作访问的方法, 缺省值:execute.

  10. <result>元素:配置结果视图.
    <result name="" type=""></result>
    局部结果视图: <result>定义在<action>中.
    全局结果视图: <result>定义在<global-results>中,而<global-results>在<package>中                                                             
    逻辑视图寻找顺序:先从当前的Action中去选择局部结果视图,找到就跳转,找不到,再找当前action所在package中找全局的结果视图,找到,跳转,找不到,报错.No result defined.
    ----------------------------------
    常见的属性:
    name:Action方法返回的逻辑视图名称. 缺省值:success
    type:结果的跳转类型.该类型的值在struts-default.xml中已经预定义好了. 缺省值:dispatcher

    常见的type值(结果类型):
    dispatcher:      表示从Action请求转发到页面(JSP).
    redirect:          表示从Action重定向到页面(JSP).
    chain:               表示从Action请求转发到另一个Action.
    redirectAction:  表示从Action重定向到另一个Action.
    stream:          表示返回流. 文件下载时使用.

    <param name="">表示参数:name缺省值:location(地址)  没有成功:请求转发到另一个Action                                

  11. 第三种.定义一个类,继承于com.opensymphony.xwork2.ActionSupport类.(推荐)

  12. 方案2: 使用通配符的方式类配置:  通配符:*
    <action name="emp_*" class="com._520it.manymethod.EmployeeAction" method="{1}">
    Action的名字: emp_Action方法: 比如:emp_list,那么{1}的值就是list;emp_edit,那么{1}的值就是edit
    两个通配符:
    <action name="*_*" class="com._520it.manymethod.{1}Action" method="{2}">
    Action名字:Action类名_Action方法. 比如:Employee_list,表示调用的EmployeeAction中的list方法
                                      比如:Department_edit,表示调用DepartmentAction中的edit方法.

  13. Action获取请求参数三种方式,归功于拦截器:
    第一种:Action本身作为Model对象,通过setter方法封装(属性注入)   Struts2内置有强大的类型转化器,                                        

    第二种:创建独立Model对象,页面通过ognl表达式封装(属性注入); 对象保证不为null

    方式2必须保证请求参数名必须是Model中的一个属性.

    第三种:使用ModelDriven接口,对请求数据进行封装(模型驱动)

  14. 给页面(JSP)传递数据

  15. 1:通过HttpServletRequest对象传递,像servlet;但依赖servlet;页面上使用EL表达式获取;2:通过Action传递,引入Struts2标签库;
             a,通过HTTP对象传递数据,页面使用<s:property/>获取数据;
             b,通过在Action使用ValueStack传递;页面使用<s:property/>获取数据;

    1.什么是OGNL
      Struts2框架使用OGNL作为默认的表达式语言。作用:Action和视图(JSP)之间数据交互的桥梁.

    2.ValueStack
         值栈是对应每一个请求对象的轻量级的内存数据中心。   一个请求--->一个action对象--->值栈
         每一次请求的时候,都会创建一个新的ValueStack对象,该ValueStack对象封装了这一次请求相关的数据信息.
           1).ValueStack实际是一个接口,在Struts2中利用OGNL时,实际上使用的是实现了该接口的OgnlValueStack类,这个类是Struts2利用OGNL的基础。
          2).ValueStack贯穿整个Action的生命周期(一次请求):每个Action类的实例都拥有一个ValueStack对象。 ValueStack相当于数据的中转站,在其中保存该次请求和当前Action对象和其他相关对象信息。
          3).Struts2框架把ValueStack对象保存在名为“struts.valueStack”的request作用域中。
       新的请求发出:
                ValueStack vs =  Struts2框架创建ValueStack对象;
                request.setAttribute("struts.valueStack",vs);
    3,如何获取ValueStack.
      方式1: 因为ValueStack在请求中,属性名为:struts.valueStack.
             ValueStack vs = request.getAttribute("struts.valueStack");
             ValueStack vs = ServletActionContext.getRequest().getAttribute("struts.valueStack");
             ValueStack vs = ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
      方式2: 通过ActionContext对象获取
             ValueStack vs = ActionContext.getContext().getValueStack();
      以上两种方式获取的是同一个ValueStack对象.

    //xwork2.OgnlValueStack@19487adb
    System.out.println(ServletActionContext.getRequest().getAttribute("struts.valueStack"));
    //xwork2.OgnlValueStack@19487adb
    System.out.println(ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY));
    //xwork2.OgnlValueStack@19487adb
    System.out.println(ActionContext.getContext().getValueStack());
    //xwork2.ActionContext@69dc6be1
    System.out.println(ServletActionContext.getContext());
    //xwork2.ActionContext@69dc6be1
    System.out.println(ActionContext.getContext());
    //应用上下文 ,不变//apache.catalina.core.ApplicationContextFacade@534ec133
    System.out.println(ServletActionContext.getServletContext());

     

  16. 4.ValueStack内部结构
      ValueStack对象中有两个很重要的属性,这两个属性就是ValueStack的主要内部结构:
    ------------------------------------
      root:        类型: CompoundRoot extends ArrayList  : 表示栈的数据结构(后进先出)
      context: 类型: Map:                            : 上下文

      root:主要存储Action对象相关的数据信息.
      context:主要存储映射关系数据(key-value).

    context存在root对象的引用(只要拿到context对象就可以获取到root对象):

    context中还存在request、session、application、attr、action、parameters对象的引用。
    获取到context,就可以获取ValueStack中所有的数据.
    从root中获取数据:    直接使用属性名获取.   ---><s:property value="属性名"/>
    从context中获取数据: #key                  ---><s:property value="#key"/>

  17. 5.把数据放入ValueStack.
    1).把数据放入root中:(栈,ArrayList.每次都是压在栈顶)
         方式1:ValueStack对象.getRoot().add(0, Obejct val);//把数据压入栈顶
         方式2:ValueStack对象.getRoot().push(Object val):等价于valueStack对象.getRoot().add(0, Obejct val);
         方式3:ValueStack对象.set(String propertyName,Object value);//可以设置给action对象
         方式4.在Action中提供一个可访问的属性(getter方法 setter).

         一般的,把单个对象可放入root中,就在栈顶.
    -------------------------------------------------------------------
    2).把数据放入context中:
        方式1:ValueStack对象.getContext().put(String key,Object value); 太长了.
        方式2:ActionContext对象.put(String key,Object value);

         一般的:把集合中的数据放入context中.
    --------------------------------------------------------------------------------------------------------
    6.如何从JSP中取出ValueStack中的数据:
    此时必须使用Struts2的标签.--->先引入Struts2标签
    <%@ taglib uri="/struts-tags" prefix="s"%>
    Struts2的调试标签:<s:debug/> :主要用来观察数据在哪一个空间(root,context).
    访问方式:<s:property value="OGNL表达式"/>

    1).获取root中数据:
       若:放入root中的数据,没有属性名:<s:property value="[0].top"/>
       若:放入root中的数据有属性名:   <s:property value="属性名"/>

    2).把context中数据:
       <s:property value="#key"/>
    --------------------------------------
    EL可以访问ValueStack中的数据:
       不建议这么做:
       为什么可以呢: Struts2重新包装而来请求对象.${msg}---><%=pageContext.findAttribute("msg")  %>
       StrutsRequestWrapper:先从ValueStack中取出数据,再放入request中.

    //往值栈存数据
    ActionContext.getContext().getValueStack().set("h", "哈哈哈");//root
    ServletActionContext.getContext().put("o", "哦哦哦");//context

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值