[Java]SpringMVC 学习笔记(动力节点王鹤王妈妈2020)(四)

简介: [Java]SpringMVC 学习笔记(动力节点王鹤王妈妈2020)(四)

Dao

  • 操作数据库的接口定义:StudentDao
/**
 * ClassName: StudentDao
 * Package: cw.springmvc.study.dao
 * Description:
 *
 * @Author tcw
 * @Create 2023-05-28 15:57
 * @Version 1.0
 */
public interface StudentDao {
    /**
     * 插入学生信息
     * 
     * @param student 学生信息
     * @return 影响数据库的条数
     */
    int insertStudent(Student student);
    /**
     * 查询全部学生信息
     * 
     * @return 学生信息
     */
    List<Student> selectStudents();
}
  • SQL映射配置文件:StudentDao
<?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="cw.springmvc.study.dao.StudentDao">
  <insert id="insertStudent">
    insert into t_student(name, age)
    values (#{name}, #{age});
  </insert>
  <select id="selectStudents" resultType="Student">
    select id, name, age from t_student order by id desc;
  </select>
</mapper>

Service

  • 业务层接口:StudentService
package cw.springmvc.study.service;
import cw.springmvc.study.pojo.Student;
import java.util.List;
/**
 * ClassName: StudentService
 * Package: cw.springmvc.study.service
 * Description:
 *
 * @Author tcw
 * @Create 2023-05-28 16:05
 * @Version 1.0
 */
public interface StudentService {
    /**
     * 添加学生信息
     *
     * @param student 学生信息
     * @return
     */
    int addStudent(Student student);
    /**
     * 查询所有学生信息
     *
     * @return 学生信息
     */
    List<Student> findStudents();
}
  • 业务层接口实现类:StudentServiceImpl
package cw.springmvc.study.service.impl;
import cw.springmvc.study.dao.StudentDao;
import cw.springmvc.study.pojo.Student;
import cw.springmvc.study.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * ClassName: StudentServiceImpl
 * Package: cw.springmvc.study.service.impl
 * Description:
 *
 * @Author tcw
 * @Create 2023-05-28 16:07
 * @Version 1.0
 */
@Service
public class StudentServiceImpl implements StudentService {
    @Autowired // 根据类型自动装配
    private StudentDao studentDao;
    @Override
    public int addStudent(Student student) {
        return studentDao.insertStudent(student);
    }
    @Override
    public List<Student> findStudents() {
        return studentDao.selectStudents();
    }
}

controller

package cw.springmvc.study.controller;
import cw.springmvc.study.pojo.Student;
import cw.springmvc.study.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
/**
 * ClassName: StudentController
 * Package: cw.springmvc.study.controller
 * Description:
 *
 * @Author tcw
 * @Create 2023-06-05 18:33
 * @Version 1.0
 */
@Controller
@RequestMapping("/student")
public class StudentController {
    @Autowired // 自动装配
    private StudentService studentService;
    /**
     * 处理新增学生信息请求
     *
     * @return 视图和数据
     */
    @RequestMapping("/add")
    public ModelAndView addStudent(Student student) {
        // 调用Service处理新增学生信息业务
        int cnt = studentService.addStudent(student);
        ModelAndView mv = new ModelAndView();
        // 添加响应数据
        if (cnt > 0) {
            mv.addObject("msg", "学生【" + student.getName() + "】注册成功");
        } else {
            mv.addObject("msg", "学生【" + student.getName() + "】注册失败");
        }
        // 设置响应视图
        mv.setViewName("result");
        return mv;
    }
    /**
     * 查询所有的学生信息
     *
     * @return 所有的学生信息
     */
    @RequestMapping("/list")
    @ResponseBody
    public List<Student> selectStudentAll() {
        // 查询学生信息
        return studentService.findStudents();
    }
}

JSP

  • index.jsp
<%--
  Created by IntelliJ IDEA.
  User: cw
  Date: 2023-06-05
  Time: 18:43
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script>
    <script>
        $(function () {
            $("button").click(function (){
                // 发请求
                $.ajax({
                    url: "./student/list",
                    type:"get",
                    dataType:"json",
                    success(data) {
                        let newData = data.map((d) => {
                            return d.id + " " + d.name + " " + d.age + "<br/>";
                        })
                        $("div").html(""); // 清除
                        $("div").append(newData); // 追加新数据
                    }
                })
            })
        })
    </script>
</head>
<body>
<p>SSM</p>
<form action="./student/add" method="post">
    姓名:<input name="name" type="text"><br/>
    年龄:<input name="age" type="text"><br/>
    <input value="提交" type="submit">
</form>
<br/>
<button>查询学生信息</button>
<div></div>
</body>
</html>
  • result.jsp
<%--
  Created by IntelliJ IDEA.
  User: cw
  Date: 2023-06-05
  Time: 18:41
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
  <h2>${msg}</h2>
</body>
</html>

测试

请求转发与重定向

  • SpringMVC 框架把原来 Servlet 中的请求转发和重定向操作进行了封装。可以使用简单的方式实现转发和重定向。
  • 使用 forward 表示转发,实现 request.getRequestDispatcher(“xx.jsp”).forward()
  • 使用 redirect 表示重定向,实现 response.sendRedirect(“xxx.jsp”)
  • forward 和 redirect 都是 SpringMVC 框架中的关键字,两个关键字都不和视图解析器一同工作

请求转发

  • 通过处理器方法返回ModelAndView,实现请求转发
  • 语法:
mv.setViewName("forward:视图文件完整路径")
  • 注意:forward 不和视图解析器一同使用,不管有没有配置视图解析器,使用forward进行请求转发都相当于没有视图解析器。
  • 使用 forward 关键字进行请求转发为显示转发,该种方式主要用于当想要进行请求转发但是要转发到的页面没有在视图解析器配置的路径中的情况下,使得请求转发可以不受视图解析器的限制,实现可以转发到视图解析器以外的页面
  • 视图解析器配置如下:
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/"/>
  <property name="suffix" value=".jsp"/>
</bean>
  • 控制器:
@Controller
public class MyController {
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(String name, String age) {
        ModelAndView mv = new ModelAndView();
        System.out.println(123);
        mv.addObject("name", name);
        mv.addObject("age", age);
        // 进行请求转发
        mv.setViewName("forward:./WEB-INF/view/show.jsp");
        return mv;
    }
}
  • show.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<p>姓名:${name}</p>
<p>年龄:${age}</p>
</body>
</html>

请求重定向

  • 通过处理器方法返回ModelAndView,实现请求重定向
  • 语法:
mv.setViewName("redirect:视图文件完整路径")
  • 注意:redirect 不和视图解析器一同使用,不管有没有配置视图解析器,使用redirect进行请求重定向都相当于没有视图解析器。
  • 控制器:
@Controller
public class MyController {
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(String name, String age) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("name111", name);
        mv.addObject("age111", age);
        System.out.println("name: " + name + " age: " + age);
        // 进行请求重定向
        // http://localhost:8080/springmvc/show222.jsp?name111=%E5%BC%A0%E4%B8%89&age111=23
        mv.setViewName("redirect:./show222.jsp");
        return mv;
    }
}
  • 在进行请求重定向的时候,添加到ModelAndView中的数据,框架会将Model中的简单类型的数据转为String使用,作为向请求重定向地址的请求参数使用,使得在两次请求之间可以传递数据
  • 注意:请求重定向是一次全新的从浏览器发出的请求,WEB-INF下的资源是不能被浏览器请求访问的
  • jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<!--
    请求重定向,是全新的一次请求,参数在request对象上,
    不在本次的请求作用域中
