面向接口的编程:
面向接口编程(Interface Oriented Programming:OIP)是一种编程思想,接口作为实体抽象出来的一种表现形式,用于抽离内部实现进行外部沟通,最终实现内部变动而不影响外部与其他实现交互,可以理解成按照这种思想来设计编程的方式就可以称为面向接口编程。 它并不是比面向对象编程更先进的一种独立的编程思想,可以说属于面向对象思想体系的一部分或者说它是面向对象编程体系中的思想精髓之一
用我的话说就是:用接口来解耦
Entity:
@Data注解来自lombok 此处帮助简化了set(), get(),toString()等方法
@Data
public class Client {private int clientId ;private String clientName;private String sex;private int age;public Client(int id, String clientName, String sex, int age) {this.clientId = id;this.clientName = clientName;this.sex = sex;this.age = age;}public Client(){}public Client(int clientId){this.clientId = clientId;}
}
Utils:
JdbcUtil.class:主要用于jdb的频繁连接和释放操作
JDBC工具类
DAO:
方法的命名:通常是和SQL语句有关 selectById updateById …
dao.ClientDao.java接口
/*** function annotation:通过id查询指定Client* TODO* @param id* @return Client*/Client selectById(Integer id) throws SQLException, ClassNotFoundException;
dao.impl.ClientDaoImpl.java 实现类
@Overridepublic Client selectById(Integer id) throws SQLException, ClassNotFoundException {String sql = "select * from client_TB where clientId = ?";//连接数据库Connection connection = JdbcUtils.getConnection();PreparedStatement ps = connection.prepareStatement(sql);ps.setInt(1, id);ResultSet resultSet = ps.executeQuery();Client client = new Client();while (resultSet.next()) {client.setClientId(resultSet.getInt(1));client.setClientName(resultSet.getString(2));//数据转化 birthday 转化成ageDate date = resultSet.getDate(3);int age = DateCompareUtils.compareYear(date.toString());client.setAge(age);client.setSex(resultSet.getString(4));}//释放资源JdbcUtils.release(resultSet,connection,ps);return client;}
Service:
本项目就是简单的增删查看,所以直接return clientdao.selectById();
//创建dao层对象
private ClientDao clientDao = new ClientDaoImpl();@Overridepublic Client getById(Integer id) throws SQLException, ClassNotFoundException {return clientDao.selectById(id);}
Controller:
public class FindClientServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req,resp);}@SneakyThrows@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1 获取表单数据//客户IDString clientId = req.getParameter("clientId");int id = Integer.parseInt(clientId);//2 创建 ClientService对象ClientService clientService = new ClientServiceImpl();//3 调用 clientService getById方法Client cl = clientService.getById(id);List<Client> list = new ArrayList<>();list.add(cl);//4 将结果放到request域当中req.setAttribute("clients",list);// 请求转发req.getRequestDispatcher("/clientList.jsp").forward(req,resp);}
}
在web.xml上设置servlet路径映射
<servlet><servlet-name>ListClientServlet</servlet-name><servlet-class>cn.edu.bnuz.order_system.controller.clientServlet.ListClientServlet</servlet-class></servlet><servlet-mapping><servlet-name>ListClientServlet</servlet-name><url-pattern>/listClient</url-pattern></servlet-mapping>
View:
在编写JSP代码时候一定要弄清楚逻辑顺序:Servlet→JSP 还是 JSP→Servlet 等等
这个时候在一开始项目设计时候用到的逻辑顺序图可以帮助我理解这样复杂的逻辑关系,能够快速定位
例如所有的VIEW层的JSP页面转发一定是要在一张JSP主页面里显示的,首先在启动Tomcat服务器时候就需要使用web.xml下设置默认开启的主页面
<welcome-file-list><welcome-file>main.jsp</welcome-file>
</welcome-file-list>
此处使用main.jsp页面作为启动项目的默认页面,<welcome-file-list>标签从字面意思就很清楚了解
main.jsp
<table width="100%" height="700" cellpadding="0" cellspacing="0" border="1"><tr><td width="15%" height="100%" valign="top" ><a href="${pageContext.request.contextPath}/listClient" target="mainFrame" style="padding-left: 90px">查询客户</a><br><a href="${pageContext.request.contextPath}/listProduct" target="mainFrame"style="padding-left: 90px">查询产品</a><br><a href="${pageContext.request.contextPath}/listOrder" target="mainFrame"style="padding-left: 90px">查询订单</a><br></td><td width="60%" height="100%" valign="top" ><iframe name="mainFrame" width="1100" height="2000" scrolling="no" frameborder="0" align="center"></iframe></td></tr></table>
<iframe>标签用于显示内嵌的jsp页面
例如:
通过逻辑顺讯图可知ListClient功能的逻辑顺序: main.jsp→ListClientServlet.class→view.jsp→clientList.jsp
主页main.jsp选择ListClient功能→ListClientServlet数据请求,数据装载到clientList.jsp→view.jsp更新为clientList.jsp
EL表达式能帮助简化代码
TIPS:用到了EL表达式,而JSP文件默认不使用的,需要引用
<%--el表达式的开启--%>
<%@ page isELIgnored="false"%>
client.jsp页面
<table border="1" align="center"><tr bgcolor="#949494"><th>客户ID</th><th>客户名</th><th>性别</th><th>年龄</th></tr><%--使用JSTL标签库的 <c:froEach>标签--%><c:forEach items="${clients}" var="cl"><tr><td align="center">${cl.clientId}</td><td align="center">${cl.clientName}</td><td align="center">${cl.sex}</td><td align="center">${cl.age}</td></tr></c:forEach>
</table>
最后的效果:默认是没有显示右边的客户表是一个main.jsp
当点击左边箭头所指的超链接就会弹出:具体功能实现了CRUD功能
github源码
https://github.com/zslkdjaw/study_notes/tree/servlet-jsp-mysql-orderSystem
基于数据库的订单系统设计模式应用开发
代码实现
总结