首先,说声抱歉,之前忙着另外的事情,没时间更新
本次学习目标:学会数据库连接的基本操作
1、重点:分两个案例讲解知识点:在eclipse上进行演示两个案例,分别为直接再WebContent目录下进行登录和在WebContent目录下新建子文件jsp的登录,通过两个案例的区别讲解pathPath的作用。
2、简单讲解数据库的操作,在mysql和Navicat下简单的操作。
3、讲解上次(6)遗漏的中文乱码怎么处理
4.实现逻辑:
前提:先连接数据库
1. 通过login.jsp从浏览器中获得登录界面
2. 在登录界面中输入账号和密码, login.jsp的action通过映射地址(login)传给 login.Servlet.java,让request获取用户名和密码。
3.在UserDao.java中执行sql语句,并把用户名和密码,放到结果集中。
4.结果集中有数据就通过getRequestDispatcher转发,跳转到Success.jsp,没有数据就跳转到Failed.jsp
正文:
安装数据库:
mysql数据库和navicat,端口号一般是3306,只是我安装mysql数据库的是3307,只有你的端口号,密码,Usernam,Host与你安装的数据库mysql的一样,点击测试连接才会显示Connection successful,这样子才可以使navicat与mysql数据库联系起来。就完成第一步了。
将数据库的数据建立起来:navicat为例子讲解,复制连接打开网址,按步骤进行操作,前提你已经安装了navicat和mysql,说明只需要username和password这两个字段,userid不需要。按照下面的博主进行操作就行。
数据库的博主博客:
https://blog.csdn.net/weixin_39731623/article/details/113901278?spm=1001.2014.3001.5506
第二步:分析代码部分(案例一)
先看一下我解释的案例1创建项目的基本目录,圈住的是数据库驱动jar包,很重要,没他运行不了。
特别注意的是,这个驱动包一定要放在lib目录下,不然没用,一定要放在lib目录下,不然没用,一定要放在lib目录下,不然没用,重要的事情说三遍。
DBDao.java代码
你需要修改的:(标注红色的)
private static String USER = "root";
private static String PASSWORD = "123456";
private static String DB_URL = "jdbc:mysql://localhost:3307/my12306";
端口号一般是3306,只是我起的是3307,只有你的端口号,密码,Usernam,Host与你安装的数据库mysql的一样点击测试连接,才会显示Connection successful,这样子才可以使navicat与mysql数据库联系起来。
package com.mc.dao;
import java.sql.*;
/**
* url:
* jdbc:协议名
* mysql:数据库
* localhost:ip地址
* 3306:端口号
* my12306:数据库名称
* user:用户名
* password:密码
*/
public class DBDao {
private static String USER = "root";
private static String PASSWORD = "123456";
private static String DB_URL = "jdbc:mysql://localhost:3307/my12306";
private static String DB_DRIVER = "com.mysql.jdbc.Driver";
// private static String SQL = "";
private static Connection connection = null;
//连接数据库
public static Connection getConnection(){
try {
//1、加载数据库驱动
Class.forName(DB_DRIVER);
//2、获取数据库连接
connection = DriverManager.getConnection(DB_URL, USER, PASSWORD);
} catch (Exception e) {
System.out.println("数据库连接异常");
e.printStackTrace();
}
//调用此方法返回数据库连接对象
return connection;
}
public static void closeConnection(Connection connection){
if(connection != null){
try {
// 关闭数据库连接
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
剩下的代码都不用修改:
UserDao.java代码
此处修改代码为:
红色标记处是你自己取名的数据表,必须改。
SQL = "select * from login where username = ? and password = ?";
package com.mc.dao;
import java.sql.*;
import java.sql.ResultSet;
import com.mc.user.User;
public class UserDao {
User user = null;
private String SQL ="";
public User login(String username, String password){
//3、定义sql语句
SQL = "select * from login where username = ? and password = ?";
Connection connection = null;
PreparedStatement pstmt = null;
try {
//调用DBDao中的getConnection返回的数据库连接对象
connection = DBDao.getConnection();
//4、 获取操作对象preparedStament
pstmt = (PreparedStatement) connection.prepareStatement(SQL);
System.out.println("我在UserDao.java这里,自己查询数据库是否有匹配的用户名:"+username);
System.out.println("我在UserDao.java这里,自己查询数据库是否有匹配的密码:"+password);
//4.1 给占位符赋值
pstmt.setString(1, username);
pstmt.setString(2, password);
//5、执行sql语句,并将结果放入结果集中返回结果集对象--ResultSet
ResultSet rSet = (ResultSet) pstmt.executeQuery();//得到数据库的查询结果,一个数据集
//6、判断结果集是否有效,结果集对象中有数据就获取
if(rSet.next()){
user = new User();
user.setUsername(rSet.getString("username"));
user.setPassword(rSet.getString("password"));
}
connection.close();
pstmt.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
//无论如何finally语句块都会执行:一般用来释放资源的
// 7、释放资源:先开的后关,后开的先关
DBDao.closeConnection(connection);
}
return user;
}
}
LoginServlet.java代码
package com.mc.login.servlet;
import java.io.IOException;
import java.io.PrintWriter;
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 com.mc.dao.UserDao;
import com.mc.user.User;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/* 必须要有这句话,否则当你输入中文用户名的时候就会获取乱码,
下面的代码就无法识别你所输入的用户名(username)
这就是我要补充之前遗漏的(6)乱码问题。
通俗讲:就是浏览器请求数据时,tomcat接受到的数据不是UTF-8,因此我们要转换为UTF-8
*
*
*/
//获取从浏览器得到的数据,并转换为UTF-8的形式(防止请求乱码)浏览器-----》服务器
request.setCharacterEncoding("UTF-8");
//设置向浏览器发送信息的编码格式(防止响应乱码)服务器---------》浏览器
//服务器响应的编码格式,防止出现中文乱码,这里提供了两种方法
response.setCharacterEncoding("UTF-8");//法一
// response.setContentType("text/html;charset=utf-8");//法二
//获取用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//查看有没有获取到username 和password
System.out.println("成功从用户登录界面(login.jsp)获取用户名:"+username);
System.out.println("成功从用户登录界面(login.jsp)获取密码:"+password);
//获取UserDao实例
UserDao userDao = new UserDao();
User user = userDao.login(username,password);
// 判断user是否为空
if(user != null){
// 转发到LoginSuccess.jsp页面
// getRequestDispatcher()是请求转发
System.out.println("数据库连接成功你就到这吧");
//response.getWriter().append("登录成功");
request.getRequestDispatcher("Success.jsp").forward(request, response);
}else{
// 登录失败
request.getRequestDispatcher("Failed.jsp").forward(request, response);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
User.java代码
package com.mc.user;
/*
* 用户登录类,定义基本属性用户名和密码
*/
public class User {
private String username;
private String password;
public String getUsername(){
return this.username;
}
public void setUsername(String username){
this.username = username;
}
public String getPassword(){
return this.password;
}
public void setPassword(String password){
this.password = password;
}
}
login.jsp代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>登录界面</title>
</head>
<body>
<center>
<form method="post" action="login">
用户名:<input type="text" name="username" ><br>
密码:<input type="password" name="password" ><br>
<br>
<input type="submit" value="登录">
</form>
</center>
</body>
</html>
登录Success代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>登陆成功</title>
</head>
<body>
<h1> 你终于成功登录了,好棒! </h1><br>
</body>
</html>
登录Failed.jap代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>登录失败</title>
</head>
<body>
登录失败,请返回重新登录 <br>
<!--注意此处的action中的路径写法-->
<form action="./login.jsp">
<input type = "submit" value = "返回">
</form>
</body>
</html>
直接运行login.jsp页面就可以了
效果图:
登录失败:因为我的数据库根本就没有小明这个人
控制台没有出现中文乱码
案例二:代码和上面的都是一样的,几乎没有任何改变,只是login.jsp的代码不一样了,只不过这里的login.jsp,我放在lWebcontent的jsp子文件中。按照原来的login.jsp代码根本就运行不了.出现资源找不到。
分两步来:先演示直接粘贴代码,看看会出现什么效果:
粘贴复制之后点击运行login.jsp,写入用户名和登录密码
效果图:看见没有
为什么会出现这样的问题?
原因在于login.jsp它运行提交之后找不到他映射的loginservlet地址,,找不到是因为它跳不出jsp这个子文件夹,多了上图的jsp路径,当初我写的第一篇文章讲过jsp和html要放在WebContent目录下,映射的的地址才会自动跳转到相应的Servlet类中
那现在怎么办呢?
这就是我要讲的知识点,
把上面的代码login.jsp换成下面的代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>登录界面</title>
</head>
<body>
<center>
<form method="post" action="login">
用户名:<input type="text" name="username" ><br>
密码:<input type="password" name="password" ><br>
<br>
<input type="submit" value="登录">
</form>
</center>
</body>
</html>
粘贴复制之后点击运行login.jsp,写入用户名和登录密码
效果图:
好开心,为什么呢?
看图说话:圈住的两部分是在原来login.jsp中新增的代码
圈住这两段代码的意思是:其实就是配置绝对路径
首先我们得来了解什么是BathPath?
Basepath其实就是提供了一个默认的绝对路径,相当于:localhost:8080/项目名/,让我们在写路径的时候不再为路径错误导致的404烦恼。
再来看看配置之后圈住的部分:
没有配置圈住的部分:
配置之后明显就是跳出了jsp这个子文件夹
讲解这个虽然很简单,但是却非常有用,以后我们搭建项目的时候总不能都放在WebContent目录下再去找Servlet类吧,创建文件夹分好类,利用好绝对路径这种方法才是王道。