思维导图
1.解决自控制器初始化的问题
改动init中代码
减少代码改动风险性
减少代码编译次数(对于已经部署到服务器后)
解决方案:
改成自控制器可配置
解决步骤:
1.必须要有配置文件config.xml
2.配置文件config.xml中要包含处理业务的子控制器
3.读取到配置文件config.xml中对应的处理游览器请求的子控制器
如图,以前需要写多个put方法
2.解决参数实体类封装的问题
解决参数实体类封装的问题
/*
* 缺陷:对于前端传参,实体类属性值封装req.getParammeter("")代码 是重复的
* 需求:做一个book的新增功能
* 思考:将JSP参数塞进实体类的属性中,问题是每个实体类的属性是不一样的,没办法做到代码的完全重复
* 思路:
* 不知道是哪一个实体类->泛型T
* 不知道这个实体类有哪些属性,但是又要给这些属性赋值->反射动态设置属性值
* 解决:泛型+反射
* 编码:
* 模型驱动接口:ModelDriver
*/
如图以前设置需要写多个set方法
需求:删除数据后跳转到书籍展示页面
* 缺陷:1.出现大量重复代码 2.不好管理(增删改重新跳转到查询界面)
* 解决方案:在一个地方统一管理重定向还是转发,并且是定位跳转到哪一个页面
* 预测结果
* BookAction调用bookDao.delete()...
* BookAction调用bookDao.list()...
如图以前需要在这里面转发或重定向
Book类
package com.lj.entity;
public class Book {
private String bid;
private String bname;
private String price;
private String author;
private String publish;
private String remark;
public String getBid() {
return bid;
}
public void setBid(String bid) {
this.bid = bid;
}
public String getBname() {
return bname;
}
public void setBname(String bname) {
this.bname = bname;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPublish() {
return publish;
}
public void setPublish(String publish) {
this.publish = publish;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
@Override
public String toString() {
return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + ", author=" + author + ", publish="
+ publish + ", remark=" + remark + "]";
}
}
ActionModel类
package com.lj.framework;
import java.util.HashMap;
import java.util.Map;
public class ActionModel {
// <action path="/regAction" type="test.RegAction">
private String path;
private String type;
private Map<String, ForwardModel> fMap = new HashMap<>();
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
// ѹջ
public void push(ForwardModel forwardModel) {
fMap.put(forwardModel.getName(), forwardModel);
}
// ��ջ
public ForwardModel pop(String name) {
return fMap.get(name);
}
}
ActionSupport类
package com.lj.framework;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ActionSupport implements Action {
@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) {
String methodName = req.getParameter("methodName");
String res = null;
try {
Method m = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
m.setAccessible(true);
res = (String) m.invoke(this, req, resp);
} catch (Exception e) {
e.printStackTrace();
}
return res;
}
}