javaweb模块功能开发顺序(前后端不分离)
1.编写模块的数据库表
就是创建当前模块的主要类所拥有的属性的数据库表格,并向其中插入一些数据
2.编写模块的JavaBean
在IDEA中编写该主要类,将属性设置为私有,编写一个空参的构造器和全参构造器,编写所有属性的Set和Get方法,重写toString方法
3.编写模块的Dao和测试Dao
-
就是对数据库的增删改查操作,首先编写在dao包下编写一个类接口,取名为xxxDao,在Dao类中编写增删改查的抽象方法,或者是编写你想对这个模块做的一些事情,比如全部清空clear,保存save等。
下面是编写BaseDao的代码:
public abstract class BaseDao { //使用DbUtils操作数据库 private QueryRunner queryRunner = new QueryRunner(); /** * update() 方法用来执行:Insert\Update\Delete语句 * * @return 如果返回-1,说明执行失败<br/>返回其他表示影响的行数 */ public int update(String sql, Object... args) { Connection connection = JdbcUtils.getConnection(); try { return queryRunner.update(connection, sql, args); } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtils.close(connection); } return -1; } /** * 查询返回一个javaBean的sql语句 * * @param type 返回的对象类型 * @param sql 执行的sql语句 * @param args sql对应的参数值 * @param <T> 返回的类型的泛型 * @return */ public <T> T queryForOne(Class<T> type, String sql, Object... args) { Connection con = JdbcUtils.getConnection(); try { return queryRunner.query(con, sql, new BeanHandler<T>(type), args); } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtils.close(con); } return null; } /** * 查询返回多个javaBean的sql语句 * * @param type 返回的对象类型 * @param sql 执行的sql语句 * @param args sql对应的参数值 * @param <T> 返回的类型的泛型 * @return */ public <T> List<T> queryForList(Class<T> type, String sql, Object... args) { Connection con = JdbcUtils.getConnection(); try { return queryRunner.query(con, sql, new BeanListHandler<T>(type), args); } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtils.close(con); } return null; } /** * 执行返回一行一列的sql语句 * @param sql 执行的sql语句 * @param args sql对应的参数值 * @return */ public Object queryForSingleValue(String sql, Object... args){ Connection conn = JdbcUtils.getConnection(); try { return queryRunner.query(conn, sql, new ScalarHandler(), args); } catch (Exception e) { e.printStackTrace(); } finally { JdbcUtils.close(conn); } return null; } }
-
再在impl包下编写实现类,在这里编写的实现类要继承(extends)BaseDao和实现(implements)上面编写的xxxDao,取名为xxxDaoImpl,将接口中的抽象方法根据实际情况实现。一般就是先设置一个sql语句,再return update方法,update(sql,这后面根据形参和sql语句中的?写)。
注意查询语句一般有两种,一个是通过id单个查询,一个是全部查询。
最后编写测试方法,在XXXDao接口里面找一个空行,然后按住ctrl+shift+t,自动生成test方法。
-
先在test方法里面创建一个接口类的实现对象。
-
然后根据实现类XXXDaoImpl里面的具体实现方法,来编写各个test方法,做一些看实际操作能否实现的测试。
4.编写模块的Service和测试Service
Service类的编写和Dao的编写类似。
都是在各自对应的包下先创建一个接口,Service的编写是在service包下创建一个XXXService接口,里面编写和Dao中XXXDao接口一样的抽象方法或者增加一些你的网页想自己实现的方法。
然后不同的是,Dao是实现和数据库的连接,Service是实现和服务器的连接,因此具体实现方法中,XXXServiceImpl要首先创建一个XXXDao类接口的XXXDaoImpl实现对象,然后在每个方法中通过调用实现类对象进行XXXService方法的实现--------------相当于给你想要访问数据库的操作增加了一层Service的外衣,因为你此时已经是通过服务器调用数据库了。
最后测试方法遵循一样的规则,在XXXService接口中,按住ctrl+shift+t自动创建test方法,同样首先创建一个是实现对象,这时的实现对象就是XXXServiceImpl了,test就相当于你假装通过了服务器,在本地调用,观察服务器到数据库这条道是否打通,方便你之后编写后端Servlet的时候用Service的一些类。
然后调用实现对象XXXService里面实现的方法
5.编写模块的Web层,和页面联调测试
编写Web主要就是编写一些Servlet程序,首先编写Servlet的过程在之前的文章中有,下面简述一下。
然后它就会在Web.xml里面自动创建下面的配置内容
然后自己手动配置一下下面的内容
这个url-pattern的路径根据需要修改
然后创建XXXServlet程序,继承一个编写好的BaseServlet程序,BaseServlet代码如下
public abstract class BaseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getParameter("action");
try {
// 获取action业务鉴别字符串,获取相应的业务 方法反射对象
Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
// System.out.println(method);
// 调用目标业务 方法
method.invoke(this, req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
在XXXServlet中首先创建一个XXXService对象
这里就体现了XXXService的用武之地
比如说我在图书管理系统页面上设置了一个修改按钮如下,
前面这一部分是指要转到哪个Servlet里面去,这个跟web.xml文件有关
这一部分是指要执行什么操作,这一步的设置和BaseServlet有关,
上面的例子因为要修改某一本书,就要知道这本书主键id,然后通过id找到这本书的所有信息,为什么要页面号呢,是因为我们设置了一个页面来浏览图书,页面号pageNo的传递是为了方便后面页面回显。
这样找到图书之后,请求重定向去book_edit页面,
以下是book_edit隐藏域的内容,这些内容是会随着提交按钮被发送给服务器的
这个操作的意思是如果id为空就是action=add就是增加图书的操作,如果id不为空,就是修改图书的操作,我们可以知道请求转发过来的时候id是不为空的,因此是update操作,
修改完成之后,点击提交按钮,服务器得到请求,执行action=update操作,
首先从上面你修改过的内容得到Map里面存放着修改后的数据,然后得到一个修改之后的Book对象,根据这个对象的内容修改保存到数据库,下面是BookDaoImpl的updateBook方法
然后可以看到数据库中的内容已经得到修改,页面也通过PageNo回到最初点击修改的那个Page页面。
这里是由action=page到了page方法中,page方法就是根据pageNo页面,和pageSize的大小,调用XXXService中的page方法得到一个新的page对象
最后设置分页条的请求地址,重定向回最开始的页面显示,将我们设置的页面显示在服务器上,显示的数据即为已经更新的数据。
注意:以上大概就是设置一个模块某个功能的的开发顺序。
仅供自己复习参考,错误请大佬指正。