700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > IDEA实现前端页面登录 注册 增 删 改 查操作-完整版

IDEA实现前端页面登录 注册 增 删 改 查操作-完整版

时间:2023-06-14 11:53:47

相关推荐

IDEA实现前端页面登录 注册 增 删 改 查操作-完整版

分层思想:entity层:存放实体类vo层:消息模型(重复使用的一些属性)mapper层:接口(写方法的)mapper.xml:MyBatis与数据库相关的一些内容controller(web)层:接收前端传回的参数调用service层,返回结果转发、响应结果(跳转页面)service层:业务逻辑判断,写方法的.utils层:工具类:写通用的方法、类。test包:测试类、测试方法(测试代码)MyBatis-config.xml:连接数据库的

pom.xml:导入相关依赖

<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.hsd</groupId><artifactId>Servlet_Maven</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><name>Servlet_Maven Maven Webapp</name><!-- FIXME change it to the project's website --><url></url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><piler.source>1.7</piler.source><piler.target>1.7</piler.target></properties><dependencies><dependency><groupId>com.fasterxml.jackson</groupId><artifactId>jackson-datatype-json-org</artifactId><version>1.8.0</version></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version></dependency><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.34</version></dependency><!-- jsp--><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><dependency><!--junit:封装类的jar包--><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies><build><!-- 将配置文件复制到编译目录中--><resources><resource><!-- 所在的目录--><directory>src/main/java</directory><includes><!--.xml和.properties结尾的文件都会扫描到--><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource></resources><finalName>Servlet_Maven</finalName><pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --><plugins><plugin><artifactId>maven-clean-plugin</artifactId><version>3.1.0</version></plugin><!-- see /ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --><plugin><artifactId>maven-resources-plugin</artifactId><version>3.0.2</version></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.1</version></plugin><plugin><artifactId>maven-war-plugin</artifactId><version>3.2.2</version></plugin><plugin><artifactId>maven-install-plugin</artifactId><version>2.5.2</version></plugin><plugin><artifactId>maven-deploy-plugin</artifactId><version>2.8.2</version></plugin></plugins></pluginManagement></build></project>

MyBatis-config.xml: 连接数据库

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-////DTD Config 3.0//EN""/dtd/mybatis-3-config.dtd"><configuration><!--properties标签配置的整个文件都可使用,在任何位置配置的值都可以引入进来--><!--resource和url都可配置,但不能同时使用--><!--<properties resource="Mysql.properties"/>--><!-- <properties url="Mysql.properties"/>--><!--扫描实体类--><!-- <typeAliases><package name="com.hsd.entity"/>&lt;!&ndash;<typeAliases alias="User" type="com.hsd.entity.User"/>&ndash;&gt;</typeAliases>--><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><!--我的数据库:h--><property name="url" value="jdbc:mysql:///h?useSSL=false&amp;useServerPrepStmts=true"/><!--我的数据库的名称和密码--><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!--mapper映射器--><mappers><!--1.映射文件一个一个扫描--><!--<mapper resource="com.hsd.mapper.UserMapper"/><mapper class="com.hsd.mapper.UserMapper"/>--><!--2.扫描mapper,自动扫描mapper中的接口和xml--><package name="com.hsd.mapper"/></mappers></configuration>

utils层:GetSessionUtil类:

