JDBC登录与数据传输
现在我们就先对登录代码来操作解释一波~(当然也不会讲的太具体 实在不行百度也是不错的选择)
那么在写代码之前先创建好代码中所需要的包(包名如下)
controller(控制器)
Filter(过滤器)
mapper(连接数据库代码的接口)
mapperImpl(连接数据库的代码)
service(服务:对前后端数据进行比对)
serviceImpl(服务的接口)
pojo(数据)
创建完包之后就跟着下面的步骤一步步执行就可以了
在pojo包中创建User类 并生成Get/Set/toString() 方法就可以了(代码很简单,这里就展示部分代码 )
private int id ;
private String uname ;
private String aname ;
private int tel ;
private String email ;
private Date date ;
private String role ;
private String upass ;
在mapper包中创建一个用于连接数据库的接口类(UserMapper)
public interface UserMapper {
User getUser(User user);//返回User对象
List<User> getList();//返回包含User的List集合
}
写完接口那么就来实现它(UserMapperImpl)
public class UserMapperImpl implements UserMapper {
@Override
public User getUser(User user) {
User user1 = null;//声明User对象
Connection conn = null;//不写在try/catch中是为了方便下面的关流(数据库连接池默认:100)
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");//这里通过反射 加载Mysql的驱动类
//创建数据库的连接(写到这为了检测数据库是否连接成功 可以输出一下conn 如果有结果则连接成功)
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/java", "root", "abc123");
//sql语句
ps = conn.prepareStatement("select uname,upass from test where uname = ? and upass = ? ");
//这里的setString()指的是sql语句中的?(问号) 从1开始
ps.setString(1, user.getUname());
ps.setString(2, user.getUpass());
//执行sql语句并返回)ResultSet(结果集)对象
rs = ps.executeQuery();
while (rs.next()) {//根据是否有值来判断
user1 = new User();
user1.setUname(rs.getString("uname"));//通过一开始创建的set来进行赋值
user1.setUpass(rs.getString("upass"));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//下面就是关闭接口(与栈一样先进后出)
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return user1;
}
@Override
public List<User> getList() {
// TODO Auto-generated method stub
List<User> user1 = new ArrayList<User>();//由于要返回一整个数据所有需要一个集合
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/java", "root", "abc123");
ps = conn.prepareStatement("select * from test ");//查询表中所有
rs = ps.executeQuery();
while (rs.next()) {
//和上面代码雷同
User user = new User();
user.setId(rs.getInt("id"));
user.setUname(rs.getString("uname"));
user.setAname(rs.getString("aname"));
user.setTel(rs.getInt("tel"));
user.setEmail(rs.getString("email"));
user.setDate(rs.getDate("date"));
user.setRole(rs.getString("role"));
user.setUpass(rs.getString("upass"));
user1.add(user);//将赋好值得user对象加到集合中
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return user1;
}
}
由于在连接数据库的操作已经在代码中解释了 所以下面我们依旧是跟着代码流程写下去
在service包中创建UserService的接口类
public interface UserService {
boolean checkUser(User user);//对形参里的user进行判定返回布尔值
List<User> getUsers();//获取list集合
}
在serviceImpl包中创建UserServiceImpl的实现类
public class UserServiceImpl implements UserService{
private UserMapper uMapper = new UserMapperImpl();//通过多态实现UserMapperImpl的对象
@Override
public boolean checkUser(User user) {
// TODO Auto-generated method stub
boolean flag = false ;
User user2 = uMapper.getUser(user);//获取数据库查询结果
if (user2 != null) {//查询成功不就不会空值对呗~
flag = true ;
}
return flag;//将布尔值返回
}
@Override
public List<User> getUsers() {
return uMapper.getList();//这还是返回集合
}
}
目前连接数据库的代码也完成了,检测是否成功的代码也完成了 那么现在就只剩下获取前端数据的controller了
在controller包中创建UserController类(这里我们前端采用post提交)
@WebServlet("/login")//这里采用了注解的方式来声明(也就不需要去web.xml中进行配置啦~ )
public class UserController extends HttpServlet {
private UserService uSimple = new UserServiceImpl();//通过多台获取UserServiceImpl对象
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
String uname = req.getParameter("uname");//通过getParameter()方法来获取前端数据的数据
String upass = req.getParameter("upass");
User user = new User();
user.setUname(uname);
user.setUpass(upass);
boolean result = uSimple.checkUser(user);//将前端的值进行判定返回布尔值
if (result) {//成功则执行下面代码
//通过Session来进行短时间(30min)的用户名传输
HttpSession session = req.getSession();
session.setAttribute("uname", uname);//key和value
//这里我个人是通过ServletContext全局的方式来获取数据库传输的集合
ServletContext context = this.getServletContext();
List<User> users = uSimple.getUsers();
context.setAttribute("lists", users);
req.getRequestDispatcher("/index.jsp").forward(req, resp);//跳转
} else {
req.setAttribute("temp", "用户名或密码错误");
req.getRequestDispatcher("/login.jsp").forward(req, resp);//跳转
}
}
}
到现在 JDBC登录与数据传输后台代码已经完成了,当然你们也可以接着去优化这里的代码
那么前端的代码我就不全部显示出来了(显示集合显示的代码)
<div id="data">
<table id="datalist" border="1" cellspacing="0px" width="700px">
<tr align="center">
<td>管理员id</td>
<td>姓名</td>
<td>登录名</td>
<td>电话</td>
<td>电子邮件</td>
<td>授权日期</td>
<td>拥有角色</td>
<td>密码</td>
</tr>
<c:forEach items="${lists}" var="list" >
<tr align="center">
<td>${list.id}</td>
<td>${list.uname}</td>
<td>${list.aname}</td>
<td>${list.tel}</td>
<td>${list.email}</td>
<td>${list.date}</td>
<td>${list.role}</td>
<td>${list.upass}</td>
</tr>
</c:forEach>
</table>
</div>
这里主要是使用jstl标签库 使用之前需要在最上方加入一下代码:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>