Struts之CRUD
1何为CRUD:CRUD代表的是一个框架的Create(增),Read(读取),update(更新),Delete(删除)
2怎么做呢??
其实Struts2的CRUD与现实的方法一样,只是在属性的设置和获取上更方便了,因为了值栈吖,有了OGNL对象表达式,所以Struts2的CRUD显为更加方便
废话不多说了,下面就来个分析吧!!(与数据库连接部分就用data来代替)
Create------>增:添加数据,保存数据到数据库
肯定就是获得一个保存的对象吧,但是提交的Action类和对象类不是同一个OGNL匹配的不是我这个Action类,那我怎么获得提交的对象呢?惯性思想肯定是从值栈里拿吧,但是这样做好麻烦吖,从值栈拿出来,还要一个一个的赋值,或者是在Action类里写相同属性的Set方法(),麻烦吖,所以Struts2又提供了更简便的方法是实现ModelDriven的接口----------该接口就是用来把所需的对象压入栈顶
正式流程:
1表单提交数据
2在Action类中实现ModelDriven接口 ,并实现getModel()方法,并把自己所需的对象压入栈顶,也就是return回去那个对象
3在getModel方法的作用就是把对象压入值栈的栈顶
4然后paparmeterInterceptor拦截器(默认会调用此拦截器的,),该拦截器就是把请求里的参数与值栈对象的一一匹配,这样我们的对象就从栈顶里拿下来了,然后根据相应的办法放入数据库
代码如下:
表单提交数据:
<s:form action="emp-save"> <s:textfield name="firstName" label="FirstName"></s:textfield> <s:textfield name="lastName" label="LastName"></s:textfield> <s:textfield name="email" label="Email"></s:textfield> <s:submit></s:submit> </s:form>
Action类处理请求:
public class EmployeeAction implements ModelDriven<Employee> {
private Employee employee;
public String save(){
dao.save(employee);
return "success";
}
public Employee getModel() {
this.employee=new employee()
return employee;
}
}
data类----模拟的数据库
public class Dao { private static Map<Integer, Employee> emps = new LinkedHashMap<Integer, Employee>(); static{//模拟数据库 emps.put(1001, new Employee(1001, "AA", "aa", "aa@atguigu.com")); emps.put(1002, new Employee(1002, "BB", "bb", "bb@atguigu.com")); emps.put(1003, new Employee(1003, "CC", "cc", "cc@atguigu.com")); emps.put(1004, new Employee(1004, "DD", "dd", "dd@atguigu.com")); emps.put(1005, new Employee(1005, "EE", "ee", "ee@atguigu.com")); } /* *用来遍历的 * */ public List<Employee> getEmployees(){ return new ArrayList<Employee>(emps.values()); } /* *用来删除 * */ public void delete(Integer empId){ emps.remove(empId); } /* *用来保存 * */ public void save(Employee emp){ long time = System.currentTimeMillis();//用来产生ID的 emp.setEmployeeId((int)time); /* *根据ID获取数据的 * */ public Employee get(Integer empId){ return emps.get(empId); }
流程分析:
form表单提交,发送请求道Action类的save方法,大家都知道Action请求的走的流程吧,Action在执行save方法后会不断的回调各种拦截器,其中就有一个modelDriven吧,这个拦截器的作用就是把自己所需的对象压入栈顶,因为压入栈顶后paparmeterInterceptor拦截器(默认会调用此拦截器的,),该拦截器就是把请求里的参数与值栈对象的一一匹配,这样我们的对象的属性就被一一匹配了吧,就从栈顶里拿下来了,然后根据dao的save方法放入数据库吧,整个流程就是这样
form提交---->Action类的Action方法------>因为实现了ModelDriven接口(下一遍我会把这个源代码分析上来)----->所以会调用getModel()方法,这个方法作用就是把我们所需的对象压入栈顶-->paparmeterInterceptor拦截器进行匹配------>表单提交的数据被匹配到我们的对象中,那我们就可以根据相应的方法放入数据库吖