struts2_笔记02

1 struts2的Action三种使用方式

1.1 第一种方式,不实现Action接口

/**
 * 第一种方式:不需要实现或继承任何接口或类
 * @author APPle
 *
 */
public class UserAction2 {

    public String login()throws Exception{
        System.out.println("UserAction2.login()");
        return "success";
    }
    
}

1.2第二种方式,实现Action接口

/**
 * 第二种方式:实现Action接口
 *  1)定义了默认的execute方法的标准
 *  2)提供了项目中常用的视图标记
 * @author APPle
 *
 */
public class UserAction implements Action {

    public String login() throws Exception {
        System.out.println("执行了UserAction的login方法");
        return SUCCESS;
    }

    public String execute() throws Exception {
        return null;
    }

}

1.3 第三种方式, 继承ActionSupport类(推荐)

/**
 * 第三种方式: 继承ActionSupport类(推荐使用)
 *      好处: 
 *          1)提供了常用的视图标记
 *          2)提供了数据校验功能
 * 
 * @author APPle
 *
 */
public class UserAction3 extends ActionSupport{

    public String login()throws Exception{
        System.out.println("UserAction3.login()");
        return SUCCESS;
    }
}

2 Action的三种访问方式

2.1 通过<action>标签中的method属性,访问到Action中的具体的方法。

传统的配置方式,配置更清晰更好理解!但是扩展需要修改配置文件等!
具体的实例如下:

  • 页面代码

     <a href="${pageContext.request.contextPath}/addBook.action">添加图书</a>
     <a href="${pageContext.request.contextPath}/deleteBook.action">删除图书</a>
  • 配置文件的代码

     <package name="demo2" extends="struts-default" namespace="/">
         <action name="addBook" class="cn.itcast.demo2.BookAction" method="add"></action>
         <action name="deleteBook" class="cn.itcast.demo2.BookAction" method="delete"></action>
     </package>
  • Action的代码

     public String add(){
         System.out.println("添加图书");
         return NONE;
     }
     public String delete(){
         System.out.println("删除图书");
         return NONE;
     }

2.2 通配符的访问方式

注意: (访问的路径和方法的名称必须要有某种联系.) 通配符就是 * 代表任意的字符

使用通配符的方式可以简化配置文件的代码编写,而且扩展和维护比较容易。

具体实例如下:

  • 页面代码

    <a href="${pageContext.request.contextPath}/BookAction_add.action">添加订单</a>
    <a href="${pageContext.request.contextPath}/BookAction_list.action">删除订单</a>
  • 配置文件代码

     <action name="*_*" class="gz.itcast.b_path.{1}Action" method="{2}">
        <result name="{2}">/{1}/{2}.jsp</result>
     </action>
  • Action的代码

    public class BookAction extends ActionSupport{
        //添加方法
        public String add()throws Exception{
            System.out.println("BookAction.add()");
            return "add";
        }
        //查询方法
        public String list()throws Exception{
            System.out.println("BookAction.list()");
            return "list";
        }   
    }
  • 具体理解:在JSP页面发送请求,http://localhost/struts2_01/order_add.action,配置文件中的order_可以匹配该请求,就相当于变成了add,method属性的值使用{1}来代替,{1}就表示的是第一个*号的位置!!所以method的值就等于了add,那么就找到Action类中的add方法,那么add方法就执行了!

2.3 动态方法访问的方式(有的开发中也会使用这种方式)

    * 如果想完成动态方法访问的方式,需要开启一个常量,struts.enable.DynamicMethodInvocation = false,把值设置成true。
        * 注意:不同的Struts2框架的版本,该常量的值不一定是true或者false,需要自己来看一下。如果是false,需要自己开启。
        * 在struts.xml中开启该常量。
            <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    
    * 具体代码如下
        * 页面的代码
            <a href="${pageContext.request.contextPath}/product!add.action">添加商品</a>
            <a href="${pageContext.request.contextPath}/product!delete.action">删除商品</a>
        
        * 配置文件代码
            <action name="product" class="cn.itcast.demo2.ProductAction"></action>
        
        * Action的类的代码
            public class ProductAction extends ActionSupport{
                public String add(){
                    System.out.println("添加订单");
                    return NONE;
                }
                public String delete(){
                    System.out.println("删除订单");
                    return NONE;
                }
            }

3 strus2的常量配置

