zoukankan      html  css  js  c++  java
  • javaweb


    title: javaweb项目-msbms
    date: 2020-11-28 11:51:36
    tags: javaweb


    SMBMS

    存在问题

    乱码解决

    idea运行java项目js中文乱码如何解决

    • VM-OPTION -Dfile.encoding=utf-8
    • Js文件编码改为UTF-BOM

    1、简介

    数据库架构

    如何搭建项目?

    • jar
    • maven

    项目搭建

    1.利用模板搭建maven-javaweb项目,注意maven配置信息需要重写

    2.配置Tomcat

    3.测试项目

    4.导入jar包`servlet-api,jsp-api,mysql-connector-java,jstl-api,standard

    5.创建包结构

    6.编写实体类

    ORM映射:表-类映射

    7.编写基础公共类

    1. 数据库配置文件
    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306?useUnicode=true&characterEncoding=utf-8
    username=root
    password=123456
    
    1. 编写数据库公共方法
    package com.bzf.dao;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.*;
    import java.util.Properties;
    
    public class BaseDao {
        private static String driver;
        private static String url;
        private static String username;
        private static String password;
    
        //静态代码块,类加载的时候就初始化
        static{
            Properties properties = new Properties();
            //通过类加载器,读取资源
            InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
    
            try {
                properties.load(is);
            } catch (IOException e) {
                e.printStackTrace();
            }
            driver = properties.getProperty("driver");
            url = properties.getProperty("url");
            username = properties.getProperty("username");
            password = properties.getProperty("password");
        }
        // 获取数据库连接
        public  static Connection getConnection(){
            Connection connection = null;
            try {
                Class.forName(driver);
                connection = DriverManager.getConnection(url,username,password);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return connection;
        }
        //编写查询公共类
        public static ResultSet  execute(Connection connection,String sql,Object[] params,ResultSet resultSet,PreparedStatement preparedStatement) throws SQLException {
            preparedStatement = connection.prepareStatement(sql);
            for (int i = 0;i<params.length;i++){
                //setObject(),占位符从1开始,但是我们的数组从1开始
                preparedStatement.setObject(i+1,params[i]);
            }
            resultSet = preparedStatement.executeQuery();
            return resultSet;
        }
        //编写 增 删 改 公共方法
        public static int execute (Connection connection,String sql,Object[] params,PreparedStatement preparedStatement) throws SQLException{
            for (int i = 0;i<params.length;i++){
                //setObject(),占位符从1开始,但是我们的数组从1开始
                preparedStatement.setObject(i+1,params[i]);
            }
            int updateRows = preparedStatement.executeUpdate();
            return updateRows;
        }
    
        //释放资源
        public static Boolean closeResource(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet) throws SQLException {
            Boolean flag = true;
    
            if (resultSet!=null){
                try {
                    resultSet.close();
                    //GC回收
                    resultSet = null;
                } catch (Exception e) {
                    e.printStackTrace();
                    flag = false;
                }
            }
            if (preparedStatement!=null){
                try {
                    preparedStatement.close();
                    //GC回收
                    preparedStatement = null;
                } catch (Exception e) {
                    e.printStackTrace();
                    flag = false;
                }
            }
            if (connection!=null){
                try {
                    connection.close();
                    //GC回收
                    connection = null;
                } catch (Exception e) {
                    e.printStackTrace();
                    flag = false;
                }
            }
            return flag;
        }
    }
    
    1. 编写字符编码过滤器,注意在web.xml注册

    8.导入静态资源,在webapp

    3、登陆功能实现

    image-20201128095614624

    1、编写前端页面

    login.jsp,error.jsp

    2、设置首页

    <!--设置欢迎页面-->
        <welcome-file-list>
            <welcome-file>login.jsp</welcome-file>
        </welcome-file-list>
    

    3、编写Dao层得到用户登陆的接口

    public interface UserDao {
        // 得到需要登陆的用户
        public User getLoginUser(Connection connection,String userCode) throws SQLException;
    }
    

    4、编写dao接口的实现类

    public User getLoginUser(Connection connection, String userCode) throws SQLException {
            PreparedStatement pstm = null;
            ResultSet rs = null;
            User user = null;
    
    
            if (connection != null) {
                String sql = "select * from smbms_user where userCode=?";
                Object[] param = {userCode};
    
    
                rs = BaseDao.execute(connection, pstm, rs, sql, param);
                if (rs.next()) {
                    user = new User();
                    user.setId(rs.getInt("id"));
                    user.setUserCode(rs.getString("userCode"));
                    user.setUserName(rs.getString("userPassword"));
                    user.setGender(rs.getInt("gender"));
                    user.setBirthday(rs.getDate("birthday"));
                    user.setPhone(rs.getString("phone"));
                    user.setAddress(rs.getString("address"));
                    user.setUserRole(rs.getInt("userRole"));
                    user.setCreatedBy(rs.getInt("createdBy"));
                    user.setCreationDate(rs.getTimestamp("creationDate"));
                    user.setModifyBy(rs.getInt("modifyBy"));
                    user.setModifyDate(rs.getTimestamp("modifyDate"));
                }
                BaseDao.closeResource(null, pstm, rs);
            }
        return user;
        }
    

    5、编写业务层接口

    public interface UserService {
       //用户登陆
       public User login(String userCode,String password) throws SQLException;
    }
    

    6、业务层实现类

    public class UserServiceImpl implements UserService {
    
        //业务层都会调用Dao层,所以我们要引入Dao层
        private UserDao userDao;
    
        public UserServiceImpl() {
            userDao = new UserDaoImpl();
        }
    
        public User login(String userCode, String password) throws SQLException {
            Connection connection = null;
            User user = null;
    
            try {
                connection = BaseDao.getConnection();
                //通过业务层调用Dao层
                user = userDao.getLoginUser(connection, userCode);
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                BaseDao.closeResource(connection, null, null);
            }
            return user;
    
        }
    // 检验代码,发现即使密码错误也可以导出!
        @Test
        public void test() throws SQLException {
            UserServiceImpl userService = new UserServiceImpl();
            User user = userService.login("admin", "12345sfsf67");
            System.out.println(user.getUserPassword());
        }
    }
    

    7、编写Servlet

    ublic class Loginservlet extends HttpServlet {
    
        //Servlet:控制层,调用业务层代码
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("进入loginServlet");
    
            //获取前端用户名和密码
            String userCode = req.getParameter("userCode");
            String userPassword = req.getParameter("userPassword");
    
            //和数据库中的密码进行对比,调用业务层
            UserServiceImpl userService = new UserServiceImpl();
            try {
                User user = userService.login(userCode, userPassword);//已经把登陆的人从数据库中查询出来了
                if (user!=null){
                    // 将用户的信息存放在session中
                    req.getSession().setAttribute(Constants.USER_SESSION,user);
                    //登陆成功后跳转到frame.jsp页面
                    resp.sendRedirect("jsp/frame.jsp");
                } else { //没有查到该用户,无法登陆
                    //转发回登陆页面,顺带提示它,用户名或者密码错误
                    req.setAttribute("error","用户名或者密码不正确");
                    req.getRequestDispatcher("login.jsp").forward(req,resp);
                }
    
            } catch (SQLException e) {
                e.printStackTrace();
            }
    
    
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    

    8、注册Servlet

    <!--Servlet-->
        <servlet>
            <servlet-name>LoginServlet</servlet-name>
            <servlet-class>com.bzf.servlet.user.Loginservlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>LoginServlet</servlet-name>
            <url-pattern>/login.do</url-pattern>
        </servlet-mapping>
    

    登陆功能优化

    注销功能

    思路:移除Session,返回登陆页面

    package com.bzf.servlet.user;
    
    import com.bzf.util.Constants;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class LogoutServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 移除用户的Session
            req.getSession().removeAttribute(Constants.USER_SESSION);
    //        req.getSession().setMaxInactiveInterval(0);
            resp.sendRedirect(req.getContextPath()+"/login.jsp");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    

    注册页面

        <!--注销登陆-->
        <servlet>
            <servlet-name>LogoutServlet</servlet-name>
            <servlet-class>com.bzf.servlet.user.LogoutServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>LogoutServlet</servlet-name>
            <url-pattern>/jsp/logout.do</url-pattern>
        </servlet-mapping>
    

    登陆拦截优化

    编写过滤器,针对jsp/*下的文件

        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse  response= (HttpServletResponse) resp;
            User user = (User) request.getSession().getAttribute(Constants.USER_SESSION);
    
            if (user==null){
                response.sendRedirect(request.getContextPath()+"/error.jsp");
            } else {
                filterChain.doFilter(req,resp);
            }
    
        }
    

    注册 web.xml

        <!--注销登陆-->    <servlet>        <servlet-name>LogoutServlet</servlet-name>        <servlet-class>com.bzf.servlet.user.LogoutServlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>LogoutServlet</servlet-name>        <url-pattern>/jsp/logout.do</url-pattern>    </servlet-mapping>
    

    密码修改

    1. 导入前端素材

      
      
    2. 写项目,建议从底层向上写

    image-20201130165324774

    3.UserDao接口

        //修改密码    public int updatePwd(Connection connection,int id,int password) throws SQLException;
    

    4.UserDao接口实现类

        public int updatePwd(Connection connection, int id, int password) throws SQLException {        PreparedStatement pstm =null;        int execute = 0;//int execute = Integer.parseInt(null);        if (connection!=null){//企业分工,万一前人,没有传过来connection            String sql = "update smbms_user set `userPassword`= ? where id = ?";            Object[] params = {password,id};            execute = BaseDao.execute(connection, pstm, sql, params);            BaseDao.closeResource(null,pstm,null);        }        return execute;    }
    

    5.userService

        //修改密码    public boolean updatePwd( int id, int password) throws SQLException;
    

    6.UserService实现类

     public boolean updatePwd(int id, int password) throws SQLException {        Connection connection = null;        boolean flag = false;        //修改密码        try {            connection = BaseDao.getConnection();            if (userDao.updatePwd(connection,id,password)>0){                flag = true;            }        } catch (SQLException e) {            e.printStackTrace();        } finally {            BaseDao.closeResource(connection,null,null);            return flag;        }    }
    

    7.UserServlet 复用提取出方法

    package com.bzf.servlet.user;import com.bzf.pojo.User;import com.bzf.service.user.UserServiceImpl;import com.bzf.util.Constants;import com.mysql.jdbc.StringUtils;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.sql.SQLException;//实现Servlet复用public class UserServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        String method = req.getParameter("method");        if (method.equals("savepwd")&&method!=null){            this.updatePwd(req,resp);        }    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doGet(req, resp);    }    public void updatePwd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //从session里获取id        Object user = req.getSession().getAttribute(Constants.USER_SESSION);        String newpassword = req.getParameter("newpassword");        if (user!=null && newpassword!=null){            UserServiceImpl userService = new UserServiceImpl();            try {                boolean flag = userService.updatePwd(((User) user).getId(), newpassword);                if (flag){                    req.setAttribute("message","修改成功,请退出,使用新密码登陆");                    //密码修改成功,移除当前session                    req.getSession().removeAttribute(Constants.USER_SESSION);//resp.sendRedirect("/login.do");是不可取的                } else {                    req.setAttribute("message","密码修改失败");                }            } catch (SQLException e) {                e.printStackTrace();            }            req.getRequestDispatcher("pwdmodify.jsp").forward(req,resp);        }    }}
    

    8.注册

    优化前端密码验证

    用户管理实现

    思路:

    image-20201203154142509

    1.导入分页的工具类

    2.用户列表页面导入

    1、获取用户数量

    1、UserDao

     //查询用户总数    public int getUserCount(Connection connection,String username,int userRole) throws SQLException;
    

    2、UserDaoImpl

     public int getUserCount(Connection connection, String userName, int userRole) throws SQLException {        PreparedStatement pstm = null;        ResultSet rs = null;        int count = 0;        if (connection!=null){            StringBuffer sql = new StringBuffer();            sql.append("select count(1) as count from smbms_user u ,smbms_role s where u.userRole=s.id");            ArrayList<Object> list = new ArrayList<Object>();            if (!StringUtils.isNullOrEmpty(userName)){                sql.append(" and u.userName like ?");                list.add("%"+userName+"%");//index:0            }            if (userRole>0){                sql.append(" and u.userRole = ?");//index:1                list.add(userRole);            }            //怎么办list转化为数组            Object[] params = list.toArray();            System.out.println("UserDaoImpl->getUserCount:"+sql.toString());//输出完整的sql语句            rs = BaseDao.execute(connection,pstm,rs,sql.toString(),params);            if(rs.next()){                count = rs.getInt("count");            }            BaseDao.closeResource(null, pstm, rs);        }        return count;    }
    

    3、UserService

        //查询记录数    public int getUserCount(String queryUserName, int queryUserRole) throws SQLException;
    

    4、UserServiceImpl

    public int getUserCount(String queryUserName, int queryUserRole) throws SQLException {    // TODO Auto-generated method stub    Connection connection = null;    int count = 0;    System.out.println("queryUserName ---- > " + queryUserName);    System.out.println("queryUserRole ---- > " + queryUserRole);    try {        connection = BaseDao.getConnection();        count = userDao.getUserCount(connection, queryUserName,queryUserRole);    } catch (Exception e) {        // TODO Auto-generated catch block        e.printStackTrace();    }finally{        BaseDao.closeResource(connection, null, null);    }    return count;}
    

    2、获取用户列表

    3、获取角色操作

    RoleDao

    public interface RoleDao {		public List<Role> getRoleList(Connection connection)throws Exception;}
    

    RoleDaoImpl

    public class RoleDaoImpl implements RoleDao{	public List<Role> getRoleList(Connection connection) throws Exception {		PreparedStatement pstm = null;		ResultSet rs = null;		List<Role> roleList = new ArrayList<Role>();		if(connection != null){			String sql = "select * from smbms_role";			Object[] params = {};			rs = BaseDao.execute(connection, pstm, rs, sql, params);			while(rs.next()){				Role _role = new Role();				_role.setId(rs.getInt("id"));				_role.setRoleCode(rs.getString("roleCode"));				_role.setRoleName(rs.getString("roleName"));				roleList.add(_role);			}			BaseDao.closeResource(null, pstm, rs);		}				return roleList;	}}
    

    RoleService

    public interface RoleService {		public List<Role> getRoleList() throws SQLException;	}
    

    RoleServiceImpl

    public class RoleServiceImpl implements RoleService{		private RoleDao roleDao;		public RoleServiceImpl(){		roleDao = new RoleDaoImpl();	}		public List<Role> getRoleList() throws SQLException {		Connection connection = null;		List<Role> roleList = null;		try {			connection = BaseDao.getConnection();			roleList = roleDao.getRoleList(connection);		} catch (Exception e) {			e.printStackTrace();		}finally{			BaseDao.closeResource(connection, null, null);		}		return roleList;	}	}
    

    4、用户显示

    1. 获取用户的前端数据(查询)
    2. 判断请求是否需要执行,看参数的值判断
    3. 为了实现分页,需要计算当前页面和总页面,页面大小
    4. 返回用户列表展示
    5. 返回前端
    private void query(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException, SQLException {        //查询用户列表        String queryUserName = request.getParameter("queryname");        String temp = request.getParameter("queryUserRole");        String pageIndex = request.getParameter("pageIndex");        int queryUserRole = 0;        UserService userService = new UserServiceImpl();        List<User> userList = null;        //设置页面容量        int pageSize = Constants.pageSize;        //当前页码        int currentPageNo = 1;        System.out.println("queryUserName servlet--------"+queryUserName);        System.out.println("queryUserRole servlet--------"+queryUserRole);        System.out.println("query pageIndex--------- > " + pageIndex);        if(queryUserName == null){            queryUserName = "";        }        if(temp != null && !temp.equals("")){            queryUserRole = Integer.parseInt(temp);        }        if(pageIndex != null){            try{                currentPageNo = Integer.valueOf(pageIndex);            }catch(NumberFormatException e){                response.sendRedirect("error.jsp");            }        }        //总数量(表)        int totalCount	= userService.getUserCount(queryUserName,queryUserRole);        //总页数        PageSupport pages=new PageSupport();        pages.setCurrentPageNo(currentPageNo);        pages.setPageSize(pageSize);        pages.setTotalCount(totalCount);        int totalPageCount = pages.getTotalPageCount();        //控制首页和尾页        if(currentPageNo < 1){            currentPageNo = 1;        }else if(currentPageNo > totalPageCount){            currentPageNo = totalPageCount;        }        userList = userService.getUserList(queryUserName,queryUserRole,currentPageNo, pageSize);        request.setAttribute("userList", userList);        List<Role> roleList = null;        RoleService roleService = new RoleServiceImpl();        roleList = roleService.getRoleList();        request.setAttribute("roleList", roleList);        request.setAttribute("queryUserName", queryUserName);        request.setAttribute("queryUserRole", queryUserRole);        request.setAttribute("totalPageCount", totalPageCount);        request.setAttribute("totalCount", totalCount);        request.setAttribute("currentPageNo", currentPageNo);        request.getRequestDispatcher("userlist.jsp").forward(request, response);}
    
  • 相关阅读:
    the configured user limit (128) on the number of inotify instances has been reached
    RabbitMQ Docker 单服务器集群
    webapi和GRPC性能对比
    camstart API 服务器负载均衡
    视图查询缺少值
    system.Data.Entity.Infrastructure.DbUpdateConcurrencyException: Store update, insert, or delete statement affected an unexpected number of rows (0) 问题
    WCF 基础连接已经关闭: 服务器关闭了本应保持活动状态的连接。
    优化sql用到的方法
    调用C++动态链接库出现错误
    ThoughtWorks.QRCode源码
  • 原文地址:https://www.cnblogs.com/aspiration/p/15422771.html
Copyright © 2011-2022 走看看