转发:/hello.jsp
重定向:/hello.jsp
转发到Action(不常用;此种格式为标准格式;当下一目标资源不在同一namespace下):
Demo1Action
/
重定向到Action:
HelloAction_hello
/
全局结果配置:
/error.jsp
原理:依赖ActionContext对象(Struts2的数据中心),其本质是map。
存放有:原生request、原生response、原生servletContext、request域(从request中抽取出来、本 质上是map)、session域、application域、attrs、params、ValueStack(值栈)……很多
ActionContext生命周期:
每次请求都会创建一个ActionContext对象
ActionContext对象创建后放在了哪里?
ThreadLocal
请求到来时,ActionContext对象创建并被放置到ThreadLocal中与线程绑定。可以确保本次请 求范围内,获取ActionContext对象时,从ThreadLocal中拿到。☆替代request域
三种方式获取ServletAPI:
获取解耦API:通过ActionContext对象 (常用)
//获取 ActionContext
ActionContext context = ActionContext.getContext();
//获取解耦application域
Map application = context.getApplication();
application.put("name", "applicationName");
// 获取 解耦session域
Map session = context.getSession();
session.put("name", "sessionName");
//struts2官方不推荐使用request域。推荐使用ActionContext本身作为request域取代原本的 request域,用法依旧沿袭request的用法,只不过实际上是从ActionContex中存取
context.put("name", "requestName");
获取原生ServletAPI:通过ServletActionContext (常用)
//获取原生request
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("name", "requestName");
//获取原生response
HttpServletResponse response = ServletActionContext.getResponse();
//获取原生session
HttpSession session = request.getSession();
session.setAttribute("name", "sessionName");
//获取原生ServletContext
ServletContext sc = ServletActionContext.getServletContext();
sc.setAttribute("name", "applicationName");
实现接口方式获取API:需要什么就实现什么的接口。 (不常用)
步骤:
1. 实现相应接口,比如ServletRequestAware | ServletContextAware
2. 在自己的action类中定义私有属性
3. 在重写的接口的方法内部使用属性接收方法参数传入的API对象
4. 在可执行的方法内部使用属性即可。
简单参数接收:
属性驱动:在Action中准备与表单提交相同的属性,struts2会自动将提交的参数的值封装到属性中 (常用)
注:struts2接收参数时可以自动进行类型转换。支持8大基本数据类型+Date类型(根据浏览器标识出 中文访问者,时间格式为yyyy-MM-dd)
问题:Action对象的生命周期?答:每次请求都会创建与当前请求对应的Action对象
对象驱动:将表单提交参数封装到对象当中。(不常用)
步骤:
1. 在表单中设置input标签属性name="user.name"/name="user.age"
2. 创建user实体类
3. 在自己的Action类中定义属性user,注意:定义get/set方法
4. 在可执行的方法中即可直接使用user属性了
模型驱动:同样将表单数据封装到对象中。(常用;且类似于对象驱动)
步骤:
1. 表单input属性正常设置,即对应实体类的属性
2. 自定义Action类定义私有属性user,并赋值。即private User user = new User();
3. 自定义Action类实现ModelDriven接口,重写方法 ,将属性user返回
4. 在可执行的方法中即可直接使用user属性了
复杂类型参数接收:数组、List集合、Map集合
步骤:
1. 在自定义Action类中,定义属性,比如String[]、List、Map
2. 在表单input中:
arr:
arr:
arr:
list:
list:
list:
map:
map:
3. 在可执行方法中即可使用接收参数的属性了。
待续……