添加用户:以前是传一个command,现在换一种方式,不传command了.在servlet的url-pattern中用*.do;则如果是添加就是addUser.do,那么在servlet中截取到这个是/servlet/addUser还是/servlet/delUser而作相应的操作.但这也有一个缺点,就是会有大量的if..else语句,把东西写死了,不符合OCP原则.还有就是/servlet/delUser等这样的串容易写错,也容易写死.还有就是这些要转向的页面也写死了,不灵活!这些东西如何拿出来.
如何去掉if...else?
抽取一个接口,叫Action,有个方法execute();然后每个if都对应一个类,它实现了Action接口,如AddUserAction,servlet中看到的是Action接口.并且要把这些东西用xml文件配起来,
配置格式如下:
<action-config>
<action path="/servlet/addUser" type="cn.wenping.servlet.AddUserAction">
<forward name="success">/add_success.jsp</forward>
<forward name="error">/add_error.jsp</forward>
</action>
<action path="/servlet/delUser" type="cn.wenping.servlet.DelUserAction">
<forward name="success">/del_success.jsp</forward>
<forward name="error">/del_error.jsp</forward>
</action>
</action-config>
可以把这些东西放到一个map里面嘛,map.put(path,一个mapping)
mapping包含的信息的形式是这样:
ActionMapping{
private String path;
private String type;
Map forwardMap;
}
forwardMap{
key="success";
value="del_success.jsp";
key="error"
value="del_error.jsp"
}
如添加就是
actionMapping{
path="/servlet/addUser";
type="cn.wenping.servlet.AddUserAction";
forwardMap{
key="success",value="...";
key="error", value="..."
}
}
将每一条配置放入一个map里面,path就是这个map的key
Map map = new HashMap();
map.put("/servlet/delUser", actionMapping);
map.put("/servlet/addUser", actionMapping);
map.put("/servlet/modifyUser", actionMapping);
map.put("/servlet/queryUser", actionMapping);
String path="/servlet/addUser"
在servlet中就可以通过截取的URL请求,到Map里面去请求对应的Action
ActionMapping actionMapping=(ActionMapping)map.get(path)
取得本请求对应的Action类的完整路径String type = actionMappint.getType();
采用反射动态实例化Action
Action action = (Action)class.forName(type).newInstance();
动态待用Action中的execute方法
String forward = action.execute(request, response);
根据路径完成转向
request.getRequestDispatcher(forward).forward(request, response);
以上就是struts的基本原理