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的程序运行过程中使用的一些常量参数。
-
指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出
-
自定义后缀修改常量
-
设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭
-
当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开
-
开发模式下使用,这样可以打印出更详细的错误信息
-
默认的视图主题
-
与spring集成时,指定由spring负责action对象的创建
-
该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为 false
-
上传文件的大小限制
<constant name="struts.multipart.maxSize" value=“10701096"/>
注意:
通过struts.xml文件声明
4 struts2的全局视图配置和默认配置
4.1 全局视图作用: 当该包下的所有action都使用到的一些视图就是可以放到全局视图配置中
注意: 当action中也有相同名称的视图,那么action的局部视图会覆盖全局视图。
4.2 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中使用
这个标签来向Action对象的属性注入内容
e:/images/
/login.jsp
6 sruts2的数据共享的三种方式
在web项目中都是使用域对象来共享数据。
struts2提供给开发者使用域对象来共享数据的方法一共有三种。
6.1 第一种方式
ServletActionContext类
getRequest() : 获取request对象
getRequest().getSession() : 获取session对象
getServletContext() : 获取ServletContext对象
注意:
-
该方式依赖servlet的api,耦合比较高
-
如果要通过域对象来获取域对象的相关信息必须使用该方式
//1)从数据库得到数据
Listlist = 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集合
注意:
-
不依赖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中的具体的方法。
传统的配置方式,配置更清晰更好理解!但是扩展需要修改配置文件等!
具体的实例如下:
-
页面代码
-
配置文件的代码
-
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的程序运行过程中使用的一些常量参数。
-
指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出
-
自定义后缀修改常量
-
设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭
-
当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开
-
开发模式下使用,这样可以打印出更详细的错误信息
-
默认的视图主题
-
与spring集成时,指定由spring负责action对象的创建
-
该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为 false
-
上传文件的大小限制
<constant name="struts.multipart.maxSize" value=“10701096"/>
注意:
通过struts.xml文件声明
4 struts2的全局视图配置和默认配置
4.1 全局视图作用: 当该包下的所有action都使用到的一些视图就是可以放到全局视图配置中
注意: 当action中也有相同名称的视图,那么action的局部视图会覆盖全局视图。
4.2 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中使用
这个标签来向Action对象的属性注入内容
e:/images/
/login.jsp
6 sruts2的数据共享的三种方式
在web项目中都是使用域对象来共享数据。
struts2提供给开发者使用域对象来共享数据的方法一共有三种。
6.1 第一种方式
ServletActionContext类
getRequest() : 获取request对象
getRequest().getSession() : 获取session对象
getServletContext() : 获取ServletContext对象
注意:
-
该方式依赖servlet的api,耦合比较高
-
如果要通过域对象来获取域对象的相关信息必须使用该方式
//1)从数据库得到数据
Listlist = 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集合
注意:
-
不依赖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
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";
}
}
浙公网安备 33010602011771号