struts2的常量就是用于在strut2的程序运行过程中使用的一些常量参数。

  1. 指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出

     <constant name="struts.i18n.encoding" value="UTF-8"/>
  2. 自定义后缀修改常量

     <constant name="struts.action.extension" value="do"/>
  3. 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭

     <constant name="struts.serve.static.browserCache" value="false"/>
  4. 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开

     <constant name="struts.configuration.xml.reload" value="true"/>
  5. 开发模式下使用,这样可以打印出更详细的错误信息

     <constant name="struts.devMode" value="true" />
  6. 默认的视图主题

     <constant name="struts.ui.theme" value="simple" />
  7. 与spring集成时,指定由spring负责action对象的创建

     <constant name="struts.objectFactory" value="spring" />
  8. 该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为 false

     <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
  9. 上传文件的大小限制

     <constant name="struts.multipart.maxSize" value=“10701096"/>

注意:

通过struts.xml文件声明<constant name="struts.action.extension" value="action,do,,"></constant>修改常量配置。

4 struts2的全局视图配置和默认配置

4.1 全局视图作用: 当该包下的所有action都使用到的一些视图就是可以放到全局视图配置中

注意: 当action中也有相同名称的视图,那么action的局部视图会覆盖全局视图。

<!-- 全局视图配置: 把该包下的所有action共用的视图都机集中在这里写 -->
<global-results>
    <result name="success">/login.jsp</result>
</global-results>

4.2 action的默认配置

<!-- 默认配置 
    name: 必填项
    class: 可选项 。默认配置:  ActionSupport类  该类继承自struts-default (<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />)
    method: 可选。默认配置
    result:
        name: 可选。默认配置: success
        type: 可选。默认配置: dispatcher
-->
<!-- 全部使用默认配置的action的作用 :专门用于转发到WEB-INF下的页面 -->
<action name="book">
    <result>/WEB-INF/jsp/login.jsp</result>
</action>

5 Action的属性注入

作用: 如果Action对象中需要把一些经常改变的参数提取到配置文件中,那么就可以使用属性注入的方法。

Action属性注入的步骤:

  1. 在Action类中声明一个成员变量,用于接收xml配置文件传入内容
  2. 在Action类提供一个该变量的setter方法,该方法接收了xml配置的内容

     //1)在action中提供一个属性  
     private String savePath;
    
     //2)提供属性的setter方法,用于外部的action的参数进行注入    
     public void setSavePath(String savePath) {
         this.savePath = savePath;
     }
  3. 在对应的struts.xml文件中,找到对应的action对象的配置,然后在action中使用

     <param name=""></param> 这个标签来向Action对象的属性注入内容
    
     <action name="upload" class="gz.itcast.d_ioc.UploadAction" method="upload">
         <!-- 3)使用该配置可以往Action对象的属性注入内容(只要有setter都可以使用param进行注入)
             param:
                 name: setter方法名。setSavePath -> savePath
          -->
         <param name="savePath">e:/images/</param>
         <result>/login.jsp</result>
     </action>

6 sruts2的数据共享的三种方式

在web项目中都是使用域对象来共享数据。
struts2提供给开发者使用域对象来共享数据的方法一共有三种。

6.1 第一种方式

ServletActionContext类
        getRequest() : 获取request对象
        getRequest().getSession() : 获取session对象
        getServletContext() : 获取ServletContext对象
注意:
  1. 该方式依赖servlet的api,耦合比较高
  2. 如果要通过域对象来获取域对象的相关信息必须使用该方式

     //1)从数据库得到数据
     List<String> list = new ArrayList<String>();
     list.add("eric");
     list.add("jacky");
     list.add("rose");
    
     //2)用request,session,context域对象来共享数据
     /**
      * 1)strus2提供的第一种使用域对象的方法(如果单纯的使用域对象来存取数据 ,不推荐使用这种方式)
      *       ServletActionContext对象:可以在struts2的action方法中使用域对象
      *    特点: 依赖servlet原生的api
      */
     //获取request域对象
     HttpServletRequest request = ServletActionContext.getRequest();
     request.setAttribute("request_list", list);
     //获取session域对象
     HttpSession session = ServletActionContext.getRequest().getSession(true);
     session.setAttribute("session_list", list);
     //获取ServletContext域对象
     ServletContext context = ServletActionContext.getServletContext();
     context.setAttribute("context_list", list);

6.2 第二种方式

ActionContext类
        getContextMap() : 获取操作request域对象数据的map集合
        getSession() :      获取操作session域对象数据的map集合  
        getApplication()  获取操作context域对象数据的map集合
