基于Maven,用Servlet再实现查询功能,登录功能(2)。

1.查询功能实现

由于请求中既有查询,又有新增,所有为了区分不同的功能,我们设置一个标志flag来进行区分,当发送请求时将这个flag的值传递进来。

项目结构如下:

index.jsp的代码,demo-list.sjp的代码和页面显示图如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/demo" method="get">
        <input type="hidden" name= "flag" value="save">
        菜品:<input type="text" name="dish"><br>
        价格:<input type="text" name="price"><br>
        说明:<input type="text" name="desc"><br>
        <button>提交</button>
    </form>
    <a href="/demo?flag=query">查询</a>
</body>
</html>
<%--
  Created by IntelliJ IDEA.
  User: 22529
  Date: 2024/7/25
  Time: 11:02
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<center>
    <h1>热烈欢迎【<span style="color: skyblue">${user.username}</span>】来访问</h1>
</center>
    <table style="margin: 0 auto" width="80%" cellpadding="5" cellspacing="0" border="1">
        <tr>
            <th>序号</th>
            <th>菜名</th>
            <th>价格</th>
            <th>描述</th>
        </tr>
        <%--
        items:循环的对象
        var:每次循环的结果
        varStatus:获取索引和循环次数使用
        --%>
        <c:forEach items="${list}" var = "demo" varStatus="i">
            <tr align="center">
                <td>${i.count}</td>
                <td>${demo.dish}</td>
                <td>${demo.price}</td>
                <td>${demo.desc}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

 

点击查询可以查看数据库中的所有信息 ,展示到页面中

注:其中登录的是谁,热烈欢迎的就是谁,这是用request对象中的session实现的,具体分析如下

servlet层的代码如下:

package com.its.servlet;

import com.its.entity.Demo;
import com.its.service.DemoService;
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;
import java.util.List;

@WebServlet("/demo")
public class DemoServlet extends HttpServlet {
    DemoService demoService = new DemoService();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String flag = request.getParameter("flag");
        if("save".equals(flag)){
            save(request,response);
        } else if ("query".equals(flag)) {
            query(request,response);
        } else if ("delete".equals(flag)) {
//            delete(request,response);
        } else {
            throw new RuntimeException("请传递flag标志");
        }
    }

//    private void delete(HttpServletRequest request, HttpServletResponse response) {
//        int row = demoService.delete();
//
//    }
    //1.查询功能
    private void query(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<Demo> list = demoService.query();
//        将list数据存到request中命名为list
        request.setAttribute("list",list);
//        跳转页面到demo-list.jsp
        request.getRequestDispatcher("demo-list.jsp").forward(request,response);
        list.forEach(System.out::println);
    }
    //2.新增功能
    private void save(HttpServletRequest request, HttpServletResponse response) {
        //        接收数据
        String dish = request.getParameter("dish");
        String price = request.getParameter("price");
        String desc =request.getParameter("desc");
//        封装数据
        Demo demo = new Demo();
        demo.setDish(dish);
        demo.setPrice(Integer.parseInt(price));
        demo.setDesc(desc);
//        传递到下一层进行逻辑处理
        //插入一条数据
        int result = demoService.saveDish(demo);
        if(result > 0){
            System.out.println("插入成功");
        }else {
            System.out.println("插入失败");
        }
    }
}

service层代码如下:

package com.its.service;

import com.its.dao.DemoDao;
import com.its.entity.Demo;

import java.util.List;

public class DemoService {
    DemoDao demoDao = new DemoDao();
    public int saveDish(Demo demo) {
        return demoDao.saveDish(demo);
    }

    public List<Demo> query() {
        return demoDao.query();
    }
}

Dao层的代码如下:

package com.its.dao;

