javaweb案例一

article/2025/11/6 2:45:52

文章目录

  • 一、登录界面
    • 1.前端代码
    • 2.后端代码
  • 二、添加功能
    • 1.前端代码
    • 2.后端代码
  • 三、删除功能
    • 1.前端代码
    • 2.后端代码
  • 四、修改功能
    • 1.前端代码
      • (1)修改路径
      • (2)信息回显
      • (3)隐藏域
    • 2.后端代码
      • (1)findUserServlet
      • (2)updateUserServlet
  • 五、删除选中功能
    • 1.前端代码
      • (1)单选
      • (2)全选
    • 2.后端代码
  • 六、分页查询功能
    • 1.前端代码
    • 2.后端代码
      • (1)封装pagebean
      • (2)findUserByPageServlet
  • 七、复杂条件查询
    • 1.前端代码
    • 2.后端代码
  • 总结


一、登录界面

图片:
在这里插入图片描述

1.前端代码

  • 改造验证码
<img src="${pageContext.request.contextPath}/checkCodeServlet" title="看不清点击刷新" id="vcode"/>
  • 点击验证码刷新
    加new Date().getTime()的原因在于,时间不重复,因此更新验证就不会重复。
<script type="text/javascript">//切换验证码function refreshCode(){//1.获取验证码图片对象var vcode = document.getElementById("vcode");//2.设置其src属性,加时间戳vcode.src = "${pageContext.request.contextPath}/checkCodeServlet?time="+new Date().getTime();}</script>
<a href="javascript:refreshCode();">
  • 提交表单
<form action="${pageContext.request.contextPath}/loginServlet" method="post">
  • 出错显示的信息框
 <div class="alert alert-warning alert-dismissible" role="alert"><button type="button" class="close" data-dismiss="alert" ><span>&times;</span></button><strong>${login_msg}</strong><!-- 对应后面的:request.setAttribute("login_msg","用户名或密码错误!"); --></div>

2.后端代码

  • 设置编码
request.setCharacterEncoding("utf-8");
  • 获取用户填写验证码,getParameter()的参数是验证码栏的name字段
<input type="text" name="verifycode" class="form-control" id="verifycode" placeholder="请输入验证码" style="width: 120px;"/>

String verifycode = request.getParameter("verifycode");//得到的是页面获取的验证码
  • 验证码校验
    checkCodeServlet里面,将生成的验证码存放在session中。
//将验证码放入HttpSession中
request.getSession().setAttribute("CHECKCODE_SERVER",checkCode);

equalsIgnoreCase()忽略大小写比较。

HttpSession session = request.getSession();
String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");//获取了生成的验证码
session.removeAttribute("CHECKCODE_SERVER");//确保验证码一次性if(!checkcode_server.equalsIgnoreCase(verifycode)){//验证码不正确//提示信息request.setAttribute("login_msg","验证码错误!");//跳转登录页面request.getRequestDispatcher("/login.jsp").forward(request,response);return;}

注意:写到这里时,记得先验证是否正确。再进行下一步!!!!!
session.removeAttribute(“CHECKCODE_SERVER”);//确保验证码一次性,注意这一步!!!!

  • 获取所有的数据(只有用户名和密码)
Map<String, String[]> map = request.getParameterMap();
  • 封装User对象(参考request和reponse—常见问题)
  User user = new User();try {BeanUtils.populate(user,map);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}
  • 调用Service查询
