zoukankan      html  css  js  c++  java
  • servlet实现登录,前端和数据库交互小项目

    代码目录

    com.DAO包

    com.pojo包

    com.service包

    com.Servlet包

    com.utils包

    web.xml

    login.html

    本次小项目感想及错误提示

    首先,项目目录结构和描述如下:

    1.准备:

    在使用Servlet之前,请确保导入了mysql的jar包和servlet的jar包,并放在wepcontent的lib下面

    已经在tomcat里面布置好服务器配置了。如果没有配置请参考nanfengnan的上一篇博客:https://www.cnblogs.com/nanfengnan/p/13825922.html

    如果没有servlet选项请看:https://www.cnblogs.com/nanfengnan/p/13825924.html

     2.项目概述,为什莫写这末多包主要是为了实现隔离和好管理  当然还有设计模式的事情(当然小编此时才大三 哈哈,刚回一点一点设计模式就不献丑了)

    com.DAO包:是实现数据库操作的包,(里面写入从数据库里面读数据的方法)直接和数据库交互的包

    com.pojo包:因为要和数据库交互,要有数据库实例,里面是数据库的属性

    com.service包:是实现接受前端传来的字段,并构造要查询sql语句和调用com.DAO包里面的方法,实现和数据库交互的中间层。

    com.Servlet包:是servlet,里面是用来接受html传来的表单的操作,并返回在页面上提示信息,准则让每个servlet实现一个相应的操作(实际开发中),如登录用一个servlet线程,注册用一个servlet线程。

    com.utils包:用来存工具的包,如取得数据库链接对象的类

     login.html:登陆主页

    注意servlet1,servlet没有用,那是我的练习

    相应包里面的类和代码

    3.废话不多说,直接上代码

    3.1com.DAO包

    //这是com.DAO包里面的类

    package com.DAO;

    //数据库的操作  要把数据库的操作和具体前端操作都分隔开
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.util.ArrayList;
    import com.pojo.User;
    import com.utils.*;

    public class UserDAO {
        public ArrayList findUserBySql(String sql) {
            //存用户的列表
            ArrayList<User> userList=new ArrayList<User>();
            
            //数据库操作
            GetConnection getConnection = new GetConnection();
            Connection conn=getConnection.getConn();
            try {
                Statement state=conn.createStatement();
                ResultSet result=state.executeQuery(sql);
                System.out.println("数据查询中......");
                System.out.println("sql语句为:"+sql);
                while(result.next()) {
                    User u =new User();
                    u.setId(result.getInt("id"));
                    u.setUsername(result.getString("username"));
                    u.setPassword(result.getString("password"));
                    userList.add(u);
                }
                state.close();
                conn.close();
            }
            catch (Exception e) {
                e.printStackTrace();
            }
            return userList;
        }
    }

    3.2com.pojo包

    package com.pojo;
    //实体类 数据库的实体对象类
    public class User {
        private int id;
        private String username;
        private String password;
        public int getId()
        {
            return id;
        }
        public String getUsername() {
            return username;
        }
        public String getPassword() {
            return password;
        }
        public void setId(int id) {
            this.id=id;
        }
        public void setUsername(String username) {
            this.username=username;
        }
        public void setPassword(String password) {
            this.password=password;
        }
        
    }

     3.3

    package com.service;

    import java.io.PrintWriter;
    import java.util.ArrayList;
    import com.DAO.UserDAO;
    import com.pojo.User;
    //具体业务方法  登录从后台取出用户名和密码 组成一个用户送到前端

    public class userService {
        // 因为要调用userDAO里面的方法,所以先建立一个对象
        UserDAO ud = new UserDAO();

        public User login(String name, String pwd) {
            // 前端表单输入用户名和密码,让后调用方法判断数据库里面有没有这一个记录,有的话传回前端
            // 没有的话,登陆失败

            User u = null;
            // 构造要查询的sql语句
            String sql = "select * from user where username='"+name+"' and password='"+pwd+"' ";
            ArrayList<User> userList = ud.findUserBySql(sql);
            if (userList.size() > 0) {
                // 用户数量大于零,说明里面有用户,登陆成功,返回给前台用户对象
                u = userList.get(0);
                System.out.println("找到了");
            }
            // 否则没找到用户对象返回空null
            
            System.out.println("查询服务结束");
            return u;
        }
    }

    3.4com.service包

    package com.Servlet;

    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import com.pojo.User;
    import com.service.userService;

    public class servlet2 extends HttpServlet {
        //实际开发中每个servlet对应一个功能,登录用登录的servlet,注册用注册的servlet
        userService us=new userService();
        //获取表单数据 模拟登录 login.html
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //获取请求参数
            request.setCharacterEncoding("GBK");//设置请求编码格式
            response.setCharacterEncoding("GBK");//设置响应的编码格式
            String name=request.getParameter("uname");//得到请求参数name(地址栏输入的)
            String passwd=request.getParameter("upwd");
            PrintWriter pw = response.getWriter();
            if(name!=null && passwd!=null) //防止空指针异常
            {
                User u=us.login(name, passwd);
                if (u!=null) {
                    pw.print("恭喜你!"+u.getUsername()+"登陆成功");
                }
                else {
                    pw.println("用户名或密码错误,请重新输入");
                }
            }
            else {
                pw.println("输入的用户名或密码为空!");
            }
        }

        protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
            doGet(request, response);
        }

    }

    3.5com.utils包

    package com.utils;

    import java.sql.*;
    //工具包
    //返回数据库连接对象
    public class GetConnection {
        private Connection conn=null;
        private static String url="jdbc:mysql://localhost:3306/java?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
        private static String name="root";
        private static String passwd="20003234fenglei";
        
        public Connection getConn()
        {
            if(conn==null) {
                try {
                    Class.forName("com.mysql.cj.jdbc.Driver");
                    conn = DriverManager.getConnection(url,name,passwd);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    System.out.println("连接失败!");
                }
            }
            return conn;
        }
    }

    3.6 webcontent下面的web-xml配置成如下,如果没有的话,百度一下很简单的

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
      <display-name>web3</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
     
      <servlet>
           <servlet-name>servlet2</servlet-name>
           <servlet-class>com.Servlet.servlet2</servlet-class>
      </servlet>
     
      <servlet-mapping>
           <servlet-name>servlet2</servlet-name>
           <url-pattern>/servlet2</url-pattern>
      </servlet-mapping>
        
     
    </web-app>

    3.7login.html 登录主页  这个html代码大家可以自己添加操作,在后台补上相应操作即可

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="GBK">
    <title>用户登录</title>
    </head>
    <body>
        <form action="http://127.0.0.1:8080/web3/servlet2" method="post">
            用户名:<input type="text" name="uname"><br>
            密码:<input type="password" name="upwd">
            <input type="submit">
        </form>
    </body>
    </html>

    总结:可去我的博客里面找到在java-web下面有解决办法

    常用报错:

    1.com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. 错误

    2.此Web应用程序实例已停止。无法加载[]。为了调试以及终止导致非法访问的线程,将抛出以下堆栈跟踪。 这个问题是因为最开始我把连接的方法和变量定义成静态static的了,只能访问一次,下一次访问就找不到线程了。

  • 相关阅读:
    IOS-- UIView中的坐标转换
    iphone练习之手势识别(双击、捏、旋转、拖动、划动、长按)UITapGestureRecognizer
    Storm与Spark Streaming比较
    Python程序的常见错误(收集篇)
    Python画图笔记
    如何在论文中画出漂亮的插图?
    别老扯什么Hadoop了,你的数据根本不够大
    保险与互联网结合拉开序幕
    关于数学
    R--基本统计分析方法(包及函数)
  • 原文地址:https://www.cnblogs.com/nanfengnan/p/13828912.html
Copyright © 2011-2022 走看看