1、注解开发
-
分析oa项目中的web.xml文件
- 现在只是一个单标的CRUD,没有复杂的业务逻辑,很简单的一丢丢功能。web.xml文件中就有如此多的配置信息。如果采用这种方式,对于一个大的项目来说,这样的话web.xml文件会非常庞大,有可能最终会达到几十兆。
- 在web.xml文件中进行servlet信息的配置,显然开发效率比较低,每一个都需要配置一下。也就是一个请求对应一个sevlet
- 而且在web.xml文件中的配置是很少被修改的,所以这种配置信息能不能直接写到java类当中呢?可以的。
-
Servlet3.0版本之后,推出了各种Servlet基于注解式开发。优点是什么?
- 开发效率高,不需要编写大量的配置信息。直接在java类上使用注解进行标注。
- web.xml文件体积变小了。
-
并不是说注解有了之后,web.xml文件就不需要了:
- 有一些需要变化的信息,还是要配置到web.xml文件中。一般都是 注解+配置文件 的开发模式。
- 一些不会经常变化修改的配置建议使用注解。一些可能会被修改的建议写到配置文件中。
注意,可以使用
@WebServlet(“/dept/* “) 是模糊查询,前缀一样的,所以可以设置该项目内的url的前缀一致,但不可以是@WebServlet(”/”)
注解@WebServlet()内部不加项目名
2、解决类爆炸
- 上面的注解解决了配置文件的问题。但是现在的oa项目仍然存在一个比较臃肿的问题。
- 一个单标的CRUD,就写了6个Servlet。如果一个复杂的业务系统,这种开发方式,显然会导致类爆炸。(类的数量太大。)
- 怎么解决这个类爆炸问题?可以使用模板方法设计模式。
- 怎么解决类爆炸问题?
- 以前的设计是一个请求一个Servlet类。1000个请求对应1000个Servlet类。导致类爆炸。
- 可以这样做:一个请求对应一个方法。一个业务对应一个Servlet类。
- 处理部门相关业务的对应一个DeptServlet。处理用户相关业务的对应一个UserServlet。处理银行卡卡片业务对应一个CardServlet。
接下来基于以上两种方式,对文章1:纯Servlet的CRUD的操作进行改进
一个请求对应一个方法,文章一中写了6个类,接下来改进成一个业务DeptServlet类,该业务类继承HttpServlet父类,在内部重写方法
protected void service(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException;
那现在可能有一个疑问就是为什么不像之前一样重写doGet/doPost方法呢?
漏漏漏,因为这6种请求对应的6个方法可能是post请求,也可能是get请求,在这种情况下,我们重写doGet/doPost的上一级方法,也就是service()方法。
理清思路了,接下来就让我们来重新写下主类叭
package com.wll.javaweb.oaImprove;
import DBUtil.DButil;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* @author nideyiyi
* @create 2022-11-14-20:08
*/
@WebServlet({"/dept/add","/dept/del","/dept/edit","/dept/editpage","/dept/showlist","/dept/detail"})
public class DeptServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException{
String servletPath = request.getServletPath();
if("/dept/add".equals(servletPath)){
doAdd(request,response);
}else if("/dept/del".equals(servletPath)){
doDel(request,response);
}else if("/dept/edit".equals(servletPath)){
doEdit(request,response);
}else if("/dept/editpage".equals(servletPath)){
doEditPage(request,response);
}else if("/dept/showlist".equals(servletPath)){
doShowList(request,response);
}else if("/dept/detail".equals(servletPath)){
doDetail(request,response);
}
}
private void doShowList(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String cpath = request.getContextPath();
out.println( " <!DOCTYPE html>");
out.println( " <html lang='en'>");
out.println( " <head>");
out.println( " <meta charset='UTF-8'>");
out.println( " <title>部门列表</title>");
out.println(" <script type='text/javascript'>");
out.println(" function del(deptno){");
out.println(" if(window.confirm('亲,删除了就不可以恢复了呦!')){");
out.println(" document.location.href='"+cpath+"/dept/del?deptno=' + deptno");
out.println(" }");
out.println(" }");
out.println(" </script>");
out.println( "</head>");
out.println( "<body>");
out.println("<h1 align='center'>部门列表</h1>");
out.println( " <hr>");
out.println( " <form>");
out.println( " <table align='center' border='10px solid red' width='80%' >");
out.println( " <tr>");
out.println( " <th>序号</th>");
out.println( " <th>部门编号</th>");
out.println( " <th>部门名称</th>");
out.println( " <th>部门地址</th>");
out.println( " <th>操作</th>");
out.println( " </tr>");
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = DButil.getConnection();
String sql = "select deptno,dname,loc from dept";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
int a = 1;
while(rs.next()){
String deptno = rs.getString(1);
String dname = rs.getString(2);
String loc = rs.getString(3);
out.println( " <tr>");
out.println( " <td>"+(a++)+"</td>");
out.println( " <td>"+deptno+"</td>");
out.println( " <td>"+dname+"</td>");
out.println( " <td>"+loc+"</td>");
out.println( " <td>");
out.println( " <a href='javascript:void(0)' οnclick='del("+deptno+")'>删除</a>");
out.println( " <a href='"+cpath+"/dept/editpage?deptno="+deptno+"&dname="+dname+"&loc="+loc+"'>修改</a>");
out.println( " <a href='"+cpath+"/dept/detail?deptno="+deptno+"'>详情</a>");
out.println( " </td>");
out.println( " </tr>");
}
} catch (Exception throwables) {
throwables.printStackTrace();
}finally {
DButil.close(rs,ps,conn);
}
out.println( " </table>");
out.println( " </form>");
out.println( " <hr>");
out.println( " <a href='/oa/add.html'>新增部门</a>");
out.println( " </body>");
out.println( " </html>");
}
private void doDetail(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String cpath = request.getContextPath();
String deptno1 = request.getParameter("deptno");
out.println(" <!DOCTYPE html>");
out.println(" <html lang='en'>");
out.println(" <head>");
out.println(" <meta charset='UTF-8'>");
out.println(" <title>Title</title>");
out.println(" </head>");
out.println(" <body>");
out.println(" <h1 align='center'>部门列表</h1>");
out.println(" <hr>");
out.println(" <form>");
out.println(" <table align='center' border='10px solid red' width='80%'>");
out.println(" <tr>");
out.println(" <th>序号</th>");
out.println(" <th>部门编号</th>");
out.println(" <th>部门名称</th>");
out.println( " <th>部门地址</th>");
out.println(" </tr>");
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs =null;
try {
conn = DButil.getConnection();
String sql = "select dname,loc from dept where deptno = ?";
ps = conn.prepareStatement(sql);
ps.setString(1,deptno1);
rs=ps.executeQuery();
int a = 1;
while(rs.next()){
String dname = rs.getString(1);
String loc = rs.getString(2);
out.println(" <tr>");
out.println(" <td>"+(a++)+"</td>");
out.println(" <td>"+deptno1+"</td>");
out.println(" <td>"+dname+"</td>");
out.println(" <td>"+loc+"</td>");
out.println(" </tr>");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
DButil.close(rs,ps,conn);
}
out.println(" </table>");
out.println(" </form>");
out.println(" <hr>");
out.println(" <input type='button' value='后退' οnclick='window.history.back()'/>");
out.println(" </body>");
out.println(" </html>");
}
private void doEditPage(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String dname = request.getParameter("dname");
String loc = request.getParameter("loc");
String deptno = request.getParameter("deptno");
String cpath = request.getContextPath();
out.println(" <!DOCTYPE html>");
out.println(" <html lang='en'>");
out.println(" <head>");
out.println(" <meta charset='UTF-8'>");
out.println(" <title>修改部门</title>");
out.println(" </head>");
out.println(" <body>");
out.println(" <h1>修改部门</h1>");
out.println(" <hr>");
out.println(" <form action='"+cpath+"/edit' method='post'>");
out.println(" <label for='input1'>部门编号:<input name='deptno' id='input1' value='"+deptno+"' readonly></label><br>");
out.println(" <label for='input2'>部门名称:<input name='dname' id='input2' value='"+dname+"'></label><br>");
out.println(" <label for='input3'>部门位置:<input name='loc' id='input3' value='"+loc+"'></label><br>");
out.println(" <button type='submit' name='保存' value='修改' >保存</button>");
out.println(" </form>");
out.println(" </body>");
out.println(" </html>");
}
private void doEdit(HttpServletRequest request, HttpServletResponse response)throws IOException,ServletException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
String dname = request.getParameter("dname");
String loc = request.getParameter("loc");
String deptno = request.getParameter("deptno");
String cpath = request.getContextPath();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
int flag = 0;
try {
conn = DButil.getConnection();
String sql = "update dept set dname=?,loc=? where deptno=? ";
ps = conn.prepareStatement(sql);
ps.setString(1,dname);
ps.setString(2,loc);
ps.setString(3,deptno);
flag = ps.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
DButil.close(rs,ps,conn);
}
if(flag == 1){
response.sendRedirect(request.getContextPath()+"/showlist");
// request.getRequestDispatcher("/showlist").forward(request,response);
}else{
response.sendRedirect(request.getContextPath()+"/error.html");
// request.getRequestDispatcher("/error.html").forward(request,response);
}
}
private void doDel(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String deptno = request.getParameter("deptno");
Connection conn = null;
PreparedStatement ps = null;
int flag= 0 ;
try {
conn = DButil.getConnection();
String sql = "delete from dept where deptno=?";
ps = conn.prepareStatement(sql);
ps.setString(1,deptno);
flag = ps.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
DButil.close(null,ps,conn);
}
if(flag == 1){
response.sendRedirect(request.getContextPath()+"/showlist");
// request.getRequestDispatcher("/showlist").forward(request,response);
}else{
response.sendRedirect(request.getContextPath()+"/error.html");
// request.getRequestDispatcher("/error.html").forward(request,response);
}
}
private void doAdd(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String dname = request.getParameter("dname");
String loc = request.getParameter("loc");
String deptno = request.getParameter("deptno");
Connection conn = null;
PreparedStatement ps = null;
int flag= 0 ;
try {
conn = DButil.getConnection();
String sql = "insert into dept(deptno,dname,loc) values(?,?,?)";
ps = conn.prepareStatement(sql);
ps.setString(1, deptno);
ps.setString(2, dname);
ps.setString(3, loc);
flag = ps.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
DButil.close(null,ps,conn);
}
if(flag== 1){
// request.getRequestDispatcher("/showlist").forward(request,response);
response.sendRedirect(request.getContextPath()+"/showlist");
}else{
response.sendRedirect(request.getContextPath()+"/error.html");
// request.getRequestDispatcher("/error.html").forward(request, response);
}
}
}
注意:url路径基于'/dept'
的更改!!!!
运行下来很完美!!!!哈哈哈哈,我很快乐!!!!!