javaweb-LoginDemo在JdbcTemp的登录实现及总结+进阶javabean改进

刚开始发现- -我好像忘记了JdbcTemp的知识了,以为自己学漏了,重新回去看了一下,还好还记得,所以今天做一个案例:

  • 案例分析:

    登录的实现

 

  •  步骤:
    • 先导入jar包,然后写一个简单的html页面
    • 创建数据库一个新的数据库 create database~
    • 导入数据库池的配置文件druid.properties(记得改里面的新数据库名称)
    • 写util方法包和JDBCUtils工具类
    • 开始将目录结构写了写包,我们先写了DAO层,数据库连接的部分
    • 写一个domain包,放入User类 并写setget tostring方法
    • 然后再写一个包,放道层测试类,然后可以看到我们的DAO层是没报错的
    • 所以继续写servelet,再写servelet可以发现我们的html页面里的action还没设定(红色是因为我就在这里查了一个下午错 悲伤 铭记)
    • 再写failservlet copy可以得到 successservlet 当然因为successservlet里面需要用到反射:
      -获取request域中的共享的username对象
      -再用一个if方法来避免空指针异常

 

 

 

 

 

 

 

  • 遇到的问题:

The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.   404

The server encountered an unexpected condition that prevented it from fulfilling the request. 500

  • 解决思路:

因为在视频里其实是对于虚拟路径不太理解,而且在test类中对与UserDao其实是没有出错的,所以没有放在那里,是不是页面输入的值没有获取,还是直接都没有跑起来呢?
于是我带着问题开始查资料,首先查看了自己的项目结构,

果然,我的lib包名字叫libs,马上改名,重新导入包;

随之发现新的问题,就是一直显示java.loginServlet的错误 doPost的问题
我就去到LoginServlet里查看,果然,

在DoPost方法里没有写doGet;

(听课一定要看着老师敲完这部分,理解了再自己敲,然后检查,我就是一边听一边敲,搞笑了)接着看到弹幕说2021的idea好像是Servlet不用加  / 所以我觉得应该是这里出问题了

Tomcat里的虚拟路径给改了,改成一个斜杠,然后再

 

 

 

 

 

 我尝试着把前面的给删掉,然后又删掉了/和所有servlet的/ (包含fail和success的)