-->
<!-- param 请求参数集合 -->
<p>姓名:${param.name111}</p>
<p>年龄:<%= request.getParameter("age111") %></p>
</body>
</html>

异常处理

  • 之前对代码可能出现异常的处理方法:
public void fun() {
  try {
    } catch (Exception e){
    }
}
  • SpringMVC 框架中将处理异常的代码(非业务逻辑代码)抽取出来,在一个统一的位置定义异常的处理,采用面向切面编程的方式,来处理异常
  • springmvc框架采用的是统一,全局的异常处理。把controller中的所有异常处理都集中到一个地方,采用的是aop的思想,把业务逻辑和异常处理代码分开,解耦合。
  • springmvc框架提供了两个注解进行异常的处理:@ExceptionHandler、@ControllerAdvice

自定义异常类

package cw.springmvc.exception;
/**
 * ClassName: MyUserException
 * Package: cw.springmvc.exception
 * Description:
 *
 * @Author tcw
 * @Create 2023-06-05 22:31
 * @Version 1.0
 */
public class MyUserException extends Exception{
    public MyUserException() {
        super();
    }
    public MyUserException(String message) {
        super(message);
    }
}
package cw.springmvc.exception;
/**
 * ClassName: AgeException
 * Package: cw.springmvc.exception
 * Description:
 *
 * @Author tcw
 * @Create 2023-06-05 22:32
 * @Version 1.0
 */