注意:
  1. 不依赖servlet的api,耦合性低
  2. 只能用在Action对象的一个方法中。不能在所有方法中都是用同一个ActionContext

     //得到客户的请求的相关数据
     /**
      * 注意: 如果用到了request/session/servletcontext对象中的除存取数据以外的其他方法,就必须得使用ServletActionContext
      *     来获取数据。
      */
     ServletActionContext.getRequest().getMethod();
    
    
    
     ActionContext ac = ActionContext.getContext();
     /**
      * strus2提供的第二种使用域对象的方法(Action对象方法少的时候,可以使用这种方式)
      *     ActionContext对象: action的上下文对象,在这个ActionContext对象中提供操作不同域对象数据的Map集合        *     
      *     特点:
      *     1) 不依赖servlet原生的api,方便测试
      *     2)只能在action的某个业务方法中使用    
      */     
    
     //得到操作request域的map集合(操作这个Map集合就等同于操作了request域的数据)
     Map<String,Object> requestMap = ac.getContextMap();
     requestMap.put("request_list", list); //存放到request域中
     //得到操作session域的map集合
     Map<String,Object> sessionMap = ac.getSession();
     sessionMap.put("session_list", list);
     //得到操作context域的map集合
     Map<String, Object> contextMap = ac.getApplication();
     contextMap.put("context_list", list);

6.3 第三种方式

    使用  RequestAware  ,   SessionAware   ApplicationAware 接口
    注入操作对应域对象数据的Map集合
注意:
  1. 不依赖servlet的api
  2. 可以在Action对象的所有方法中共享Map集合

6.4总结 提取获取对象的工具类

1 struts2的Action三种使用方式

1.1 第一种方式,不实现Action接口

/**
 * 第一种方式:不需要实现或继承任何接口或类
 * @author APPle
 *
 */
public class UserAction2 {

    public String login()throws Exception{
        System.out.println("UserAction2.login()");
        return "success";
    }
    
}

1.2第二种方式,实现Action接口

/**
 * 第二种方式:实现Action接口
 *  1)定义了默认的execute方法的标准
 *  2)提供了项目中常用的视图标记
 * @author APPle
 *
 */
public class UserAction implements Action {

    public String login() throws Exception {
        System.out.println("执行了UserAction的login方法");
        return SUCCESS;
    }

    public String execute() throws Exception {
        return null;
    }

}

1.3 第三种方式, 继承ActionSupport类(推荐)

/**
 * 第三种方式: 继承ActionSupport类(推荐使用)
 *      好处: 
 *          1)提供了常用的视图标记
 *          2)提供了数据校验功能
 * 
 * @author APPle
 *
 */
public class UserAction3 extends ActionSupport{

    public String login()throws Exception{
        System.out.println("UserAction3.login()");
        return SUCCESS;
    }
}

2 Action的三种访问方式

2.1 通过<action>标签中的method属性,访问到Action中的具体的方法。

传统的配置方式,配置更清晰更好理解!但是扩展需要修改配置文件等!
具体的实例如下:

  • 页面代码

     <a href="${pageContext.request.contextPath}/addBook.action">添加图书</a>
     <a href="${pageContext.request.contextPath}/deleteBook.action">删除图书</a>
  • 配置文件的代码

     <package name="demo2" extends="struts-default" namespace="/">
         <action name="addBook" class="cn.itcast.demo2.BookAction" method="add"></action>
         <action name="deleteBook" class="cn.itcast.demo2.BookAction" method="delete"></action>
     </package>
  • Action的代码

     public String add(){
         System.out.println("添加图书");
         return NONE;
     }
     public String delete(){
         System.out.println("删除图书");
         return NONE;
     }

2.2 通配符的访问方式

注意: (访问的路径和方法的名称必须要有某种联系.) 通配符就是 * 代表任意的字符

使用通配符的方式可以简化配置文件的代码编写,而且扩展和维护比较容易。

具体实例如下:

  • 页面代码

    <a href="${pageContext.request.contextPath}/BookAction_add.action">添加订单</a>
    <a href="${pageContext.request.contextPath}/BookAction_list.action">删除订单</a>
  • 配置文件代码

     <action name="*_*" class="gz.itcast.b_path.{1}Action" method="{2}">
        <result name="{2}">/{1}/{2}.jsp</result>
     </action>
  • Action的代码

    public class BookAction extends ActionSupport{
        //添加方法
        public String add()throws Exception{
            System.out.println("BookAction.add()");
            return "add";
        }
        //查询方法
        public String list()throws Exception{
            System.out.println("BookAction.list()");
            return "list";
        }   
    }
  • 具体理解:在JSP页面发送请求,http://localhost/struts2_01/order_add.action,配置文件中的order_可以匹配该请求,就相当于变成了add,method属性的值使用{1}来代替,{1}就表示的是第一个*号的位置!!所以method的值就等于了add,那么就找到Action类中的add方法,那么add方法就执行了!

