当前位置: 首页 > 图灵资讯 > 技术篇> 使用EL和JSTL改造oa

使用EL和JSTL改造oa

来源:图灵教育
时间:2023-06-05 09:32:31

1.OA541.1用什么技术改造?54-55

Servlet+JSP+EL表达式+JSTL标签。改造。

-在前端HTML代码中,有一个叫做base标签的标签,可以设置整个网页的基本路径。

-这不是Java语法,也不是JSP语法。它是HTML中的一种语法。HTML中的标签。通常出现在Head标签中。

<basehref="http://localhost:8080/oa/">

-在当前页面中,任何未从“/”开始的路径都会在这些路径之前自动添加base中的路径。

-<ahref="ab/def">

-等同于:<ahref="http://localhost:8080/oa/ab/def">

-需要注意的是,为了保险JS代码中的路径,最好不要依赖base标签。JS代码中的路径最好写在整个路径上。

base标签的写作方法

<base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/">

2.目前OA项目有哪些缺陷?56

-DeptServlet、EmpServlet、OrderServlet。每一个Servlet都在处理自己的相关业务。在执行这些Servlet之前,需要判断用户是否登录。如果用户登录,可以继续操作。如果没有登录,用户需要登录。判断用户是否登录的代码是固定的,需要在每个Servlet类别中编写。显然,代码没有重复使用。每一个Servlet都要解决中文乱码问题,还有公共代码。目前这些代码都是重复编写的,还没有实现重用。如何解决这个问题?

-Servlet规范中的Filter过滤器可以用来解决这个问题。

3.在oa项目中实现目前在线登录的人数。61

-用户登录的代表是什么?

-session.setAttribute("user",userObj);只要User类型的对象存储在Session中,就意味着有新用户登录。

-用户退出的代表是什么?

-session.removeAttribute("user");从session域中删除User类型的对象。

-或者可能是session被销毁了。(session超时)

com中的代码.bjpowernode.oa.bean.javabeanDept

package com.bjpowernode.oa.bean;import java.util.Objects;//这是一个普通的java类,可以包装分散的数据,代表部门对象public class Dept {    private String deptno;    private String dname;    private String loc;    public Dept() {    }    public String getDeptno() {        return deptno;    }    public void setDeptno(String deptno) {        this.deptno = deptno;    }    public String getDname() {        return dname;    }    public void setDname(String dname) {        this.dname = dname;    }    public String getLoc() {        return loc;    }    public void setLoc(String loc) {        this.loc = loc;    }    @Override    public String () {        return "Dept{" +                "deptno='" + deptno + '\'' +                ", dname='" + dname + '\'' +                ", loc='" + loc + '\'' +                '}';    }    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        Dept dept = (Dept) o;        return Objects.equals(deptno, dept.deptno) &&                Objects.equals(dname, dept.dname) &&                Objects.equals(loc, dept.loc);    }    @Override    public int hashCode() {        return Objects.hash(deptno, dname, loc);    }}

User(显示在线人数)

package com.bjpowernode.oa.bean;import jakarta.servlet.ServletContext;import jakarta.servlet.http.HttpSessionBindingEvent;import jakarta.servlet.http.HttpSessionBindingListener;//这个javabean负责显示用户的在线数量  61public class User implements HttpSessionBindingListener {    @Override    public void valueBound(HttpSessionBindingEvent event) {        ///用户登录        ///user类型的对象存储在session域中        ///获得Servletcontext域对象        //因为我们必须存储所有用户,所以放在最大的application域(application域相当于servletcontext)        ServletContext application = event.getSession().getServletContext();        //获取在线人数        Object onlinecount = application.getAttribute("onlinecount");        if(onlinecount==null){///第一次取可能是空的            application.setAttribute("onlinecount",1);//如果第一次取空,我们只存一个        }else{            int count = (Integer)onlinecount;            count++;///用户登录加1            application.setAttribute("onlinecount",count);//存储Servletcontext域        }    }    @Override    public void valueUnbound(HttpSessionBindingEvent event) {        ///用户退出        ///user类型的对象删除到session域        ///获得Servletcontext对象        ServletContext application = event.getSession().getServletContext();        //获取在线人数        Integer onlinecount =(Integer) application.getAttribute("onlinecount");        onlinecount--;///用户退出登录减1        application.setAttribute("onlinecount",onlinecount);//存储Servletcontext域    }    private String username;    private String password;    public User() {    }    public User(String username, String password) {        this.username = username;        this.password = password;    }    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }}

