深入理解面向接口编程:在类中调用接口的方法,而不必关心具体的实现。
这将有利于代码的解耦。 使程序有更好的可移植性和可扩展性。
1.CustomerSerlet 调用CustomerDAO :
//面向接口编程:Jdbc方式
private CustomerDAO customerDAO=new CustomerDAOJdbcImpl();
//面向接口编程:XML方式
//private CustomerDAO customerDAO=new CustomerDAOXMLImpl();
2.动态修改Customer的存储方式:通过修改类路径下的switch.properties文件的方式来实现
XML方式
type=xml
JDBC方式
type=jdbc
# 注释
1).CustomerServlet中不能再通过这样的方式写死实现类
private CustomerDAO customerDAO=new CustomerDAOJdbcImpl();
2).需要通过一个类的一个方法来获取具体的实现类的对象。
①.web.xml文件
<servlet>
<display-name>InitServlet</display-name>
<servlet-name>InitServlet</servlet-name>
<servlet-class>com.zc.mvcapp.servlet.InitServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
当前WEB应用才启动的时候initServlet被创建,并由Servlet容器调用init()方法;
@Override
public void init() throws ServletException {
CustomerDAOFactory.getInstance().setType("jdbc");
//读取类路径下的switch.properties文件
InputStream in =
getServletContext().getResourceAsStream("/WEB-INF/classes/switch.properties");
java.util.Properties properties=new java.util.Properties();
try {
properties.load(in);
//获取switch.properties的type属性值
String type=properties.getProperty("type");
//赋给了CustomerDAOFactory的type属性
CustomerDAOFactory.getInstance().setType(type);
} catch (Exception e) {
e.printStackTrace();
}
②.
public class CustomerServlet extends HttpServlet {
private CustomerDAO customerDAO=CustomerDAOFactory.getInstance().getCustomerDAO();
创建CustomerServlet时,为CustomerDAO属性赋值是通过
CustomerDAOFactory的getCustomerDAO()方法完成的。
private CustomerDAOFactory(){
daos.put("jdbc", new CustomerDAOJdbcImpl());
daos.put("xml", new CustomerDAOXMLImpl());
}
public CustomerDAO getCustomerDAO(){
return daos.get(type);
}
6.response.sendRedirect 可以避免表单的重复提交