2.3 动态方法访问的方式(有的开发中也会使用这种方式)

    * 如果想完成动态方法访问的方式,需要开启一个常量,struts.enable.DynamicMethodInvocation = false,把值设置成true。
        * 注意:不同的Struts2框架的版本,该常量的值不一定是true或者false,需要自己来看一下。如果是false,需要自己开启。
        * 在struts.xml中开启该常量。
            <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    
    * 具体代码如下
        * 页面的代码
            <a href="${pageContext.request.contextPath}/product!add.action">添加商品</a>
            <a href="${pageContext.request.contextPath}/product!delete.action">删除商品</a>
        
        * 配置文件代码
            <action name="product" class="cn.itcast.demo2.ProductAction"></action>
        
        * Action的类的代码
            public class ProductAction extends ActionSupport{
                public String add(){
                    System.out.println("添加订单");
                    return NONE;
                }
                public String delete(){
                    System.out.println("删除订单");
                    return NONE;
                }
            }

3 strus2的常量配置

struts2的常量就是用于在strut2的程序运行过程中使用的一些常量参数。

  1. 指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出

     <constant name="struts.i18n.encoding" value="UTF-8"/>
  2. 自定义后缀修改常量

     <constant name="struts.action.extension" value="do"/>
  3. 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭

     <constant name="struts.serve.static.browserCache" value="false"/>
  4. 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开

     <constant name="struts.configuration.xml.reload" value="true"/>
  5. 开发模式下使用,这样可以打印出更详细的错误信息

     <constant name="struts.devMode" value="true" />
  6. 默认的视图主题

     <constant name="struts.ui.theme" value="simple" />
  7. 与spring集成时,指定由spring负责action对象的创建

     <constant name="struts.objectFactory" value="spring" />
  8. 该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为 false

     <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
  9. 上传文件的大小限制

     <constant name="struts.multipart.maxSize" value=“10701096"/>

注意:

通过struts.xml文件声明<constant name="struts.action.extension" value="action,do,,"></constant>修改常量配置。

4 struts2的全局视图配置和默认配置

4.1 全局视图作用: 当该包下的所有action都使用到的一些视图就是可以放到全局视图配置中

注意: 当action中也有相同名称的视图,那么action的局部视图会覆盖全局视图。

<!-- 全局视图配置: 把该包下的所有action共用的视图都机集中在这里写 -->
<global-results>
    <result name="success">/login.jsp</result>
</global-results>

4.2 action的默认配置

<!-- 默认配置 
    name: 必填项
    class: 可选项 。默认配置:  ActionSupport类  该类继承自struts-default (<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />)
    method: 可选。默认配置
    result:
        name: 可选。默认配置: success
        type: 可选。默认配置: dispatcher
-->
<!-- 全部使用默认配置的action的作用 :专门用于转发到WEB-INF下的页面 -->
<action name="book">
    <result>/WEB-INF/jsp/login.jsp</result>
</action>

5 Action的属性注入

作用: 如果Action对象中需要把一些经常改变的参数提取到配置文件中,那么就可以使用属性注入的方法。

Action属性注入的步骤:

  1. 在Action类中声明一个成员变量,用于接收xml配置文件传入内容
  2. 在Action类提供一个该变量的setter方法,该方法接收了xml配置的内容

     //1)在action中提供一个属性  
     private String savePath;
    
     //2)提供属性的setter方法,用于外部的action的参数进行注入    
     public void setSavePath(String savePath) {
         this.savePath = savePath;
     }
  3. 在对应的struts.xml文件中,找到对应的action对象的配置,然后在action中使用

     <param name=""></param> 这个标签来向Action对象的属性注入内容
    
     <action name="upload" class="gz.itcast.d_ioc.UploadAction" method="upload">
         <!-- 3)使用该配置可以往Action对象的属性注入内容(只要有setter都可以使用param进行注入)
             param:
                 name: setter方法名。setSavePath -> savePath
          -->
         <param name="savePath">e:/images/</param>
         <result>/login.jsp</result>
     </action>