import com.its.entity.Demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class DemoDao {
    //新增
    public int saveDish(Demo demo) {
//        持久化处理
        try {
            //注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //建立连接
            Connection connection = DriverManager.getConnection("jdbc:mysql:///demo_test", "root", "root");
            //创建编译器,执行sql语句。
            String sql = "insert into menu(dish, price, `desc`) values(?,?,?) ";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, demo.getDish());
            preparedStatement.setString(2, String.valueOf(demo.getPrice()));
            preparedStatement.setString(3, demo.getDesc());
            int i = preparedStatement.executeUpdate();
            //释放连接
            connection.close();
            return i;
            //释放连接
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
    }

    public int deleteDish(String dishName) {
        try {
            //注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //建立连接
            Connection connection = DriverManager.getConnection("jdbc:mysql:///demo_test", "root", "root");
            //创建编译器
            String sql = "delete from menu where dish = ?";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, dishName);
            int i = preparedStatement.executeUpdate();
            return i;

        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
    }

    //查询
    public List<Demo> query() {
        List<Demo> list = new ArrayList<>();
        try {
            //注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //建立连接
            Connection connection = DriverManager.getConnection("jdbc:mysql:///demo_test", "root", "root");
            //创建编译器
            String sql = "select * from menu";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            ResultSet resultSet = preparedStatement.executeQuery();
            while (resultSet.next()){
                Demo demo = new Demo();
                int id = resultSet.getInt("id");
                String dish = resultSet.getString("dish");
                int price = resultSet.getInt("price");
                String desc = resultSet.getString("desc");
                demo.setId(id);
                demo.setDish(dish);
                demo.setPrice(price);
                demo.setDesc(desc);
                list.add(demo);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return list;
    }
}

注:因为jsp文件没有循环的操作,所以需要引入外部依赖,导入相关依赖如下:

<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/taglibs/standard -->
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>

然后在需要的jsp文件中引入即可:

最后运行,即可实现上面的查询功能。

2.登录功能

首先创建简单的用户表

再写一个简单的登录页面login.jsp,代码中也包含了记住用户名和密码的功能(cookie实现,后序加以说明)

<%--
  Created by IntelliJ IDEA.
  User: 22529
  Date: 2024/7/25
  Time: 12:01
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
  Cookie[] cookies = request.getCookies();
  if(cookies !=null){
    for (Cookie cookie:cookies){
      if("username".equals(cookie.getName())){
        String v1 = cookie.getValue();
        request.setAttribute("username",v1);
      }
      if("password".equals(cookie.getName())){
        String v2 = cookie.getValue();
        request.setAttribute("password",v2);
      }
    }
  }
%>
<form action="/login">
  <input type="hidden" name="flag" value="login"><br>
    <span style="color: red">${message}</span><br>
  账号:<input type="text" name="username" placeholder="账号" value="${username}"><br>
  密码:<input type="password" name="password" placeholder="密码" value="${password}"><br>
  <input type="checkbox" name="remember">是否记住账号?<br>
  <button>登录</button>
</form>
</body>
</html>

登录界面如下:

三层架构的代码如下:

servlet层代码:

package com.its.servlet;

import com.its.entity.User;
import com.its.service.UserService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/login")
public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String flag = request.getParameter("flag");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String remember = request.getParameter("remember");
        System.out.println(remember);
        UserService userService = new UserService();
        //登录请求
        if("login".equals(flag)){
            //checkLogin方法验证,得到一个boolean类型的值
            boolean b = userService.checkLogin(username,password,request);
            //登录成功
            if(b){
                //登录成功,记住账号和密码到cookie中(用户勾选了,这个选项)
                if ("on".equals(remember)){
                    //创建cookie,用于存储用户名和密码
                    Cookie c1 = new Cookie("username", username);
                    Cookie c2 = new Cookie("password", password);
                    //设置cookie的生命周期
                    c1.setMaxAge(3600 * 24 * 30);
                    c2.setMaxAge(3600 * 24 * 30);
                    //添加cookie
                    response.addCookie(c1);
                    response.addCookie(c2);
                }
                //登录成功,重定向到index.jsp这个页面
                response.sendRedirect("index.jsp");
            }else {//登录失败
                //将错误提示信息存到request中,后序在页面中展示出来
                request.setAttribute("message","账号或密码错误");
                //转发请求到login.jsp中
                request.getRequestDispatcher("login.jsp").forward(request,response);
//                response.sendRedirect("login.jsp");
            }
        }else if("logout".equals(flag)){//这个是退出登录功能
            logout(request,response);
        } else {
            throw new RuntimeException("请携带标志");
        }
    }

    private void logout(HttpServletRequest request, HttpServletResponse response) throws IOException {
        HttpSession session = request.getSession();
//        删除当前会话
        session.invalidate();
//        重定向到login.jsp页面
        response.sendRedirect("login.jsp");
    }
}

其中使用了cookie进行用户名和密码的记录细节如下:

浏览器中可查询到记录。

service代码如下:

package com.its.service;

import com.its.dao.UserDao;

import javax.servlet.http.HttpServletRequest;

public class UserService {
     UserDao userDao =new UserDao();
    public boolean checkLogin(String username, String password, HttpServletRequest request) {
       return userDao.checkLogin(username,password,request);
    }
}

Dao层代码:

package com.its.dao;

import com.its.entity.User;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class UserDao {
    public boolean checkLogin(String username, String password, HttpServletRequest request) {
        List<User> list =new ArrayList<>();
        try {
            //注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //建立连接
            Connection connection = DriverManager.getConnection("jdbc:mysql:///demo_test", "root", "root");
            //创建编译器
            String sql = "select * from user where username = ? and password = ?";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1,username);
            preparedStatement.setString(2,password);
            ResultSet resultSet = preparedStatement.executeQuery();
            while (resultSet.next()){
                //将查询的结果封装到User对象中,再存到集合里
                User user = new User();
                int id = resultSet.getInt("id");
                String username1 = resultSet.getString("username");
                int password1 = resultSet.getInt("password");
                user.setId(id);
                user.setUsername(username);
                user.setPassword(password1);
                list.add(user);
            }
            if(list.size() > 0){
                //得到session,session的默认存货时间大概是30分钟
                HttpSession session = request.getSession();
                //加密
                User user = list.get(0);
                user.setPassword(0000000000000000000);
                //将对象存到session中
                session.setAttribute("user",user);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return list.size() > 0;
    }

}

对于cookie代码的分析如下:

效果图:

大概的两个功能基本完成,后序还会有拦截和监听的功能。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值