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代码的分析如下:
效果图:
大概的两个功能基本完成,后序还会有拦截和监听的功能。