public class AgeException extends MyUserException{
    public AgeException() {
        super();
    }
    public AgeException(String message) {
        super(message);
    }
}
package cw.springmvc.exception;
/**
 * ClassName: NameException
 * Package: cw.springmvc.exception
 * Description:
 *
 * @Author tcw
 * @Create 2023-06-05 22:32
 * @Version 1.0
 */
public class NameException extends MyUserException{
    public NameException() {
        super();
    }
    public NameException(String message) {
        super(message);
    }
}

处理器类

package cw.springmvc.controller;
import cw.springmvc.exception.AgeException;
import cw.springmvc.exception.MyUserException;
import cw.springmvc.exception.NameException;
import cw.springmvc.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.sound.midi.Soundbank;
import java.util.ArrayList;
import java.util.List;
/**
 * ClassName: MyController
 * Package: cw.springmvc.controller
 * Description:
 *
 * @Author tcw
 * @Create 2023-05-21 20:24
 * @Version 1.0
 */
@Controller
public class MyController {
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(String name, Integer age) throws MyUserException {
        ModelAndView mv = new ModelAndView();
        // 根据请求参数抛出异常,将异常交给SpringMVC框架处理
        if (!"admin".equals(name)) {
            throw new NameException("用户名不正确.");
        }
        if (age == null || age < 0) {
            throw new AgeException("年龄不正确.");
        }
        mv.addObject("name", name);
        mv.addObject("age", age);
        mv.setViewName("show");
        return mv;
    }
}

异常处理器

  • 当控制器发生异常时,会停止控制器方法的执行,跳转到异常处理器类中,进行处理异常方法的匹配
  • 异常处理类,也是组件,所以需要配置包扫描,进行异常处理类组件扫描
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice {
    @AliasFor("basePackages")
    String[] value() default {};
    @AliasFor("value")
    String[] basePackages() default {};
    Class<?>[] basePackageClasses() default {};
    Class<?>[] assignableTypes() default {};
    Class<? extends Annotation>[] annotations() default {};
}
  • @ControllerAdvice:标注该类是异常处理类
  • @ExceptionHandler:标注异常处理方法处理的异常类型,如果没有指定处理的异常类型,那么该方法就是用于处理没有异常处理方法匹配的异常,没有指定处理的异常类型的方法只能有一个
  • 要使用这两个注解,需要在SpringMVC配置文件中配置注解驱动
package cw.springmvc.handler;
import cw.springmvc.exception.AgeException;
import cw.springmvc.exception.NameException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
/**
 * ClassName: GlobalExceptionHandler
 * Package: cw.springmvc.handler
 * Description:
 * 全局异常处理器
 * ControllerAdvice注解:控制器通知、控制器增强
 * 给控制器增加功能,增加异常处理功能
 * ControllerAdvice注解使用在类上
 * 对于控制器通知组件需要配置组件扫描器
 *
 * @Author tcw
 * @Create 2023-06-05 22:39
 * @Version 1.0
 */
