一.Struts2的Servlet的API的访问
- 完全解耦合的方式
- 编写jsp, 一个提交参数form表单
-
编写Action
//一.接收参数: //利用Struts2中的对象ActionContext对象 ActionContext context = ActionContext.getContext(); //调用ActionContext中的方法 //类似于request.getParameterMap(); Map<String,Object> map = context.getParameters(); for (String key : map.keySet()) { String[] values = (String[]) map.get(key); System.out.println(key+" "+Arrays.toString(values)); } //二.向域对象中存入数据 context.put("reqName", "reqValue");//相当于调用了request.setAttribute(); context.getSession().put("sessName", "sessValue");//相当于session.setAttribute(); context.getApplication().put("appName", "appValue");//相当于application.setAttribute();
这种方式只能获得代表request,session,application,的数据的Map集合,不能操作这些对象的本身的方法
- 使用Servlet的API的原生方式
- 编写JSP
- 编写Action
//一.接收数据 //直接获得request对象,通过ServletActionContext\ HttpServletRequest request = ServletActionContext.getRequest(); Map<String, String[]> map = request.getParameterMap(); for (String key: map.keySet()) { String[] values = map.get(key); System.out.println(key+" "+Arrays.toString(values)); } //二.向域对象中保存数据 //向request中保存数据 request.setAttribute("reqName", "reqValue"); //向session中保存数据 request.getSession().setAttribute("sessName", "sessValue"); //向application中保存数据 ServletActionContext.getServletContext().setAttribute("appName", "appValue");
这种方式可以操作域对象的数据,同时也可以获得对象的方法
- 接口注入的方式
- 编写jsp
- 编写Action
- Servlet是单例的,多个程序访问同一个Servlet只会创建一个Servlet的实例
Action是多例的,一次请求创建一次Action的实例,不会出现线程安全问题
二.Struts2的结果页面的配置
- 全局结果页面
- 指的是,在包中配置一次,其他的在这个包中的所有的action只要返回了这个值,都可以跳转这个页面
-- 针对这个包下的所有的action的配置都有效
<!-- 全局结果页面 -->
<global-results>
<result name="success">/demo1/demo2.jsp</result>
</global-results>
- 指的是,在包中配置一次,其他的在这个包中的所有的action只要返回了这个值,都可以跳转这个页面
- 局部结果页面
- 指的是只能在当前的action中的配置有效
- result标签的配置
- 用于配置页面的跳转,在result标签上有两个属性
-- name属性 : 逻辑视图的名称 默认值 : success
-- type属性 : 页面跳转的类型
dispatcher : 默认值 , 请求转发(Action转发JSP)
redirect : 重定向. (Action重定向JSP)
chain : 转发(Action转发Action)
redirectAction : 重定向(Action重定向Action)
stream : Struts2中提供文件下载的功能
- 用于配置页面的跳转,在result标签上有两个属性
三.Struts2的数据的封装
- 属性驱动 : 提供属性set方法的方式 (不常用)
- 属性驱动 : 页面中提供表达式方式 例如:action中创建了User及其get,set方法, 那么jsp页面中 name="user.username"
- 模型驱动 : 采用模型驱动方式 : 实现ModelDriven<User>接口,new一个User实例, 重写getModel()方法return User;
- 模型驱动方式是最常用的方式: 缺点是只能同时向一个对象中封装数据
而属性驱动第二种可以向多个对象中同时封装数据
四.INPUT的逻辑视图的配置
- Action接口中提供了五个逻辑视图的名称
SUCCESS ERROR LOGIN INPUT NONE
五.Struts2的复杂类型的数据封装
- 封装数据到List集合中:action中创建了List<User> users及其get,set方法, 那么jsp页面中 name="users[ index ].username"
- 封装数据到Map集合中:action中创建了Map<User> users及其get,set方法, 那么jsp页面中 name="users[ ' key ' ].username"