6 sruts2的数据共享的三种方式

在web项目中都是使用域对象来共享数据。
struts2提供给开发者使用域对象来共享数据的方法一共有三种。

6.1 第一种方式

ServletActionContext类
        getRequest() : 获取request对象
        getRequest().getSession() : 获取session对象
        getServletContext() : 获取ServletContext对象
注意:
  1. 该方式依赖servlet的api,耦合比较高
  2. 如果要通过域对象来获取域对象的相关信息必须使用该方式

     //1)从数据库得到数据
     List<String> list = new ArrayList<String>();
     list.add("eric");
     list.add("jacky");
     list.add("rose");
    
     //2)用request,session,context域对象来共享数据
     /**
      * 1)strus2提供的第一种使用域对象的方法(如果单纯的使用域对象来存取数据 ,不推荐使用这种方式)
      *       ServletActionContext对象:可以在struts2的action方法中使用域对象
      *    特点: 依赖servlet原生的api
      */
     //获取request域对象
     HttpServletRequest request = ServletActionContext.getRequest();
     request.setAttribute("request_list", list);
     //获取session域对象
     HttpSession session = ServletActionContext.getRequest().getSession(true);
     session.setAttribute("session_list", list);
     //获取ServletContext域对象
     ServletContext context = ServletActionContext.getServletContext();
     context.setAttribute("context_list", list);

6.2 第二种方式

ActionContext类
        getContextMap() : 获取操作request域对象数据的map集合
        getSession() :      获取操作session域对象数据的map集合  
        getApplication()  获取操作context域对象数据的map集合
注意:
  1. 不依赖servlet的api,耦合性低
  2. 只能用在Action对象的一个方法中。不能在所有方法中都是用同一个ActionContext

     //得到客户的请求的相关数据
     /**
      * 注意: 如果用到了request/session/servletcontext对象中的除存取数据以外的其他方法,就必须得使用ServletActionContext
      *     来获取数据。
      */
     ServletActionContext.getRequest().getMethod();
    
    
    
     ActionContext ac = ActionContext.getContext();
     /**
      * strus2提供的第二种使用域对象的方法(Action对象方法少的时候,可以使用这种方式)
      *     ActionContext对象: action的上下文对象,在这个ActionContext对象中提供操作不同域对象数据的Map集合        *     
      *     特点:
      *     1) 不依赖servlet原生的api,方便测试
      *     2)只能在action的某个业务方法中使用    
      */     
    
     //得到操作request域的map集合(操作这个Map集合就等同于操作了request域的数据)
     Map<String,Object> requestMap = ac.getContextMap();
     requestMap.put("request_list", list); //存放到request域中
     //得到操作session域的map集合
     Map<String,Object> sessionMap = ac.getSession();
     sessionMap.put("session_list", list);
     //得到操作context域的map集合
     Map<String, Object> contextMap = ac.getApplication();
     contextMap.put("context_list", list);

6.3 第三种方式

    使用  RequestAware  ,   SessionAware   ApplicationAware 接口
    注入操作对应域对象数据的Map集合
注意:
  1. 不依赖servlet的api
  2. 可以在Action对象的所有方法中共享Map集合

6.4总结 提取获取对象的工具类

    /**
     * 基础Action
     *  在这个基础Action当前注入了三个域对象的操作Map集合
     */
    public class BaseAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
        protected Map<String,Object> requestMap;
        protected Map<String,Object> sessionMap;
        protected Map<String,Object> contextMap;
        
        //struts2自动会把操作request域的map集合传入
        public void setRequest(Map<String, Object> request) {
            this.requestMap = request;
        }
        //struts2自动会把操作session域的map集合传入
        public void setSession(Map<String, Object> session) {
            this.sessionMap = session;
        }
        //struts2自动会把操作context域的map集合传入
        public void setApplication(Map<String, Object> application) {
            this.contextMap = application;
        }
    }

    /**
     * 工具类的使用
     * @author J_zihao
     *
     */
    public class BookAction extends BaseAction{
        
        public String list()throws Exception{
            
            //1)从数据库得到数据
            List<String> list = new ArrayList<String>();
            list.add("eric");
            list.add("jacky");
            list.add("rose");
            
            //往request域存放数据
            requestMap.put("request_list", list);
            //往session域存放数据
            sessionMap.put("session_list", list);
            //往context域存放数据
            contextMap.put("context_list", list);
            
            return "success";       
        }
    }

转载于:https://www.cnblogs.com/jiangzihao/p/7196916.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值