还是错 报错404 我就想应该是这里不对劲 再改改 就把斜杠加上了,像图上的(图上的是我改好的)

 

 

 最后成功啦!!喜极而泣,撒花!

 

  • 代码:  
    • druid.properties
      driverClassName=com.mysql.jdbc.Driver
      url=jdbc:mysql:///adminDemo
      username=root
      password=root
      #最初始化的连接数
      initialSize=5
      maxActive=10
      maxWait=3000
      
    • JDBCUtils
      package cn.com.util;
      
      import com.alibaba.druid.pool.DruidDataSourceFactory;
      
      import javax.sql.DataSource;
      import java.io.IOException;
      import java.io.InputStream;
      import java.sql.Connection;
      import java.sql.SQLException;
      import java.util.Properties;
      
      public class JDBCUtils {
      
          private static DataSource ds;
          /*
          用静态代码块加载数据连接池
          用druid.properties封装成键值对
           */
          static {
              try {
                  //1 加载配置文件
                  Properties pro = new Properties();
                  //  使用classLoader加载配置文件,获取字节输入流
                  InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
                  pro.load(is);
                  //2 初始化连接池对象
                  ds = DruidDataSourceFactory.createDataSource(pro) ;
      
              } catch (IOException e) {
                  e.printStackTrace();
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
          /*
          获取链接池对象
           */
          public static DataSource getDataSource(){
              return ds;
          }
      
          /*
          获取链接Connection对象
           */
          public static Connection getConnection() throws SQLException {
              return ds.getConnection();
          }
      }
      JDBCUtils
    • UserDao(USER自己生成 不写这个)
      package cn.com.dao;
      
      import cn.com.domain.User;
      import cn.com.util.JDBCUtils;
      import org.springframework.dao.DataAccessException;
      import org.springframework.jdbc.core.BeanPropertyRowMapper;
      import org.springframework.jdbc.core.JdbcTemplate;
      
      /*
       操作数据库中的user表
       */
      public class UserDao {
          //声明jdbctmpl来共用
          private JdbcTemplate tmpl = new JdbcTemplate(JDBCUtils.getDataSource());
          /**
           * login method
           * @param loginUser username and password
           * @return User include all data
           */
          public User login(User loginUser){
              try {
                  //1 编写sql
                  String sql ="SELECT *FROM USER WHERE username = ? AND PASSWORD = ?;";
                  //2 调用query方法
                  //test中若其中不匹配,也就是sql没有返回1条数据就报错了,
                  // 因为只有查询到结果才可以将数据信息返回成功,
                  //那么我们就可以用一个catch住(快捷键:ctrl+alt+t)
                  //原理:如果没有查询到返回值就返回null,有就返回data
                  User user = tmpl.queryForObject(sql,
                          new BeanPropertyRowMapper<User>(User.class),
                          loginUser.getUsername(), loginUser.getPassword());
                  return user;
              } catch (DataAccessException e) {
                  e.printStackTrace();//记录日志
                  return null;
              }
          }
      }
      UserDao
    • LoginServlet
      package cn.com.servlet;
      
      import cn.com.dao.UserDao;
      import cn.com.domain.User;
      
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      @WebServlet("/LoginServlet")
      public class LoginServlet extends HttpServlet {
      
          @Override
          protected void doGet(HttpServletRequest request,
                               HttpServletResponse response)
                  throws ServletException, IOException {
              //1 设置编码
              request.setCharacterEncoding("utf-8");
              //2 获取请求参数
              String username = request.getParameter("username");
              String password = request.getParameter("password");
              //3 封装user对象
              User loginuser = new User();
              loginuser.setUsername(username);
              loginuser.setPassword(password);
              //4 调用userdao的login方法
              UserDao userdao = new UserDao();
                                      //find
      //        System.out.println(loginuser.getUsername());
      //        System.out.println(loginuser.getPassword());
              User user = userdao.login(loginuser);
      //        System.out.println("************");
              //5判断user
              if (user == null){
                  //fail 需要转发
                  request.getRequestDispatcher("/failServlet")
                          .forward(request,response);
              }else {
                  //success
                  //存储数据
                  request.setAttribute("user",user);
                  //转发
                  request.getRequestDispatcher("/successServlet")
                          .forward(request,response);
              }
          }
      
      
          @Override
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doGet(request, response);
          }
      }
      LoginServlet
    • faiServlet
      package cn.com.servlet;
      
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      @WebServlet("/failServlet")
      public class failServlet extends HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //给页面写一句话
              //设置编码
              response.setContentType("text/html;charset=utf-8");
              //output
              response.getWriter().write("fail,username or password is worst");
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doPost(request,response);
          }
      }faiServlet
    • package cn.com.servlet;
      
      import cn.com.domain.User;
      
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      @WebServlet("/successServlet")
      public class successServlet extends HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //给页面写一句话 因为下面需要写的是用户名,所以在前面要写一个获取username
              //获取request域中的共享的username对象,因为知道这个就是user对象
              //所以给一个强制转换
               User user = (User) request.getAttribute("user");
               //用if来避免空指针异常
               if (user != null){
                   //设置编码
                   response.setContentType("text/html;charset=utf-8");
                   //output
                   response.getWriter().write("success"+
                           user.getUsername()+"welcome!");
               }
      
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doPost(request,response);
         
    • successServlet
      package cn.com.servlet;
      
      import cn.com.domain.User;
      
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      @WebServlet("/successServlet")
      public class successServlet extends HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //给页面写一句话 因为下面需要写的是用户名,所以在前面要写一个获取username
              //获取request域中的共享的username对象,因为知道这个就是user对象
              //所以给一个强制转换
               User user = (User) request.getAttribute("user");
               //用if来避免空指针异常
               if (user != null){
                   //设置编码
                   response.setContentType("text/html;charset=utf-8");
                   //output
                   response.getWriter().write("success"+
                           user.getUsername()+"welcome!");
               }
      
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doPost(request,response);
          }
      }
      successServlet
    • login.html
      login页面

       

       

      Hehe是属性 所以可以不一样 方法操作的是成员变量的值

       

       

       

       

       

       

posted @ 2022-02-06 16:59  Tityaaaa  阅读(54)  评论(0编辑  收藏  举报