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的程序运行过程中使用的一些常量参数。
-
指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出
<constant name="struts.i18n.encoding" value="UTF-8"/>
-
自定义后缀修改常量
<constant name="struts.action.extension" value="do"/>
-
设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭
<constant name="struts.serve.static.browserCache" value="false"/>
-
当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开
<constant name="struts.configuration.xml.reload" value="true"/>
-
开发模式下使用,这样可以打印出更详细的错误信息
<constant name="struts.devMode" value="true" />
-
默认的视图主题
<constant name="struts.ui.theme" value="simple" />
-
与spring集成时,指定由spring负责action对象的创建
<constant name="struts.objectFactory" value="spring" />
-
该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为 false
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
-
上传文件的大小限制
<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属性注入的步骤:
-
在Action类中声明一个成员变量,用于接收xml配置文件传入内容
-
在Action类提供一个该变量的setter方法,该方法接收了xml配置的内容
//1)在action中提供一个属性 private String savePath; //2)提供属性的setter方法,用于外部的action的参数进行注入 public void setSavePath(String savePath) { this.savePath = savePath; }
-
在对应的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对象
注意:
-
该方式依赖servlet的api,耦合比较高
-
如果要通过域对象来获取域对象的相关信息必须使用该方式
//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集合
注意:
-
不依赖servlet的api,耦合性低
-
只能用在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集合
注意:
- 不依赖servlet的api
- 可以在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的程序运行过程中使用的一些常量参数。
-
指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出
<constant name="struts.i18n.encoding" value="UTF-8"/>
-
自定义后缀修改常量
<constant name="struts.action.extension" value="do"/>
-
设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭
<constant name="struts.serve.static.browserCache" value="false"/>
-
当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开
<constant name="struts.configuration.xml.reload" value="true"/>
-
开发模式下使用,这样可以打印出更详细的错误信息
<constant name="struts.devMode" value="true" />
-
默认的视图主题
<constant name="struts.ui.theme" value="simple" />
-
与spring集成时,指定由spring负责action对象的创建
<constant name="struts.objectFactory" value="spring" />
-
该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为 false
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
-
上传文件的大小限制
<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属性注入的步骤:
-
在Action类中声明一个成员变量,用于接收xml配置文件传入内容
-
在Action类提供一个该变量的setter方法,该方法接收了xml配置的内容
//1)在action中提供一个属性 private String savePath; //2)提供属性的setter方法,用于外部的action的参数进行注入 public void setSavePath(String savePath) { this.savePath = savePath; }
-
在对应的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对象
注意:
-
该方式依赖servlet的api,耦合比较高
-
如果要通过域对象来获取域对象的相关信息必须使用该方式
//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集合
注意:
-
不依赖servlet的api,耦合性低
-
只能用在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集合
注意:
- 不依赖servlet的api
- 可以在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";
}
}