package com.hsd.utils;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;import java.io.InputStream;public class GetSessionUtil {public static SqlSession SqlSession(){InputStream inputStream=null;SqlSessionFactory sqlSessionFactory=null;SqlSession sqlSession=null;//获取MyBatis的配置文件try {String resources="MyBatis-config.xml";//通过输入流拿到MyBatis-config.xml的配置文件inputStream=Resources.getResourceAsStream(resources);//MyBatis通过读取配置文件信息,构造出sqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//获取sqlSessionsqlSession=sqlSessionFactory.openSession();return sqlSession;}catch (IOException e){e.printStackTrace();return null;}}//测试配置环境无问题public static void main(String[] args) {System.out.println(SqlSession());}}

test包:UserTest类:

package com.hsd.test;import com.hsd.entity.User;import com.hsd.mapper.UserMapper;import com.hsd.utils.GetSessionUtil;import org.apache.ibatis.session.SqlSession;public class UserTest {public static void main(String[] args) {//获取sqlSessionSqlSession sqlSession= GetSessionUtil.SqlSession();//获取mapperUserMapper mapper=sqlSession.getMapper(UserMapper.class);//调用mapper的方法User user = mapper.selectByUsername("aaa");//System.out.println(user);}}

登录:1.数据库建表user2.前端页面:user.jsp登录表单:(1)form表单,创建账号和密码的输入框(2)将登陆按钮绑定点击事件(3)获取用户名和密码的值(4)判断账号是否为空若为空,就提示“账号不能为空”(赋值给span标签)并return返回(5)判断密码是否为空若为空,就提示“密码不能为空”(赋值给span标签)并return返回(6)若都不为空,提交表单,跳转到后端3.后端代码:(1)接收客户端请求(账号、密码)(2)调用service中的登录方法(3)判断账号是否存在若账号不存在,就提示“用户账号不存在”,返回到登录页面继续登录。(4)判断密码是否有误若密码有误,就提示“用户密码有误”,返回到登录页面继续登录。(5)若都没问题就跳转到首页controller层:(接收请求、响应结果)1、接收客户端请求(账号、密码)2、调用service中的登录方法3、判断是否登录成功,成功的话跳转到首页,失败的话继续登录service层:(业务逻辑)1、创建消息模型对象(状态、提示信息、回显数据)2、判断账号是否存在若账号不存在,就提示“用户账号不存在”,回显数据到消息模型对象中,返回消息模型对 象3、判断密码是否有误若密码有误,就提示“用户密码有误”,回显数据到消息模型对象中,返回消息模型对象4、若无问题就将用户信息放到消息模型中mapper层:mapper接口:定义对应的接口mapper.xml:写对应的sql语句entity层:vo层:消息模型(重复使用的一些属性,写在MessageModel类中)student.jsp:首页

1.数据库建表user

CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(20),PASSWORD VARCHAR(20));INSERT INTO USER(username,PASSWORD)VALUE('admin','123');

entity层:User类

package com.hsd.entity;public class User {private int id;private String username;private String password;public User() {}public User(int id, String username, String password) {this.id = id;this.username = username;this.password = password;}public int getId() {return id;}public void setId(int id) {this.id = id;}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;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}}

entity层:Student类

package com.hsd.entity;//学生实体类public class Student {private int id;//编号private String name;//姓名private int age;//年龄private String sex;//性别private String hobby;//爱好private String time;//日期public Student() {}public Student(int id, String name, int age, String sex, String hobby, String time) {this.id = id;this.name = name;this.age = age;this.sex = sex;this.hobby = hobby;this.time = time;}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 int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getHobby() {return hobby;}public void setHobby(String hobby) {this.hobby = hobby;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", sex='" + sex + '\'' +", hobby='" + hobby + '\'' +", time='" + time + '\'' +'}';}}

2.前端页面:user.jsp

<%--Created by IntelliJ IDEA.User: 30868Date: /10/27Time: 16:55To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %><html><head><title>登录</title></head><body><div style="text-align: center"><h1>登录页面</h1><form action="UserServlet" method="get" id="userForm">账号:<input type="text" name="username" id="username" value="${messageModel.object.username}"><br>密码:<input type="password" name="password" id="password" value="${messageModel.object.password}"><br><div style="color: red" id="div">${messageModel.msg}</div><br><button type="button" id="but">登录</button><button type="button"><a href="register.jsp" style="text-decoration: none">注册</a></button></form></div></body><%--加载jquery-3.4.1.js插件--%><script src="js/jquery-3.4.1.js"></script><script type="text/javascript"><%--通过id选择器,给登录按钮绑定一个点击事件--%>$("#but").click(function () {//通过id选择器获取账号和密码var username=$("#username").val();var password=$("#password").val();//判断用户名和密码是否为空,若为空返回true,不为空返回falsefunction isEmpty(str) {if(str==null||str.trim()==""){return true;}return false;}//判断账号是否为空if(isEmpty(username)) {//若账号为空,提示并返回:$("#div").html("账号不能为空!")return;}if(isEmpty(password)){/* //若密码为空,提示并返回:*/$("#div").html("密码不能为空!")return;}$("#userForm").submit()});</script></html>

相关的MessageModel类:entity层:-->vo层-->消息模型:写入重复使用的一些属性。

package com.hsd.entity.vo;public class MessageModel {private int code=1;//状态码(1:成功。0:失败。默认为1)private String msg="成功";//提示信息(成功和失败,默认成功,失败提示错误信息)private Object object;//回显对象(基本数据类型、引用数据类型、数组、集合)public MessageModel() {}public MessageModel(int code, String msg, Object object) {this.code = code;this.msg = msg;this.object = object;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Object getObject() {return object;}public void setObject(Object object) {this.object = object;}}

3.后端代码:controller层:UserServlet类

package com.hsd.controller;import com.hsd.entity.vo.MessageModel;import com.hsd.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;/*controller层:(接收请求、响应结果)1、接收客户端请求(账号、密码)2、调用service中的登录方法3、判断是否登录成功,成功的话跳转到首页,失败的话继续登录*/@WebServlet("/UserServlet")public class UserServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取UserService对象UserService userService=new UserService();// 1、接收客户端请求(账号、密码)String username=req.getParameter("username");String password=req.getParameter("password");//2、调用service中的登录方法MessageModel messageModel=userService.selectByUsername(username,password);//3、判断是否登录成功,成功的话跳转到首页,失败的话继续登录if(messageModel.getCode()==1){//成功,将消息模型存到req中,并重定向到首页//转发(req)req.getSession().setAttribute("messageModel",messageModel);//重定向(resp)//路径不加‘/’resp.sendRedirect("StudentServlet");}else{//失败,将消息模型存到req中,并转发到登录页面req.setAttribute("messageModel",messageModel);//路径加‘/’req.getRequestDispatcher("/user.jsp").forward(req,resp);}}}

service层:UserService类

package com.hsd.service;import com.hsd.entity.User;import com.hsd.entity.vo.MessageModel;import com.hsd.mapper.UserMapper;import com.hsd.utils.GetSessionUtil;import org.apache.ibatis.session.SqlSession;/*1、创建消息模型对象(状态、提示信息、回显数据)2、判断账号是否存在若账号不存在,就提示“用户账号不存在”,回显数据到消息模型对象中,返回消息模型对象3、判断密码是否有误若密码有误,就提示“用户密码有误”,回显数据到消息模型对象中,返回消息模型对象4、若无问题就将用户信息放到消息模型中*/public class UserService {public MessageModel selectByUsername(String username, String password) {//1、创建消息模型对象(状态、提示信息、回显数据)MessageModel messageModel=new MessageModel();//回显数据,当账号和密码输入错误时,不会自动清空账号和密码,仍保留。User u=new User();u.setUsername(username);u.setPassword(password);//将回显的数据放在回显对象中messageModel.setObject(u);//获取sqlSession对象SqlSession sqlSession= GetSessionUtil.SqlSession();//调用UserMapper的登录方法UserMapper mapper=sqlSession.getMapper(UserMapper.class);User user=mapper.selectByUsername(username);//2、判断账号是否存在if(user==null){//若账号不存在,就提示“用户账号不存在”,回显数据到消息模型对象中,返回消息模型对象messageModel.setCode(0);//修改状态为0messageModel.setMsg("该账号不存在");return messageModel;}//3、判断密码是否有误if(!password.equals(user.getPassword())){messageModel.setCode(0);//修改状态为0messageModel.setMsg("密码有误");return messageModel;}//4、若无问题就将用户信息放到消息模型中messageModel.setObject(user);//释放资源sqlSession.close();return messageModel;}/*service层:(业务逻辑)1、创建消息模型对象(状态、提示信息、回显数据)2、判断账号是否存在若账号存在,就提示“用户账号已存在不能注册”,回显数据到消息模型对象中,返回消息模型对象3、若无问题就将用户信息放到消息模型中*/public MessageModel Register(User user) {// 1、创建消息模型对象(状态、提示信息、回显数据)MessageModel messageModel = new MessageModel();//回显数据User u = new User();u.setUsername(user.getUsername());u.setPassword(user.getPassword());//将回显的数据存到数据模型中messageModel.setObject(u);//获取sqlSessionSqlSession sqlSession = GetSessionUtil.SqlSession();//获取mapperUserMapper mapper = sqlSession.getMapper(UserMapper.class);//调用mapper中查找用户名的方法User user1 = mapper.selectByUsername(user.getUsername());//2、判断账号是否存在if(user1!=null){//若账号存在,就提示“用户账号已存在不能注册”,messageModel.setCode(0);//消息模型的状态修改为0messageModel.setMsg("该账号已存在不能注册");//提示信息return messageModel;//将错误的信息返回给messageModel}//不存在,3、若无问题就将用户信息放到消息模型中//调用mapper中的注册方法mapper.Register(user);messageModel.setObject(user);//提交事务:添加时需要提交,查询时不需要提交//将数据放到数据库时,需要提交事务;从数据库中取出数据时,不需要提交事务mit();return messageModel;//释放资源}}

mapper层:UserMapper

package com.hsd.mapper;import com.hsd.entity.User;import org.apache.ibatis.annotations.Select;public interface UserMapper {//@Select("select * from user")User selectByUsername(String name);void Register(User user);}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><!--namespace:命名空间,对应Mapper接口的路径--><mapper namespace="com.hsd.mapper.UserMapper"><!--id(必写)对应Mapper接口中的方法名称,parameterType:接口中的方法的参数类型,resultType:实体类--><select id="selectByUsername" parameterType="String" resultType="com.hsd.entity.User">select * from user where username=#{username};</select><insert id="Register">insert into user value (null,#{username},#{password});</insert></mapper>

设置xml:File-->Settings-->Editor-->Code Style-->File and Code Templates:点击'+'号,设置:Name:Mapper,Extension:xml-->Apply-->OK

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace=""></mapper>

注册:

1.前端页面register.jsp 注册表单:

(1)form表单,账号、密码、重复密码和注册的按钮

(2)将注册按钮绑定点击事件

(3)获取账号、密码、重复密码的值

(4)判断账号是否为空 若为空,就提示“账号不能为空”(赋值给div标签)并return返回 (5)判断密码是否为空 若为空,就提示“密码不能为空”(赋值给div标签)并return返回 (6)判断重复密码是否为空 若为空,就提示“重复密码不能为空”(赋值给div标签)并return返回

(7)判断密码和重复密码是否一致

(8)判断密码长度是否符合要求(>3&&<6)

(9)提交表单

2.后端代码:

(1)接收客户端请求(账号、密码)

(2)把接收的数据封装到实体类

(3)调用service中的注册方法

(4)判断账号是否存在 若账号存在,就提示“用户账号已存在不能注册”,返回到注册页面继续注册。

(5)若该账号不存在,就跳转到登录页面

controller层:(接收请求、响应结果)

1、接收客户端请求(账号、密码)

2、把接收的数据封装到实体类

3、调用service中的注册方法

4、判断是否注册成功,成功的话跳转到登录页面,失败的话继续注册

service层:(业务逻辑)

1、创建消息模型对象(状态、提示信息、回显数据)

2、判断账号是否存在 若账号存在,就提示“用户账号已存在不能注册”,回显数据到消息模型对象中,返回消息模型对象

3、若无问题就将用户信息放到消息模型中

mapper层:

1、mapper接口:定义对应的接口

2、mapper.xml:写对应的sql语句

1.前端页面register.jsp:

里面用到了jQuery:

jQuery 是一个 JavaScript 库,里面存在大量的JavaScript函数

jQuery 极大地简化了 JavaScript 编程

jQuery 的获取:官网

/

<%--Created by IntelliJ IDEA.User: 30868Date: /10/28Time: 10:30To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %><html><head><title>Title</title></head><body><span style="text-align: center"><h1>注册页面</h1><form action="RegisterServlet" method="get" id="registerForm">账号:<input type="text" name="username" id="username" value="${messageModel.object.username}"><br>密码:<input type="password" name="password" id="password" value="${messageModel.object.password}"><br>重复密码:<input type="password" name="password2" id="password2"><br><div style="color: red" id="div">${messageModel.msg}</div><br><button type="button" id="but">注册</button><button type="button"><a href="user.jsp" style="text-decoration: none">登录</a></button></form></span></body><script src="js/jquery-3.4.1.js"></script><script type="text/javascript">/*通过id选择器获取注册的按钮,给注册按钮绑定点击事件*/$("#but").click(function () {//获取账号、密码、重复密码的值var username=$("#username").val();var password=$("#password").val();var password2=$("#password2").val();//判断是否为空function isEmpty(str){if(str==null||str.trim()==""){return true;}return false;}if(isEmpty(username)){$("#div").html("账号不能为空")return;}if(isEmpty(password)){$("#div").html("密码不能为空")return;}if(isEmpty(password2)){$("#div").html("重复密码不能为空")return;}//判断密码和重复密码是否一致if(password!=password2){$("#div").html("密码不一致")return;}//判断密码长度是否符合要求(>3&&<6)if(username.length<3||username.length>6){$("#div").html("账号长度不能小于3位,也不能大于6位")return;}//提交表单$("#registerForm").submit();});</script></html>

2.后端代码:controller层:RegisterServlet类:

package com.hsd.controller;import com.hsd.entity.User;import com.hsd.entity.vo.MessageModel;import com.hsd.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("/RegisterServlet")public class RegisterServlet extends HttpServlet {@Override/*controller层:(接收请求、响应结果)1、接收客户端请求(账号、密码)2、把接收的数据封装到实体类3、调用service中的注册方法4、判断是否注册成功,成功的话跳转到登录页面,失败的话继续注册*/protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取userService对象UserService userService = new UserService();// 1、接收客户端请求(账号、密码)String username=req.getParameter("username");String password=req.getParameter("password");//2、把接收的数据封装到实体类User user=new User();user.setUsername(username);user.setPassword(password);//3、调用service中的注册方法MessageModel messageModel=userService.Register(user);//4、判断是否注册成功,成功的话跳转到登录页面,失败的话继续注册if(messageModel.getCode()==1){//成功,将消息模型存到req中,并重定向到登录页面req.setAttribute("messageModel",messageModel);resp.sendRedirect("user.jsp");}else {//失败,将消息模型存到req中,并转发到注册页面req.setAttribute("messageModel",messageModel);req.getRequestDispatcher("/register.jsp").forward(req,resp);}}}

student.jsp:首页

<%@ taglib prefix="c" uri="/jsp/jstl/core" %><%--Created by IntelliJ IDEA.User: 30868Date: /10/28Time: 8:44To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %><html><head><title>展示页面</title></head><body><center><h1>展示页面</h1><h2>欢迎${messageModel.object.username}登录成功!</h2><a href="add.jsp">添加</a><table border="1px" cellspacing="0"><tr><%--th:加粗居中--%><th>选项</th><th>编号</th><th>姓名</th><th>年龄</th><th>性别</th><th>爱好</th><th>日期</th><th>操作</th></tr><%--c:forEach :循环--%><c:forEach items="${list}" var="l"><tr><td><input type="checkbox" name="option" value="${l.id}"></td><td>${l.id}</td><td>${l.name}</td><td>${l.age}</td><td><c:if test="${l.sex==1}">男</c:if><c:if test="${l.sex!=1}">女</c:if></td><td>${l.hobby}</td><td>${l.time}</td><td><%--修改根据id--%><a href="selectByIdServlet?id=${l.id}">修改</a><%--删除根据id--%><a href="deleteByIdServlet?id=${l.id}">删除</a></td></tr></c:forEach></table><input type="submit" value="全选" onclick="checkAll()"><input type="submit" value="全不选" onclick="checkNoAll()"></center></body><script type="text/javascript">/*在js中获取点击框*/var option=document.getElementsByName("option");//全选function checkAll() {for (let i = 0; i < option.length; i++) {option[i].checked=true;}}function checkNoAll() {for (let i = 0; i < option.length; i++) {option[i].checked=false;}}</script></html>

StudentServlet类:

package com.hsd.controller;import com.hsd.entity.Student;import com.hsd.service.StudentService;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("/StudentServlet")public class StudentServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取StudentService对象StudentService studentService = new StudentService();//调用Service层的selectAll方法List<Student> list=studentService.selectAll();//将拿到的数据存到req域中req.setAttribute("list",list);//转发到student.jsp展示页面req.getRequestDispatcher("/student.jsp").forward(req,resp);}}

service层:StudentService类:

package com.hsd.service;import com.hsd.entity.Student;import com.hsd.mapper.StudentMapper;import com.hsd.utils.GetSessionUtil;import org.apache.ibatis.session.SqlSession;import java.util.List;public class StudentService {//获取工具类中的SqlSession对象SqlSession sqlSession= GetSessionUtil.SqlSession();//获取MapperStudentMapper mapper = sqlSession.getMapper(StudentMapper.class);public List<Student> selectAll() {//获取mapper接口中查看所有的方法List<Student> list=mapper.selectAll();//释放资源sqlSession.close();//返回到Servletreturn list;}public void addServlet(Student student) {//获取mapper中添加的方法mapper.addServlet(student);//提交事务mit();//释放资源sqlSession.close();}public void deleteById(int id) {//获取mapper中删除的方法mapper.deleteById(id);//提交事务mit();sqlSession.close();}public Student selectById(int id) {//获取mapper中根据id查找的方法Student student=mapper.selectById(id);sqlSession.close();return student;}public void update(Student student) {//获取mapper中的修改方法mapper.update(student);//提交事务mit();sqlSession.close();}}

mapper层:

package com.hsd.mapper;import com.hsd.entity.Student;import java.util.List;public interface StudentMapper {//查看所有List<Student> selectAll();void addServlet(Student student);void deleteById(int id);Student selectById(int id);void update(Student student);}

StudentMapper.xml:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapperPUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.hsd.mapper.StudentMapper"><select id="selectAll" resultType="com.hsd.entity.Student">select * from student;</select><insert id="addServlet">insert into student value (null,#{name},#{age},#{sex},#{hobby},#{time});</insert><delete id="deleteById">delete from student where id=#{id};</delete><select id="selectById" resultType="com.hsd.entity.Student">select * from student where id=#{id};</select><update id="update">update student set name=#{name},age=#{age},sex=#{sex},hobby=#{hobby},time=#{time} where id=#{id};</update></mapper>

添加:1.前端页面add.jsp2.后端代码:(1)接收客户端请求(添加的数据)(2)把接收的数据封装到实体类(3)调用service中的添加方法(4)添加完毕后返回首页。controller层:(接收请求、响应结果)1、接收客户端请求(添加的数据)2、把接收的数据封装到实体类3、调用service中的添加方法4、添加成功的话跳转到首页service层:(业务逻辑)1、获取工具类中的SqlSession对象2、获取Mapper3、获取mapper中添加的方法mapper层:mapper接口:定义对应的接口mapper.xml:写对应的sql语句

1.前端页面add.jsp:

<%--Created by IntelliJ IDEA.User: 30868Date: /10/29Time: 8:54To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>添加页面</title></head><body><form action="AddServlet" method="get">姓名:<input type="text" name="name"><br>年龄:<input type="text" name="age"><br>性别:<input type="radio" name="sex" value="1">男<input type="radio" name="sex" value="0">女<br>爱好:<input type="checkbox" name="hobby" value="吃">吃<input type="checkbox" name="hobby" value="喝">喝<input type="checkbox" name="hobby" value="玩">玩<input type="checkbox" name="hobby" value="乐">乐<br>日期:<input type="date" name="time"><br><input type="reset" value="重置"><br><input type="submit" value="添加"><br></form></body></html>

controller层:AddServlet类:

package com.hsd.controller;import com.hsd.entity.Student;import com.hsd.service.StudentService;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.Arrays;@WebServlet("/AddServlet")public class AddServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取StudentServiceStudentService studentService = new StudentService();String name=req.getParameter("name");String age=req.getParameter("age");String sex=req.getParameter("sex");//多选框实现添加用数组String[] hobby=req.getParameterValues("hobby");String time=req.getParameter("time");//将获取到的数据封装到对应的实体类中//Student student = new Student(Integer.parseInt(null),name,Integer.parseInt(age),sex,hobby,time);Student student = new Student();student.setName(name);student.setAge(Integer.parseInt(age));student.setSex(sex);student.setHobby(Arrays.toString(hobby));student.setTime(time);//调用StudentService中的添加方法,将添加的数据传回去,添加不需要返回值studentService.addServlet(student);//转发到首页req.getRequestDispatcher("StudentServlet").forward(req,resp);}}

service层:在StudentService中写入添加方法。

mapper层:在StudentMapper中写入添加方法,在StudentMapper.xml中写入添加的sql语句。

删除:后端代码:(1)创建studentService对象(2)接收客户端请求(根据id删除)(3)删除后返回首页controller层:(接收请求、响应结果)1、接收客户端请求(根据id删除)2、调用service中的删除方法3、删除成功的话跳转到首页service层:(业务逻辑)1、获取工具类中的SqlSession对象2、获取Mapper3、获取mapper中删除的方法mapper层:mapper接口:定义对应的接口mapper.xml:写对应的sql语句

deleteByIdServlet类:

package com.hsd.controller;import com.hsd.service.StudentService;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("/deleteByIdServlet")public class deleteByIdServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//创建studentService对象StudentService studentService = new StudentService();//获取id,根据id删除String id=req.getParameter("id");//删除不需要返回值studentService.deleteById(Integer.parseInt(id));//删除后返回首页req.getRequestDispatcher("StudentServlet").forward(req,resp);}}

service层:在StudentService中写入根据id查找和删除的方法。

mapper层:在StudentMapper中写入根据id查找的方法和删除的方法,在StudentMapper.xml中写入根据id查找和删除的sql语句。

修改:1.前端页面update.jsp:进行数据回显2.后端代码:获取要修改的数据:(1)获取studentService类中的获取id的方法(2)将数据存到req域中,通过setAttribute发送给回显页面,方便回显数据(3)若找到数据,跳转到修改页面,进行回显对获取的数据进行修改(1)接收修改后的数据(2)把修改后的数据封装到实体类student中(3)调用studentService类中的修改方法(4)修改后跳转到主页面controller层:(接收请求、响应结果)1、接收客户端请求(根据id修改)2、调用service中的修改方法3、修改成功的话跳转到首页service层:(业务逻辑)1、获取工具类中的SqlSession对象2、获取Mapper3、获取mapper中修改的方法mapper层:mapper接口:定义对应的接口mapper.xml:写对应的sql语句

1.前端页面update.jsp:

<%@ taglib prefix="c" uri="/jsp/jstl/core" %><%@ taglib prefix="fn" uri="/jsp/jstl/functions" %><%--Created by IntelliJ IDEA.User: 30868Date: /10/29Time: 14:37To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %><html><head><title>修改页面</title></head><body><form action="UpdateServlet" method="get">编号:<input type="text" name="id" value="${s.id}"><br>姓名:<input type="text" name="name" value="${s.name}"><br>年龄:<input type="text" name="age" value="${s.age}"><br>性别:<input type="radio" name="sex" value="1" <c:if test="${s.sex==1}"></c:if> checked="checked">男<input type="radio" name="sex" value="0" <c:if test="${s.sex==0}"></c:if> checked="checked">女<br>爱好:<input type="checkbox" name="hobby" value="吃" <c:if test="${fn:contains(s.hobby,'吃' )}">checked="checked"</c:if>>吃<input type="checkbox" name="hobby" value="喝" <c:if test="${fn:contains(s.hobby,'喝' )}">checked="checked"</c:if>>喝<input type="checkbox" name="hobby" value="玩" <c:if test="${fn:contains(s.hobby,'玩' )}">checked="checked"</c:if>>玩<input type="checkbox" name="hobby" value="乐" <c:if test="${fn:contains(s.hobby,'乐' )}">checked="checked"</c:if>>乐<br>日期:<input type="date" name="time" value="${s.time}"><br><input type="reset" value="重置"><br><input type="submit" value="修改"><br></form></body></html>

2.后端代码:controller层:selectByIdServlet类:修改时,先根据id回显。

package com.hsd.controller;import com.hsd.entity.Student;import com.hsd.service.StudentService;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("/selectByIdServlet")public class selectByIdServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取studentService对象StudentService studentService = new StudentService();//获取idString id = req.getParameter("id");//获取studentService类中的获取id的方法Student student=studentService.selectById(Integer.parseInt(id));//将数据存到req域中,通过setAttribute发送给回显页面,方便回显数据req.setAttribute("s",student);//若找到数据,跳转到修改页面,进行回显req.getRequestDispatcher("update.jsp").forward(req,resp);}}

UpdateServlet类:

package com.hsd.controller;import com.hsd.entity.Student;import com.hsd.service.StudentService;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.Arrays;@WebServlet("/UpdateServlet")public class UpdateServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取studentService对象StudentService studentService = new StudentService();//接收修改后的数据String id = req.getParameter("id");String name = req.getParameter("name");String age = req.getParameter("age");String sex = req.getParameter("sex");//多选框用数组类型接收数据String[] hobby = req.getParameterValues("hobby");String time = req.getParameter("time");//把修改后的数据封装到实体类student中Student student = new Student();student.setId(Integer.parseInt(id));student.setName(name);student.setAge(Integer.parseInt(age));student.setSex(sex);//将数组类型转换为Stringstudent.setHobby(Arrays.toString(hobby));student.setTime(time);//调用studentService类中的修改方法,修改不需要返回值studentService.update(student);//修改后跳转到主页面req.getRequestDispatcher("StudentServlet").forward(req,resp);}}

service层:在StudentService中写入根据id修改的方法。

mapper层:在StudentMapper中写入根据id修改的方法,在StudentMapper.xml中写入根据id修改的sql语句。

页面效果:

功能完善

1、选中删除功能

2、根据姓名查询功能

3、根据年龄区间查询功能

:student.jsp页面:

<%@ taglib prefix="c" uri="/jsp/jstl/core" %><%--Created by IntelliJ IDEA.User: 30868Date: /10/28Time: 8:44To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %><html><head><title>展示页面</title></head><body><center><h1>展示页面</h1><h2>欢迎${messageModel.object.username}登录成功!</h2><a href="add.jsp">添加</a><form action="SelectByNameServlet" method="get">根据姓名查询:<input type="text" name="name" value="${s.name}"><input type="submit" value="查询"></form><form action="SelectByAgeServlet" method="get">根据年龄区间查询:<input type="text" name="age1" value="${s.age1}">---<input type="text" name="age2" value="${s.age2}"><input type="submit" value="查询"></form><table border="1px" cellspacing="0"><tr><%--th:加粗居中--%><th>选项</th><th>编号</th><th>姓名</th><th>年龄</th><th>性别</th><th>爱好</th><th>日期</th><th>操作</th></tr><%--c:forEach :循环--%><c:forEach items="${list}" var="l"><tr><td><input type="checkbox" name="option" value="${l.id}"></td><td>${l.id}</td><td>${l.name}</td><td>${l.age}</td><td><c:if test="${l.sex==1}">男</c:if><c:if test="${l.sex!=1}">女</c:if></td><td>${l.hobby}</td><td>${l.time}</td><td><%--修改根据id--%><a href="selectByIdServlet?id=${l.id}">修改</a><%--删除根据id--%><a href="deleteByIdServlet?id=${l.id}">删除</a></td></tr></c:forEach></table><input type="submit" value="全选" onclick="checkAll()"><input type="submit" value="全不选" onclick="checkNoAll()"><input type="submit" value="选中删除" onclick="XDelete()"></center></body><script type="text/javascript">/*在js中获取点击框*/var option=document.getElementsByName("option");//全选function checkAll() {for (let i = 0; i < option.length; i++) {option[i].checked=true;}}//全不选function checkNoAll() {for (let i = 0; i < option.length; i++) {option[i].checked=false;}}//选中删除function XDelete() {//定义一个id变量,初始化值为null,用来存储选中的数据var id="";//循环多选框for (let i = 0; i < option.length; i++) {if(option[i].checked==true){//选中的id赋值给id变量,用逗号分隔开id=id+option[i].value+","}}location.href="XDeleteServlet?id="+id;}</script></html>

1、选中删除功能

controller层:XDeleteServlet类:

package com.hsd.controller;import com.hsd.service.StudentService;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("/XDeleteServlet")public class XDeleteServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//创建StudentService对象StudentService studentService = new StudentService();//接收页面发送过来的idString ids=req.getParameter("id");//查看是否可以获得选中的idSystem.out.println(ids);//调用service中的方法studentService.xDelete(ids);//删除成功后返回首页req.getRequestDispatcher("StudentServlet").forward(req,resp);}}

service层:StudentService类中添加方法:

public void xDelete(String ids){//查看是否可以获得选中的idSystem.out.println(ids);//字符串分割String[] split = ids.split(",");//循环删除,将分割后的id进行循环(选中多条)for (String id : split) {//调用mapper中的接口mapper.xDelete(Integer.parseInt(id));}//提交事务mit();sqlSession.close();}

mapper层:在StudentMapper接口类和xml中添加方法

package com.hsd.mapper;import com.hsd.entity.Student;import java.util.List;public interface StudentMapper {//查看所有List<Student> selectAll();void addServlet(Student student);void deleteById(int id);Student selectById(int id);void update(Student student);void xDelete(int id);}

<delete id="xDelete">delete from student where id = #{id}</delete>

页面效果:选中id为12,14的删除

2、根据姓名查询功能

controller层:SelectByNameServlet类

package com.hsd.controller;import com.hsd.entity.Student;import com.hsd.service.StudentService;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("/SelectByNameServlet")public class SelectByNameServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取StudentService对象StudentService studentService = new StudentService();//获取页面中的name值String name = req.getParameter("name");//查看是否获取页面输入的name//System.out.println(name);Student student=new Student();student.setName(name);//调用selectByName方法List<Student> list=studentService.selectByName(student);//将拿到的数据添加到req中req.setAttribute("list",list);//通过Session将查找的数据转发到页面req.setAttribute("s",student);//转发到展示页面req.getRequestDispatcher("student.jsp").forward(req,resp);}}

service层:StudentService类中添加方法:

public List<Student> selectByName(Student student) {//调用mapper中的方法List<Student> list=mapper.selectByName(student);//提交事务mit();sqlSession.close();return list;}

mapper层:在StudentMapper接口类和xml中添加方法

package com.hsd.mapper;import com.hsd.entity.Student;import java.util.List;public interface StudentMapper {//查看所有List<Student> selectAll();void addServlet(Student student);void deleteById(int id);Student selectById(int id);void update(Student student);void xDelete(int id);List<Student> selectByName(Student student);List<Student> selectByAge(Student student);}

根据姓名模糊查询:

<select id="selectByName" resultType="com.hsd.entity.Student" parameterType="com.hsd.entity.Student">select * from student where name like concat('%',#{name},'%')</select>

页面效果:查询名字含‘三’的所有有关信息

3、根据年龄区间查询功能

controller层:SelectByAgeServlet类

package com.hsd.controller;import com.hsd.entity.Student;import com.hsd.service.StudentService;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("/SelectByAgeServlet")public class SelectByAgeServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//StudentService studentService = new StudentService();//String age1=req.getParameter("age1");String age2=req.getParameter("age2");//Student student = new Student();student.setAge1(Integer.parseInt(age1));student.setAge2(Integer.parseInt(age2));////List<Student> list=studentService.selectByAge(student);//将拿到的数据添加到req中,返回值写list的原因是把数据返回req.setAttribute("list",list);req.setAttribute("s",student);//req.getRequestDispatcher("/student.jsp").forward(req,resp);}}

service层:StudentService类中添加方法:

public List<Student> selectByAge(Student student) {//调用mapper中的方法List<Student> list=mapper.selectByAge(student);//提交事务mit();sqlSession.close();return list;}

mapper层:在StudentMapper接口类和xml中添加方法

package com.hsd.mapper;import com.hsd.entity.Student;import java.util.List;public interface StudentMapper {//查看所有List<Student> selectAll();void addServlet(Student student);void deleteById(int id);Student selectById(int id);void update(Student student);void xDelete(int id);List<Student> selectByName(Student student);List<Student> selectByAge(Student student);}

根据年龄区间查询:

<select id="selectByAge" resultType="com.hsd.entity.Student" parameterType="com.hsd.entity.Student">select * from student/*循环判断,where标签在MyBatis中是循环*//*if标签在MyBatis中是判断*/<where>/*在MyBatis中,在where循环中使用and的前提,必须是还有一次条件,如果只有一次条件就不允许使用and,可以写一个模拟条件*/sex in('0','1')/*模拟条件*//*判断输入的不是空值*/<if test="age1 != null and age1 != ''">/*在MyBatis中,大于号和小于号是由(&gt; &lt;)代替的*/and age &gt;#{age1}</if><if test="age2!=null and age2!=''">/*在MyBatis中,大于号和小于号是由(gt; lt;)代替的*/and age &lt;#{age2}</if></where></select>

页面效果:查询年龄在17到20的所有信息

进行多条件查询:

将2、根据age查询和3、根据name查询联合起来,进行多条件查询,以下是在2、3的基础上进行的完善。文末会介绍直接进行多条件查询,不用写2、3。

修改的页面如下:student.jsp页面

<%-- <form action="SelectByNameServlet" method="get">根据姓名查询:<input type="text" name="name" value="${s.name}"><input type="submit" value="查询"></form><form action="SelectByAgeServlet" method="get">根据年龄区间查询:<input type="text" name="age1" value="${s.age1}">---<input type="text" name="age2" value="${s.age2}"><input type="submit" value="查询">--%><form action="SelectNameAndAgeServlet" method="get">根据姓名查询:<input type="text" name="name" value="${s.name}">根据年龄区间查询:<input type="text" name="age1" value="${s.age1}">---<input type="text" name="age2" value="${s.age2}"><input type="submit" value="查询"></form><%--</form>--%>

在entity层的vo包下添加一个StudentVo类:

package com.hsd.entity.vo;public class StudentVo {private String name;//根据姓名查询的字段private String age1;//根据年龄区间查询开始的年龄字段private String age2;//根据年龄区间查询结束的年龄字段public StudentVo() {}public StudentVo(String name, String age1, String age2) {this.name = name;this.age1 = age1;this.age2 = age2;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge1() {return age1;}public void setAge1(String age1) {this.age1 = age1;}public String getAge2() {return age2;}public void setAge2(String age2) {this.age2 = age2;}}

将Student类进行修改:将参数age1和age2删除,同时将该类中与这两个参数有关的get,set方法及有参无参方法删除。

修改SelectByAgeServlet类:

package com.hsd.controller;import com.hsd.entity.Student;import com.hsd.entity.vo.StudentVo;import com.hsd.service.StudentService;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("/SelectByAgeServlet")public class SelectByAgeServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//StudentService studentService = new StudentService();//String age1=req.getParameter("age1");String age2=req.getParameter("age2");///* Student student = new Student();if(age1!=null&&age2!=null){student.setAge1(Integer.parseInt(age1));student.setAge2(Integer.parseInt(age2));}*//////* List<Student> list=studentService.selectByAge(student);//将拿到的数据添加到req中,返回值写list的原因是把数据返回req.setAttribute("list",list);req.setAttribute("s",student);*///将接受的值存到Vo的实体类中StudentVo studentVo = new StudentVo();studentVo.setAge1(age1);studentVo.setAge2(age2);// 获取StudentService中根据姓名查询的方法,返回值写List集合的原因,就是需要返回所有的数据List<Student> list = studentService.selectByAge(studentVo);// 给查询所有的数据全部添加到req中req.setAttribute("list",list);// 拿到的数据添加到req中req.setAttribute("s",studentVo);//req.getRequestDispatcher("/student.jsp").forward(req,resp);}}

修改SelectByNameServlet类:

package com.hsd.controller;import com.hsd.entity.Student;import com.hsd.entity.vo.StudentVo;import com.hsd.service.StudentService;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("/SelectByNameServlet")public class SelectByNameServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取StudentService对象StudentService studentService = new StudentService();//获取页面中的name值String name = req.getParameter("name");//查看是否获取页面输入的name//System.out.println(name);/* Student student=new Student();student.setName(name);//调用selectByName方法List<Student> list=studentService.selectByName(student);//将拿到的数据添加到req中req.setAttribute("list",list);//通过Session将查找的数据转发到页面req.setAttribute("s",student);*/StudentVo studentVo = new StudentVo();studentVo.setName(name);// 获取StudentService中根据姓名查询的方法,返回值写List集合的原因,就是需要返回所有的数据List<Student> list = studentService.selectByName(studentVo);// 给查询所有的数据全部添加到req中req.setAttribute("list",list);// 给根据姓名查询拿到的数据添加到req中req.setAttribute("s",studentVo);//转发到展示页面req.getRequestDispatcher("student.jsp").forward(req,resp);}}

在controller层加一个类:SelectNameAndAgeServlet类

package com.hsd.controller;import com.hsd.entity.Student;import com.hsd.entity.vo.StudentVo;import com.hsd.service.StudentService;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("/SelectNameAndAgeServlet")public class SelectNameAndAgeServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {StudentService studentService = new StudentService();//String name = req.getParameter("name");String age1=req.getParameter("age1");String age2=req.getParameter("age2");StudentVo studentVo = new StudentVo();studentVo.setName(name);studentVo.setAge1(age1);studentVo.setAge2(age2);List<Student> list=studentService.selectByNameAndAge(studentVo);req.setAttribute("list",list);req.setAttribute("s",studentVo);//req.getRequestDispatcher("/student.jsp").forward(req,resp);}}

修改StudentService:

public List<Student> selectByName(StudentVo studentVo) {//调用mapper中的方法List<Student> list=mapper.selectByName(studentVo);//提交事务mit();sqlSession.close();return list;}public List<Student> selectByAge(StudentVo studentVo) {//调用mapper中的方法List<Student> list=mapper.selectByAge(studentVo);//提交事务mit();sqlSession.close();return list;}public List<Student> selectByNameAndAge(StudentVo studentVo) {List<Student> list=mapper.selectByNameAndAge(studentVo);//提交事务mit();sqlSession.close();return list;}

修改StudentMapper:

List<Student> selectByName(StudentVo studentVo);// 根据age区间条件查询的方法List<Student> selectByAge(StudentVo studentVo);// 多条件查询的方法List<Student> selectByNameAndAge(StudentVo studentVo);

<select id="selectByName" resultType="com.hsd.entity.Student" parameterType="com.hsd.entity.vo.StudentVo">select * from student where name like concat('%',#{name},'%')</select><select id="selectByAge" resultType="com.hsd.entity.Student" parameterType="com.hsd.entity.vo.StudentVo">select * from student/*循环判断,where标签在MyBatis中是循环*//*if标签在MyBatis中是判断*/<where>/*在MyBatis中,在where循环中使用and的前提,必须是还有一次条件,如果只有一次条件就不允许使用and,可以写一个模拟条件*/sex in('0','1')/*模拟条件*//*判断输入的不是空值*/<if test="age1 != null">/*在MyBatis中,大于号和小于号是由(&gt; &lt;)代替的*/and age &gt;#{age1}</if><if test="age2!=null">/*在MyBatis中,大于号和小于号是由(gt; lt;)代替的*/and age &lt;#{age2}</if></where></select><select id="selectByNameAndAge" parameterType="com.hsd.entity.vo.StudentVo" resultType="com.hsd.entity.Student">select * from student<where><if test="name!=null||name!=''">name like concat('%',#{name},'%')</if><if test="age1!=null and age1!=''">and age &gt;#{age1}</if><if test="age2!=null and age2!=''">/*在MyBatis中,大于号和小于号是由(gt; lt;)代替的*/and age &lt;#{age2}</if></where></select>

页面效果:

直接进行多条件查询,不用写以上的2、3 步

以下用另一个项目进行展示。整体架构和上面的项目一致。

<form action="SelectGnameAndPriceServlet" method="get">根据商品名称查询:<input type="text" name="gname" value="${g.gname}"><br>根据价格区间查询:<input type="text" name="price1" value="${g.price1}">---<input type="text" name="price2" value="${g.price2}"><br><input type="submit" value="查询"></form>

在entity层的vo包下添加一个GoodsVo类:

package com.hsd.entity.vo;public class GoodsVo {private String gname;private String price1;private String price2;public GoodsVo() {}public GoodsVo(String gname, String price1, String price2) {this.gname = gname;this.price1 = price1;this.price2 = price2;}public String getGname() {return gname;}public void setGname(String gname) {this.gname = gname;}public String getPrice1() {return price1;}public void setPrice1(String price1) {this.price1 = price1;}public String getPrice2() {return price2;}public void setPrice2(String price2) {this.price2 = price2;}}

此时,Goods类中的参数不需要进行任何修改,因为在后面的操作中,涉及的都是GoodsVo类。

在controller层添加一个SelectByGnameAndPrice类:

package com.hsd.controller;import com.hsd.entity.Goods;import com.hsd.entity.vo.GoodsVo;import com.hsd.service.GoodsService;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("/SelectGnameAndPriceServlet")public class SelectGnameAndPriceServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {GoodsService goodsService = new GoodsService();//String gname = req.getParameter("gname");String price1=req.getParameter("price1");String price2=req.getParameter("price2");GoodsVo goodsVo = new GoodsVo();goodsVo.setGname(gname);goodsVo.setPrice1(price1);goodsVo.setPrice2(price2);List<GoodsVo> list=goodsService.selectByGnameAndPrice(goodsVo);//将查询信息展示到页面上req.setAttribute("list",list);//回显req.setAttribute("g",goodsVo);//req.getRequestDispatcher("/goods.jsp").forward(req,resp);}}

GoodsService类:添加一个selectByGnameAndPrice方法

public List<GoodsVo> selectByGnameAndPrice(GoodsVo goodsVo) {List<GoodsVo> list=mapper.selectByGnameAndPrice(goodsVo);//提交事务mit();sqlSession.close();return list;}

GoodsMapper:添加selectByGnameAndPrice方法

List<GoodsVo> selectByGnameAndPrice(GoodsVo goodsVo);

GoodsMapper.xml:添加sql语句

<select id="selectByGnameAndPrice" parameterType="com.hsd.entity.vo.GoodsVo" resultType="com.hsd.entity.Goods">select * from goods<where><if test="gname!=null||gname!=''">gname like concat('%',#{gname},'%')</if><if test="price1!=null and price1!=''">and price &gt;#{price1}</if><if test="price2!=null and price2!=''">/*在MyBatis中,大于号和小于号是由(gt; lt;)代替的*/and price &lt;#{price2}</if></where></select>

对以上项目的修改:

一、以上的StudentVo类中age1和age2都是String类型的,若写为int类型,当根据年龄区间进行搜索时,输入框什么都不输入的话,想要的结果是查询所有,但int类型会报500的错误。解决方法如下:

在转换类型时添加一个判断语句即可。

修改之前的500错误如下:

1、将StudentMapper.xml中的语句进行修改,如下:

<select id="selectByNameAndAge" parameterType="com.hsd.entity.vo.StudentVo" resultType="com.hsd.entity.Student">select * from student<where><if test="name!=null and name!=''">name like concat('%',#{name},'%')</if><if test="age1!=null and age1!=0">and age &gt;#{age1}</if><if test="age2!=null and age2!=0">/*在MyBatis中,大于号和小于号是由(gt; lt;)代替的*/and age &lt;#{age2}</if></where></select>

2、将SelectByNameAndAgeServlet中的语句进行修改,转换类型时,加一个判断。如下:

//判断age不是null且不是空串就进入if,反之没有输入的话,就不走这个查询条件。if(age1!=null&&!"".equals(age1)){student.setAge1(Integer.parseInt(age1));}if(age2!=null&&!"".equals(age2)){student.setAge2(Integer.parseInt(age2));}

二、当进行选中删除时,什么都不选直接点击选中删除按钮时,会报500错误。对其进行修改完善:

给选中删除函数加一个判断,若一条都没选中,则弹窗提示。

1、引入jquery:

<script src="js/jquery-3.4.1.js"></script>

2、给选中删除函数加一个判断,若一条都没选中,则弹窗提示。修改如下:

//选中删除function XDelete() {if($("input[name=option]:checked").length==0){alert("至少选中一条数据");return;}//定义一个id变量,初始化值为null,用来存储选中的数据var id="";//循环多选框for (let i = 0; i < option.length; i++) {if(option[i].checked==true){//选中的id赋值给id变量,用逗号分隔开id=id+option[i].value+","}}location.href="XDeleteServlet?id="+id;}

三、添加一个过滤器:当没有登录直接访问主页面和添加页面时,提示未登录。必须登录后才能进行其他操作。

浏览器一旦启动,当登录过一次后,再返回到登录之前的页面,在url栏输入StudentServlet或add.jsp时,不会再提示未登录,可以直接进入。

可以简单理解为:在浏览器启动时,过滤器只会起一次过滤作用。

1、在controller层添加一个filter包,在包下创建一个RightConfig类:

package com.hsd.filter;import com.hsd.entity.vo.MessageModel;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;//拦截器的工具类@WebFilter(value = {"/StudentServlet","/add.jsp"})public class RightConfig implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//过滤器(拦截器)//1.先向下转型(强制类型转换),获取HttpServletRequestHttpServletRequest request= (HttpServletRequest) servletRequest;HttpServletResponse response= (HttpServletResponse) servletResponse;//2.获取session域HttpSession session=request.getSession();//3.通过getAttribute获取到user,返回一个消息模型对象MessageModel messageModel = (MessageModel) session.getAttribute("user");//4.判断是否登录if(messageModel!=null){//已经登录,释放拦截器filterChain.doFilter(request,response);}else{//没有登录,返回登录页面进行登录request.setAttribute("msg","未登录,请返回登录");//后端代码跳转到jsp需加‘/’request.getRequestDispatcher("user.jsp").forward(request,response);}}@Overridepublic void destroy() {}}

选择Filter javax.servlet:

2、修改UserServlet类:

if(messageModel.getCode()==1){//成功,将消息模型存到req中,并重定向到首页//获取session信息HttpSession session=req.getSession();//把登录的信息存到session中session.setAttribute("user",messageModel);//转发(req)req.getSession().setAttribute("messageModel",messageModel);//重定向(resp)//路径不加‘/’resp.sendRedirect("StudentServlet");}else

3、修改user.jsp:添加提示信息:${msg}

<div style="color: red" id="div">${messageModel.msg} ${msg}</div><br>

实现退出登录功能:两种方法

(1)写一个超链接:

(2)先添加一个超链接:<a href="ExitServlet">退出登录</a>,

然后在controller层中添加一个ExitServlet类

(1)写一个超链接:

<a href="user.jsp">退出</a>

效果:

缺点:

<1>当点击退出时,直接返回到user.jsp,但是username和password的内容仍存在。

<2>退出后,在url输入StudentServlet或add.jsp时,可以直接进入,即:过滤器没起作用。解决办法:

使用(2)实现退出登录。

(2)先添加一个超链接:<a href="ExitServlet">退出登录</a>,

然后在controller层中添加一个ExitServlet类,在该类中实现将(1)中的<1>username和password消除,实现(1)中的<2>过滤器。

<a href="ExitServlet">退出登录</a>

package com.hsd.controller;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;@WebServlet("/ExitServlet")public class ExitServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取session中的信息HttpSession session=req.getSession();//清空session域session.invalidate();req.getRequestDispatcher("user.jsp").forward(req,resp);}}

效果:

​​​​​​​

总结:

selectByIdServlet类:

(1)在controller层中:

有req.setAttribute("s",student);语句

(2)在service层中:

有return student;语句。

作用:将数据进行回显。

如:输入姓名进行查询时,当点击按钮时,填写的数据不会消失。若无返回,则一旦点击

按钮进行查询,在输入框的内容将消失。

StudentServlet类

SelectByAgeServlet类

SelectByNameServlet类

SelectNameAndAgeServlet类

(1)在controller层中:

三者都有req.setAttribute("list",list);语句。

(2)在service层中:

三者的方法都有返回值return list;语句

作用:将拿到的数据存在req域中。

返回值写list集合的原因:就是需要返回所有的数据到页面上展示。

如:在根据姓名查询时,当查询到数据时,先将查到的数据存在req中的list中,

然后根据return list;语句将数据展示到页面上,若无返回,则查询到的信息不会在页面上展示。

mapper配套:mapper层的接口和.xml中的方法名及sql语句要一致

getParameter:接收前端页面参数

req.setAttribute:将messageModel对象存到req域中

使用getAttribute通过key获取session中的值

req.getParameterValues("hobby");多选框实现添加用数组

student.setHobby(Arrays.toString(hobby));

重定向(resp):resp.sendRedirect("StudentServlet");

转发(req):req.getRequestDispatcher("/user.jsp").forward(req,resp);

重定向和转发的区别?

相同点:页面都会实现跳转

不同点:请求转发时,url不会发生变化 状态码:307

重定向时,url会发生变化 状态码:302

mapper层:

.xml中

namespace:命名空间,对应Mapper接口的路径

id(必写)对应Mapper接口中的方法名称,parameterType:接口中的方法的参数类型,resultType:实体类。

提交事务:mit():

添加时需要提交,查询时不需要提交。

即:将数据放到数据库时,需要提交事务;从数据库中取出数据时,不需要提交事务

如:在注册用户时,需将用户名和密码放到数据库中,需要提交事务,而在登录时,只是从数据库获取用户名和密码进行比较,不需要提交事务。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。