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中的具体的方法。

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

  • 页面代码

    添加图书
    删除图书

  • 配置文件的代码




  • Action的代码

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

2.2 通配符的访问方式

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

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

具体实例如下:

  • 页面代码

    添加订单
    删除订单

  • 配置文件代码


    /{1}/{2}.jsp

  • 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中开启该常量。

* 具体代码如下
* 页面的代码
添加商品
删除商品

* 配置文件代码

* 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的输出

  2. 自定义后缀修改常量

  3. 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭

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

  5. 开发模式下使用,这样可以打印出更详细的错误信息

  6. 默认的视图主题

  7. 与spring集成时,指定由spring负责action对象的创建

  8. 该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为 false

  9. 上传文件的大小限制

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

注意:

通过struts.xml文件声明修改常量配置。

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

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

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



/login.jsp

4.2 action的默认配置




/WEB-INF/jsp/login.jsp

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中使用

    这个标签来向Action对象的属性注入内容



    e:/images/
    /login.jsp

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

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

6.1 第一种方式

ServletActionContext类
getRequest() : 获取request对象
getRequest().getSession() : 获取session对象
getServletContext() : 获取ServletContext对象

注意:
  1. 该方式依赖servlet的api,耦合比较高

  2. 如果要通过域对象来获取域对象的相关信息必须使用该方式

    //1)从数据库得到数据
    List list = new ArrayList();
    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中的具体的方法。

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

  • 页面代码

    添加图书
    删除图书

  • 配置文件的代码




  • Action的代码

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

2.2 通配符的访问方式

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

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

具体实例如下:

  • 页面代码

    添加订单
    删除订单

  • 配置文件代码


    /{1}/{2}.jsp

  • 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中开启该常量。

* 具体代码如下
* 页面的代码
添加商品
删除商品

* 配置文件代码

* 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的输出

  2. 自定义后缀修改常量

  3. 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭

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

  5. 开发模式下使用,这样可以打印出更详细的错误信息

  6. 默认的视图主题

  7. 与spring集成时,指定由spring负责action对象的创建

  8. 该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为 false

  9. 上传文件的大小限制

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

注意:

通过struts.xml文件声明修改常量配置。

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

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

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



/login.jsp

4.2 action的默认配置




/WEB-INF/jsp/login.jsp

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中使用

    这个标签来向Action对象的属性注入内容



    e:/images/
    /login.jsp

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

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

6.1 第一种方式

ServletActionContext类
getRequest() : 获取request对象
getRequest().getSession() : 获取session对象
getServletContext() : 获取ServletContext对象

注意:
  1. 该方式依赖servlet的api,耦合比较高

  2. 如果要通过域对象来获取域对象的相关信息必须使用该方式

    //1)从数据库得到数据
    List list = new ArrayList();
    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 list = new ArrayList();
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";
}
}

posted @ 2017-07-17 18:23  J_zihao  阅读(573)  评论(0)    收藏  举报