// 标注为控制器异常处理组件
@ControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 定义方法,处理发生的异常
     * 处理异常的方法和控制器方法的定义方式一样,
     * 控制器方法可以怎么定义,处理异常的方法就可以怎么定义
     *
     * 处理NameException的异常
     *
     * @param e 表示Controller中抛出的异常对象
     *          通过这个形参可以获取发生的异常信息
     * @return
     */
    // @ExceptionHandler(异常的class):表示该方法处理异常的类型
    @ExceptionHandler(value = {NameException.class})
    public ModelAndView doNameException(Exception e) {
        // 异常的处理逻辑:
        // 1.需要把异常记录下来,记录到数据库或日志文件
        //   记录日志发生的时间、哪个方法发生、异常错误的内容
        // 2.发送通知,把异常的信息通过邮件、短信、微信发送给相关人员
        // 3.给用户友好的提示
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "用户名必须是admin");
        mv.addObject("exception", e);
        mv.setViewName("nameError");
        return mv;
    }
    /**
     * 处理年龄异常 AgeException
     *
     * @param e 异常对象
     * @return
     */
    @ExceptionHandler(value = {AgeException.class})
    public ModelAndView doAgeException(Exception e) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "年龄不能为空,且应该大于0");
        mv.addObject("exception", e);
        mv.setViewName("ageError");
        return mv;
    }
    /**
     * 处理其他异常,处理没有相匹配的异常处理方法的异常
     * 会先与有指定处理具体异常的方法进行匹配,都不能处理发生的异常
     * 即没有方法匹配
     * 就使用该方法进行处理,使用没有指定具体处理异常类型的方法处理
     * 只能有一个默认处理异常的
     *
     * @param e 异常对象
     * @return
     */
    @ExceptionHandler
    public ModelAndView doOtherException(Exception e) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "未知异常");
        mv.addObject("exception", e);
        mv.setViewName("defaultError");
        return mv;
    }
}

JSP

  • show.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<p>姓名:${name}</p>
<p>年龄:${age}</p>
</body>
</html>
  • ageError.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>年龄异常</h1>
<p>${msg}</p>
<p>${exception.message}</p>
</body>
</html>
  • nameError.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>姓名异常</h1>
<p>${msg}</p>
<p>${exception.message}</p>
</body>
</html>
  • defaultError.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>未知异常</h1>
<p>${msg}</p>
<p>${exception.message}</p>
</body>
</html>
  • index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="./some.do" method="post">
    name:<input type="text" name="name"><br/>
    age:<input type="text" name="age"><br/>
    <input type="submit" name="submit"><br/>
</form>
</body>
</html>


