上一节介绍了编写综合项目的基本流程 “综合”web项目编写------手把手0基础教学(一)
这里将继续介绍项目的编写,一个一个功能挨个实现。
目录
第四步.调取功能模型中的功能(这里调用的是登录login功能)
我们在功能编写之前可以先做一下准备工作,编写一下工具包,将一些要重复使用的代码封装起来,比如:数据库的链接(对数据库增删改查都要使用),来避免后面重复写。具体代码如下:
- package com.my.until;
-
- import java.sql.Connection;
- import java.sql.Driver;
- import java.sql.DriverManager;
- import java.sql.SQLException;
-
- public class DBUntil { //封装数据库的链接
- //属性
- private static final String DRIVER = "com.mysql.jdbc.Driver";
- private static final String URL = "jdbc:mysql://localhost:3306/a01";
- private static final String USER = "root";
- private static final String PASSWORD = "1234";
- //方法
- //链接数据库
- public Connection getConn(){
- try {
- //注册驱动
- Class.forName(DRIVER);
- //链接数据库
- return DriverManager.getConnection(URL,USER,PASSWORD);
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return null;
- }
- }
编写entity包,创建实体类
实体类是根据数据表进行创建的,我们在先前的数据库中构建了一个users表,那么我们可以根据表来构建用户(user)模型
用户类此时实现序列化接口,然后据数据库中的表定义属性,自动生成方法getter()和setter()
具体代码和注释如下:
- package com.my.entity;
-
- import java.io.Serializable;
-
- //Serializable是序列化接口,实现序列化是为了数据库表中的每一条数据保存到对象中,不再在控制台输出,在客户端显示
-
- public class Users implements Serializable {//实现一个序列化接口
- //属性:
- //根据数据库表中的属性构建
- private Integer id;
- private String userName;
- private String userPwd;
- //方法:getter和setter方法,alt+insert自动生成
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String getUserPwd() {
- return userPwd;
- }
- public void setUserPwd(String userPwd) {
- this.userPwd = userPwd;
- }
- }
数据模型构建完,要开始搭建功能模型,我们首先编写功能接口,该接口中存放用户可以实现的功能名,具体代码如下:
- package com.my.dao;
-
- //定义功能
-
- import com.my.entity.Users;
-
- public interface UsersDao {
- //登录功能
- Users login(String userName, String userPwd);
- }
完成功能接口后,我们要在Impl文件中对接口进行实现,重写接口中的方法,具体代码如下:
- package com.my.dao.Impl;
-
- import com.my.dao.UsersDao;
- import com.my.entity.Users;
- import com.my.until.DBUntil;
-
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
-
- public class UsersDaoImpl extends DBUntil implements UsersDao {
- private Connection conn = null;
- private PreparedStatement ps = null;
- private ResultSet rs = null;
- //编写登录功能
- @Override
- public Users login(String userName, String userPwd) {
- Users user = null;
- //获取链接,注册驱动
- conn = getConn(); //工具包中关于数据库链接的方法
- //编写sql语句
- String sql = "select userName,userPwd from Users where userName = ?";
- try {
- //把sql语句发送到数据库中
- ps = conn.prepareStatement(sql);
- //给?赋值
- ps.setString(1,userName);
- //执行sql语句
- rs = ps.executeQuery();
- //判断rs是否为空
- if(rs.next()){
- user = new Users();
- user.setId(rs.getInt(1));
- user.setUserName(rs.getString(2));
- user.setUserPwd(rs.getString(3));
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return user;
- }
- }
- <%--
- Created by IntelliJ IDEA.
- User: dell
- Date: 2022/11/17
- Time: 17:31
- To change this template use File | Settings | File Templates.
- --%>
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>登录页面title>
- head>
- <body>
- <center>
- <form action="/UsersServlet?action=login" method="post">
- <h1>欢迎登录h1>
- <hr color="red" width="50%">
- <p>账号:<input type="text" name="user" value="user">p>
- <p>密码:<input type="password" name="password" value="password">p>
- <p>
- <input type="submit" value="登录"/>
- p>
- form>
- center>
- body>
- html>
效果:
我们上面编写的jsp页面目前是无法实现功能的,下面将通过Servlet的编写让实现登录
编写Servlet实现登录功能,主要分为五大步,其余的就是在这五步中进行拓展
用servlet注册完毕,才真正将我们的user类创建完毕,注册Servlet有两种方式,一种是通过注解@WebServlet,另一种则是更改配置文件web.xml
注意:在调用功能时,要在最开头创建功能模型对象
响应分为两种状态:
1.成功状态:将请求信息保存到session作用域中(目的:在浏览器关闭之前,信息都可以一直使用)
2.失败状态:采用重定向,返回页面
以下附详细代码注释:
- package com.my.servlet;
-
- import com.my.dao.Impl.UsersDaoImpl;
- import com.my.dao.UsersDao;
- import com.my.entity.Users;
-
- 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;
-
- //注册Servlet,注册完Servlet才是真正创建了User类
- @WebServlet("/UsersServlet")
-
- public class UsersServlet extends HttpServlet {
- //创建功能模型对象
- UsersDao m = new UsersDaoImpl();
- //重写方法
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doPost(req,resp);
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //设置字符集编码格式
- req.setCharacterEncoding("utf-8");
- //获取请求参数
- String action = req.getParameter("action");
- //判断action值
- if("login".equals(action)){ //登录
- //获取参数
- String user = req.getParameter("user");
- String password = req.getParameter("password");
- //调用登录功能
- Users auser = m.login(user, password);
- //返回响应:有两种状态,成功/失败
- if(auser!=null){//登录成功
- //将信息保存到session作用域中(目的:在浏览器关闭之前,信息都可以一直被保存)
- req.getSession().setAttribute("auser",auser);
- req.getRequestDispatcher("/success.jsp").forward(req,resp);
- System.out.println("登录成功!");
-
- }else{
- //重定向返回登录页面
- resp.sendRedirect("/index.jsp");
- System.out.println("登录失败,请检查账号密码!");
- }
- }
- }
- }
到这里,我们最简单的登录功能已经实现,但是我们可以对此进行拓展,比如登录成功可以记住密码,实现自动登录等.......下面,我们实现记住密码和自动登录两个功能
由于我们之前已经将数据模型和功能模型搭建好了,后面我们在添加功能时就不用再重复搭建,直接编写功能,修改jsp页面即可
注:这里我们的记住密码和自动登录属于登录功能,无需在功能模型中添加,只修改jsp,servlet代码
我们对servlet代码进行补充,详细注释见代码:
- package com.my.servlet;
-
- import com.my.dao.Impl.UsersDaoImpl;
- import com.my.dao.UsersDao;
- import com.my.entity.Users;
-
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.Cookie;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
-
- //注册Servlet,注册完Servlet才是真正创建了User类
- @WebServlet("/UsersServlet")
-
- public class UsersServlet extends HttpServlet {
- //创建功能模型对象
- UsersDao m = new UsersDaoImpl();
- //重写方法
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doPost(req,resp);
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //设置字符集编码格式
- req.setCharacterEncoding("utf-8");
- //获取请求参数
- String action = req.getParameter("action");
- //判断action值
- if("login".equals(action)){//登录
- //获取请求参数:
- String user =req.getParameter("user");
- String password = req.getParameter("password");
- String jiZhu = req.getParameter("jiZhu");
- String auto = req.getParameter("auto");
- //先执行登录
- Users auser = m.login(user,password);
- //判断登录是否成功!
- if (auser != null){//登录成功
- //把信息保存会话级作用域:
- req.getSession().setAttribute("auser",auser);
- //判断是否记住密码:
- //记住账号密码和记住密码
- Cookie user_cookie = new Cookie("user",user);
- Cookie password_cookie = new Cookie("password",password);
- Cookie jiZhu_cookie = new Cookie("jiZhu",jiZhu);
- Cookie auto_cookie = new Cookie("auto",auto);
- if("1".equals(jiZhu)){//记住密码
- //判断是否自动登录:
- if("1".equals(auto)){
- auto_cookie.setMaxAge(60*60);
- }
- //设置记住密码的时间
- user_cookie.setMaxAge(60*60);
- password_cookie.setMaxAge(60*60);
- jiZhu_cookie.setMaxAge(60*60);
- }else{//忘记密码
- //设置记住密码的时间
- user_cookie.setMaxAge(0);
- password_cookie.setMaxAge(0);
- jiZhu_cookie.setMaxAge(0);
- auto_cookie.setMaxAge(0);
- }
- //把记住密码添加到响应当中
- resp.addCookie(user_cookie);
- resp.addCookie(password_cookie);
- resp.addCookie(jiZhu_cookie);
- resp.addCookie(auto_cookie);
- //请求转发到成功页面!!!
- req.getRequestDispatcher("/success.jsp").forward(req,resp);
- System.out.println("登录成功!");
- }else{
- //重定向返回登录页面
- resp.sendRedirect("/index.jsp");
- System.out.println("登录失败,请检查账号密码!");
- }
- }
- }
- }
我们编写客户端jsp页面,引入c标签库,对存放在请求域中的数据进行操作
具体代码和注释如下:
- <%--
- Created by IntelliJ IDEA.
- User: dell
- Date: 2022/11/17
- Time: 17:31
- To change this template use File | Settings | File Templates.
- --%>
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
- <html>
- <head>
- <title>登录页面title>
- head>
- <body>
- <center>
- <h1>欢迎登录h1>
- <hr color="red" width="50%">
- <form action="/UsersServlet?action=login" method="post">
- <p>账号:<input type="text" name="user" value="${cookie.user.value}">p>
- <p>密码:<input type="password" name="password" value="${cookie.password.value}">p>
- <p>
- <input type="checkbox" name="jiZhu" value="1"
- <c:if test="${cookie.jiZhu.value == 1}"> checked c:if>
- >记住密码
- <input type="checkbox" name="auto" value="1">自动登录
- <c:if test="${cookie.auto.value == 1}">
- <%-- 自动登录 --%>
- <jsp:forward page="/UsersServlet?action=login&user=${cookie.user.value}&password=${cookie.password.value}&jiZhu=1&auto=1">jsp:forward>
- c:if>
- p>
- <p>
- <input type="submit" value="登录"/>
- p>
- form>
- center>
- body>
- html>
到此为止,我们的登录功能就编写完毕
下一节我们将介绍分页功能,通过分页来展示用户列表