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(); } }
- 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; } } }
- 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); } }
- 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); } }
- login.html
login页面
Hehe是属性 所以可以不一样 方法操作的是成员变量的值
- druid.properties