第8章 JSP
目录
- 8.1 概念:
- 8.2 原理
- 8.3 JSP的脚本
- 8.4 JSP的内置对象:
- request
- response
- out:字符输出流对象
- 8.5 案例:改造Cookie案例
- 8.6 指令
- 8.7 注释:
- 8.8 内置对象
- 8.9 MVC:开发模式
- 8.9.1 jsp演变历史
- 8.9.2 MVC:
- 8.9.3 MVC优缺点:
- 8.10 EL表达式
- 8.10.1 概述
- 8.10.2 使用
- 运算:
- 获取值
- 8.11 JSTL
- 8.11.1 概述
- 8.11.2 使用步骤:
- 8.11.3 常用的JSTL标签
- if:相当于java代码的if语句
- choose:相当于java代码的switch语句
- foreach:相当于java代码的for语句
- 练习
- 8.12 三层架构:软件设计架构
- 8.12.1案例:用户信息列表展示
- 1 环境搭建
- 创建数据库,添加数据
- 导入相关jar包
- 导入静态资源
- 导入druid.properties文件
- 2 列表查询
- User
- UserDao
- UserDaoImpl
- UserService
- UserServiceImpl
- JDBCUtils
- UserListServlet
- index.jsp
- list.jsp
- 3 页面调整
- list.jsp
- 4 登录功能
- login.jsp
- index.jsp
- User
- UserDao
- UserDaoImpl
- UserService
- UserServiceImpl
- LoginServlet
- 5 添加功能
- list.jsp
- add.jsp
- UserDao
- UserDaoImpl
- UserService
- UserServiceImpl
- AddUserServlet
- 6 删除
- list.jsp
- UserDao
- UserDaoImpl
- UserService
- UserServiceImpl
- DelUserServlet
- 7 修改
- list.jsp
- update.jsp
- UserDao
- UserDaoImpl
- UserService
- UserServiceImpl
- FindUserServlet
- UpdateUserServlet
- 8 删除选中功能
- list.jsp
- UserService
- UserServiceImpl
- DelSelectedServlet
- 9 分页
- index.jsp
- list.jsp
- UserDao
- UserDaoImpl
- UserService
- UserServiceImpl
- FindUserByPageServlet
- 10 复杂查询
- list.jsp
- UserDao
- UserDaoImpl
- UserServiceImpl
- FindUserByPageServlet
8.1 概念:
Java Server Pages: java服务器端页面
可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
用于简化书写!!!
8.2 原理
SP本质上就是一个Servlet3.
8.3 JSP的脚本
JSP定义Java代码的方式
<% 代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
<%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
<%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
8.4 JSP的内置对象:
在jsp页面中不需要获取和创建,可以直接使用的对象
jsp一共有9个内置对象。
request
response
out:字符输出流对象
可以将数据输出到页面上。和response.getWriter()类似
response.getWriter()和out.write()的区别:
在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。 response.getWriter()数据输出永远在out.write()之前
8.5 案例:改造Cookie案例
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.net.URLDecoder" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>itcast</title>
</head>
<body><%//1.获取所有CookieCookie[] cookies = request.getCookies();boolean flag = false;//没有cookie为lastTime//2.遍历cookie数组if(cookies != null && cookies.length > 0){for (Cookie cookie : cookies) {//3.获取cookie的名称String name = cookie.getName();//4.判断名称是否是:lastTimeif("lastTime".equals(name)){//有该Cookie,不是第一次访问flag = true;//有lastTime的cookie//设置Cookie的value//获取当前时间的字符串,重新设置Cookie的值,重新发送cookieDate date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");String str_date = sdf.format(date);System.out.println("编码前:"+str_date);//URL编码str_date = URLEncoder.encode(str_date,"utf-8");System.out.println("编码后:"+str_date);cookie.setValue(str_date);//设置cookie的存活时间cookie.setMaxAge(60 * 60 * 24 * 30);//一个月response.addCookie(cookie);//响应数据//获取Cookie的value,时间String value = cookie.getValue();System.out.println("解码前:"+value);//URL解码:value = URLDecoder.decode(value,"utf-8");System.out.println("解码后:"+value);%><h1>欢迎回来,您上次访问时间为:<%=value%></h1><input><%break;}}}if(cookies == null || cookies.length == 0 || flag == false){//没有,第一次访问//设置Cookie的value//获取当前时间的字符串,重新设置Cookie的值,重新发送cookieDate date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");String str_date = sdf.format(date);System.out.println("编码前:"+str_date);//URL编码str_date = URLEncoder.encode(str_date,"utf-8");System.out.println("编码后:"+str_date);Cookie cookie = new Cookie("lastTime",str_date);//设置cookie的存活时间cookie.setMaxAge(60 * 60 * 24 * 30);//一个月response.addCookie(cookie);%><h1>您好,欢迎您首次访问</h1>
<span></span><%}%><input></body>
</html>
8.6 指令
-
作用:用于配置JSP页面,导入资源文件
-
格式:
<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>
-
分类:
-
page: 配置JSP页面的
- contentType:等同于response.setContentType()
- 设置响应体的mime类型以及字符集
- 设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要设置pageEncoding属性设置当前页面的字符集)
- import:导包
- errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
- isErrorPage:标识当前也是是否是错误页面。
- true:是,可以使用内置对象exception
- false:否。默认值。不可以使用内置对象exception
- contentType:等同于response.setContentType()
-
include : 页面包含的。导入页面的资源文件
<%@include file="top.jsp"%>
-
- taglib : 导入资源
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>prefix:前缀,自定义的
8.7 注释:
- html注释::只能注释html代码片段
- jsp注释:推荐使用
<%-- --%>:可以注释所有
8.8 内置对象
在jsp页面中不需要创建,直接使用的对象
变量名 | 真实类型 | 作用 |
---|---|---|
pageContext | PageContext | 当前页面共享数据,还可以获取其他八个内置对象 |
request | HttpServletRequest | 一次请求访问的多个资源(转发) |
session | HttpSession | 一次会话的多个请求间 |
application | ServletContext | 所有用户间共享数据 |
response | HttpServletResponse | 响应对象 |
page | Object | 当前页面(Servlet)的对象 this |
out | JspWriter | 输出对象,数据输出到页面上 |
config | ServletConfig | Servlet的配置对象 |
exception | Throwable | 异常对象 |
8.9 MVC:开发模式
8.9.1 jsp演变历史
- 早期只有servlet,只能使用response输出标签数据,非常麻烦
- 后来又jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大量的java代码,有写html表,造成难于维护,难于分工协作
- 再后来,java的web开发,借鉴mvc开发模式,使得程序的设计更加合理性
8.9.2 MVC:
- M:Model,模型。JavaBean
- 完成具体的业务操作,如:查询数据库,封装对象
- V:View,视图。JSP
- 展示数据
- C:Controller,控制器。Servlet
- 获取用户的输入
- 调用模型
- 将数据交给视图进行展示
8.9.3 MVC优缺点:
- 优点:
-
耦合性低,方便维护,可以利于分工协作
-
重用性高
- 缺点:
- 使得项目架构变得复杂,对开发人员要求高
8.10 EL表达式
8.10.1 概述
- 概念:Expression Language 表达式语言
- 作用:替换和简化jsp页面中java代码的编写
- 语法:${表达式}
- 注意:
- jsp默认支持el表达式的。如果要忽略el表达式
- 设置jsp中page指令中:isELIgnored=“true” 忽略当前jsp页面中所有的el表达式
- \ ${表达式} :忽略当前这个el表达式
- jsp默认支持el表达式的。如果要忽略el表达式
8.10.2 使用
运算:
- 运算符:
- 算数运算符: + - * /(div) %(mod)
- 比较运算符: > < >= <= == !=
- 逻辑运算符: &&(and) ||(or) !(not)
- 空运算符: empty
- 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
- ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0
- ${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0
获取值
- el表达式只能从域对象中获取值
- 语法:
-
${域名称.键名}:从指定域中获取指定键的值
- 域名称:
- pageScope --> pageContext
- requestScope --> request
- sessionScope --> session
- applicationScope --> application(ServletContext)
- 举例:在request域中存储了name=张三
- 获取:${requestScope.name}
- 域名称:
-
${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
-
获取对象、List集合、Map集合的值
-
对象:${域名称.键名.属性名}
-
本质上会去调用对象的getter方法
<%User user=new User("张三",34,new Date());request.setAttribute("u",user);%><h1>el获取对象的值</h1>${requestScope.u}<br>${requestScope.u.name}<br>${u.age}<br>${u.birthday}<br>
-
List集合:${域名称.键名[索引]}
-
Map集合:
${域名称.键名.key名称} ${域名称.键名["key名称"]}
-
-
-
隐式对象:
el表达式中有11个隐式对象
pageContext:
获取jsp其他八个内置对象
${pageContext.request.contextPath}:动态获取虚拟目录
8.11 JSTL
8.11.1 概述
概念:JavaServer Pages Tag Library
JSP标准标签库
是由Apache组织提供的开源的免费的jsp标签
作用:用于简化和替换jsp页面上的java代码
8.11.2 使用步骤:
导入jstl相关jar包
引入标签库:taglib指令: <%@ taglib %>
使用标签
8.11.3 常用的JSTL标签
if:相当于java代码的if语句
属性:
test 必须属性,接受boolean表达式
如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
一般情况下,test属性值会结合el表达式一起使用
注意: c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--Created by IntelliJ IDEA.User: LenovoDate: 2021/7/24Time: 19:04To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>c:if</title>
</head>
<body><c:if test="true">我是真。。。。</c:if><%int a=6;%><c:if test="${number % 2 == 0}">是偶数。。。。</c:if>
</body>
</html>
choose:相当于java代码的switch语句
相当于switch声明
使用when标签做判断 ,相当于case
使用otherwise标签做其他情况的声明 ,相当于default 、
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--Created by IntelliJ IDEA.User: LenovoDate: 2021/7/24Time: 19:12To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>c:choose</title>
</head>
<body><%request.setAttribute("number",5);%><c:choose><c:when test="${number==1}">周一</c:when><c:when test="${number==2}">周二</c:when><c:when test="${number==3}">周三</c:when><c:when test="${number==4}">周四</c:when><c:when test="${number==5}">周五</c:when><c:when test="${number==6}">周六</c:when><c:when test="${number==7}">周七</c:when><c:otherwise>您输入的有误!!!</c:otherwise></c:choose>
</body>
</html>
foreach:相当于java代码的for语句
-
完成重复的操作
for(int i = 0; i < 10; i ++){}
属性:
begin:开始值
end:结束值
var:临时变量
step:步长
varStatus:循环状态对象
-
遍历容器
List< User> list;
for(User user : list){}
属性:
items:容器对象
var:容器中元素的临时变量
varStatus:循环状态对象
index:容器中元素的索引,从0开始
count:循环次数,从1开始
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html>
<head><title>foreach标签</title>
</head>
<body><c:forEach begin="1" end="10" var="i" step="2" varStatus="s">${i} <h3>${s.index}<h3> <h4> ${s.count} </h4><br></c:forEach><hr><%List list = new ArrayList();list.add("aaa");list.add("bbb");list.add("ccc");request.setAttribute("list",list);%><c:forEach items="${list}" var="str" varStatus="s">${s.index} ${s.count} ${str}<br></c:forEach></body>
</html>
练习
需求:在request域中有一个存有User对象的List集合。需要使用jstl+el将list集合数据展示到jsp页面的表格table中
package itcast.pojo;import java.util.Date;public class User {private String name;private int age;private Date birthday;public User(String name, int age, Date birthday) {this.name = name;this.age = age;this.birthday = birthday;}public User() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", birthday=" + birthday +'}';}
}
<%@ page import="cn.itcast.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html>
<head><title>test</title>
</head>
<body><%List list = new ArrayList();list.add(new User("张三",23,new Date()));list.add(new User("李四",24,new Date()));list.add(new User("王五",25,new Date()));request.setAttribute("list",list);%><table border="1" width="500" align="center"><tr><th>编号</th><th>姓名</th><th>年龄</th><th>生日</th></tr><%--数据行--%><c:forEach items="${list}" var="user" varStatus="s"><c:if test="${s.count % 2 != 0}"><tr bgcolor="red"><td>${s.count}</td><td>${user.name}</td><td>${user.age}</td><td>${user.birStr}</td></tr></c:if><c:if test="${s.count % 2 == 0}"><tr bgcolor="green"><td>${s.count}</td><td>${user.name}</td><td>${user.age}</td><td>${user.birStr}</td></tr>// </c:if></c:forEach></table></body>
</html>
8.12 三层架构:软件设计架构
界面层(表示层web):用户看的得界面。用户可以通过界面上的组件和服务器进行交互
业务逻辑层service:处理业务逻辑的。
数据访问层dao:操作数据存储文件。
8.12.1案例:用户信息列表展示
-
需求:用户信息的增删改查操作
-
设计:
-
技术选型:Servlet+JSP+MySQL+JDBCTempleat+Duird+BeanUtilS+tomcat
-
数据库设计:
-
-
开发:
- 环境搭建
- 创建数据库环境
- 创建项目,导入需要的jar包
- 编码
- 测试
- 部署运维
1 环境搭建
创建数据库,添加数据
create database day17; -- 创建数据库
use day17; -- 使用数据库
create table user( -- 创建表 id int primary key auto_increment, name varchar(20) not null, gender varchar(5), age int, address varchar(32), qq varchar(20), email varchar(50)
);
INSERT INTO `user` VALUES (1, '张三', '男', 23, '河北省', '2623222222', '2623222222@qq.com');
INSERT INTO `user` VALUES (2, '李四', '男', 33, '河南省', '2625555555', '2625555555@qq.com');
INSERT INTO `user` VALUES (3, '王五', '女', 27, '重庆', '4522222268', '4522222268@qq.com');
INSERT INTO `user` VALUES (4, '柳六', '男', 13, '陕西', '12345', 'zhangsan@itcast.cn');
INSERT INTO `user` VALUES (5, '钱七', '女', 15, '北京', '88888', 'ls@itcast.cn');
导入相关jar包
导入静态资源
导入druid.properties文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///javawebs
username=root
password=root
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
2 列表查询
User
package cn.gtt.pojo;public class User {private int id;private String name;private String genter;private int age;private String address;private String qq;private String email;public User(int id, String name, String genter, int age, String address, String qq, String email) {this.id = id;this.name = name;this.genter = genter;this.age = age;this.address = address;this.qq = qq;this.email = email;}public User() {}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGenter() {return genter;}public void setGenter(String genter) {this.genter = genter;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getQq() {return qq;}public void setQq(String qq) {this.qq = qq;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", genter='" + genter + '\'' +", age=" + age +", address='" + address + '\'' +", qq='" + qq + '\'' +", email='" + email + '\'' +'}';}
}
UserDao
package cn.gtt.dao;import cn.gtt.pojo.User;import java.util.List;/*** 用户操作的dao*/
public interface UserDao {/*** 查询所有用户信息*/public List<User> findAll();
}
UserDaoImpl
package cn.gtt.dao.Impl;import cn.gtt.dao.UserDao;
import cn.gtt.pojo.User;
import cn.gtt.util.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;import java.util.List;public class UserDaoImpl implements UserDao {private JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());/*** 查询所有用户信息*/@Overridepublic List<User> findAll() {
// 使用JDBC操作数据库String sql="select * from user";List<User> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));return users;}
}
UserService
package cn.gtt.service;import cn.gtt.pojo.User;import java.util.List;/*** 用户管理的业务接口*/
public interface UserService {/*** 查询所有用户信息* @return*/public List<User> findAll();
}
UserServiceImpl
package cn.gtt.service.Impl;import cn.gtt.dao.Impl.UserDaoImpl;
import cn.gtt.dao.UserDao;
import cn.gtt.pojo.User;
import cn.gtt.service.UserService;import java.util.List;public class UserServiceImpl implements UserService {UserDao userDao=new UserDaoImpl() ;/*** 查询所有用户信息*/@Overridepublic List<User> findAll() {
// 调用userDao完成return userDao.findAll();}
}
JDBCUtils
package cn.gtt.util;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;/*** Druid连接池的工具类*/
public class JDBCUtils {
// 定义成员变量DataSourceprivate static DataSource dataSource;static {try {
// 加载配置文件Properties properties = new Properties();properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
// 获取DataSourcedataSource= DruidDataSourceFactory.createDataSource(properties);} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 获取连接*/public static Connection getConnection() throws SQLException {return dataSource.getConnection();}/*** 释放资源*/public static void close(ResultSet resultSet,Statement statement, Connection connection){if(resultSet!=null){try {resultSet.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(statement!=null){try {statement.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(connection!=null){try {connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}/*** 获取连接池方法*/public static DataSource getDataSource(){return dataSource;}}
UserListServlet
package cn.gtt.web.servlet;import cn.gtt.pojo.User;
import cn.gtt.service.Impl.UserServiceImpl;
import cn.gtt.service.UserService;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("/userListServlet")
public class UserListServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 调用UserService完成查询UserService userService = new UserServiceImpl();List<User> users = userService.findAll();
// 将list存入request域req.setAttribute("users",users);
// 转发到list.jspreq.getRequestDispatcher("/list.jsp").forward(req,resp);}
}
index.jsp
<%--Created by IntelliJ IDEA.User: LenovoDate: 2021/7/24Time: 20:37To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>首页</title><!-- 1. 导入CSS的全局样式 --><link href="css/bootstrap.min.css" rel="stylesheet"><!-- 2. jQuery导入,建议使用1.9以上的版本 --><script src="js/jquery-2.1.0.min.js"></script><!-- 3. 导入bootstrap的js文件 --><script src="js/bootstrap.min.js"></script><script type="text/javascript"></script>
</head>
<body>
<div align="center"><a
<%-- ${pageContext.request.contextPath}来表示请求路径--%>href="${pageContext.request.contextPath}/userListServlet" style="text-decoration:none;font-size:33px">查询所有用户信息</a>
</div>
</body>
</html>
list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head><!-- 指定字符集 --><meta charset="utf-8"><!-- 使用Edge最新的浏览器的渲染方式 --><meta http-equiv="X-UA-Compatible" content="IE=edge"><!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。width: 默认宽度与设备的宽度相同initial-scale: 初始的缩放比,为1:1 --><meta name="viewport" content="width=device-width, initial-scale=1"><!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><title>用户信息管理系统</title><!-- 1. 导入CSS的全局样式 --><link href="css/bootstrap.min.css" rel="stylesheet"><!-- 2. jQuery导入,建议使用1.9以上的版本 --><script src="js/jquery-2.1.0.min.js"></script><!-- 3. 导入bootstrap的js文件 --><script src="js/bootstrap.min.js"></script><style type="text/css">td, th {text-align: center;}</style>
</head>
<body>
<div class="container"><h3 style="text-align: center">用户信息列表</h3><table border="1" class="table table-bordered table-hover"><tr class="success"><th>编号</th><th>姓名</th><th>性别</th><th>年龄</th><th>籍贯</th><th>QQ</th><th>邮箱</th><th>操作</th></tr><c:forEach var="user" varStatus="s" items="${users}"><tr><td>${s.count}</td><td>${user.name}</td><td>${user.gender}</td><td>${user.age}</td><td>${user.address}</td><td>${user.qq}</td><td>${user.email}</td><td><a class="btn btn-default btn-sm" href="update.html">修改</a> <a class="btn btn-default btn-sm" href="">删除</a></td></tr></c:forEach><tr><td colspan="8" align="center"><a class="btn btn-primary" href="add.html">添加联系人</a></td></tr></table>
</div>
</body>
</html>
3 页面调整
list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head><!-- 指定字符集 --><meta charset="utf-8"><!-- 使用Edge最新的浏览器的渲染方式 --><meta http-equiv="X-UA-Compatible" content="IE=edge"><!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。width: 默认宽度与设备的宽度相同initial-scale: 初始的缩放比,为1:1 --><meta name="viewport" content="width=device-width, initial-scale=1"><!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><title>用户信息管理系统</title><!-- 1. 导入CSS的全局样式 --><link href="css/bootstrap.min.css" rel="stylesheet"><!-- 2. jQuery导入,建议使用1.9以上的版本 --><script src="js/jquery-2.1.0.min.js"></script><!-- 3. 导入bootstrap的js文件 --><script src="js/bootstrap.min.js"></script><style type="text/css">td, th {text-align: center;}</style>
</head>
<body>
<div class="container"><h3 style="text-align: center">用户信息列表</h3><div style="float:left;"><form class="form-inline"><div class="form-group"><label for="exampleInputName2">姓名</label><input type="text" class="form-control" id="exampleInputName2"></div><div class="form-group"><label for="exampleInputEmail2">籍贯</label><input type="email" class="form-control" id="exampleInputEmail2" ></div><div class="form-group"><label for="exampleInputEmail2">E-mail</label><input type="email" class="form-control" id="exampleInputEmail2" ></div><button type="submit" class="btn btn-default">查询</button></form></div><div style="float: right;margin: 5px;"><a class="btn btn-primary" href="add.html">添加联系人</a><a class="btn btn-primary" href="add.html">删除选中</a></div><table border="1" class="table table-bordered table-hover"><tr class="success"><th><input type="checkbox"></th><th>编号</th><th>姓名</th><th>性别</th><th>年龄</th><th>籍贯</th><th>QQ</th><th>邮箱</th><th>操作</th></tr><c:forEach var="user" varStatus="s" items="${users}"><tr><td><input type="checkbox"></td><td>${s.count}</td><td>${user.name}</td><td>${user.gender}</td><td>${user.age}</td><td>${user.address}</td><td>${user.qq}</td><td>${user.email}</td><td><a class="btn btn-default btn-sm" href="update.html">修改</a> <a class="btn btn-default btn-sm" href="">删除</a></td></tr></c:forEach></table><div><nav aria-label="Page navigation"><ul class="pagination"><li><a href="#" aria-label="Previous"><span aria-hidden="true">«</span></a></li><li><a href="#">1</a></li><li><a href="#">2</a></li><li><a href="#">3</a></li><li><a href="#">4</a></li><li><a href="#">5</a></li><li><a href="#" aria-label="Next"><span aria-hidden="true">»</span></a></li><span style="font-size: 25px;margin-left: 20px">共16条记录,共4页</span></ul></nav></div>
</div>
</body>
</html>
4 登录功能
验证码问题
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>管理员登录</title><!-- 1. 导入CSS的全局样式 --><link href="css/bootstrap.min.css" rel="stylesheet"><!-- 2. jQuery导入,建议使用1.9以上的版本 --><script src="js/jquery-2.1.0.min.js"></script><!-- 3. 导入bootstrap的js文件 --><script src="js/bootstrap.min.js"></script><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>
</head>
<body>
<div class="container" style="width: 400px;"><h3 style="text-align: center;">管理员登录</h3><form action="${pageContext.request.contextPath}/loginServlet" method="post"><div class="form-group"><label for="user">用户名:</label><input type="text" name="username" class="form-control" id="user" placeholder="请输入用户名"/></div><div class="form-group"><label for="password">密码:</label><input type="password" name="password" class="form-control" id="password" placeholder="请输入密码"/></div><div class="form-inline"><label for="vcode">验证码:</label><input type="text" name="verifycode" class="form-control" id="verifycode" placeholder="请输入验证码" style="width: 120px;"/><a href="javascript:refreshCode();"><img src="${pageContext.request.contextPath}/checkCodeServlet" title="看不清点击刷新" id="vcode"/></a></div><hr/><div class="form-group" style="text-align: center;"><input class="btn btn btn-primary" type="submit" value="登录"></div></form><!-- 出错显示的信息框 --><div class="alert alert-warning alert-dismissible" role="alert"><button type="button" class="close" data-dismiss="alert" ><span>×</span></button><strong>${login_msg}</strong></div>
</div>
</body>
</html>
index.jsp
<%--Created by IntelliJ IDEA.User: LenovoDate: 2021/7/24Time: 20:37To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>首页</title><!-- 1. 导入CSS的全局样式 --><link href="css/bootstrap.min.css" rel="stylesheet"><!-- 2. jQuery导入,建议使用1.9以上的版本 --><script src="js/jquery-2.1.0.min.js"></script><!-- 3. 导入bootstrap的js文件 --><script src="js/bootstrap.min.js"></script><script type="text/javascript"></script>
</head>
<body>
<div align="center"><a
<%-- ${pageContext.request.contextPath}来表示请求路径--%>href="${pageContext.request.contextPath}/userListServlet" style="text-decoration:none;font-size:33px">查询所有用户信息</a>
</div>
</body>
</html>
User
package cn.gtt.pojo;public class User {private int id;private String name;private String gender;private int age;private String address;private String qq;private String email;private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public User(int id, String name, String gender, int age, String address, String qq, String email) {this.id = id;this.name = name;this.gender = gender;this.age = age;this.address = address;this.qq = qq;this.email = email;}public User() {}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getQq() {return qq;}public void setQq(String qq) {this.qq = qq;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", gender='" + gender + '\'' +", age=" + age +", address='" + address + '\'' +", qq='" + qq + '\'' +", email='" + email + '\'' +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}
UserDao
package cn.gtt.dao;import cn.gtt.pojo.User;import java.util.List;/*** 用户操作的dao*/
public interface UserDao {/*** 查询所有用户信息*/public List<User> findAll();/*** 登录* @param username* @param password* @return*/User findUserByUsernamePassword(String username,String password);
}
UserDaoImpl
package cn.gtt.dao.Impl;import cn.gtt.dao.UserDao;
import cn.gtt.pojo.User;
import cn.gtt.util.JDBCUtils;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;import java.util.List;public class UserDaoImpl implements UserDao {private JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());/*** 查询所有用户信息*/@Overridepublic List<User> findAll() {
// 使用JDBC操作数据库String sql="select * from user";List<User> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));return users;}/*** 登录* @param username* @param password* @return*/@Overridepublic User findUserByUsernamePassword(String username, String password) {try {String sql="select * from user where username=? and password=?";User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username, password);return user;}catch (Exception e){e.printStackTrace();return null;}}}
UserService
package cn.gtt.service;import cn.gtt.pojo.User;import java.util.List;/*** 用户管理的业务接口*/
public interface UserService {/*** 查询所有用户信息* @return*/public List<User> findAll();/*** 登录* @param user* @return*/User login(User user);
}
UserServiceImpl
package cn.gtt.service.Impl;import cn.gtt.dao.Impl.UserDaoImpl;
import cn.gtt.dao.UserDao;
import cn.gtt.pojo.User;
import cn.gtt.service.UserService;import java.util.List;public class UserServiceImpl implements UserService {UserDao userDao=new UserDaoImpl() ;/*** 查询所有用户信息*/@Overridepublic List<User> findAll() {
// 调用userDao完成return userDao.findAll();}/*** 登录* @param user* @return*/@Overridepublic User login(User user) {return userDao.findUserByUsernamePassword(user.getUsername(),user.getPassword());}
}
LoginServlet
package cn.gtt.web.servlet;import cn.gtt.dao.Impl.UserDaoImpl;
import cn.gtt.pojo.User;
import cn.gtt.service.Impl.UserServiceImpl;
import cn.gtt.service.UserService;
import org.apache.commons.beanutils.BeanUtils;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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.设置编码格式req.setCharacterEncoding("utf-8");// 2.获取数据
// 2.1 获取用户填写验证码String verifycode = req.getParameter("verifycode");
// 3.验证码校验HttpSession session = req.getSession();String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
// 确保验证码一次性session.removeAttribute("CHECKCODE_SERVER");if (!checkcode_server.equalsIgnoreCase(verifycode)){
// 验证码不正确
// 提示信息req.setAttribute("login_msg","验证码错误!!!");
// 转跳登录页面req.getRequestDispatcher("/login.jsp").forward(req,resp);return;}
// 4.封装user对象Map<String, String[]> parameterMap = req.getParameterMap();User user=new User();try {BeanUtils.populate(user,parameterMap);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}// 5.调用service查询UserService userService = new UserServiceImpl();User login = userService.login(user);
// 6.判断是否登录成功if (login!=null){
// 将用户存入sessionsession.setAttribute("user",login);
// 跳转页面resp.sendRedirect(req.getContextPath()+"/index.jsp");}else{
// 提示信息req.setAttribute("login_msg","用户名或密码错误!!!");
// 转跳登录页面req.getRequestDispatcher("/login.jsp").forward(req,resp);}}
}
5 添加功能
list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head><!-- 指定字符集 --><meta charset="utf-8"><!-- 使用Edge最新的浏览器的渲染方式 --><meta http-equiv="X-UA-Compatible" content="IE=edge"><!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。width: 默认宽度与设备的宽度相同initial-scale: 初始的缩放比,为1:1 --><meta name="viewport" content="width=device-width, initial-scale=1"><!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><title>用户信息管理系统</title><!-- 1. 导入CSS的全局样式 --><link href="css/bootstrap.min.css" rel="stylesheet"><!-- 2. jQuery导入,建议使用1.9以上的版本 --><script src="js/jquery-2.1.0.min.js"></script><!-- 3. 导入bootstrap的js文件 --><script src="js/bootstrap.min.js"></script><style type="text/css">td, th {text-align: center;}</style>
</head>
<body>
<div class="container"><h3 style="text-align: center">用户信息列表</h3><div style="float:left;"><form class="form-inline"><div class="form-group"><label for="exampleInputName2">姓名</label><input type="text" class="form-control" id="exampleInputName2"></div><div class="form-group"><label for="exampleInputEmail2">籍贯</label><input type="email" class="form-control" id="exampleInputEmail2" ></div><div class="form-group"><label for="exampleInputEmail2">E-mail</label><input type="email" class="form-control" id="exampleInputEmail2" ></div><button type="submit" class="btn btn-default">查询</button></form></div><div style="float: right;margin: 5px;"><a class="btn btn-primary" href="${pageContext.request.contextPath}/add.jsp">添加联系人</a><a class="btn btn-primary" href="add.html">删除选中</a></div><table border="1" class="table table-bordered table-hover"><tr class="success"><th><input type="checkbox"></th><th>编号</th><th>姓名</th><th>性别</th><th>年龄</th><th>籍贯</th><th>QQ</th><th>邮箱</th><th>操作</th></tr><c:forEach var="user" varStatus="s" items="${users}"><tr><td><input type="checkbox"></td><td>${s.count}</td><td>${user.name}</td><td>${user.gender}</td><td>${user.age}</td><td>${user.address}</td><td>${user.qq}</td><td>${user.email}</td><td><a class="btn btn-default btn-sm" href="update.html">修改</a> <a class="btn btn-default btn-sm" href="">删除</a></td></tr></c:forEach></table><div><nav aria-label="Page navigation"><ul class="pagination"><li><a href="#" aria-label="Previous"><span aria-hidden="true">«</span></a></li><li><a href="#">1</a></li><li><a href="#">2</a></li><li><a href="#">3</a></li><li><a href="#">4</a></li><li><a href="#">5</a></li><li><a href="#" aria-label="Next"><span aria-hidden="true">»</span></a></li><span style="font-size: 25px;margin-left: 20px">共16条记录,共4页</span></ul></nav></div>
</div>
</body>
</html>
add.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><!-- HTML5文档-->
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head><!-- 指定字符集 --><meta charset="utf-8"><!-- 使用Edge最新的浏览器的渲染方式 --><meta http-equiv="X-UA-Compatible" content="IE=edge"><!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。width: 默认宽度与设备的宽度相同initial-scale: 初始的缩放比,为1:1 --><meta name="viewport" content="width=device-width, initial-scale=1"><!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><title>添加用户</title><!-- 1. 导入CSS的全局样式 --><link href="css/bootstrap.min.css" rel="stylesheet"><!-- 2. jQuery导入,建议使用1.9以上的版本 --><script src="js/jquery-2.1.0.min.js"></script><!-- 3. 导入bootstrap的js文件 --><script src="js/bootstrap.min.js"></script>
</head>
<body>
<div class="container"><center><h3>添加联系人页面</h3></center><form action="${pageContext.request.contextPath}/addUserServlet" method="post"><div class="form-group"><label for="name">姓名:</label><input type="text" class="form-control" id="name" name="name" placeholder="请输入姓名"></div><div class="form-group"><label>性别:</label><input type="radio" name="gender" value="男" checked="checked"/>男<input type="radio" name="gender" value="女"/>女</div><div class="form-group"><label for="age">年龄:</label><input type="text" class="form-control" id="age" name="age" placeholder="请输入年龄"></div><div class="form-group"><label for="address">籍贯:</label><select name="address" class="form-control" id="address"><option value="陕西">陕西</option><option value="北京">北京</option><option value="上海">上海</option></select></div><div class="form-group"><label for="qq">QQ:</label><input type="text" class="form-control" id="qq" name="qq" placeholder="请输入QQ号码"/></div><div class="form-group"><label for="email">Email:</label><input type="text" class="form-control" id="email" name="email" placeholder="请输入邮箱地址"/></div><div class="form-group" style="text-align: center"><input class="btn btn-primary" type="submit" value="提交" /><input class="btn btn-default" type="reset" value="重置" /><input class="btn btn-default" type="button" value="返回" /></div></form>
</div>
</body>
</html>
UserDao
package cn.gtt.dao;import cn.gtt.pojo.User;import java.util.List;/*** 用户操作的dao*/
public interface UserDao {/*** 查询所有用户信息*/public List<User> findAll();/*** 登录* @param username* @param password* @return*/User findUserByUsernamePassword(String username,String password);/*** 添加* @param user*/public void addUser(User user);
}
UserDaoImpl
package cn.gtt.dao.Impl;import cn.gtt.dao.UserDao;
import cn.gtt.pojo.User;
import cn.gtt.util.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;import java.util.List;public class UserDaoImpl implements UserDao {private JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());/*** 查询所有用户信息*/@Overridepublic List<User> findAll() {
// 使用JDBC操作数据库String sql="select * from user";List<User> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));return users;}/*** 登录* @param username* @param password* @return*/@Overridepublic User findUserByUsernamePassword(String username, String password) {try {String sql="select * from user where username=? and password=?";User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username, password);return user;}catch (Exception e){e.printStackTrace();return null;}}/*** 添加* @param user*/@Overridepublic void addUser(User user) {String sql="insert into user values(null,?,?,?,?,?,?,null,null)";jdbcTemplate.update(sql,user.getName(),user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail());}}
UserService
package cn.gtt.service;import cn.gtt.pojo.User;import java.util.List;/*** 用户管理的业务接口*/
public interface UserService {/*** 查询所有用户信息* @return*/public List<User> findAll();/*** 登录* @param user* @return*/User login(User user);/*** 添加* @param user*/void addUser(User user);
}
UserServiceImpl
package cn.gtt.service.Impl;import cn.gtt.dao.Impl.UserDaoImpl;
import cn.gtt.dao.UserDao;
import cn.gtt.pojo.User;
import cn.gtt.service.UserService;import java.util.List;public class UserServiceImpl implements UserService {UserDao userDao=new UserDaoImpl() ;/*** 查询所有用户信息*/@Overridepublic List<User> findAll() {
// 调用userDao完成return userDao.findAll();}/*** 登录* @param user* @return*/@Overridepublic User login(User user) {return userDao.findUserByUsernamePassword(user.getUsername(),user.getPassword());}/*** 添加* @param user*/@Overridepublic void addUser(User user) {userDao.addUser(user);}
}
AddUserServlet
package cn.gtt.web.servlet;import cn.gtt.pojo.User;
import cn.gtt.service.Impl.UserServiceImpl;
import cn.gtt.service.UserService;
import org.apache.commons.beanutils.BeanUtils;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.lang.reflect.InvocationTargetException;
import java.util.Map;@WebServlet("/addUserServlet")
public class AddUserServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.设置编码格式req.setCharacterEncoding("utf-8");// 获取参数Map<String, String[]> parameterMap = req.getParameterMap();// 封装对象User user=new User();try {BeanUtils.populate(user,parameterMap);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}// 调用service保存UserService userService=new UserServiceImpl();userService.addUser(user);// 转跳到userListServletresp.sendRedirect(req.getContextPath()+"/userListServlet");}
}
6 删除
list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head><!-- 指定字符集 --><meta charset="utf-8"><!-- 使用Edge最新的浏览器的渲染方式 --><meta http-equiv="X-UA-Compatible" content="IE=edge"><!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。width: 默认宽度与设备的宽度相同initial-scale: 初始的缩放比,为1:1 --><meta name="viewport" content="width=device-width, initial-scale=1"><!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><title>用户信息管理系统</title><!-- 1. 导入CSS的全局样式 --><link href="css/bootstrap.min.css" rel="stylesheet"><!-- 2. jQuery导入,建议使用1.9以上的版本 --><script src="js/jquery-2.1.0.min.js"></script><!-- 3. 导入bootstrap的js文件 --><script src="js/bootstrap.min.js"></script><style type="text/css">td, th {text-align: center;}</style><script>function deleteUser(id){// 用户安全显示if(confirm("您确定要删除么?")){// 访问路径location.href=" ${pageContext.request.contextPath}/delUserServlet?id="+id;}}</script>
</head>
<body>
<div class="container"><h3 style="text-align: center">用户信息列表</h3><div style="float:left;"><form class="form-inline"><div class="form-group"><label for="exampleInputName2">姓名</label><input type="text" class="form-control" id="exampleInputName2"></div><div class="form-group"><label for="exampleInputEmail2">籍贯</label><input type="email" class="form-control" id="exampleInputEmail2" ></div><div class="form-group"><label for="exampleInputEmail2">E-mail</label><input type="email" class="form-control" id="exampleInputEmail2" ></div><button type="submit" class="btn btn-default">查询</button></form></div><div style="float: right;margin: 5px;"><a class="btn btn-primary" href="${pageContext.request.contextPath}/add.jsp">添加联系人</a><a class="btn btn-primary" href="">删除选中</a></div><table border="1" class="table table-bordered table-hover"><tr class="success"><th><input type="checkbox"></th><th>编号</th><th>姓名</th><th>性别</th><th>年龄</th><th>籍贯</th><th>QQ</th><th>邮箱</th><th>操作</th></tr><c:forEach var="user" varStatus="s" items="${users}"><tr><td><input type="checkbox"></td><td>${s.count}</td><td>${user.name}</td><td>${user.gender}</td><td>${user.age}</td><td>${user.address}</td><td>${user.qq}</td><td>${user.email}</td><td><a class="btn btn-default btn-sm" href="update.html">修改</a> <a class="btn btn-default btn-sm" href="javascript:deleteUser(${user.id});">删除</a></td></tr></c:forEach></table><div><nav aria-label="Page navigation"><ul class="pagination"><li><a href="#" aria-label="Previous"><span aria-hidden="true">«</span></a></li><li><a href="#">1</a></li><li><a href="#">2</a></li><li><a href="#">3</a></li><li><a href="#">4</a></li><li><a href="#">5</a></li><li><a href="#" aria-label="Next"><span aria-hidden="true">»</span></a></li><span style="font-size: 25px;margin-left: 20px">共16条记录,共4页</span></ul></nav></div>
</div>
</body>
</html>
UserDao
package cn.gtt.dao;import cn.gtt.pojo.User;import java.util.List;/*** 用户操作的dao*/
public interface UserDao {/*** 查询所有用户信息*/public List<User> findAll();/*** 登录* @param username* @param password* @return*/User findUserByUsernamePassword(String username,String password);/*** 添加* @param user*/public void addUser(User user);/*** 删除* @param id*/public void deleteUser(int id);
}
UserDaoImpl
package cn.gtt.dao.Impl;import cn.gtt.dao.UserDao;
import cn.gtt.pojo.User;
import cn.gtt.util.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;import java.util.List;public class UserDaoImpl implements UserDao {private JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());/*** 查询所有用户信息*/@Overridepublic List<User> findAll() {
// 使用JDBC操作数据库String sql="select * from user";List<User> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));return users;}/*** 登录* @param username* @param password* @return*/@Overridepublic User findUserByUsernamePassword(String username, String password) {try {String sql="select * from user where username=? and password=?";User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username, password);return user;}catch (Exception e){e.printStackTrace();return null;}}/*** 添加* @param user*/@Overridepublic void addUser(User user) {String sql="insert into user values(null,?,?,?,?,?,?,null,null)";jdbcTemplate.update(sql,user.getName(),user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail());}/*** 删除*/@Overridepublic void deleteUser(int id) {String sql="delete from user where id=?";jdbcTemplate.update(sql,id);}}
UserService
package cn.gtt.service;import cn.gtt.pojo.User;import java.util.List;/*** 用户管理的业务接口*/
public interface UserService {/*** 查询所有用户信息* @return*/public List<User> findAll();/*** 登录* @param user* @return*/User login(User user);/*** 添加* @param user*/void addUser(User user);/*** 删除*/void deleteUser(String id);
}
UserServiceImpl
package cn.gtt.service.Impl;import cn.gtt.dao.Impl.UserDaoImpl;
import cn.gtt.dao.UserDao;
import cn.gtt.pojo.User;
import cn.gtt.service.UserService;import java.util.List;public class UserServiceImpl implements UserService {UserDao userDao=new UserDaoImpl() ;/*** 查询所有用户信息*/@Overridepublic List<User> findAll() {
// 调用userDao完成return userDao.findAll();}/*** 登录* @param user* @return*/@Overridepublic User login(User user) {return userDao.findUserByUsernamePassword(user.getUsername(),user.getPassword());}/*** 添加* @param user*/@Overridepublic void addUser(User user) {userDao.addUser(user);}@Overridepublic void deleteUser(String id) {userDao.deleteUser(Integer.parseInt(id));}
}
DelUserServlet
package cn.gtt.web.servlet;import cn.gtt.service.Impl.UserServiceImpl;
import cn.gtt.service.UserService;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;@WebServlet("/delUserServlet")
public class DelUserServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取idString id = req.getParameter("id");
// 调用service层删除UserService userService=new UserServiceImpl();userService.deleteUser(id);
// 转跳到查询所有servletresp.sendRedirect(req.getContextPath()+"/userListServlet");}
}
7 修改
list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head><!-- 指定字符集 --><meta charset="utf-8"><!-- 使用Edge最新的浏览器的渲染方式 --><meta http-equiv="X-UA-Compatible" content="IE=edge"><!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。width: 默认宽度与设备的宽度相同initial-scale: 初始的缩放比,为1:1 --><meta name="viewport" content="width=device-width, initial-scale=1"><!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><title>用户信息管理系统</title><!-- 1. 导入CSS的全局样式 --><link href="css/bootstrap.min.css" rel="stylesheet"><!-- 2. jQuery导入,建议使用1.9以上的版本 --><script src="js/jquery-2.1.0.min.js"></script><!-- 3. 导入bootstrap的js文件 --><script src="js/bootstrap.min.js"></script><style type="text/css">td, th {text-align: center;}</style><script>function deleteUser(id){// 用户安全显示if(confirm("您确定要删除么?")){// 访问路径location.href=" ${pageContext.request.contextPath}/delUserServlet?id="+id;}}</script>
</head>
<body>
<div class="container"><h3 style="text-align: center">用户信息列表</h3><div style="float:left;"><form class="form-inline"><div class="form-group"><label for="exampleInputName2">姓名</label><input type="text" class="form-control" id="exampleInputName2"></div><div class="form-group"><label for="exampleInputEmail2">籍贯</label><input type="email" class="form-control" id="exampleInputEmail2" ></div><div class="form-group"><label for="exampleInputEmail2">E-mail</label><input type="email" class="form-control" id="exampleInputEmail2" ></div><button type="submit" class="btn btn-default">查询</button></form></div><div style="float: right;margin: 5px;"><a class="btn btn-primary" href="${pageContext.request.contextPath}/add.jsp">添加联系人</a><a class="btn btn-primary" href="">删除选中</a></div><table border="1" class="table table-bordered table-hover"><tr class="success"><th><input type="checkbox"></th><th>编号</th><th>姓名</th><th>性别</th><th>年龄</th><th>籍贯</th><th>QQ</th><th>邮箱</th><th>操作</th></tr><c:forEach var="user" varStatus="s" items="${users}"><tr><td><input type="checkbox"></td><td>${s.count}</td><td>${user.name}</td><td>${user.gender}</td><td>${user.age}</td><td>${user.address}</td><td>${user.qq}</td><td>${user.email}</td><td><a class="btn btn-default btn-sm" href="${pageContext.request.contextPath}/findUserServlet?id=${user.id}">修改</a> <a class="btn btn-default btn-sm" href="javascript:deleteUser(${user.id});">删除</a></td></tr></c:forEach></table><div><nav aria-label="Page navigation"><ul class="pagination"><li><a href="#" aria-label="Previous"><span aria-hidden="true">«</span></a></li><li><a href="#">1</a></li><li><a href="#">2</a></li><li><a href="#">3</a></li><li><a href="#">4</a></li><li><a href="#">5</a></li><li><a href="#" aria-label="Next"><span aria-hidden="true">»</span></a></li><span style="font-size: 25px;margin-left: 20px">共16条记录,共4页</span></ul></nav></div>
</div>
</body>
</html>
update.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN"><head><!-- 指定字符集 --><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>修改用户</title><link href="css/bootstrap.min.css" rel="stylesheet"><script src="js/jquery-2.1.0.min.js"></script><script src="js/bootstrap.min.js"></script></head><body><div class="container" style="width: 400px;"><h3 style="text-align: center;">修改联系人</h3><form action="${pageContext.request.contextPath}/updateUserServlet" method="post"><!-- 隐藏域 提交id--><input type="hidden" name="id" value="${user.id}"><div class="form-group"><label for="name">姓名:</label><input type="text" class="form-control" id="name" name="name" value="${user.name}" readonly="readonly" placeholder="请输入姓名" /></div><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="age">年龄:</label><input type="text" class="form-control" value="${user.age}" id="age" name="age" placeholder="请输入年龄" /></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><div class="form-group"><label for="qq">QQ:</label><input type="text" id="qq" class="form-control" value="${user.qq}" name="qq" placeholder="请输入QQ号码"/></div><div class="form-group"><label for="email">Email:</label><input type="text" id="email" class="form-control" value="${user.email}" name="email" placeholder="请输入邮箱地址"/></div><div class="form-group" style="text-align: center"><input class="btn btn-primary" type="submit" value="提交" /><input class="btn btn-default" type="reset" value="重置" /><input class="btn btn-default" type="button" value="返回"/></div></form></div></body>
</html>
UserDao
package cn.gtt.dao;import cn.gtt.pojo.User;import java.util.List;/*** 用户操作的dao*/
public interface UserDao {/*** 查询所有用户信息*/public List<User> findAll();/*** 登录* @param username* @param password* @return*/User findUserByUsernamePassword(String username,String password);/*** 添加* @param user*/public void addUser(User user);/*** 删除* @param id*/public void deleteUser(int id);/*** 修改*/User findUserById(int id);public void updateUser(User user);
}
UserDaoImpl
package cn.gtt.dao.Impl;import cn.gtt.dao.UserDao;
import cn.gtt.pojo.User;
import cn.gtt.util.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;import java.util.List;public class UserDaoImpl implements UserDao {private JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());/*** 查询所有用户信息*/@Overridepublic List<User> findAll() {
// 使用JDBC操作数据库String sql="select * from user";List<User> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));return users;}/*** 登录* @param username* @param password* @return*/@Overridepublic User findUserByUsernamePassword(String username, String password) {try {String sql="select * from user where username=? and password=?";User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username, password);return user;}catch (Exception e){e.printStackTrace();return null;}}/*** 添加* @param user*/@Overridepublic void addUser(User user) {String sql="insert into user values(null,?,?,?,?,?,?,null,null)";jdbcTemplate.update(sql,user.getName(),user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail());}/*** 删除*/@Overridepublic void deleteUser(int id) {String sql="delete from user where id=?";jdbcTemplate.update(sql,id);}/*** 修改* @param id*/@Overridepublic User findUserById(int id) {String sql="select * from user where id=?";User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), id);return user;}@Overridepublic void updateUser(User user) {String sql="update user set name=?,gender=?,age=?,address=?,qq=?,email=? where id=?";jdbcTemplate.update(sql, user.getName(), user.getGender(), user.getAge(), user.getAddress(), user.getQq(), user.getEmail(), user.getId());}}
UserService
package cn.gtt.service;import cn.gtt.pojo.User;import java.util.List;/*** 用户管理的业务接口*/
public interface UserService {/*** 查询所有用户信息* @return*/public List<User> findAll();/*** 登录* @param user* @return*/User login(User user);/*** 添加* @param user*/void addUser(User user);/*** 删除*/void deleteUser(String id);/*** 修改*/User findUserById(String id);public void updateUser(User user);}
UserServiceImpl
package cn.gtt.service.Impl;import cn.gtt.dao.Impl.UserDaoImpl;
import cn.gtt.dao.UserDao;
import cn.gtt.pojo.User;
import cn.gtt.service.UserService;import java.util.List;public class UserServiceImpl implements UserService {UserDao userDao=new UserDaoImpl() ;/*** 查询所有用户信息*/@Overridepublic List<User> findAll() {
// 调用userDao完成return userDao.findAll();}/*** 登录* @param user* @return*/@Overridepublic User login(User user) {return userDao.findUserByUsernamePassword(user.getUsername(),user.getPassword());}/*** 添加* @param user*/@Overridepublic void addUser(User user) {userDao.addUser(user);}/*** 删除* @param id*/@Overridepublic void deleteUser(String id) {userDao.deleteUser(Integer.parseInt(id));}/*** 修改* @param id*/@Overridepublic User findUserById(String id) {return userDao.findUserById(Integer.parseInt(id));}@Overridepublic void updateUser(User user) {userDao.updateUser(user);}
}
FindUserServlet
package cn.gtt.web.servlet;import cn.gtt.pojo.User;
import cn.gtt.service.Impl.UserServiceImpl;
import cn.gtt.service.UserService;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;@WebServlet("/findUserServlet")
public class FindUserServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");// 获取idString id = req.getParameter("id");
// 调用service查询UserService userService=new UserServiceImpl();User user=userService.findUserById(id);// 将user存入requestreq.setAttribute("user",user);req.getRequestDispatcher("/update.jsp").forward(req,resp);}
}
UpdateUserServlet
package cn.gtt.web.servlet;import cn.gtt.pojo.User;
import cn.gtt.service.Impl.UserServiceImpl;
import cn.gtt.service.UserService;
import org.apache.commons.beanutils.BeanUtils;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.lang.reflect.InvocationTargetException;
import java.util.Map;@WebServlet("/updateUserServlet")
public class UpdateUserServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");
// 获取mapMap<String, String[]> parameterMap = req.getParameterMap();
// 封装对象User user=new User();try {BeanUtils.populate(user,parameterMap);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}
// 调用service保存UserService userService=new UserServiceImpl();userService.updateUser(user);// 转跳到userListServletresp.sendRedirect(req.getContextPath()+"/userListServlet");}
}
8 删除选中功能
list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head><!-- 指定字符集 --><meta charset="utf-8"><!-- 使用Edge最新的浏览器的渲染方式 --><meta http-equiv="X-UA-Compatible" content="IE=edge"><!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。width: 默认宽度与设备的宽度相同initial-scale: 初始的缩放比,为1:1 --><meta name="viewport" content="width=device-width, initial-scale=1"><!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><title>用户信息管理系统</title><!-- 1. 导入CSS的全局样式 --><link href="css/bootstrap.min.css" rel="stylesheet"><!-- 2. jQuery导入,建议使用1.9以上的版本 --><script src="js/jquery-2.1.0.min.js"></script><!-- 3. 导入bootstrap的js文件 --><script src="js/bootstrap.min.js"></script><style type="text/css">td, th {text-align: center;}</style><script>function deleteUser(id){// 用户安全显示if(confirm("您确定要删除么?")){// 访问路径location.href=" ${pageContext.request.contextPath}/delUserServlet?id="+id;}}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();}}}//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>
</head>
<body>
<div class="container"><h3 style="text-align: center">用户信息列表</h3><div style="float:left;"><form class="form-inline"><div class="form-group"><label for="exampleInputName2">姓名</label><input type="text" class="form-control" id="exampleInputName2"></div><div class="form-group"><label for="exampleInputEmail3">籍贯</label><input type="email" class="form-control" id="exampleInputEmail3" ></div><div class="form-group"><label for="exampleInputEmail4">E-mail</label><input type="email" class="form-control" id="exampleInputEmail4" ></div><button type="submit" class="btn btn-default">查询</button></form></div><div style="float: right;margin: 5px;"><a class="btn btn-primary" href="${pageContext.request.contextPath}/add.jsp">添加联系人</a><a class="btn btn-primary" href="javascript:void(0);" id="delSelected">删除选中</a></div><form action="${pageContext.request.contextPath}/delSelectedServlet" method="post" id="form"><table border="1" class="table table-bordered table-hover"><tr class="success"><th><input type="checkbox" id="firstCb"></th><th>编号</th><th>姓名</th><th>性别</th><th>年龄</th><th>籍贯</th><th>QQ</th><th>邮箱</th><th>操作</th></tr><c:forEach var="user" varStatus="s" items="${users}"><tr><td><input type="checkbox" name="uid" value="${user.id}"></td><td>${s.count}</td><td>${user.name}</td><td>${user.gender}</td><td>${user.age}</td><td>${user.address}</td><td>${user.qq}</td><td>${user.email}</td><td><a class="btn btn-default btn-sm" href="${pageContext.request.contextPath}/findUserServlet?id=${user.id}">修改</a> <a class="btn btn-default btn-sm" href="javascript:deleteUser(${user.id});">删除</a></td></tr></c:forEach></table></form><div><nav aria-label="Page navigation"><ul class="pagination"><li><a href="#" aria-label="Previous"><span aria-hidden="true">«</span></a></li><li><a href="#">1</a></li><li><a href="#">2</a></li><li><a href="#">3</a></li><li><a href="#">4</a></li><li><a href="#">5</a></li><li><a href="#" aria-label="Next"><span aria-hidden="true">»</span></a></li><span style="font-size: 25px;margin-left: 20px">共16条记录,共4页</span></ul></nav></div>
</div>
</body>
</html>
UserService
package cn.gtt.service;import cn.gtt.pojo.User;import java.util.List;/*** 用户管理的业务接口*/
public interface UserService {/*** 查询所有用户信息* @return*/public List<User> findAll();/*** 登录* @param user* @return*/User login(User user);/*** 添加* @param user*/void addUser(User user);/*** 删除*/void deleteUser(String id);/*** 修改*/User findUserById(String id);public void updateUser(User user);/*** 删除选中*/void delSelecteUser(String[] ids);}
UserServiceImpl
package cn.gtt.service.Impl;import cn.gtt.dao.Impl.UserDaoImpl;
import cn.gtt.dao.UserDao;
import cn.gtt.pojo.User;
import cn.gtt.service.UserService;import java.util.List;public class UserServiceImpl implements UserService {UserDao userDao=new UserDaoImpl() ;/*** 查询所有用户信息*/@Overridepublic List<User> findAll() {
// 调用userDao完成return userDao.findAll();}/*** 登录* @param user* @return*/@Overridepublic User login(User user) {return userDao.findUserByUsernamePassword(user.getUsername(),user.getPassword());}/*** 添加* @param user*/@Overridepublic void addUser(User user) {userDao.addUser(user);}/*** 删除* @param id*/@Overridepublic void deleteUser(String id) {userDao.deleteUser(Integer.parseInt(id));}/*** 修改* @param id*/@Overridepublic User findUserById(String id) {return userDao.findUserById(Integer.parseInt(id));}@Overridepublic void updateUser(User user) {userDao.updateUser(user);}/*** 删除选中* @param ids*/@Overridepublic void delSelecteUser(String[] ids) {if(ids != null && ids.length > 0){//1.遍历数组for (String id : ids) {//2.调用dao删除userDao.deleteUser(Integer.parseInt(id));}}}}
DelSelectedServlet
package cn.gtt.web.servlet;import cn.gtt.service.Impl.UserServiceImpl;
import cn.gtt.service.UserService;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;@WebServlet("/delSelectedServlet")
public class DelSelectedServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取所有的idString[] uids = req.getParameterValues("uid");
// 调用service删除UserService userService=new UserServiceImpl();userService.delSelecteUser(uids);resp.sendRedirect(req.getContextPath()+"/userListServlet");}
}
9 分页
- 减轻服务器内存的开销
- 提升用户体验
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>首页</title><!-- 1. 导入CSS的全局样式 --><link href="css/bootstrap.min.css" rel="stylesheet"><!-- 2. jQuery导入,建议使用1.9以上的版本 --><script src="js/jquery-2.1.0.min.js"></script><!-- 3. 导入bootstrap的js文件 --><script src="js/bootstrap.min.js"></script><script type="text/javascript"></script>
</head>
<body><div >${user.name},欢迎您</div><div align="center"><ahref="${pageContext.request.contextPath}/findUserByPageServlet" style="text-decoration:none;font-size:33px">查询所有用户信息</a></div></body>
</html>
list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head><!-- 指定字符集 --><meta charset="utf-8"><!-- 使用Edge最新的浏览器的渲染方式 --><meta http-equiv="X-UA-Compatible" content="IE=edge"><!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。width: 默认宽度与设备的宽度相同initial-scale: 初始的缩放比,为1:1 --><meta name="viewport" content="width=device-width, initial-scale=1"><!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><title>用户信息管理系统</title><!-- 1. 导入CSS的全局样式 --><link href="css/bootstrap.min.css" rel="stylesheet"><!-- 2. jQuery导入,建议使用1.9以上的版本 --><script src="js/jquery-2.1.0.min.js"></script><!-- 3. 导入bootstrap的js文件 --><script src="js/bootstrap.min.js"></script><style type="text/css">td, th {text-align: center;}</style><script>function deleteUser(id){// 用户安全显示if(confirm("您确定要删除么?")){// 访问路径location.href=" ${pageContext.request.contextPath}/delUserServlet?id="+id;}}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();}}}//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>
</head>
<body>
<div class="container"><h3 style="text-align: center">用户信息列表</h3><div style="float:left;" ><form class="form-inline"><div class="form-group"><label for="exampleInputName2">姓名</label><input type="text" class="form-control" id="exampleInputName2"></div><div class="form-group"><label for="exampleInputEmail3">籍贯</label><input type="email" class="form-control" id="exampleInputEmail3" ></div><div class="form-group"><label for="exampleInputEmail4">E-mail</label><input type="email" class="form-control" id="exampleInputEmail4" ></div><button type="submit" class="btn btn-default">查询</button></form></div><div style="float: right;margin: 5px;"><a class="btn btn-primary" href="${pageContext.request.contextPath}/add.jsp">添加联系人</a><a class="btn btn-primary" href="javascript:void(0);" id="delSelected">删除选中</a></div><form action="${pageContext.request.contextPath}/delSelectedServlet" method="post" id="form"><table border="1" class="table table-bordered table-hover"><tr class="success"><th><input type="checkbox" id="firstCb"></th><th>编号</th><th>姓名</th><th>性别</th><th>年龄</th><th>籍贯</th><th>QQ</th><th>邮箱</th><th>操作</th></tr><c:forEach items="${pb.list}" var="user" varStatus="s" ><tr><td><input type="checkbox" name="uid" value="${user.id}"></td><td>${s.count}</td><td>${user.name}</td><td>${user.gender}</td><td>${user.age}</td><td>${user.address}</td><td>${user.qq}</td><td>${user.email}</td><td><a class="btn btn-default btn-sm" href="${pageContext.request.contextPath}/findUserServlet?id=${user.id}">修改</a> <a class="btn btn-default btn-sm" href="javascript:deleteUser(${user.id});">删除</a></td></tr></c:forEach></table></form><div><nav aria-label="Page navigation"><ul class="pagination"><c:if test="${pb.currentPage==1}"><li class="disabled"></c:if><c:if test="${pb.currentPage!=1}"><li ></c:if><li><a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${pb.currentPage-1}&rows=5" aria-label="Previous"><span aria-hidden="true">«</span></a></li><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">${i}</a></li></c:if><c:if test="${pb.currentPage!=i}"><li><a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${i}&rows=5">${i}</a></li></c:if></c:forEach><li><a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${pb.currentPage+1}&rows=5" aria-label="Next"><span aria-hidden="true">»</span></a></li><span style="font-size: 25px;margin-left: 20px">共${pb.totalCount}条记录,共${pb.totalPage}页</span></ul></nav></div>
</div>
</body>
</html>
UserDao
package cn.gtt.dao;import cn.gtt.pojo.User;import java.util.List;/*** 用户操作的dao*/
public interface UserDao {/*** 查询所有用户信息*/public List<User> findAll();/*** 登录* @param username* @param password* @return*/User findUserByUsernamePassword(String username,String password);/*** 添加* @param user*/public void addUser(User user);/*** 删除* @param id*/void deleteUser(int id);/*** 修改*/User findUserById(int id);public void updateUser(User user);/*** 分页*//*** 查询总记录数* @return*/int findTotalCount();/*** 分页查询每页记录* @param start* @param rows* @return*/List<User> findByPage(int start,int rows);}
UserDaoImpl
package cn.gtt.dao.Impl;import cn.gtt.dao.UserDao;
import cn.gtt.pojo.User;
import cn.gtt.util.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;import java.util.List;public class UserDaoImpl implements UserDao {private JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());/*** 查询所有用户信息*/@Overridepublic List<User> findAll() {
// 使用JDBC操作数据库String sql="select * from user";List<User> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));return users;}/*** 登录* @param username* @param password* @return*/@Overridepublic User findUserByUsernamePassword(String username, String password) {try {String sql="select * from user where username=? and password=?";User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username, password);return user;}catch (Exception e){e.printStackTrace();return null;}}/*** 添加* @param user*/@Overridepublic void addUser(User user) {String sql="insert into user values(null,?,?,?,?,?,?,null,null)";jdbcTemplate.update(sql,user.getName(),user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail());}/*** 删除*/@Overridepublic void deleteUser(int id) {String sql="delete from user where id=?";jdbcTemplate.update(sql,id);}/*** 修改* @param id*/@Overridepublic User findUserById(int id) {String sql="select * from user where id=?";User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), id);return user;}@Overridepublic void updateUser(User user) {String sql="update user set name=?,gender=?,age=?,address=?,qq=?,email=? where id=?";jdbcTemplate.update(sql, user.getName(), user.getGender(), user.getAge(), user.getAddress(), user.getQq(), user.getEmail(), user.getId());}/*** 分页*//*** 查询总记录数* @return*/@Overridepublic int findTotalCount() {String sql="select count(*) from user";return jdbcTemplate.queryForObject(sql,Integer.class);}/*** 分页查询每页记录* @param start* @param rows* @return*/@Overridepublic List<User> findByPage(int start, int rows) {String sql="select * from user limit ?,?";return jdbcTemplate.query(sql,new BeanPropertyRowMapper<User>(User.class),start,rows);}}
UserService
package cn.gtt.service;import cn.gtt.pojo.Page;
import cn.gtt.pojo.User;import java.util.List;/*** 用户管理的业务接口*/
public interface UserService {/*** 查询所有用户信息* @return*/public List<User> findAll();/*** 登录* @param user* @return*/User login(User user);/*** 添加* @param user*/void addUser(User user);/*** 删除*/void deleteUser(String id);/*** 修改*/User findUserById(String id);public void updateUser(User user);/*** 删除选中*/void delSelecteUser(String[] ids);/*** 分页查询*/Page<User> findUserByPage(String currentPage, String rows);}
UserServiceImpl
package cn.gtt.service.Impl;import cn.gtt.dao.Impl.UserDaoImpl;
import cn.gtt.dao.UserDao;
import cn.gtt.pojo.Page;
import cn.gtt.pojo.User;
import cn.gtt.service.UserService;import java.util.List;public class UserServiceImpl implements UserService {UserDao userDao=new UserDaoImpl() ;/*** 查询所有用户信息*/@Overridepublic List<User> findAll() {
// 调用userDao完成return userDao.findAll();}/*** 登录* @param user* @return*/@Overridepublic User login(User user) {return userDao.findUserByUsernamePassword(user.getUsername(),user.getPassword());}/*** 添加* @param user*/@Overridepublic void addUser(User user) {userDao.addUser(user);}/*** 删除* @param id*/@Overridepublic void deleteUser(String id) {userDao.deleteUser(Integer.parseInt(id));}/*** 修改* @param id*/@Overridepublic User findUserById(String id) {return userDao.findUserById(Integer.parseInt(id));}@Overridepublic void updateUser(User user) {userDao.updateUser(user);}/*** 删除选中* @param ids*/@Overridepublic void delSelecteUser(String[] ids) {if(ids != null && ids.length > 0){//1.遍历数组for (String id : ids) {//2.调用dao删除userDao.deleteUser(Integer.parseInt(id));}}}/*** 分页查询* @return*/@Overridepublic Page<User> findUserByPage(String _currentPage, String _rows) {int currentPage=Integer.parseInt(_currentPage);int rows=Integer.parseInt(_rows);if (currentPage<=0){currentPage=1;}// 创建空的page对象Page<User> pb = new Page<User>();
// 设置参数pb.setCurrentPage(currentPage);pb.setRows(rows);
// 调用dao查询总记录数int totalCount=userDao.findTotalCount();pb.setTotalCount(totalCount);
// 调用dao查询list集合
// 计算开始的记录int start=(currentPage-1)*rows;List<User> list=userDao.findByPage(start,rows);pb.setList(list);
// 计算总页码int totalPage=totalCount%rows==0?totalCount/rows:(totalCount/rows+1);pb.setTotalPage(totalPage);
// http://localhost:8080/findUserByPageServlet?currentPage=1&rows=5System.out.println(pb);return pb;}}
FindUserByPageServlet
package cn.gtt.web.servlet;import cn.gtt.pojo.Page;
import cn.gtt.pojo.User;
import cn.gtt.service.Impl.UserServiceImpl;
import cn.gtt.service.UserService;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;@WebServlet("/findUserByPageServlet")
public class FindUserByPageServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取参数
// 当前页码String currentPage = req.getParameter("currentPage");
// 每页显示的记录数String rows = req.getParameter("rows");if(currentPage==null||"".equals(currentPage)){currentPage="1";}if(rows==null||"".equals(rows)){rows="5";}// 调用service查询UserService userService=new UserServiceImpl();Page<User> pb=userService.findUserByPage(currentPage,rows);// 将Page存入requestreq.setAttribute("pb",pb);// 转发到list.jspreq.getRequestDispatcher("/list.jsp").forward(req,resp);}
}
10 复杂查询
list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head><!-- 指定字符集 --><meta charset="utf-8"><!-- 使用Edge最新的浏览器的渲染方式 --><meta http-equiv="X-UA-Compatible" content="IE=edge"><!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。width: 默认宽度与设备的宽度相同initial-scale: 初始的缩放比,为1:1 --><meta name="viewport" content="width=device-width, initial-scale=1"><!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><title>用户信息管理系统</title><!-- 1. 导入CSS的全局样式 --><link href="css/bootstrap.min.css" rel="stylesheet"><!-- 2. jQuery导入,建议使用1.9以上的版本 --><script src="js/jquery-2.1.0.min.js"></script><!-- 3. 导入bootstrap的js文件 --><script src="js/bootstrap.min.js"></script><style type="text/css">td, th {text-align: center;}</style><script>function deleteUser(id){// 用户安全显示if(confirm("您确定要删除么?")){// 访问路径location.href=" ${pageContext.request.contextPath}/delUserServlet?id="+id;}}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();}}}//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>
</head>
<body>
<div class="container"><h3 style="text-align: center">用户信息列表</h3><div style="float:left;" ><form class="form-inline" action="${pageContext.request.contextPath}/findUserByPageServlet" method="post"><div class="form-group"><label for="exampleInputName2">姓名</label><input type="text" class="form-control" id="exampleInputName2" name="name" value="${condition.name[0]}"></div><div class="form-group"><label for="exampleInputEmail3">籍贯</label><input type="text" class="form-control" id="exampleInputEmail3" name="address" value="${condition.address[0]}"></div><div class="form-group"><label for="exampleInputEmail4">E-mail</label><input type="text" class="form-control" id="exampleInputEmail4" name="email" value="${condition.email[0]}"></div><button type="submit" class="btn btn-default">查询</button></form></div><div style="float: right;margin: 5px;"><a class="btn btn-primary" href="${pageContext.request.contextPath}/add.jsp">添加联系人</a><a class="btn btn-primary" href="javascript:void(0);" id="delSelected">删除选中</a></div><form action="${pageContext.request.contextPath}/delSelectedServlet" method="post" id="form"><table border="1" class="table table-bordered table-hover"><tr class="success"><th><input type="checkbox" id="firstCb"></th><th>编号</th><th>姓名</th><th>性别</th><th>年龄</th><th>籍贯</th><th>QQ</th><th>邮箱</th><th>操作</th></tr><c:forEach items="${pb.list}" var="user" varStatus="s" ><tr><td><input type="checkbox" name="uid" value="${user.id}"></td><td>${s.count}</td><td>${user.name}</td><td>${user.gender}</td><td>${user.age}</td><td>${user.address}</td><td>${user.qq}</td><td>${user.email}</td><td><a class="btn btn-default btn-sm" href="${pageContext.request.contextPath}/findUserServlet?id=${user.id}">修改</a> <a class="btn btn-default btn-sm" href="javascript:deleteUser(${user.id});">删除</a></td></tr></c:forEach></table></form><div><nav aria-label="Page navigation"><ul class="pagination"><c:if test="${pb.currentPage==1}"><li class="disabled"></c:if><c:if test="${pb.currentPage!=1}"><li ></c:if><li><a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${pb.currentPage-1}&rows=5&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}" aria-label="Previous"><span aria-hidden="true">«</span></a></li><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><li><a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${pb.currentPage+1}&rows=5&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}" aria-label="Next"><span aria-hidden="true">»</span></a></li><span style="font-size: 25px;margin-left: 20px">共${pb.totalCount}条记录,共${pb.totalPage}页</span></ul></nav></div>
</div>
</body>
</html>
UserDao
package cn.gtt.dao;import cn.gtt.pojo.User;import java.util.List;
import java.util.Map;/*** 用户操作的dao*/
public interface UserDao {/*** 查询所有用户信息*/public List<User> findAll();/*** 登录* @param username* @param password* @return*/User findUserByUsernamePassword(String username,String password);/*** 添加* @param user*/public void addUser(User user);/*** 删除* @param id*/void deleteUser(int id);/*** 修改*/User findUserById(int id);public void updateUser(User user);/*** 分页*//*** 查询总记录数* @return* @param condition*/int findTotalCount(Map<String, String[]> condition);/*** 分页查询每页记录* @param start* @param rows* @param condition* @return*/List<User> findByPage(int start, int rows, Map<String, String[]> condition);}
UserDaoImpl
package cn.gtt.dao.Impl;import cn.gtt.dao.UserDao;
import cn.gtt.pojo.User;
import cn.gtt.util.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;public class UserDaoImpl implements UserDao {private JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());/*** 查询所有用户信息*/@Overridepublic List<User> findAll() {
// 使用JDBC操作数据库String sql="select * from user";List<User> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));return users;}/*** 登录* @param username* @param password* @return*/@Overridepublic User findUserByUsernamePassword(String username, String password) {try {String sql="select * from user where username=? and password=?";User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username, password);return user;}catch (Exception e){e.printStackTrace();return null;}}/*** 添加* @param user*/@Overridepublic void addUser(User user) {String sql="insert into user values(null,?,?,?,?,?,?,null,null)";jdbcTemplate.update(sql,user.getName(),user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail());}/*** 删除*/@Overridepublic void deleteUser(int id) {String sql="delete from user where id=?";jdbcTemplate.update(sql,id);}/*** 修改* @param id*/@Overridepublic User findUserById(int id) {String sql="select * from user where id=?";User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), id);return user;}@Overridepublic void updateUser(User user) {String sql="update user set name=?,gender=?,age=?,address=?,qq=?,email=? where id=?";jdbcTemplate.update(sql, user.getName(), user.getGender(), user.getAge(), user.getAddress(), user.getQq(), user.getEmail(), user.getId());}/*** 分页*//*** 查询总记录数* @return* @param condition*/@Overridepublic int findTotalCount(Map<String, String[]> condition) {
// 查询总记录数
// String sql="select count(*) from user";
// return jdbcTemplate.queryForObject(sql,Integer.class);// 定义模板初始化sqlString sql="select count(*) from user where 1=1";StringBuffer sb=new StringBuffer(sql);
// 遍历mapSet<String> keySet = condition.keySet();
// 定义一个参数的集合List<Object> params = new ArrayList<>();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 jdbcTemplate.queryForObject(sb.toString(),Integer.class,params.toArray());}/*** 分页查询每页记录* @param start* @param rows* @param condition* @return*/@Overridepublic List<User> findByPage(int start, int rows, Map<String, String[]> condition) {String sql="select * from user where 1=1 ";StringBuffer sb=new StringBuffer(sql);
// 遍历mapSet<String> keySet = condition.keySet();
// 定义一个参数的集合List<Object> params = new ArrayList<>();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+"%");}}// 添加分页查询sb.append("limit ?,?");params.add(start);params.add(rows);return jdbcTemplate.query(sb.toString(),new BeanPropertyRowMapper<User>(User.class),params.toArray());}}
package cn.gtt.service;import cn.gtt.pojo.Page;
import cn.gtt.pojo.User;import java.util.List;
import java.util.Map;/*** 用户管理的业务接口*/
public interface UserService {/*** 查询所有用户信息* @return*/public List<User> findAll();/*** 登录* @param user* @return*/User login(User user);/*** 添加* @param user*/void addUser(User user);/*** 删除*/void deleteUser(String id);/*** 修改*/User findUserById(String id);public void updateUser(User user);/*** 删除选中*/void delSelecteUser(String[] ids);/*** 分页条件查询** 条件condition*/Page<User> findUserByPage(String currentPage, String rows, Map<String, String[]> condition);}
UserServiceImpl
package cn.gtt.service.Impl;import cn.gtt.dao.Impl.UserDaoImpl;
import cn.gtt.dao.UserDao;
import cn.gtt.pojo.Page;
import cn.gtt.pojo.User;
import cn.gtt.service.UserService;import java.util.List;
import java.util.Map;public class UserServiceImpl implements UserService {UserDao userDao=new UserDaoImpl() ;/*** 查询所有用户信息*/@Overridepublic List<User> findAll() {
// 调用userDao完成return userDao.findAll();}/*** 登录* @param user* @return*/@Overridepublic User login(User user) {return userDao.findUserByUsernamePassword(user.getUsername(),user.getPassword());}/*** 添加* @param user*/@Overridepublic void addUser(User user) {userDao.addUser(user);}/*** 删除* @param id*/@Overridepublic void deleteUser(String id) {userDao.deleteUser(Integer.parseInt(id));}/*** 修改* @param id*/@Overridepublic User findUserById(String id) {return userDao.findUserById(Integer.parseInt(id));}@Overridepublic void updateUser(User user) {userDao.updateUser(user);}/*** 删除选中* @param ids*/@Overridepublic void delSelecteUser(String[] ids) {if(ids != null && ids.length > 0){//1.遍历数组for (String id : ids) {//2.调用dao删除userDao.deleteUser(Integer.parseInt(id));}}}/*** 分页条件查询** 条件condition*/@Overridepublic Page<User> findUserByPage(String _currentPage, String _rows, Map<String, String[]> condition) {int currentPage=Integer.parseInt(_currentPage);int rows=Integer.parseInt(_rows);if (currentPage<=0){currentPage=1;}// 创建空的page对象Page<User> pb = new Page<User>();
// 设置参数pb.setCurrentPage(currentPage);pb.setRows(rows);
// 调用dao查询总记录数int totalCount=userDao.findTotalCount(condition);pb.setTotalCount(totalCount);
// 调用dao查询list集合
// 计算开始的记录int start=(currentPage-1)*rows;List<User> list=userDao.findByPage(start,rows,condition);pb.setList(list);
// 计算总页码int totalPage=totalCount%rows==0?totalCount/rows:(totalCount/rows+1);pb.setTotalPage(totalPage);
// http://localhost:8080/findUserByPageServlet?currentPage=1&rows=5System.out.println(pb);return pb;}}
FindUserByPageServlet
package cn.gtt.web.servlet;import cn.gtt.pojo.Page;
import cn.gtt.pojo.User;
import cn.gtt.service.Impl.UserServiceImpl;
import cn.gtt.service.UserService;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.Map;@WebServlet("/findUserByPageServlet")
public class FindUserByPageServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");// 获取参数
// 当前页码String currentPage = req.getParameter("currentPage");
// 每页显示的记录数String rows = req.getParameter("rows");if(currentPage==null||"".equals(currentPage)){currentPage="1";}if(rows==null||"".equals(rows)){rows="5";}// 获取条件查询参数Map<String, String[]> condition = req.getParameterMap();// 调用service查询UserService userService=new UserServiceImpl();Page<User> pb=userService.findUserByPage(currentPage,rows,condition);// 将Page存入requestreq.setAttribute("pb",pb);
// 将查询条件存起来req.setAttribute("condition",condition);
// 转发到list.jspreq.getRequestDispatcher("/list.jsp").forward(req,resp);}
}
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 玩转5G之--网络布线2 详细解说
目录 前言: 上期回顾: 本期内容: 1.交叉线:交叉电缆 2.线缆的连接: 3.制作双绞线跳线: 4.信息插座的安装: 5.双绞线连通性测试: 6.无线传输介质: 一. 无线电波&a…...
2024/4/27 20:20:48 - 2021-07-29牛客网面试题练习总结
escape方法: 该方法返回对一个字符串编码后的结果字符串 eval方法:该方法将某个参数字符串作为一个JavaScript执行 parseFloat方法:该方法将一个字符串转换成对应的小数 isNaN方法:该方法用于检测参数是否为数值型,…...
2024/4/21 0:07:07 - Python中pip命令出现Microsoft Visual C++ 14.0 is required问题的解决方法
很多网上遇到这种问题大都是安个pycharm,jupyter notebook之类的,然后在里面配置环境,那么如何不下载而简单解决呢?当然vs的某些东西要下载是避免不了的。 首先如果在下面这个网站找相应版本python的whl文件,cp37代表为…...
2024/4/21 19:25:47 - 【Numpy】numpy.random.uniform均匀分布
numpy.random.uniform函数的用法numpy.random.uniform()函数其他随机数产生函数1、numpy.random.randint(low, highNone, sizeNone, dtypel)2、numpy.random.random_sample(sizeNone)3、numpy.random.rand(d0, d1, ..., dn)4、numpy.random.randn(d0,d1,...,dn)nump…...
2024/4/27 2:07:34 - React中styled-components的使用(样式组件库)
一、官网地址 https://www.styled-components.com/二、styled-components 1、styled-components 样式化组件,主要作用是它可以编写实际的CSS代码来设计组件样式,也不需要组件和样式之间的映射,即创建后就是一个正常的React 组件,…...
2024/4/23 11:26:24 - 【论文笔记2】Long-Short Transformer: Efficient Transformers for Language and Vision
论文原文:https://arxiv.org/abs/2107.02192 论文笔记:百度网盘提取码:nzsi 1. Summary Contributions: (1)提出了一种长短时Transformer模型:Long-Short Transformer (Transformer-LS)&#…...
2024/4/28 9:14:53 - app 测试梳理
安卓 app 内存不足时,如何获取内存 系统优先结束被挂起(暂停)的进程,释放内存 app 测试常见问题有哪些?原因有哪些 常见问题: crash ANR(应用无响应、卡死) 一…...
2024/4/20 21:44:07 - 题1 J2EE是什么
考查对J2EE(Java EE)概念上的理解 解析: J2EE (Java 2 Platform,Enterprise Edition)是Java2平台企业版。J2EE是一套全然不同于传统应用开发的技术架构,包含很多组件,可简化且规范应用系统的开发与部署࿰…...
2024/4/24 2:26:02 - srsLTE-srsGUI安装使用
srsLTE的配套图形化显示界面,可以显示星座图等 安装srsGUI git clone https://github.com/srsLTE/srsGUI cd srsGUI mkdir build cd build cmake ../ make sudo make install sudo ldconfig 重新编译srsLTE cd srsLTE cd build cmake ../ make sudo make instal…...
2024/4/26 18:40:50 - 基于Springboot的学生毕业离校系统
学生毕业离校系统的开发过程中,采用B / S架构,主要使用Java技术进行开发,结合最新流行的springboot框架。中间件服务器是Tomcat服务器,使用Mysql数据库和Eclipse开发环境。该学生毕业离校系统包括管理员、学生和教师。其主要功能包…...
2024/4/28 11:57:52 - dirb网站目录扫描工具详解
1 介绍 有勇气的牛排 — 攻防 Kali Linux提供一款基于字典的Web目录扫描工具DIRB。该工具根据用户提供的字典,对目标网站目录进行暴力猜测。它会尝试以递归方式进行爆破,以发现更多的路径。同时,该工具支持代理、HTTP认证扫描限制访问的网站…...
2024/4/25 23:17:02 - 超简单Docker的安装教程
准备工作 先准备一个CentOs 7.6,(博主这里是7.6,小伙伴可以自己选择,尽量选在7以上版本的) 1. 进入Docker官网,按步骤安装 https://docs.docker.com/engine/install/centos/ 官网里面详细的介绍了各种操…...
2024/4/20 20:52:33 - Linux CentOS / Fedora / RHEL7 下 MongoDB 副本集+分片集群 3台机器 部署搭建
一、概述 从图中可以看到有四个组件:mongos、config server、shard、replica set。 mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发…...
2024/4/10 1:56:10 - 第9章 filterlistener
目录9.1 Filter:过滤器9.1.1概念:9.1.2 步骤:注解web.xml配置9.1.3 过滤器执行流程9.1.4 过滤器生命周期方法9.1.5 过滤器配置详解9.1.6 过滤器链(配置多个过滤器)案例:登录验证9.1.7 增强对象的功能:代理模式的概念&a…...
2024/4/22 23:10:52 - Java并发编程必会的多线程你竟然还不会?深夜思考
流行框架: 框架就是开发人员定义好的一套模板,程序员只需要往模板中添加响应的代码即可,填完代码,项目就完成了。所以框架存在的意义以及我们学习框架的目的就是想办法能够让程序员快速的完成整个项目的开发。 Spring Spring框…...
2024/4/27 17:00:34 - Java中高级面试必知必会,总结到位
一面问题:MySQLRedisKafka线程算法 mysql知道哪些存储引擎,它们的区别mysql索引在什么情况下会失效mysql在项目中的优化场景,慢查询解决等mysql有什么索引,索引模型是什么B-树与B树的区别?为什么不用红黑树mysql主从同…...
2024/4/23 3:22:44 - jsp医院在线预约挂号管理系统
医院在线预约挂号管理系统,不仅为用户提供了服务,而且也推广了自己,让更多的用户了解自己。对于医院而言,若拥有自己的医院在线预约挂号管理系统,通过医院在线预约挂号管理系统让医院的宣传、营销提上一个新台阶&#…...
2024/4/19 2:16:45 - 考研政治笔记3——辩证法
一、联系与发展(世界是怎样的) 1.联系:具有客观性,普遍性,多样性,条件性。 2.发展:新事物必将取代旧事物。 二、五大范畴(联系与发展的逻辑环节) 1.内容与本质ÿ…...
2024/4/21 6:50:10 - Pytho业务相关
1. 日志 https://www.cnblogs.com/xianyulouie/p/11041777.html import logging # 引入logging模块 import os.path import time # 第一步,创建一个logger logger logging.getLogger() logger.setLevel(logging.INFO) # Log等级总开关 # 第二步,创建…...
2024/4/21 12:13:20 - Java后端社招面试经历,看这一篇就够了
2. ZooKeeper 介绍 2.1. ZooKeeper 由来 正式介绍 ZooKeeper 之前,我们先来看看 ZooKeeper 的由来,还挺有意思的。 下面这段内容摘自《从 Paxos 到 ZooKeeper 》第四章第一节,推荐大家阅读一下: ZooKeeper 最早起源于雅虎研究院…...
2024/4/28 3:55:08
最新文章
- 跨设备自动化协同提效新利器!边缘自动化流程编排工具
痛点剖析 随着企业生产环境的日益复杂化,不同生产设备间的协调性问题尤为凸显。 1、不同设备往往基于各自的技术标准、通信协议和操作系统设计,这使得它们之间的数据交换和指令传递存在显著的障碍。 2、技术上的不兼容性导致设备间难以实现无缝对接和…...
2024/4/28 15:20:23 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - MongoDB初探:安装与图形化界面保姆级使用指南
文章目录 前言一、MongoDB下载安装下载解压配置环境变量打开mongoDB 二、配置本地MongoDB服务创建文件下载服务测试服务 三、图形化界面Compass GUINavicat GUI 总结 前言 MongoDB是一种流行的开源、面向文档的NoSQL数据库程序。与传统的关系型数据库不同,MongoDB将…...
2024/4/28 13:37:23 - 【Locust分布式压力测试】
Locust分布式压力测试 https://docs.locust.io/en/stable/running-distributed.html Distributed load generation A single process running Locust can simulate a reasonably high throughput. For a simple test plan and small payloads it can make more than a thousan…...
2024/4/28 3:06:27 - javaWeb网上零食销售系统
1 绪 论 目前,我国的网民数量已经达到7.31亿人,随着互联网购物和互联网支付的普及,使得人类的经济活动进入了一个崭新的时代。淘宝,京东等网络消费平台功能的日益完善,使得人们足不出户就可以得到自己想要的东西。如今…...
2024/4/27 19:08:10 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/4/28 4:04:40 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/4/28 12:01:04 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/4/27 12:24:35 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/4/27 12:24:46 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/4/28 12:01:03 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/4/28 12:01:03 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/4/28 12:01:03 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/4/27 12:44:49 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/4/27 21:08:20 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/4/28 9:00:42 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/4/27 18:40:35 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/4/28 4:14:21 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/4/27 13:52:15 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/4/27 13:38:13 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/4/28 12:00:58 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/4/28 12:00:58 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/4/27 22:51:49 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/4/28 7:31:46 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/4/28 8:32:05 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/4/27 20:28:35 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57