UserService service = new UserServiceImpl();
User loginUser = service.login(user);//查询我用户输入的账户是否存在
  • 判断是否登录成功
		if(loginUser != null){//登录成功//将用户存入sessionsession.setAttribute("user",loginUser);//跳转页面response.sendRedirect(request.getContextPath()+"/index.jsp");}else{//登录失败//提示信息request.setAttribute("login_msg","用户名或密码错误!");//跳转登录页面request.getRequestDispatcher("/login.jsp").forward(request,response);}

注意:request没有共享数据,因此,登录成功之后,进行重定向!!!
注意:数据库的表需创建,还有配置文件需配置!

二、添加功能

分析图:
在这里插入图片描述

1.前端代码

  • 修改添加联系人的跳转页面路径
<a class="btn btn-primary" href="${pageContext.request.contextPath}/add.jsp">添加联系人</a>
  • 修改头信息
<center><h3>添加联系人页面</h3></center><form action="${pageContext.request.contextPath}/addUserServlet" method="post">

注意要给表单加name,不然后端获取数据时,获取不了,为null!!!!

<input type="text" class="form-control" id="name" name="name" placeholder="请输入姓名">

2.后端代码

  • 设置编码
request.setCharacterEncoding("utf-8");
  • 获取参数
 Map<String, String[]> map = request.getParameterMap();
  • 封装对象
User user = new User();try {BeanUtils.populate(user,map);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}
  • 调用Service保存
UserService service = new UserServiceImpl();
service.addUser(user);
  • 跳转到userListServlet(注意:下面的不一样,后面会解释)
response.sendRedirect(request.getContextPath()+"/findUserByPageServlet");

(表单的校验)

三、删除功能

分析图:
在这里插入图片描述
上述的id,是数据库的id,不是下图的编号
在这里插入图片描述

1.前端代码

在这里插入图片描述

  • id的传递,还有路径的改写
<a class="btn btn-default btn-sm" href="${pageContext.request.contextPath}/delUserServlet?id="+${user.id}">删除</a></td>

这样写有一个小问题就是,删除一条数据时,直接删除,如果用户是误操作,就会直接删除,用户的体验就不是很好。因此,我们可以将它换成如下操作。

function deleteUser(id){location.href="${pageContext.request.contextPath}/delUserServlet?id="+${user.id};}}
<a class="btn btn-default btn-sm" href="javascript:deleteUser()});">删除</a></td>

但是这样写,有会有一个问题就是,user.id这里是获取不到的,解决办法就是传参。最终版。

