当前位置:首页 » 《我的小黑屋》 » 正文

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

10 人参与  2024年04月14日 09:16  分类 : 《我的小黑屋》  评论

点击全文阅读


分层思想:   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="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/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>http://www.example.com</url>  <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    <maven.compiler.source>1.7</maven.compiler.source>    <maven.compiler.target>1.7</maven.compiler.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 http://maven.apache.org/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 configuration        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"        "http://mybatis.org/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"/>                <!--我的数据库:h2022-->                <property name="url" value="jdbc:mysql:///h2022?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通过读取配置文件信息,构造出sqlSessionFactory            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//获取sqlSession            sqlSession=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) {//获取sqlSession        SqlSession sqlSession= GetSessionUtil.SqlSession();//获取mapper        UserMapper mapper=sqlSession.getMapper(UserMapper.class);//调用mapper的方法        User user = mapper.selectByUsername("aaa");//        System.out.println(user);    }}

登录:   1.数据库建表user   2.前端页面: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;    }    @Override    public 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;    }    @Override    public String toString() {        return "Student{" +                "id=" + id +                ", name='" + name + '\'' +                ", age=" + age +                ", sex='" + sex + '\'' +                ", hobby='" + hobby + '\'' +                ", time='" + time + '\'' +                '}';    }}

 2.前端页面:user.jsp

<%--  Created by IntelliJ IDEA.  User: 30868  Date: 2022/10/27  Time: 16:55  To 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,不为空返回false        function 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 {    @Override    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、调用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);//修改状态为0            messageModel.setMsg("该账号不存在");            return messageModel;        }        //3、判断密码是否有误        if(!password.equals(user.getPassword())){            messageModel.setCode(0);//修改状态为0            messageModel.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);        //获取sqlSession        SqlSession sqlSession = GetSessionUtil.SqlSession();        //获取mapper        UserMapper mapper = sqlSession.getMapper(UserMapper.class);        //调用mapper中查找用户名的方法        User user1 = mapper.selectByUsername(user.getUsername());        //2、判断账号是否存在        if(user1!=null){            //若账号存在,就提示“用户账号已存在不能注册”,            messageModel.setCode(0);//消息模型的状态修改为0            messageModel.setMsg("该账号已存在不能注册");//提示信息            return messageModel;//将错误的信息返回给messageModel        }        //不存在,3、若无问题就将用户信息放到消息模型中        //调用mapper中的注册方法        mapper.Register(user);        messageModel.setObject(user);        //提交事务:添加时需要提交,查询时不需要提交        //将数据放到数据库时,需要提交事务;从数据库中取出数据时,不需要提交事务        sqlSession.commit();        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 mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/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 mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/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 的获取:官网
https://jquery.com/ 

<%--  Created by IntelliJ IDEA.  User: 30868  Date: 2022/10/28  Time: 10:30  To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %><html><head>    <title>Title</title></head><body><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="http://java.sun.com/jsp/jstl/core" %><%--  Created by IntelliJ IDEA.  User: 30868  Date: 2022/10/28  Time: 8:44  To 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 {    @Override    protected 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();    //获取Mapper    StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);    public List<Student> selectAll() {        //获取mapper接口中查看所有的方法        List<Student> list=mapper.selectAll();        //释放资源        sqlSession.close();        //返回到Servlet        return list;    }    public void addServlet(Student student) {        //获取mapper中添加的方法        mapper.addServlet(student);        //提交事务        sqlSession.commit();        //释放资源        sqlSession.close();    }    public void deleteById(int id) {        //获取mapper中删除的方法        mapper.deleteById(id);        //提交事务        sqlSession.commit();        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);        //提交事务        sqlSession.commit();        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 mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/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.jsp     2.后端代码:       (1)接收客户端请求(添加的数据)       (2)把接收的数据封装到实体类       (3)调用service中的添加方法       (4)添加完毕后返回首页。          controller层:(接收请求、响应结果)           1、接收客户端请求(添加的数据)           2、把接收的数据封装到实体类           3、调用service中的添加方法           4、添加成功的话跳转到首页          service层:(业务逻辑)           1、获取工具类中的SqlSession对象           2、获取Mapper           3、获取mapper中添加的方法           mapper层:            mapper接口:定义对应的接口            mapper.xml:写对应的sql语句
1.前端页面add.jsp:
<%--  Created by IntelliJ IDEA.  User: 30868  Date: 2022/10/29  Time: 8:54  To 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 {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //获取StudentService        StudentService 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、获取Mapper           3、获取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 {    @Override    protected 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、获取Mapper           3、获取mapper中修改的方法           mapper层:            mapper接口:定义对应的接口            mapper.xml:写对应的sql语句

 1.前端页面update.jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %><%--  Created by IntelliJ IDEA.  User: 30868  Date: 2022/10/29  Time: 14:37  To 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 {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //获取studentService对象        StudentService studentService = new StudentService();        //获取id        String 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 {    @Override    protected 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);        //将数组类型转换为String        student.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="http://java.sun.com/jsp/jstl/core" %><%--  Created by IntelliJ IDEA.  User: 30868  Date: 2022/10/28  Time: 8:44  To 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 {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //创建StudentService对象        StudentService studentService = new StudentService();        //接收页面发送过来的id        String ids=req.getParameter("id");        //查看是否可以获得选中的id        System.out.println(ids);        //调用service中的方法        studentService.xDelete(ids);        //删除成功后返回首页        req.getRequestDispatcher("StudentServlet").forward(req,resp);    }}

 service层:StudentService类中添加方法:

public void xDelete(String ids){        //查看是否可以获得选中的id        System.out.println(ids);        //字符串分割        String[] split = ids.split(",");        //循环删除,将分割后的id进行循环(选中多条)        for (String id : split) {            //调用mapper中的接口            mapper.xDelete(Integer.parseInt(id));        }        //提交事务        sqlSession.commit();        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 {    @Override    protected 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);        //提交事务        sqlSession.commit();        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 {    @Override    protected 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);        //提交事务        sqlSession.commit();        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 {    @Override    protected 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 {    @Override    protected 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 {    @Override    protected 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);        //提交事务        sqlSession.commit();        sqlSession.close();        return list;    }    public List<Student> selectByAge(StudentVo studentVo) {        //调用mapper中的方法        List<Student> list=mapper.selectByAge(studentVo);        //提交事务        sqlSession.commit();        sqlSession.close();        return list;    }    public List<Student> selectByNameAndAge(StudentVo studentVo) {        List<Student> list=mapper.selectByNameAndAge(studentVo);        //提交事务        sqlSession.commit();        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 {    @Override    protected 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);        //提交事务        sqlSession.commit();        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 {    @Override    public void init(FilterConfig filterConfig) throws ServletException {    }    @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//过滤器(拦截器)        //1.先向下转型(强制类型转换),获取HttpServletRequest        HttpServletRequest 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);        }    }    @Override    public 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 {    @Override    protected 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:实体类。
提交事务:sqlSession.commit():
添加时需要提交,查询时不需要提交。
即:将数据放到数据库时,需要提交事务;从数据库中取出数据时,不需要提交事务
如:在注册用户时,需将用户名和密码放到数据库中,需要提交事务,而在登录时,只是从数据库获取用户名和密码进行比较,不需要提交事务。


点击全文阅读


本文链接:http://zhangshiyu.com/post/95070.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1