Struts2 基础知识 Struts2   基 础 知 识 一、Struts2的综述 二、搭建环境 三、Struts2充当C层使用说明 四、Struts2.xml减肥(缩减配置代码) 五、Struts2.xml中的常量标签 六、action标签的默认值问题 七、Action接收页面数据问题 八、重定向 九、存储范围   方法一:

一、Struts2的综述

struts1是Servlet的实现!

Struts2是filter实现(拦截interceptor)!满足MVC框架!

注:MVC为项目的设计模式(通常符合低耦合高内聚)

  M:model -- 模型层
      封装数据类型 -- entity
      完成数据源的交互 -- dao
      封装业务逻辑 -- service
      辅助工具类 -- util

 V:view -- 视图层
     显示数据
     采集数据

 C:control -- 控制层
    连接M和V的桥梁

 M1:
    C和V合在一起
     Servlet/JSP既做C层又做V层

 M2:严格意义上的MVC
    Servlet只做C层
    JSP只做V层

Struts2特点:
   1,简化C层
       任何javabean都可以做成C层
   2,封装的表单数据
       不需要看到请求对象
   3,封装了更多的页面跳转现象
   4,低耦合
   5,提供了丰富的标签库
         绘制HTML页面
     实现JSTL的作用
    6,提供了OGNL
    7,封装了后台数据的校验
    8,提供了令牌机制token
         防止表单的重复提交

二、搭建环境

  1.创建web项目

  2.导入jar包

  3.配置文件

    Struts2.xml:一般在导入jar包过程可自动生成。名字不能改(放在src根目录)。但是可以有多个配置文件,名字不相同。前提是必须已经有了一个struts.xml。其他的配置文件若有效,需在Struts2.xml文件中导入,用include标签方法。例:<include file="user.xml"></include>

  4.web.xml文件必须配置Struts2实现的过滤器。

  <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
          org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
      </filter-class>
  </filter>
 
  <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>*.action</url-pattern>
  </filter-mapping>

三、Struts2充当C层使用说明

  1.新建一个类

    命名的原则:一般在常建的java类后面加Action

  2.在Struts.xml中配置这个类

    目的:让它能够作为C层使用

    <package>
       <action>

    <result></result>

   </action>
    </package>

  3.配置标签package

    并不是类前面的包名,目的是分类Action的。

    包含属性:

    a.name:包名 --  唯一标识用的,没多大意义(一般随便取)。

    b.namespace:命名空间(提供访问路径的)。必须以/开始。

    c.extends:继承(你想使用Struts2的哪些功能)。如果没有特殊操作,直接写成default(struts-default)。

  4.Action标签

    配置写好的JavaBean(充当C)。

    包含的属性:

    a.name:访问Action的URL(虚拟路径)。注意不能以/开始。

    b.class:类全名.

    c.method:指定Action类中的方法名。效果是该URL下访问的方法。

  5.Action类的说明

    Action类是普通的JavaBean,可以有属性和方法。方法可以有任意多个,每一个方法都相当于Servlet中的service方法,能够作为service方法使用。但该方法的要求两点:

    a.方法必须有返回值(String)。返回值的作用是为了在配置文件中根据方法的结果实现相应的也面的跳转或重定向。

    b.方法没有参数。

  6.访问Action的方法

    URL:http://serverIP:PORT/webApp/namespace/actionName.后缀

    例如访问HelloAction的hello方法:
         http://localhost:8888/Struts2/day01/hello.action

  7.后缀问题

    如果URL中没有写.action,会默认加上一个; 如果修改了后缀,那就不能省略后缀;一般习惯上,会加上后缀。

  8.404问题

        1,后缀不正确
        2,namespace不正确
          There is no Action mapped for action name hello1.
        3,Action的name不正确(org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter)
         There is no Action mapped for namespace [/day01]
             and action name [hello3] associated with context path [/Struts2].

  9.500问题

        Action的name不正确 -- 控制针
               org.apache.struts2.dispatcher.FilterDispatcher

  10.result页面跳转

    属性:
          name:Action中方法的返回值,默认值success,也可在定义个fail。
          type:跳转的方式,默认的是dispatcher(转发)

四、Struts2.xml减肥(缩减配置代码)

  1.方法匹配

    写好一个<action>。访问时,http://serverIP:PORT/webApp/namespace/actionName!methodName.action

  2.通配

    <action name="基本名_通配符" method={index}>

     基本名_通配符:hello_*
            index:通配符的位置,从1开始
                        hello_*   hello_*_*

    访问时,http://serverIP:PORT/webApp/namespace/基本名_方法名.action

五、Struts2.xml中的常量标签

  写在<struts>根标签中。

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

  修改后缀:
         修改过的后缀会覆盖原先的action,
         系统不会再加上.action,URL中必须加上后缀

六、action标签的默认值问题

    calss:ActionSupport
       method:ActionSupport类的execute方法(return "success")

七、Action接收页面数据问题

  Action类要提供些属性。而且,属性需满足:

       1,属性名跟表单的name属性(查询字符串的key)一样
          2,要提供set、get方法

  注:a.Sturts2中有一个ActionContext对象——负责管理所有的Action对象。

    b.如果Action中的属性是一个对象(实体类)——页面的name属性---对象.属性名。例如:userName  ---- user.userName

八、重定向

     <result type="">

  1,redirect(一般采用的方法)
     资源:静态页面资源
               动态的Servlet路径、Action路径

  2,redirectAction
     资源:只能是Action路径

九、存储范围

  方法一:

  值栈:存储Action对象的属性
  请求:ActionContext相当于request范围
  会话:
  应用:

  例如:
  public class RangeAction {
    String name = "zhang";//属性--值栈
    public String range(){
        //获得ActionContext对象
        ActionContext ac = ActionContext.getContext();        
        //请求
        ac.put("age", 30);
        //会话
        ac.getSession().put("sess","session");
        //应用
        ac.getApplication().put("app", "application");
        return "success";
    }
} 

  方法二:

import org.apache.struts2.interceptor.SessionAware;

public class RangeAction1 implements SessionAware {
   private Map<String, Object> session = new HashMap<String, Object>();
    public void setSession(Map<String, Object> arg0) {
        this.session = arg0;
    }
    public String range(){
        session.put("session1", "会话");
        return "success";
    }
}

注:往任何范围内存放数据,类似于map操作