com.bjpowernode.oa.utils工具类DBUtil

package com.bjpowernode.oa.utils;import java.sql.*;import java.util.ResourceBundle;/** * JDBC工具类   27 */public class DBUtil {    // 静态变量:在类加载过程中执行。    // 而且有序。自上而下的顺序。    // 绑定属性资源文件    private static ResourceBundle bundle = ResourceBundle.getBundle("resources.jdbc");    // key根据属性配置文件获得value    private static String driver = bundle.getString("driver");    private static String url = bundle.getString("url");    private static String user = bundle.getString("user");    private static String password = bundle.getString("password");    static {        // 注册驱动(注册驱动只需注册一次,放置在静态代码块中。加载DBUTil类时执行。加载DBUTil类时执行。)        try {            // "com.mysql.jdbc.Driver" 是连接数据库的驱动,不能写死。因为Oracle数据库将来可能会连接起来。            // 在连接oracle数据库时,还需要修改java代码,这显然违反了OCP开关的原则。            // OCP开关原则:对扩展开放,对修改关闭。(什么是符合OCP?不需要修改java源代码进行功能扩展。)            //Class.forName("com.mysql.jdbc.Driver");            Class.forName(driver);        } catch (ClassNotFoundException e) {            e.printStackTrace();        }    }    /**     * 获取数据库连接对象     * @return conn 连接对象     * @throws SQLException     */    public static Connection getConnection() throws SQLException {        // 获取连接        Connection conn = DriverManager.getConnection(url, user, password);        return conn;    }    /**     * 释放资源     * @param conn 连接对象     * @param ps 数据库操作对象     * @param rs 结果集对象     */    public static void close(Connection conn, Statement ps, ResultSet rs){        if (rs != null) {            try {                rs.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if (ps != null) {            try {                ps.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if (conn != null) {            try {                conn.close();            } catch (SQLException e) {                e.printStackTrace();            }        }    }}

com中的代码.bjpowernode.oa.web.actionDeptServlet

package com.bjpowernode.oa.web.action;import com.bjpowernode.oa.bean.Dept;import com.bjpowernode.oa.utils.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 jakarta.servlet.http.HttpSession;import java.io.IOException;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;///使用jsp改造单表的CRUD操作  38@WebServlet({"/dept/list","/dept/detail","/dept/delete","/dept/save","/dept/modify"})public class DeptServlet extends HttpServlet {    @Override    protected void service(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        // 获取session(这个session不需要新建)   44        // 只获得当前的session,得不到,回到nulllllllllllllllllllll        /*HttpSession session = request.getSession(false);        ///这里解释为什么if有两个判断条件,因为毫无疑问,第一个保证session不是null。        // ,但是session.getattribute中的username不是空的,因为系统默认访问index文件的        // ,因此,默认访问index文件也会产生session会话,因此需要添加第二个条件        if(session!=null && session.getAttribute("username")!=null){            String servletPath = request.getServletPath();//得到路径            if("/dept/list".equals(servletPath)){                doList(request,response);            }else if("/dept/detail".equals(servletPath)){                doDetail(request,response);            }else if("/dept/delete".equals(servletPath)){                doDel(request,response);            }else if("/dept/save".equals(servletPath)){                doSave(request, response);            }else if("/dept/modify".equals(servletPath)){                doModify(request,response);            }        }else{            ///未登录自动跳转登录页面            //重定向            //三种写法            //response.sendRedirect("/oa/index.jsp");////普通老老实实的写法            //response.sendRedirect("/oa");///省略index.jsp,因为index文件会自动访问            response.sendRedirect(request.getContextPath()+"/index.jsp");//动态获取根写法,登录页面自动找到        }*/        String servletPath = request.getServletPath();//得到路径        if("/dept/list".equals(servletPath)){            doList(request,response);        }else if("/dept/detail".equals(servletPath)){            doDetail(request,response);        }else if("/dept/delete".equals(servletPath)){            doDel(request,response);        }else if("/dept/save".equals(servletPath)){            doSave(request, response);        }else if("/dept/modify".equals(servletPath)){            doModify(request,response);        }    }    //保存部门信息   40    private void doSave(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException{        //获取部门信息        // 注意乱码问题(Tomcat10不会出现这个问题)        request.setCharacterEncoding("UTF-8");        String deptno = request.getParameter("deptno");        String dname = request.getParameter("dname");        String loc = request.getParameter("loc");        ///连接数据库执行insert语句        Connection conn = null;        PreparedStatement ps = null;        int count = 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);            count = ps.executeUpdate();        } catch (SQLException e) {            e.printStackTrace();        } finally {            DBUtil.close(conn,ps,null);        }        if(count==1) {            // 最好在这里使用重定向(浏览器会发送一个全新的请求。)            // 浏览器在地址栏上发送请求,即get请求。            response.sendRedirect(request.getContextPath()+"/dept/list");        }    }    ////根据部门编号删除相应的部门  40    private void doDel(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException{        //获取部门编号        String deptno = request.getParameter("deptno");        //连接数据库,查询部门信息        Connection conn = null;        PreparedStatement ps = null;        int count = 0;        try {            conn = DBUtil.getConnection();            String sql = "delete from dept where deptno = ?";            ps = conn.prepareStatement(sql);            ps.setString(1,deptno);            count = ps.executeUpdate();///返回删除受影响的条数        } catch (SQLException e) {            e.printStackTrace();        } finally {            DBUtil.close(conn,ps,null);        }        if(count == 1){            ///成功删除            ////重定向列表页面            String contextPath = request.getContextPath();///获取应用程序的根路径            response.sendRedirect(contextPath+"/dept/list");        }    }    ///根据部门编号获取部门信息   39    private void doDetail(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException{        ///创建部门对象        Dept dept = new Dept();        //获取部门编号        String dno = request.getParameter("dno");        ///根据部门编号获取部门信息 将部门信息封装成咖啡豆(即javabean)        //连接数据库,查询部门信息        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,dno);            rs = ps.executeQuery();            ///这个结果只集中了一个数据,所以不需要while循环,只需要if            if(rs.next()){                String dname = rs.getString("dname");                String loc = rs.getString("loc");                ///包装对象(创建豆子javabean)                dept.setDeptno(dno);                dept.setDname(dname);                dept.setLoc(loc);            }        } catch (SQLException e) {            e.printStackTrace();        } finally {            DBUtil.close(conn,ps,rs);        }        ///这个豆子只有一个,所以不需要袋子(也就是不需要集合),只需要把袋子放在request域        request.setAttribute("dept",dept);        //转发(不是重定向,因为要跳转到JSP进行数据显示)        //request.getRequestDispatcher("/detail.jsp").forward(request,response);        ///获得不同的标志(这个标志是我们的listt.自己添加jsp修改和细节,用于区分修改和细节操作)        //因为我们可以根据不同的标记转发到不同的页面  40       /* String f = request.getParameter("f");        if("m".equals(f)){            //转发到修改页面            request.getRequestDispatcher("/edit.jsp").forward(request,response);        }else if("d".equals(f)){            //转发到详细页面            request.getRequestDispatcher("/detail.jsp").forward(request,response);        }*/        //我们将简化上述代码 这是路径拼接 getParameter("f")得到标记  40        String forward = "/"+request.getParameter("f")+".jsp";        ///根据获得的拼接路径转发        request.getRequestDispatcher(forward).forward(request,response);    }    //连接数据库,查询所有部门信息,收集部门信息,然后跳转到JSP进行页面显示。38    private void doList(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException{        //准备一个容器,专门用于存储部门        List depts = new ArrayList<>();        //连接数据库,查询所有部门信息        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();            ///遍历结果集            while(rs.next()){                ///集中从结果中取出                String deptno = rs.getString("deptno");                String dname = rs.getString("dname");                String loc = rs.getString("loc");                ///将上述分散的数据封装成java对象                Dept dept = new Dept();                dept.setDeptno(deptno);                dept.setDname(dname);                dept.setLoc(loc);                ////将部门对象放入list集中                depts.add(dept);            }        } catch (SQLException e) {            e.printStackTrace();        } finally {            ///关闭连接            DBUtil.close(conn,ps,rs);        }        ///将一个集合放入请求域        request.setAttribute("deptList",depts);        ///转发不要重定向        request.getRequestDispatcher("/list.jsp").forward(request,response);    }    ///修改操作   40    private void doModify(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        ////解决请求体中文乱码问题        request.setCharacterEncoding("UTF-8");        //获取表单数据        String deptno = request.getParameter("deptno");        String dname = request.getParameter("dname");        String loc = request.getParameter("loc");        ////连接数据库执行更新语句        Connection conn = null;        ;        PreparedStatement ps = null;        int count = 0;        try {            conn = DBUtil.getConnection();            String sql = "update dept set dname = ?,loc = ?,loc = ? where deptno = ?";            ps = conn.prepareStatement(sql);            ps.setString(1, dname);            ps.setString(2, loc);            ps.setString(3, deptno);            count = ps.executeUpdate();        } catch (SQLException e) {            e.printStackTrace();        } finally {            DBUtil.close(conn, ps, null);        }        if (count == 1) {            ///成功更新            //重定向            response.sendRedirect(request.getContextPath() + "/dept/list");        }     }}

UserServlet

package com.bjpowernode.oa.web.action;import com.bjpowernode.oa.bean.User;import com.bjpowernode.oa.utils.DBUtil;import jakarta.servlet.ServletException;import jakarta.servlet.annotation.WebServlet;import jakarta.servlet.http.*;import java.io.IOException;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;///专门处理用户登录  41//Servlet负责业务处理//JSP负责页面显示@WebServlet({"/user/login","/user/exit"})public class UserServlet extends HttpServlet {    @Override    protected void service(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        String servletPath = request.getServletPath();        if("/user/login".equals(servletPath)){            doLogin(request,response);//调用登录        }else if("/user/exit".equals(servletPath)){            doExit(request,response);//调用退出        }    }    //退出   45    protected void doExit(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        ///获取session对象,销毁session        HttpSession session = request.getSession(false);        if (session !=null){            ///从session域删除user对象            session.removeAttribute("user");            ////手动销毁sssion对象            session.invalidate();            ///销毁cookie    54-55            Cookie[] cookies = request.getCookies();            if(cookies != null){                for (Cookie cookie : cookies) (//循环遍历cookiee                    设置cookie的有效时间为0,表示删除cookie                    cookie.setMaxAge(0);                    ////设置cookie的路径                    cookie.setPath(request.getContextPath());////删除cookie,注意路径问题                    //向浏览器响应cookie,浏览器端将覆盖之前的cookie                    response.addCookie(cookie);                }            }            //跳转登录页面            ///这是重定向            response.sendRedirect(request.getContextPath());        }    }    //登录    protected void doLogin(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        boolean success = false;///登录成功标志        ////验证用户名和密码是否正确        ///获取用户名和密码        // 您是这样提交前端的:username=admin&password=123        String username = request.getParameter("username");        String password = request.getParameter("password");        ////连接数据库验证用户名和密码        Connection conn = null;        PreparedStatement ps = null;        ResultSet rs = null;        try {            conn = DBUtil.getConnection();            String sql = "select * from t_user where username=? and password=? and password=?";            ///编译sql            ps = conn.prepareStatement(sql);            //给?赋值            ps.setString(1,username);            ps.setString(2,password);            //执行sql            rs = ps.executeQuery();            ///这个结果只集中了一个数据            if (rs.next()) {                ///成功登录                success = true;            }        } catch (SQLException e) {            e.printStackTrace();        }finally {            DBUtil.close(conn,ps,rs);        }        if(success){            // 获得session对象(这里的要求是:必须获得session    44            // ,没有session也要新建session对象。)            HttpSession session = request.getSession();//session对象一定不能空nulll            //session.setAttribute("username",username);///存储用户名            //这两行是为了显示在线人数(上面的写法是对的,也就是说没有这个功能)  61            User user = new User(username, password);            session.setAttribute("user",user);            ///成功登录,用户选择在10天内免费登录            String f = request.getParameter("f");            if("1".equals(f)){                ///创建cookie对象存储登录名称                Cookie cookie1 = new Cookie("username",username);                ///创建cookie对象存储密码                Cookie cookie2 = new Cookie("password", password);                ///设置cookie的有效时间为十天                cookie1.setMaxAge(60*60*24*10);                cookie2.setMaxAge(60*60*24*10);                ///设置cokiepath(只要访问此应用程序,浏览器必须携带这两个cookie)                cookie1.setPath(request.getContextPath());                cookie2.setPath(request.getContextPath());                ///响应cookie,浏览器                response.addCookie(cookie1);                response.addCookie(cookie2);            }            ///成功登录,跳转到用户列表页面            response.sendRedirect(request.getContextPath()+"/dept/list");        }else{            ///登录失败,跳转到失败页面            response.sendRedirect(request.getContextPath()+"/error.jsp");        }    }}

WelcomeServlet

package com.bjpowernode.oa.web.action;import com.bjpowernode.oa.bean.User;import com.bjpowernode.oa.utils.DBUtil;import jakarta.servlet.ServletException;import jakarta.servlet.annotation.WebServlet;import jakarta.servlet.http.*;import java.io.IOException;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;///10天内免登录欢迎页  48@WebServlet("/welcome")public class WelcomeServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        ///先获得cookie        如果不是null,这个cokie[]数组可能是null,数组的长度必须大于0        Cookie[] cookies = request.getCookies();///获得cookie数组        String username = null;        String password = null;        if (cookies != null) (//如果cookie不是nullil,            for (Cookie cookie : cookies) (///循环遍历cookie数组                String name = cookie.getName();///先得到cookiename,然后得到value                ///因为有两个cookie,因此,根据不同的cookiename获得不同的value                if("username".equals(name)){                    username = cookie.getValue();                }else if("password".equals(name)){                    password = cookie.getValue();                }            }        }        //在这里使用username和pasword变量        if(username != null && password != null){            ////验证用户名和密码是否正确            Connection conn =null;            PreparedStatement ps = null;            ResultSet rs = null;            boolean success = false;            try {                conn = DBUtil.getConnection();                String sql = "select * from t_user where username = ? and password = ?";                ps = conn.prepareStatement(sql);                ps.setString(1,username);                ps.setString(2,password);                rs = ps.executeQuery();                if(rs.next()){                    ///成功登录                    success = true;                }            } catch (SQLException e) {                e.printStackTrace();            } finally {                DBUtil.close(conn,ps,rs);            }            if(success){                ///获得session对象                HttpSession session = request.getSession();                //session.setAttribute("username",username);                //这两行是为了显示在线人数(上面的写法是对的,也就是说没有这个功能)  61                User user = new User(username, password);                session.setAttribute("user",user);                //正确,意味着登录成功                response.sendRedirect(request.getContextPath()+"/dept/list");            }else{                //错误,表示登录失败                response.sendRedirect(request.getContextPath()+"/index.jsp");            }        }else{            //跳转登录页面            ///这里使用重定向            response.sendRedirect(request.getContextPath()+"/index.jsp");        }    }}

OrderServlet

package com.bjpowernode.oa.web.action;import jakarta.servlet.ServletException;import jakarta.servlet.http.HttpServlet;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;//管理登录类别  57public class OrderServlet extends HttpServlet {    @Override    protected void service(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        ///想要进入这个servlet,肯定会右这个servlet自己的路径,但是当我们输入这个servlet路径时        //会被过滤器拦截,因为我们设置的过滤器的任何路径都会被拦截(除了那些情况)    }}

EmpServlet

package com.bjpowernode.oa.web.action;import jakarta.servlet.ServletException;import jakarta.servlet.http.HttpServlet;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;///员工登录类别  57public class EmpServlet extends HttpServlet {    @Override    protected void service(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        ///想要进入这个servlet,肯定会右这个servlet自己的路径,但是当我们输入这个servlet路径时        //会被过滤器拦截,因为我们设置的过滤器的任何路径都会被拦截(除了那些情况)    }}

com中的代码.bjpowernode.oa.web.filterLoginCheckFilter

package com.bjpowernode.oa.web.filter;import jakarta.servlet.*;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import jakarta.servlet.http.HttpSession;import java.io.IOException;///这是过滤器 负责过滤登录代码 57public class LoginCheckFilter implements Filter {    @Override    public void doFilter(ServletRequest req, ServletResponse res            , FilterChain chain) throws IOException, ServletException {        ///以下两行是强制类型转换        HttpServletRequest request = (HttpServletRequest)req;        HttpServletResponse response = (HttpServletResponse)res;        //获取请求路径        String servletPath = request.getServletPath();        // 获取session(这个session不需要新建)   44        // 只获得当前的session,得不到,回到nulllllllllllllllllllll        HttpSession session = request.getSession(false);        ///这里解释为什么if有两个判断条件,因为毫无疑问,第一个保证session不是null。        // ,但是session.getattribute中的username不是空的,因为系统默认访问index文件        // ,因此,默认访问index文件也会产生session会话,因此需要添加第二个条件        /**         * 在什么情况下不能拦截?  57         *      目前写的路径是:/* 这意味着所有请求都被拦截。  57         *      目前写的路径是:/* 这意味着所有请求都被拦截。         *         *      用户访问 index.jsp不能拦截         *      用户已经登录,需要放行,不能拦截。         *      用户必须登录,这是不能拦截的。         *      WelcomeServlet不能拦截。         */        ///不拦截(只是不需要登录)        ///这个if意味着什么时候不拦截什么样的请求,        // /index.jsp要登录,如果拦截,那么我们的登录界面就不会显示(因为chain继续执行以下代码        // ,你们都被拦截了,index.jsp中的代码还没有执行)        // /welcome是欢迎界面(程序开始第一个执行界面,如果拦截他,其后面的代码将无法执行)        // /user/login判断登录成功,如果拦截他,就无法判断(因为我本来是去判断的,你一拦截        // 但是我又要拿登录界面了)        // /user/exit是判断退出的,如果拦截他,就无法判断(),导致session和cookie无法销毁        ///因为拦截后被你拉走,又要登陆了。        //(session != null && session.getAttribute("username") != null)这意味着已经登陆        // ,不需要拦截        /*if("/index.jsp".equals(servletPath) || "/welcome".equals(servletPath) ||                "/user/login".equals(servletPath) || "/user/exit".equals(servletPath)                || (session != null && session.getAttribute("username") != null)){*/        if("/index.jsp".equals(servletPath) || "/welcome".equals(servletPath) ||                "/user/login".equals(servletPath) || "/user/exit".equals(servletPath)                || (session != null && session.getAttribute("user") != null)){            ///在session和提交的username不空的情况下继续下去            chain.doFilter(request,response);        }else{            //拦截(即登录)            ///未登录自动跳转登录页面            //重定向            //三种写法            //response.sendRedirect("/oa/index.jsp");////普通老老实实的写法            //response.sendRedirect("/oa");///省略index.jsp,因为index文件会自动访问            response.sendRedirect(request.getContextPath()+"/index.jsp");///动态获取根写法,自动找到登录页面        }    }}

SRC配置文件.resourcesjdbc.properties

driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/bjpowernodeuser=rootpassword=lzl

web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"         xmlns:xsi="https://www.tulingxueyuan.cn/d/file/p/20230605/bpr5o4an4jt"         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"         version="4.0"><!--    欢迎页面配置  48-->    <welcome-file-list>        <welcome-file>welcome</welcome-file>    </welcome-file-list><!--    配备登录检查的过滤器,过滤所有路径  57-->    <filter>        <filter-name>loginFilter</filter-name>        <filter-class>com.bjpowernode.oa.web.filter.LoginCheckFilter</filter-class>    </filter>    <filter-mapping>        <filter-name>loginFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping></web-app>

index.jsp

<%@page contentType="text/html;charset=UTF-8"%><%--更改jsp   38   将此页面改为登录页面   41--%><%--访问jsp时,不生成sesssion对象   44--%><%@page session="false" %><!DOCTYPE html><html>  <head>    <meta charset="utf-8">    <title>OA系统欢迎使用</title>  </head>  <body>    <%-- 当前端发送请求路径时,如果要求路径是绝对路径,则应使用 / 开始,添加项目名称。--%>    <%-- 这样写代码,oa项目名写死了。--%>    <%-- 这样写代码,oa项目名写死了。这种设计显然不好。--%>    <%--    <a href="/oa/list.jsp">查看部门列表</a>--%>    <%--  <a href="<%=request.getContextPath()%>/list.jsp">查看部门列表</a>--%>    <%--  执行Servlet,查询数据库,收集数据--%>    <%--  <a href="<%=request.getContextPath() %>/dept/list">查看部门列表</a>--%>    <%--  <hr>--%>    <%--  调用方法获取应用的根路径-%>    <%--  <%=request.getContextPath()%>  <%–类似out.print(request.getContextPath());   –%>--%><%--    绘制用户登录页面   41--%>    <h1>用户登录</h1>    <hr>    <form action = "${pageContext.request.contextPath}/user/login" method="post">        username:<input type="text" name="username"/><br>        password:<input type="password" name="password"/><br>        <input type="checkbox" name="f" value="1"/>十天内免登录<br>        <input type="submit" value="login"/>    </form>  </body></html>

list.jsp

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@page contentType="text/html;charset=UTF-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>部门列表页面</title><%--设置整个网页的基本路径是http://localhost:8080/oa/     54--%><%--<base href="http://localhost:8080/oa/">--%><%--写成动态的  55--%><base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/"></head><body><%--显示一个登录名 和在线人数  44--%><h3>欢迎${user.username},在线人数${onlinecount}人</h3><%--写一个安全退出的功能   45--%><a href="user/exit">[退出系统]</a><script type="text/javascript">function del(dno){//弹出确认框,用户点击确定,返回true,点击取消返回falsevarr ok = window.confirm("亲,删除不可恢复哦”);if(ok)如何在js代码中向服务器发送请求///发送请求进行删除数据操作////document.location.href = “请求路径”//document.location = “请求路径”//window.location.href = “请求路径”//window.location = “请求路径”/*注意htmlbase标签可能对JS代码无效。所以JS代码最好在前面写“//”oa" */document.location.href="${pageContext.request.contextPath}/dept/delete?deptno="+dno;}}</script><h1 align="center">部门列表</h1><hr ><table border="1px" align="center" width="50%"><tr><th>序号</th><th>部门编号</th><th>部门名称</th><th>操作</th></tr><c:forEach items="${deptList}" varStatus="deptStatus" var="dept"><tr><td>${deptStatus.count}</td><td>${dept.deptno}</td><td>${dept.dname}</td><td><a href="javascript:void(0)" onclick="del(${dept.deptno})">删除</a><a href="dept/detail?f=edit&dno=${dept.deptno}">修改</a><a href="dept/detail?f=detail&dno=${dept.deptno}">详情</a></td></tr></c:forEach></table><hr ><a href="add.jsp">新增部门</a></body></html>

add.jsp

<%@page contentType="text/html;charset=UTF-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>新增部门</title></head><body><%--显示一个登录名   44--%><h3>欢迎${username}</h3><h1>新增部门</h1><hr ><form action="${pageContext.request.contextPath}/dept/save" method="post">部门编号<input type="text" name="deptno"/><br>部门名称<input type="text" name="dname"/><br>部门位置<input type="text" name="loc"/><br><input type="submit" value="保存"/><br></form></body></html>

detail.jsp

<%@page contentType="text/html;charset=UTF-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>部门详情</title></head><body><%--显示一个登录名   44--%><h3>欢迎${username}</h3><h1>部门详情</h1><hr >部门编号:${dept.deptno} <br>部门名称:${dept.dname}<br>部门位置:${dept.loc}<br><input type="button" value="后退" onclick="window.history.back()"/></body></html>

edit.jsp

<%@page contentType="text/html;charset=UTF-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>修改部门</title></head><body><%--显示一个登录名   44--%><h3>欢迎${username}</h3><h1>修改部门</h1><hr ><form action="${pageContext.request.contextPath}/dept/modify" method="post">部门编号<input type="text" name="deptno" value="${dept.deptno}" readonly /><br>部门名称<input type="text" name="dname" value="${dept.dname}"/><br>部门位置<input type="text" name="loc" value="${dept.loc}"/><br><input type="submit" value="修改"/><br></form></body></html>

error.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>登录失败</title></head><body><%--登录失败页面  41--%>登陆失败,请<a href="${pageContext.request.contextPath}/index.jsp">重新登录</a></body></html>