相关文章
|
11天前
|
前端开发 Java API
Java入门教程:掌握Spring MVC的双向数据绑定技术
以上步骤展示了如何利用 Spring MVC 实现双向数据绑定:从显示表单、提交表单、验证输入、直至返回结果页面都涉及到不同层次间交互过程,在整个过程都无需手动去编写繁琐代码去手动获取或设置每一项值。
93 20
|
22天前
|
Java
Java 数组学习笔记
本文整理Java数组常用操作:遍历、求和、查找、最值及二维数组行求和等典型练习,涵盖静态初始化、元素翻倍、去极值求平均等实例,帮助掌握数组基础与应用。
|
22天前
|
小程序 Java 知识图谱
Java 学习笔记 —— BMI & BMR 计算器
这是一个使用 Java 编写的 BMI 与 BMR 计算器小程序,可输入年龄、性别、身高和体重,计算身体质量指数(BMI)和基础代谢率(BMR),并输出健康评估结果。通过该项目,掌握了 Java 的输入处理、数据验证、条件判断、数学运算及格式化输出等基础知识,是 Java 初学者的理想练习项目。
|
2月前
|
前端开发 Java 开发者
Java新手指南:在Spring MVC中使用查询字符串与参数
通过结合实际的需求和业务逻辑,开发者可以灵活地利用这些机制,为用户提供更丰富而高效的Web应用体验。
85 15
|
3月前
|
JSON 前端开发 Java
Java新手指南:如何在Spring MVC中处理请求参数
处理Spring MVC中的请求参数是通过控制器方法中的注解来完成的。这些注解包括 `@RequestParam`, `@PathVariable`, `@ModelAttribute`, `@RequestBody`, `@RequestHeader`, `@Valid`, 和 `@RequestMapping`。使用这些注解可以轻松从HTTP请求中提取所需信息,例如URL参数、表单数据或者JSON请求体,并将其转换成Java对象以供进一步处理。
242 17
|
4月前
|
Java API 微服务
2025 年 Java 从入门到精通学习笔记全新版
《Java学习笔记:从入门到精通(2025更新版)》是一本全面覆盖Java开发核心技能的指南,适合零基础到高级开发者。内容包括Java基础(如开发环境配置、核心语法增强)、面向对象编程(密封类、接口增强)、进阶技术(虚拟线程、结构化并发、向量API)、实用类库与框架(HTTP客户端、Spring Boot)、微服务与云原生(容器化、Kubernetes)、响应式编程(Reactor、WebFlux)、函数式编程(Stream API)、测试技术(JUnit 5、Mockito)、数据持久化(JPA、R2DBC)以及实战项目(Todo应用)。
229 5
|
5月前
|
Java 区块链 网络架构
酷阿鲸森林农场:Java 区块链系统中的 P2P 区块同步与节点自动加入机制
本文介绍了基于 Java 的去中心化区块链电商系统设计与实现,重点探讨了 P2P 网络在酷阿鲸森林农场项目中的应用。通过节点自动发现、区块广播同步及链校验功能,系统实现了无需中心服务器的点对点网络架构。文章详细解析了核心代码逻辑,包括 P2P 服务端监听、客户端广播新区块及节点列表自动获取等环节,并提出了消息签名验证、WebSocket 替代 Socket 等优化方向。该系统不仅适用于农业电商,还可扩展至教育、物流等领域,构建可信数据链条。
|
7月前
|
存储 Java
# 【Java全栈学习笔记-U1-day02】变量+数据类型+运算符
本篇笔记主要围绕Java全栈学习的第二天内容展开,涵盖了变量、数据类型、运算符以及Scanner类的应用。首先介绍了变量的概念与命名规范,以及如何定义和使用变量;接着详细讲解了Java中的基本数据类型,包括整型、浮点型、字符型、布尔型等,并通过实例演示了数据类型的运用。随后,深入探讨了各类运算符(赋值、算术、关系、逻辑)及其优先级,帮助理解表达式的构成。最后,介绍了如何利用Scanner类实现用户输入功能,并通过多个综合示例(如计算圆面积、购物打折、变量交换及银行利息计算)巩固所学知识。完成相关作业将进一步加深对这些基础概念的理解与实践能力。
108 13
|
7月前
|
开发框架 Java 开发工具
【Java全栈学习笔记-U1-day01】Java介绍
本笔记整理了Java学习的基础内容,涵盖程序理解、Java语言特性、JDK安装与配置、Java程序开发工具及编写步骤。重点介绍了Java程序的基本结构、编译和运行过程,以及输出语句的使用。通过实例演示了IDEA创建Java程序的方法,并强调了编码规范和注意事项。适合初学者复习和交流学习。 主要内容: 1. 理解程序:计算机组成、程序定义。 2. 简介:Java语言特点、技术平台、JDK作用。 3. 编写Java程序:编写、编译、运行步骤,基本结构。 4. 输出语句 5. DEA使用:新建工程、保存位置、文件介绍、新建类。 6. 扩展:注释、代码规范、大小写敏感、缩进等。
|
11月前
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
192 0

热门文章

最新文章