function deleteUser(id){//用户安全提示if(confirm("您确定要删除吗?")){//访问路径location.href="${pageContext.request.contextPath}/delUserServlet?id="+id;}}
<a class="btn btn-default btn-sm" href="javascript:deleteUser(${user.id});">删除</a></td>

2.后端代码

  • 获取id
String id = request.getParameter("id");
  • 调用service删除
UserService service = new UserServiceImpl();
service.deleteUser(id);
  • 跳转到查询所有Servlet
response.sendRedirect(request.getContextPath()+"/findUserByPageServlet");

四、修改功能

图解:
在这里插入图片描述

1.前端代码

删除这句,用不着
在这里插入图片描述

(1)修改路径

<a class="btn btn-default btn-sm" href="${pageContext.request.contextPath}/findUserServlet?id=${user.id}">修改</a>

(2)信息回显

  • 姓名、年龄、QQ、email的回显(在findUserServlet的转发到update.jsp操作)
<input type="text" class="form-control" id="name" name="name"  value="${user.name}" readonly="readonly" placeholder="请输入姓名" />
<input type="text" class="form-control" value="${user.age}" id="age"  name="age" placeholder="请输入年龄" />
<input type="text" id="qq" class="form-control" value="${user.qq}" name="qq" placeholder="请输入QQ号码"/>
<input type="text" id="email" class="form-control" value="${user.email}" name="email" placeholder="请输入邮箱地址"/>
  • 性别回显
<div class="form-group"><label>性别:</label><c:if test="${user.gender == ''}"><input type="radio" name="gender" value="" checked /><input type="radio" name="gender" value=""  /></c:if><c:if test="${user.gender == ''}"><input type="radio" name="gender" value=""  /><input type="radio" name="gender" value="" checked  /></c:if></div>
  • 籍贯的回显
<div class="form-group"><label for="address">籍贯:</label><select name="address" id="address" class="form-control" ><c:if test="${user.address == '陕西'}"><option value="陕西" selected>陕西</option><option value="北京">北京</option><option value="上海">上海</option></c:if><c:if test="${user.address == '北京'}"><option value="陕西" >陕西</option><option value="北京" selected>北京</option><option value="上海">上海</option></c:if><c:if test="${user.address == '上海'}"><option value="陕西" >陕西</option><option value="北京">北京</option><option value="上海" selected>上海</option></c:if></select></div>

(3)隐藏域

在这里插入图片描述

<!--  隐藏域 提交id-->
<input type="hidden" name="id" value="${user.id}">

2.后端代码

(1)findUserServlet

  • 获取id
String id = request.getParameter("id");
  • 调用Service查询
UserService service = new UserServiceImpl();
User user = service.findUserById(id);
  • 将user存入request
request.setAttribute("user",user);
  • 转发到update.jsp
request.getRequestDispatcher("/update.jsp").forward(request,response);

(2)updateUserServlet

  • 设置编码
request.setCharacterEncoding("utf-8");
  • 获取map
Map<String, String[]> map = request.getParameterMap();
  • 封装对象
 User user = new User();try {BeanUtils.populate(user,map);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}
  • 调用Service修改
UserService service = new UserServiceImpl();service.updateUser(user);
  • 跳转到查询所有Servlet
response.sendRedirect(request.getContextPath()+"/findUserByPageServlet");

五、删除选中功能

图解:
在这里插入图片描述

1.前端代码

(1)单选

  • 获取选中条目的id,有多方案,最简单的一种,表单默认支持,选择条目的提交。想要提交,就要加name
    在这里插入图片描述
    在这里插入图片描述
<td><input type="checkbox" name="uid" value="${user.id}"></td>
  • 点击删除选中,要进行提交表单,对删除选中添加单击事件
<a class="btn btn-primary" href="javascript:void(0);" id="delSelected">删除选中</a>
  • 获取value值
    不加就会获取不到数据库的id
    在这里插入图片描述
<script>//1.获取第一个cbdocument.getElementById("firstCb").onclick = function(){//2.获取下边列表中所有的cbvar cbs = document.getElementsByName("uid");//3.遍历for (var i = 0; i < cbs.length; i++) {//4.设置这些cbs[i]的checked状态 = firstCb.checkedcbs[i].checked = this.checked;}}
</script>
<td><input type="checkbox" name="uid" value="${user.id}"></td>

(2)全选

在这里插入图片描述

  • 下面的框跟第一个框的状态保持一致
    第一个框
<th><input type="checkbox" id="firstCb"></th>

下面的框,遍历它,让它保持一致;注意判断是否有选中条目,如果没有选中的情况!!!!

<script>
window.onload = function(){//给删除选中按钮添加单击事件document.getElementById("delSelected").onclick = function(){if(confirm("您确定要删除选中条目吗?")){var flag = false;//判断是否有选中条目var cbs = document.getElementsByName("uid");for (var i = 0; i < cbs.length; i++) {if(cbs[i].checked){//有一个条目选中了flag = true;break;}}if(flag){//有条目被选中//表单提交document.getElementById("form").submit();}}}
</script>
<td><input type="checkbox" name="uid" value="${user.id}"></td>

2.后端代码

  • 获取所有id
String[] ids = request.getParameterValues("uid");
  • 调用service删除
UserService service = new UserServiceImpl();service.delSelectedUser(ids);

-跳转查询所有Servlet

response.sendRedirect(request.getContextPath()+"/findUserByPageServlet");

六、分页查询功能

图解:
在这里插入图片描述
分析图:
在这里插入图片描述

1.前端代码

  • 为什么改成pb.list?因为request.setAttribute(“pb”,pb);存入的是pb
<c:forEach items="${pb.list}" var="user" varStatus="s">
  • 总记录和总页码的修改
 <span style="font-size: 25px;margin-left: 5px;">共${pb.totalCount}条记录,共${pb.totalPage}页</span>
  • 下面的修改
  • 加激活状态,在li里面加class=“active”
    在这里插入图片描述
<c:forEach begin="1" end="${pb.totalPage}" var="i" ><c:if test="${pb.currentPage == i}"><li class="active"><a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${i}&rows=5&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}">${i}</a></li></c:if><c:if test="${pb.currentPage != i}"><li><a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${i}&rows=5&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}">${i}</a></li></c:if></c:forEach>
  • 在最前面的,1之前的加禁用状态
<c:if test="${pb.currentPage == 1}"><li class="disabled"></c:if><c:if test="${pb.currentPage != 1}"><li></c:if><c:if test="${pb.currentPage == pb.totalPage}"><li class="disabled"></c:if><c:if test="${pb.currentPage != pb.totalPage}"><li></c:if>

还要在UserServiceImpl里的findUserByPage()里面加

if(currentPage <=0) {currentPage = 1;}else if (currentPage>totalPage){currentPage = totalPage;}
  • 将来点击下面的页面,不是进入之前的userListServlet页面,而是进入findUserByPageServlet,所以其他的都要改
    在这里插入图片描述

2.后端代码

(1)封装pagebean

在这里插入图片描述

(2)findUserByPageServlet

request.setCharacterEncoding("utf-8");
  • 获取参数
String currentPage = request.getParameter("currentPage");//当前页码String rows = request.getParameter("rows");//每页显示条数
//解决下面注意事项的问题if(currentPage == null || "".equals(currentPage)){currentPage = "1";}if(rows == null || "".equals(rows)){rows = "5";}
  • 调用service查询
UserService service = new UserServiceImpl();PageBean<User> pb = service.findUserByPage(currentPage,rows);System.out.println(pb);
  • 将PageBean存入request
request.setAttribute("pb",pb);request.setAttribute("condition",condition);//将查询条件存入request
  • 转发到list.jsp
request.getRequestDispatcher("/list.jsp").forward(request,response);
  • 注意事项
    在这里插入图片描述
    后面不跟参数,就会报错
    在这里插入图片描述
    解决办法,在上面的代码中

七、复杂条件查询

图解:
在这里插入图片描述

1.前端代码

在这里插入图片描述

  • 查询条件的回显
    在findUserByPageServlet中将查询的数据添加到request
request.setAttribute("condition",condition);//将查询条件存入request

在list.jsp中进行value的赋值

<input type="text" name="name" value="${condition.name[0]}" class="form-control" id="exampleInputName2" >
<input type="text" name="address" value="${condition.address[0]}" class="form-control" id="exampleInputName3" >
<input type="text" name="email" value="${condition.email[0]}" class="form-control" id="exampleInputEmail2"  >
  • 当查询的值查询完之后,我们再点击分页时,就会变成没有查询之前全部的数据的分页,因此我们要在每个路径下拼接路径。
    在这里插入图片描述

2.后端代码

在这里插入图片描述

  • 获取条件查询参数
Map<String, String[]> condition = request.getParameterMap();
  • 在UserDaoImpl中改造sql语句,用拼接的方式
    在这里插入图片描述
  • 拼接时,要注意: sb.append(" and “+key+” like ? ");and两边要加空格,不然拼接在一起,没有空格时,会报错;
  • 还有解决 ? 里面传值的问题,因为值不确定,因此,用List params = new ArrayList();来接收参数
 public int findTotalCount(Map<String, String[]> condition) {//1.定义模板初始化sqlString sql = "select count(*) from user where 1 = 1 ";StringBuilder sb = new StringBuilder(sql);//2.遍历mapSet<String> keySet = condition.keySet();//定义参数的集合List<Object> params = new ArrayList<Object>();for (String key : keySet) {//排除分页条件参数if("currentPage".equals(key) || "rows".equals(key)){continue;}//获取valueString value = condition.get(key)[0];//判断value是否有值if(value != null && !"".equals(value)){//有值sb.append(" and "+key+" like ? ");params.add("%"+value+"%");//?条件的值}}System.out.println(sb.toString());System.out.println(params);return template.queryForObject(sb.toString(),Integer.class,params.toArray());}
  • 排除分页条件参数,如果不排除,就会报错
    在这里插入图片描述
  • params.add("%"+value+"%");如果写成了params.add(“value”);当查询的是姓李的人,就会导致没有结果。
  • 添加分页的findByPage()方法中,最后加进去的sql语句,一定是拼接后的sql语句。
    在这里插入图片描述
    链接:完整代码
    提取码:jzfa

总结

在上述的用红色写的,是不容易发现而且很容易出错的问题,需要大家注意。


http://chatgpt.dhexx.cn/article/CL01ENjL.shtml

相关文章

简单的Java web项目代码(8个)

引言&#xff1a;Java web项目主要采用mvc的的设计思想&#xff0c;系统主要采用javajspservletmysqleclipse实现&#xff0c;具有登陆、分页、导出excel&#xff0c;增删改查等功能,适合初学者&#xff0c;满足基本的实训需求&#xff0c;以下是推荐的几款&#xff0c;总有适合…

161套javaWeb项目源码免费分享

最近很多学生在找关于java开发的学生管理系统&#xff0c;学生选课系统&#xff0c;车辆管理系统&#xff0c;商城系统&#xff0c;项目申报系统&#xff0c;教务管理系统&#xff0c;班级管理系统&#xff0c;博客系统。。。。。。。。 我找了一些前几年的项目&#xff0c;感…

kingbase人大金仓数据库安装配置手册

1、上传安装包 安装包和license文件上传到/home/setup/kingbase目录 2、操作系统配置 关闭防火墙 中标麒麟: systemctl stop firewalld systemctl disabled firewalld 银河麒麟&#xff1a; service iptables stop 3、安装数据库 创建数据库安装用户&#xff1a; groupadd…

达梦数据库安装

一、概述 本文将给大家介绍达梦数据库的安装。 二、环境介绍 达梦正式版需要授权&#xff0c;我们自己搭个测试环境&#xff0c;就选试用版。去达梦官网下载适用自己平台的安装包。我的环境使用的是centos7.9。 三、安装 1. 创建安装用户 groupadd dinstall useradd -g din…

达梦数据库安装(Window)

1、下载数据库&#xff1a;从达梦官网下载就行【下载需要注册登录账户】 www.dameng.com 2、选择自己需要的版本&#xff0c;我这里选择的是【DM8】开发版 3、下载后得到一个zip解压包&#xff0c;先解压后再解压这个iso。 4、 双击这个进行安装 5、安装步骤 点击下一步 接受并…

MIMIC IV数据库安装(一)

文章目录 一、MIMIC IV数据库简介二、PostgreSQL数据库安装1.下载PostgreSQL安装包2.安装PostgreSQL3.进入PostgreSQL Shell 一、MIMIC IV数据库简介 MIMIC数据库就是一个可为临床研究者提供临床数据的利器。研究者可根据一定的纳排标准筛选感兴趣患者的临床信息&#xff0c;利…

Oracle11g数据库安装图文详细教程

大二女大学生学习一些关于Oracle的知识时&#xff0c;安装了oracle数据库&#xff0c;正是因为oracle数据库比较难装&#xff0c;中途也遇到了很多值得思考的问题&#xff0c;于是呕心沥血将安装的过程及遇到的问题整理如下&#xff0c;进行反思学习。 了解Oracle Oracle是一…

DM数据库安装及启动教程(Windows超详细版)

DM数据库安装及启动教程&#xff08;Windows版&#xff09; 一、DM系统管理员1.DM数据库管理员的类型&#xff08;四权分立&#xff09; 二、创建和删除DM数据库1.创建DM数据库实例2.删除数据库实例 三、启动和关闭数据库1.启动数据库2.关闭数据库3.数据库状态与模式 一、DM系统…

KingbaseES——人大金仓数据库安装教程

安装教程 首先从官网上下载人大金仓数据库。下载完成后点开安装包&#xff0c;出现如下界面&#xff1a; 点击确定&#xff0c;等待几秒&#xff0c;跳转到下一个界面。 点击下一步&#xff0c;点击我接受许可协议&#xff0c;然后继续下一步&#xff0c;根据自己的需要选择安…

达梦数据库安装与初始化超详细教程

陈老老老板&#x1f9b8; &#x1f468;‍&#x1f4bb;本文专栏&#xff1a;国产数据库-达梦数据库&#xff08;主要讲一些达梦数据库相关的内容&#xff09; &#x1f468;‍&#x1f4bb;本文简述&#xff1a;本文讲一下达梦数据库的下载与安装教程&#xff08;Windows版&am…

DM数据库安装及启动教程(Linux超详细版)

DM数据库安装及启动教程&#xff08;Linux超详细版&#xff09; 一、部署前准备工作1.新建 dmdba 用户2.修改文件打开最大数3.挂载镜像文件4.新建安装目录 二、DM8Linux的安装部署1.命令行安装2.配置环境变量3.配置实例4.注册服务5.启动停止数据库&#xff08;root&#xff09;…

达梦数据库安装部署手册

文章目录 1 安装环境2 部署达梦数据库服务端2.1 达梦数据库服务安装包下载2.2 解压安装包2.2.1 解压zip2.2.2 读取iso 2.3 创建安装用户2.3.1 创建安装用户组 dinstall2.3.2 创建安装用户 dmdba2.3.3 初始化用户密码 2.4 检查操作系统限制2.4.1 data seg size2.4.2 file size2.…

MIMIC IV数据库安装(二)

文章目录 一、MIMIC IV数据文件获取二、MIMIC IV安装数据代码获取三、安装7zip工具三、MIMIC IV安装数据 一、MIMIC IV数据文件获取 获取MIMIC数据库数据权限后&#xff0c;在MIMIC-IV的官网可以获取全部的MIMIC-IV数据表格压缩包&#xff0c;官方链接&#xff1a;https://phy…

Oracle数据库安装及配置

文章目录 下载Oracle安装Oracle配置Oracle 下载Oracle 下载地址&#xff1a;&#xff08;Database Software Downloads | Oracle&#xff09; 下载好像需要Oracle账号&#xff0c;只要有邮箱就能注册。 安装Oracle 解压好下载的压缩包&#xff0c;找到setu.exe 点击安装。 …

Oracle数据库安装与配置

Oracle数据库安装与配置 一、数据库安装二、网络配置1.Oracle监听配置2.本地网络服务名配置 三、数据库创建四、数据库连接与测试五、遇到的问题及解决 这里所使用的是Oracle Database 11g发行版 一、数据库安装 首先点击安装目录下的setup.exe 电子邮件可以不填写直接下一步…

人大金仓数据库安装

人大金仓数据库安装 最近项目中有要求数据库由mysql转为国内数据库人大金仓&#xff0c;之前完全没有接触过这个人大金仓数据库&#xff0c;从网上找的人大金仓相关资料也不是很多&#xff0c;所以加了一个专栏记录一下来以避免自己再次遇到相同的需求无处可下手&#xff0c;也…

达梦7数据库安装教程

达梦数据库安装教程 达梦数据库&#xff08;DM7试用版&#xff09;试用期为一年 装在本机&#xff1a;windows环境&#xff0c;x64 提示&#xff1a;从官网上下载DM7数据库需要注册、登录用户。 官网&#xff1a;https://www.dameng.com/view_61.html 1.进入官网&#xff0c;登…

oracle19c数据库安装(静默安装)

目录 前言1. 安装前准备工作2. 安装数据库3. 配置监听4. 创建数据库 前言 oracle19c数据库安装相对于oracle12c安装还是有些不一样的&#xff0c;所以今天再来记录一下安装过程&#xff0c;本次安装仍然是基于Oracle linux7.6环境来安装&#xff0c;仅供参考 1. 安装前准备工…

数据库简介及安装

目录 MySQL数据库&#xff1a; MySQL的特性&#xff1a; Widow安装MySQL&#xff1a; 1.zip安装 2.msi安装 MySQL数据库&#xff1a; MySQL 是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;目前属于 Oracle 公司。MySQL 是一种关联数据库管…

数据库的安装步骤

2.1将mysql和navicat的安装包解压到合适的位置 2.2配置环境变量 右击 我的电脑-->属性-->高级系统系统设置-->高级-->环境变量-->系统变量中选择path&#xff0c;将自己的路径填入&#xff0c;比如我的在以下路径&#xff0c;之后点击确定。 2.3以管理员的身份…