分层思想: entity层:存放实体类 vo层:消息模型(重复使用的一些属性) mapper层:接口(写方法的) mapper.xml:MyBatis与数据库相关的一些内容 controller(web)层: 接收前端传回的参数 调用service层,返回结果 转发、响应结果(跳转页面) service层: 业务逻辑判断,写方法的. utils层: 工具类:写通用的方法、类。 test包: 测试类、测试方法(测试代码) MyBatis-config.xml: 连接数据库的
pom.xml:导入相关依赖
4.0.0 com.hsd Servlet_Maven 1.0-SNAPSHOT war Servlet_Maven Maven Webapp http://www.example.com UTF-8 1.7 1.7 com.fasterxml.jackson jackson-datatype-json-org 1.8.0 jstl jstl 1.2 org.mybatis mybatis 3.5.5 taglibs standard 1.1.2 mysql mysql-connector-java 5.1.34 javax.servlet.jsp jsp-api 2.2 javax.servlet javax.servlet-api 3.1.0 junit junit 4.11 test src/main/java **/*.properties **/*.xml true Servlet_Maven maven-clean-plugin 3.1.0 maven-resources-plugin 3.0.2 maven-compiler-plugin 3.8.0 maven-surefire-plugin 2.22.1 maven-war-plugin 3.2.2 maven-install-plugin 2.5.2 maven-deploy-plugin 2.8.2
MyBatis-config.xml: 连接数据库
<!----> <!-- --> <!-- <!––> --> <!-- -->
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
登录 登录页面
账号:
密码:
${messageModel.msg}
$("#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() });
相关的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
select * from user where username=#{username}; insert into user value (null,#{username},#{password});
设置xml:File–>Settings–>Editor–>Code Style–>File and Code Templates:点击’+’号,设置:Name:Mapper,Extension:xml–>Apply–>OK
注册:
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/
Title 注册页面
账号:
密码:
重复密码:
${messageModel.msg}
/*通过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.length6){ $("#div").html("账号长度不能小于3位,也不能大于6位") return; } //提交表单 $("#registerForm").submit(); });
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:首页
展示页面 展示页面
欢迎${messageModel.object.username}登录成功!
添加 选项 编号 姓名 年龄 性别 爱好 日期 操作 ${l.id} ${l.name} ${l.age} 男 女 ${l.hobby} ${l.time} /*在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; } }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 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 selectAll() { //获取mapper接口中查看所有的方法 List 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 selectAll(); void addServlet(Student student); void deleteById(int id); Student selectById(int id); void update(Student student);}
StudentMapper.xml:
select * from student; insert into student value (null,#{name},#{age},#{sex},#{hobby},#{time}); delete from student where id=#{id}; select * from student where id=#{id}; update student set name=#{name},age=#{age},sex=#{sex},hobby=#{hobby},time=#{time} where id=#{id};
添加: 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:
添加页面 姓名:
年龄:
性别:男 女
爱好:吃 喝 玩 乐
日期:
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:
修改页面 编号:
姓名:
年龄:
性别:<input type="radio" name="sex" value="1" checked="checked">男 <input type="radio" name="sex" value="0" checked="checked">女
爱好:<input type="checkbox" name="hobby" value="吃" checked="checked">吃 <input type="checkbox" name="hobby" value="喝" checked="checked">喝 <input type="checkbox" name="hobby" value="玩" checked="checked">玩 <input type="checkbox" name="hobby" value="乐" checked="checked">乐
日期:
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页面:
展示页面 展示页面
欢迎${messageModel.object.username}登录成功!
添加 根据姓名查询: 根据年龄区间查询:--- 选项 编号 姓名 年龄 性别 爱好 日期 操作 ${l.id} ${l.name} ${l.age} 男 女 ${l.hobby} ${l.time} /*在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; //循环多选框 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; }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 selectAll(); void addServlet(Student student); void deleteById(int id); Student selectById(int id); void update(Student student); void xDelete(int id);}
delete from student where id = #{id}
页面效果:选中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 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 selectByName(Student student) { //调用mapper中的方法 List 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 selectAll(); void addServlet(Student student); void deleteById(int id); Student selectById(int id); void update(Student student); void xDelete(int id); List selectByName(Student student); List selectByAge(Student student);}
根据姓名模糊查询:
select * from student where name like concat('%',#{name},'%')
页面效果:查询名字含‘三’的所有有关信息
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 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 selectByAge(Student student) { //调用mapper中的方法 List 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 selectAll(); void addServlet(Student student); void deleteById(int id); Student selectById(int id); void update(Student student); void xDelete(int id); List selectByName(Student student); List selectByAge(Student student);}
根据年龄区间查询:
select * from student/*循环判断,where标签在MyBatis中是循环*//*if标签在MyBatis中是判断*/ /*在MyBatis中,在where循环中使用and的前提,必须是还有一次条件,如果只有一次条件就不允许使用and,可以写一个模拟条件*/ sex in('0','1')/*模拟条件*/ /*判断输入的不是空值*/ /*在MyBatis中,大于号和小于号是由(> <)代替的*/ and age >#{age1} /*在MyBatis中,大于号和小于号是由(gt; lt;)代替的*/ and age <#{age2}
页面效果:查询年龄在17到20的所有信息
进行多条件查询:
将2、根据age查询和3、根据name查询联合起来,进行多条件查询,以下是在2、3的基础上进行的完善。文末会介绍直接进行多条件查询,不用写2、3。
修改的页面如下:student.jsp页面
<%-- 根据姓名查询: 根据年龄区间查询:--- --%> 根据姓名查询: 根据年龄区间查询:--- <%----%>
在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 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 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 list=studentService.selectByName(student); //将拿到的数据添加到req中 req.setAttribute("list",list); //通过Session将查找的数据转发到页面 req.setAttribute("s",student);*/ StudentVo studentVo = new StudentVo(); studentVo.setName(name);// 获取StudentService中根据姓名查询的方法,返回值写List集合的原因,就是需要返回所有的数据 List 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 list=studentService.selectByNameAndAge(studentVo); req.setAttribute("list",list); req.setAttribute("s",studentVo); // req.getRequestDispatcher("/student.jsp").forward(req,resp); }}
修改StudentService:
public List selectByName(StudentVo studentVo) { //调用mapper中的方法 List list=mapper.selectByName(studentVo); //提交事务 sqlSession.commit(); sqlSession.close(); return list; } public List selectByAge(StudentVo studentVo) { //调用mapper中的方法 List list=mapper.selectByAge(studentVo); //提交事务 sqlSession.commit(); sqlSession.close(); return list; } public List selectByNameAndAge(StudentVo studentVo) { List list=mapper.selectByNameAndAge(studentVo); //提交事务 sqlSession.commit(); sqlSession.close(); return list; }
修改StudentMapper:
List selectByName(StudentVo studentVo); // 根据age区间条件查询的方法 List selectByAge(StudentVo studentVo); // 多条件查询的方法 List selectByNameAndAge(StudentVo studentVo);
select * from student where name like concat('%',#{name},'%') select * from student/*循环判断,where标签在MyBatis中是循环*//*if标签在MyBatis中是判断*/ /*在MyBatis中,在where循环中使用and的前提,必须是还有一次条件,如果只有一次条件就不允许使用and,可以写一个模拟条件*/ sex in('0','1')/*模拟条件*/ /*判断输入的不是空值*/ /*在MyBatis中,大于号和小于号是由(> <)代替的*/ and age >#{age1} /*在MyBatis中,大于号和小于号是由(gt; lt;)代替的*/ and age <#{age2} select * from student name like concat('%',#{name},'%') and age >#{age1} /*在MyBatis中,大于号和小于号是由(gt; lt;)代替的*/ and age <#{age2}
页面效果:
直接进行多条件查询,不用写以上的2、3 步
以下用另一个项目进行展示。整体架构和上面的项目一致。
根据商品名称查询:
根据价格区间查询:---
在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 list=goodsService.selectByGnameAndPrice(goodsVo); //将查询信息展示到页面上 req.setAttribute("list",list); //回显 req.setAttribute("g",goodsVo); // req.getRequestDispatcher("/goods.jsp").forward(req,resp); }}
GoodsService类:添加一个selectByGnameAndPrice方法
public List selectByGnameAndPrice(GoodsVo goodsVo) { List list=mapper.selectByGnameAndPrice(goodsVo); //提交事务 sqlSession.commit(); sqlSession.close(); return list; }
GoodsMapper:添加selectByGnameAndPrice方法
List selectByGnameAndPrice(GoodsVo goodsVo);
GoodsMapper.xml:添加sql语句
select * from goods gname like concat('%',#{gname},'%') and price >#{price1} /*在MyBatis中,大于号和小于号是由(gt; lt;)代替的*/ and price <#{price2}
对以上项目的修改:
一、以上的StudentVo类中age1和age2都是String类型的,若写为int类型,当根据年龄区间进行搜索时,输入框什么都不输入的话,想要的结果是查询所有,但int类型会报500的错误。解决方法如下:
在转换类型时添加一个判断语句即可。
修改之前的500错误如下:
1、将StudentMapper.xml中的语句进行修改,如下:
select * from student name like concat('%',#{name},'%') and age >#{age1} /*在MyBatis中,大于号和小于号是由(gt; lt;)代替的*/ and age <#{age2}
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:
2、给选中删除函数加一个判断,若一条都没选中,则弹窗提示。修改如下:
//选中删除 function XDelete() { if($("input[name=option]:checked").length==0){ alert("至少选中一条数据"); return; } //定义一个id变量,初始化值为null,用来存储选中的数据 var; //循环多选框 for (let i = 0; i
三、添加一个过滤器:当没有登录直接访问主页面和添加页面时,提示未登录。必须登录后才能进行其他操作。
浏览器一旦启动,当登录过一次后,再返回到登录之前的页面,在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}
${messageModel.msg} ${msg}
实现退出登录功能:两种方法
(1)写一个超链接:
(2)先添加一个超链接:退出登录,
然后在controller层中添加一个ExitServlet类
(1)写一个超链接:
退出
效果:
缺点:
当点击退出时,直接返回到user.jsp,但是username和password的内容仍存在。
退出后,在url输入StudentServlet或add.jsp时,可以直接进入,即:过滤器没起作用。解决办法:
使用(2)实现退出登录。
(2)先添加一个超链接:退出登录,
然后在controller层中添加一个ExitServlet类,在该类中实现将(1)中的username和password消除,实现(1)中的过滤器。
退出登录
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():
添加时需要提交,查询时不需要提交。
即:将数据放到数据库时,需要提交事务;从数据库中取出数据时,不需要提交事务
如:在注册用户时,需将用户名和密码放到数据库中,需要提交事务,而在登录时,只是从数据库获取用户名和密码进行比较,不需要提交事务。