刚开始发现- -我好像忘记了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是属性 所以可以不一样 方法操作的是成员变量的值

       

javaweb-LoginDemo在JdbcTemp的登录实现及总结+进阶javabean改进的更多相关文章

  1. JavaWeb 使用Filter实现自动登录

    思路 使用cookie存储账号.密码,使用Filter拦截,从cookie中取出账号.密码.若用户要注销|登出.不再想使用自动登录,将cookie的有效期设置为0即可. 浏览器可以查看Cookie,不 ...

  2. JavaWeb 之 Filter 验证用户登录案例

    需求: 1. 访问一个网站的资源.验证其是否登录 2. 如果登录了,则直接放行. 3. 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录". 代码实现: import j ...

  3. 从零玩转JavaWeb系列7web服务器-----用户登录界面二维码的制作

    1.用eclipse工具新建一个Dynamic Web Project工程如下: 2.在Java Resources的src目录下新建一个包,包名称为com.it666.code 3.在com.it6 ...

  4. 以登录实现理解Servlet+jsp+JavaBean开发

    写在前面:菜鸟拙见,望请纠正 学过servlet的都知道,书本上一直说servlet一直作为控制器使用,它不实现view层,也不做具体的事务处理,那servlet到底是干什么的哪?怎么合理的用它呐?? ...

  5. JavaWeb_(session和application)用户登录注册模板_进阶版

    用户登录注册模板_基础版 传送门 用户登录注册模板进阶版 添加了获得获得当前登录用户信息及存储登录人数 用户登录后,在首页.注册页.登录页显示登录用户信息和存储登录人数信息 目录结构 <%@pa ...

  6. JavaWeb学习记录(二十)——Model1模式(javaBean+jsp)实现简单计算器案例

    ¨JSP技术提供了三个关于JavaBean组件的动作元素,即JSP标签,它们分别为: ¨<jsp:useBean>标签:用于在JSP页面中查找或实例化一个JavaBean组件. ¨< ...

  7. 【Java】JavaWeb 登录检查及界面跳转

    场景 一般javaweb网站都有用户登录,而有一些操作必须用户登录才能进行,常见流程:用户请求-->后台判断是否登录-->没登录跳转到登录界面,登录用户正常操作 解决思路 在用过滤器过滤请 ...

  8. 简单登录注册实现(Java面向对象复习)

    简单登录注册的实现(面向对象的复习) 需求: 设计用户类,包含用户名和密码两个属性 设计LoginDemo类设计用户登录方法 用户有三次登录机会,如果连续三次登录失败则退出程序 功能实现页面:     ...

  9. WPF MVVM从入门到精通2:实现一个登录窗口

    原文:WPF MVVM从入门到精通2:实现一个登录窗口   WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通2:实现一个登录窗口 WPF MVVM从入门到精通3:数据绑定 ...

  10. Node.js开发入门—使用cookie保持登录

    这次来做一个站点登录的小样例,后面会用到. 这个演示样例会用到Cookie.HTML表单.POST数据体(body)解析. 第一个版本号,我们的用户数据就写死在js文件中. 第二个版本号会引入Mong ...

随机推荐

  1. go cookie session

    https://astaxie.gitbooks.io/build-web-application-with-golang/content/zh/06.1.html

  2. vue项目中,alert使用

    methods:{ sendData() { ··· // 中间省略的代码 alert(`发送成功,连接失败的号码有:${failList}`) // failList里存的是后台返回的数据 } }

  3. vs同步配置

    做法(整个流程的过程):1.安装插件2.在GitHub上生成token3.获取gistid4.使用2,3步生成的token和gistid 1.在vscode上安装 settings sync 插件(我 ...

  4. vue3响应式原理以及ref和reactive区别还有vue2/3生命周期的对比,第二天

    前言: 前天我们学了 ref 和 reactive ,提到了响应式数据和 Proxy ,那我们今天就来了解一下,vue3 的响应式 在了解之前,先复习一下之前 vue2 的响应式原理 vue2 的响应 ...

  5. Android ViewPager2 + Fragment 联动

    Android ViewPager2 + Fragment 联动 本篇主要介绍一下 ViewPager2 + Fragment , 上篇中简单使用了ViewPager2 实现了一个图片的滑动效果, 那 ...

  6. 4.10:Spark之wordcount

    〇.概述 1.拓扑结构 2.目标 使用spark完成计数实验 一.启动环境 二.新建数据文件 三.查看文件内容 四.启动spark服务 五.编写代码 复制以下代码到shell中(复制后在终端右键-&g ...

  7. 【leetcode】剑指offer04二维数组查找

    很巧妙地把矩阵转化为二叉搜索树(不过好像没什用) class Solution { public: bool findNumberIn2DArray(vector<vector<int&g ...

  8. go语言的切片特性

    概述: 在使用切片进行赋值的时候,产生新的数组的指针指向原来的数组,只要修改新数组中的元素时,原来数组的元素也会改变. 测试代码: func TestSliceShareMemory(t *testi ...

  9. 你的 GitHub 年度报告「GitHub 热点速览 v.22.52」

    辞旧迎新的日子,又是年度报告满天飞的时候.GitHub 也不落其他平台之后,推出了用户 GitHub Contributions 报告.不知道,今年的你是不是比去年搬了更多的砖呢?在本期的 News ...

  10. [OpenCV实战]43 使用OpenCV进行背景分割

    运动背景分割法Background Segment主要是指通过不同方法拟合模型建立背景图像,将当前帧与背景图像进行相减比较获得运动区域.下图所示为检测图像: 通过前面的检测帧建立背景模型,获得背景图像 ...