1. struts2的好处优势是:
1. 可以利用属性驱动和模型驱动简单的获取表单的数据
2. 拦截器可以把各种不属于业务逻辑的内容(文件上传,校验,获取数据等)和action中的方法(业务逻辑)分离开来,从而改善代码结构(松耦合);
2. 在html标签中只能跟EL表达式,在struts2标签中只能跟ognl表达式
3. package作用:
包括了intercepter,action,result,
struts2的配置文件是根据包的形式进行管理的,这样可以通过继承机制,让一个新包具有一些包的特性
4. struts2的三大经典上下文:
ActionContext: 是与action相关的内容
ServletActionContext: 让struts2与servlet交互
ActionInvocation: struts2的上下文
actionInvocation.getProxy().getConfig().getXXX() : XXX包括拦截器,action,结果集,包,方法等struts2的上下文
5. 有些情况下action既会在值栈中存一份,又会在map栈中存一份
6. valueStack
值栈总够有俩种数据结构:
对象栈: 是一个arrayList,将数据放入该处;
当前请求的action在栈顶,ss是栈顶的元素,所以可以使用setValue方法赋值
如果将一个对象放到栈顶,则当前对象的属性就会暴露出来。
如果一个属性在对象栈,在页面上可以使用ongl表达式,根据name属性进行回显。
map :
值栈的结构图1 2
1、在后台把数据存放到valueStack中,在前台把数据取出来
struts2利用他的值栈valueStack的API能直接操作对象栈,使对象栈的属性赋值。
例:
ValueStack valueStack = ActionContext.getContext().getValueStack(); 获取值栈
valueStack.setValue("ss","ss"); // ss为动作类的字段 。
// 直接输出ss的值,因为在栈顶
// 不需写value即可进行数据回显,因为在对象栈中
2、充当传递数据的一种方式
3、valueStack的生命周期
4、值栈的数据安全性怎么样做到的
5、怎么样去获取值栈
总结:对象栈的作用
1. 可以把一个数据放到对象栈中,在页面上可以根据name属性直接进行回显;
2. 调用setValue方法可以直接给对象栈中的属性赋值,实现了属性驱动和模型驱动;
3. 大大简化了集合的迭代书写
7. 属性驱动与模型驱动
属性驱动
1. 属性驱动实现的条件:
当前请求的action在栈顶,所以action中的属性就暴露出来了;
获取页面上表单的元素,整合成一个map;
调用setValue方法赋值;
2. 缺点:
若字段过多,则set/get方法较多,累赘
模型驱动:
1:是ModelDrivenInterceptor拦截器实现的
大致原理: 先获取action对象,判断其类型是否为ModelDriven,如果是,获取该model(所以必须创建model,否则会报空指针异常),并将其放到栈顶;
然后经过paramettingInterceptor即可获得值
2: 把action中所有和页面表单有关的属性都封装到javaBean中了
3: 需实现ModelDriven接口
步骤:
1. 创建javaBean
2. 创建action类,并实现ModelDriven接口,同时引入javaBean
3. 在action类中创建javaBean对象
4. 复写public User getModel() {}方法
例:
-----------------------------------------------------------------------
public class User{
private Long uid;
private String username;
// set/get方法
}
public class UserAction implements ModelDriven
{
private User model = new User();
public User getModel(){
return this.model;
}
// execute等动作类的方法
}
-----------------------------------------------------------------------
8. : 当前迭代的元素在栈顶,且如果迭代的元素在栈顶,则不需要加value
例1:
------------------------------------------------------------------------------
Action{
public String execute(){
List userList = new ArrayList();
User user = new User();
user.setUid(1L);
user.setUname("aa");
userList.add(user);
ActionContext.getContext().put("userList",userList);
retrun "index";
}
}
JSP:
------------------------------------------------------------------------------
例2:
------------------------------------------------------------------------------
Action{
public String execute(){
List userList1 = new ArrayList();
List> userList2 = new ArrayList>();
User user = new User();
user.setUid(1L);
user.setUname("aa");
userList1.add(user);
userList2.add(userList2);
ActionContext.getContext().put("userList2",userList2);
retrun "index";
}
}
JSP:
------------------------------------------------------------------------------
例3:
------------------------------------------------------------------------------
Action{
public String execute(){
List userList = new ArrayList();
User user = new User();
user.setUid(1L);
user.setUname("aa");
userList.add(user);
Map> map = new HashMap>();
ActionContext.getContext().put("map",map);
retrun "index";
}
}
JSP:
------------------------------------------------------------------------------
9. 结果集
1.result按现象划分为俩种类型:
result标签中间写内容(action/jsp);
共性的内容: 只要是页面跳转,都需要获取result标签中的内容
特性的内容: 每一种跳转的处理都不一样
result标签中间什么都不写(ajax);
ajax操作中间可以什么都不写
2.自定义结果集
1. 继承StrutsResultSupport类,编写自己的结果集
2. 注册自定义的结果集
3. 使用自定义的 结果集
例子:
*************************************************************************************
1.自定义的结果集
public class MyResult extends StrutsResultSupport {
@Override
protected void doExecute(String finalLocation, ActionInvocation invocation)
throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
// System.out.println("自定义的结果集");
request.getRequestDispatcher(finalLocation).forward(request, response);
}
}
Action类:
public class UserAction extends ActionSupport {
private String uname;
// set/get属性
public String showUname(){
System.out.println("uname=aaa");
return "index";
}
}
配置文件:
/index.jsp
*************************************************************************************