day55_springmvc

news2024/12/24 21:56:05

今日内容

零、 复习昨日

零、 复习昨日

1 maven项目编译后代码在target

2 发现代码都没有错,该写的都有,但是已启动服务器404,查看target,如果编译会后资源不全面,那就删除重新编译

3 重新看一下,如何使用mavne创建javaweb项目

一、参数绑定 【重点】

所谓参数绑定,就是前端发请求中的数据,可以直接在Controller的方法参数中接收.

即前端请求数据和后端方法参数绑定.

1.1 基本类型参数绑定[重点]

基本类型指,常用的几种类型: 基本类型+String+Date

前端页面

<h2>基本类型数据绑定</h2>
<a href="/base.do?id=1&username=张三&score=10.0">请求携带数据-基本类型</a>
<hr>
<form action="/base.do" method="get">
    id<input type="text" name="id"><br>
    username<input type="text" name="username"><br>
    score<input type="text" name="score"><br>
    birthday<input type="text" name="birthday"><br>
    <input type="submit" value="基本类型">
</form>

后端接收

@Controller
public class DataController {

    /**
     * 基本类型自动封装
     * 要求是: 前端请求的参数名,后端方法的参数名要一致
     * 【特殊的】 日期,前端发送的日期格式如果是yyyy-MM-dd,springmvc无法默认绑定参数,
     *            springmvc默认支持yyyy/MM/dd
     * 两种方案解决:
     *  1. 前端改,发出的日期格式就是yyyy/MM/dd即可
     *  2. 后端改,给日期参数加@DateTimeFormat(pattern = "yyyy-MM-dd")
     */
    @RequestMapping("/base")
    public String base(int id, String username, double score, @DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday){
        System.out.println("id = " + id);
        System.out.println("username = " + username);
        System.out.println("score = " + score);
        System.out.println("birthday = " + birthday);
        return "ok";
    }

}

1.2 对象[重点]

场景: 注册/添加/更新

实体类

public class User {

    private int id;
    private String username;
    private String password;
    private double score;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    // setget
}

前端

<h2>对象数据绑定</h2>
<form action="/obj.do" method="get">
    id<input type="text" name="id"><br>
    username<input type="text" name="username"><br>
    score<input type="text" name="score"><br>
    birthday<input type="date" name="birthday"><br>
    <input type="submit" value="对象类型">
</form>

后端

    /**
     * 自动绑定: 要求前端的请求中的参数要和对象的属性名一致
     */
    @RequestMapping("/obj")
    public String obj(User user){
        System.out.println("user = " + user);
        return "ok";
    }

1.3 数组

场景: 批量删除需要同时接收多个id, (前端是复选框的)

前端

<h2>数组绑定</h2>
<form action="/array.do" method="get">
     <input type="checkbox" name="ids" value="1">1
     <input type="checkbox" name="ids" value="2">2
     <input type="checkbox" name="ids" value="3">3
     <input type="checkbox" name="ids" value="4">4
    <input type="submit" value="数组类型">
</form>

后端

    /**
     * 自动绑定: 要求前端的请求中的参数要和方法参数名(数组名)一致
     */
    @RequestMapping("/array")
    public String array(int[] ids){
        System.out.println("ids = " + Arrays.toString(ids));
        return "ok";
    }

1.4 List集合

List集合使用场景与数组是一样的

前端

<h2>List绑定</h2>
<form action="/list.do" method="get">
    <input type="checkbox" name="skill" value="Java">Java
    <input type="checkbox" name="skill" value="HTML">HTML
    <input type="checkbox" name="skill" value="Linux">Linux
    <input type="submit" value="List类型">
</form>

SpringMVC默认是不支持直接封装List的,解决方案

    1. 加注解@RequestParam,就可以【推荐】
    1. 间接的封装List — 创建一个实体类,定义List属性

方案一

@RequestMapping("/list")
public String list(@RequestParam List<String> skill){
    System.out.println("skill = " + skill);
    return "ok";
}

方案二

public class User {

    private int id;
    private String username;
    private double score;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    private List<String> skill;  // 定义集合属性
    
	// setget    
}
    @RequestMapping("/list")
// 在封装对象数据时,封装list
    public String list(User user){
        System.out.println("user-skill = " + user.getSkill());
        return "ok";
    }

1.5 Map集合

Map是键值对,键和值一一映射.

跟Java对象很类似,属性和属性值一一对应.

所以什么时候需要/可以使用Map来接收参数?

  • 凡是可以用对象接收的都可以使用Map
  • 需要接收两个参数时,可以map

SpringMVC默认不支持直接将参数封装进Map,需要使用@RequestParam

前端

<h2>Map绑定</h2>
<form action="/map.do" method="get">
    id<input type="text" name="id"><br>
    username<input type="text" name="username"><br>
    score<input type="text" name="score"><br>
    birthday<input type="date" name="birthday"><br>
    <input type="submit" value="Map类型">
</form>
<h2>模糊查询-Map绑定</h2>
<form action="/map.do" method="get">
    address<input type="text" name="address"><br>
    floor<input type="text" name="floor"><br>
    deco<input type="text" name="deco"><br>
    <input type="submit" value="模糊-Map类型">
</form>
name就是map的key
输入框的值就是map的value

后台

    @RequestMapping("/map")
    public String map(@RequestParam Map<String,Object> map){
        System.out.println("map = " + map);
        return "ok";
    }

1.6 @RequestParam

当封装数据失败时使用该注解,该注解放在参数上

场景一:

前端参数和后端方法参数要一致才能封装数据,当不一致时可以使用@RequestParam来手动指定前端数据封装给参数

image-20230614141904931

场景二:

默认情况下,后端方法的参数列表一旦设置了该参数,就必须传值,不传值就会报错

但是设置@RequestParam(required = false)时就可以不用传值也不报错

image-20230614142411040

场景三:

当后端参数没有传值时,赋值默认值@RequestParam(defaultValue = “666666”)

image-20230614142652370

二、数据乱码

之前自己写过全局编码格式拦截器

现在springmvc提供了编码格式拦截器,直接用即可

    <!-- 编码格式拦截器 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

三、页面跳转

之前学过的servlet中跳转页面的功能

  • 请求转发:
    • forward
    • req.getDispatcherServlet().forward(req,resp)
    • 请求路径不变
    • 是服务器内部请求
    • 一次请求
    • 请求域的数据可以共享
  • 重定向
    • redirect
    • resp.sendRedirect();
    • 请求路径改变
    • 是浏览器行为
    • 两次请求
    • 请求域的不能共享

请求转发

注意: 默认在使用就是请求转发

在Controller的方法的返回值中写forward:路径即可完成跳转

例如: forward:/view/ok.html forward:/test.do

注意: 跳转后的路径要写完整

 /**
     * 演示请求转发至其他页面
     * @return
     */
    @RequestMapping("/forward")
    public String forward(){
        System.out.println("执行请求转发" );
        return "forward:/view/ok.html";
    }

    /**
     * 演示请求转发至其他请求
     * @return
     */
    @RequestMapping("/forward2")
    public String forward2(){
        System.out.println("执行请求转发" );
        return "forward:/test.do";
    }

重定向

在Controller的方法的返回值中写redirect:路径即可完成跳转

例如: redirect:/view/ok.html redirect:/test.do

注意: 跳转后的路径要写完整

   /**
     * 演示重定向至其他页面
     * @return
     */
    @RequestMapping("/redirect")
    public String redirect(){
        System.out.println("执行重定向" );
        return "redirect:/view/ok.html";
    }

    /**
     * 演示重定向至其他请求
     * @return
     */
    @RequestMapping("/redirect2")
    public String redirect2(){
        System.out.println("执行重定向" );
        return "redirect:/test.do";
    }

其他的请求转发和重定向的特点和之前学习的servlet是一样的,复习.

四、数据共享

数据共享是指: 数据域,即

  • request域
    • 只有在一次请求中有效,即请求转发后能取出
  • session域
    • 一次会话有效,只要会话不结束,无论请求转发还是重定向都能取出
package com.qf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 演示域对象(Request,Session)
 */
@Controller
public class ScopeController {

    @RequestMapping("/req")
    public String requestAndSession(HttpServletRequest request, HttpSession session) {

        // 存入
        request.setAttribute("req","req-Value");
        session.setAttribute("se","se-Value");

        return "forward:/req2.do";
    }


    @RequestMapping("/req2")
    public String requestAndSession2(HttpServletRequest request, HttpSession session) {

       // 取出
        String v1 = (String) request.getAttribute("req");
        System.out.println("v1 = " + v1);
        String v2 = (String) session.getAttribute("se");
        System.out.println("v2 = " + v2);

        return "ok";
    }
}

五、静态资源处理

目前,前端控制器(DispatcherServlet)类映射的是==*.do==,前端的静态资源例如:html,js,css,图片 等都是不影响加载的

但是,如果前端控制器(DispatcherServlet)类映射的是==/==,那就是所有请求都要经过前端控制器,静态资源也不例外. 那么此时静态资源是无法完成映射.

此时就需要静态资源处理!!!

web.xml文件

    <!-- 前端控制器 -->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <!-- 此处要改成 / ,这样才能映射匹配到所有请求 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

项目中定义一个css文件夹,定义一个css文件,在index.jsp页面中引入静态资源css,查看效果即可

image-20230613165553909

springmvc.xml文件

    <!-- 静态资源映射
        mapping="访问路径"
        location="本地资源位置"
		"/**" 前端的任何请求去匹配后台处于"/"下的静态资源
    -->
    <mvc:resources mapping="/**" location="/"/>

ps:

<mvc:default-servlet-handler/> 也行

六、拦截器 【重点】

6.1 作用

  • 之前用来做编码格式过滤
  • 登录认证
  • 等等

6.2 定义拦截器

  • 自定义类
  • 实现接口
  • 重写方法
  • springmvc.xml配置
package com.qf.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 拦截器类
 */
public class MyInterceptor implements HandlerInterceptor {

    /**
     * 目前Controller,执行前,执行拦截
     * 一般用于: 校验
     * @return  返回true,即认为放行,返回false不放行
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("前 pre" );
        // 写项目时,这里通过数据判断,来决定是返回true放行,还是返回false不放行
        return true;
    }

    /**
     * 在目标Controller方法执行完,但是afterCompletion方法前执行
     * 对目标方法的返回再处理,可以对响应再定制.
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("post" );
    }

    /**
     * 目标Controller的方法全部执行完执行
     * 一般: 资源回收
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("after" );
    }
}

以上方法是按需重写,一般来说用的是前置方法preHandle()

    <!-- 配置拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- mapping path: 要拦截的路径 -->
            <!-- <mvc:mapping path="/user/**"/>-->
            <mvc:mapping path="/**"/>
            <!-- exclude-mapping 排除拦截的 -->
            <mvc:exclude-mapping path="/login"/>
            <mvc:exclude-mapping path="/test.do"/>
            <!-- 指定拦截器类 -->
            <bean class="com.qf.interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

七、异常处理

以前处理异常

  • 抛出
  • 视图捕获

全靠自己在每个方法中处理异常

springmvc框架提供了一个全局的异常处理机制,可以处理Controller的所有异常

这种方法,集中管理异常


  • 建类
  • 实现接口
  • 重写方法
  • 配置
@Component // 配置到spring容器
public class MyExceptionHandler implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {

        ModelAndView mv = new ModelAndView( );

        if (ex instanceof ArithmeticException) {
            mv.setViewName("redirect:/view/500.html");
        } else if (ex instanceof AuthException) {
            mv.setViewName("redirect:/view/auth.html");
        }
        return mv;
    }
}

测试

后台Controller抛出异常,测试!

任务

重点: 参数绑定- 重复
删除数据发请求-接收
添加/注册/更新  -> 接收
批量删除 --> 接收

其中使用的注解要会
------------------------
重新整合spring和mybatis

--------------------------------------
思考:
写项目后端数据如何在页面展现?
方案1: 存储域,在jsp页面取值
方案2: 不用jsp,用html开发,后端数据如何给前端展现?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/656629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GPT LLM】跟着论文学习gpt

GPT1开山之作&#xff1a;Improving language understanding by generative pre-training 本文提出了gpt1&#xff0c;即使用无标签的数据对模型先进行训练&#xff0c;让模型学习能够适应各个任务的通用表示&#xff1b;后使用小部分 task-aware的数据对模型进行微调&#xff…

csdn编辑

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

【tensorflow】连续输入+离散输入的神经网络模型训练代码

【tensorflow】连续输入离散输入的神经网络模型训练代码 离散输入的转化问题 构造词典 创建离散数据、转化字典索引、创建连续数据 创建离散输入连续输入模型 训练输出 全部代码 - 复制即用 查看本系列三种模型写法&#xff1a;   【tensorflow】连续输入的线性回归模型训…

基于知识图谱的电影推荐系统——Neo4jPython

文章目录 1. 数据解下载与配置2. 将处理好的数据导入数据库中3. 执行项目 1. 数据解下载与配置 选择TMDB电影数据集&#xff0c;Netflix Prize 数据集下载。 也可直接从这里下载&#xff1a;链接: https://pan.baidu.com/s/1l6wjwcUzy5G_dIlVDbCkpw 提取码: pkq6 。 执行prep…

【AI】金融FinGPT模型

金融FinGPT模型开源&#xff0c;对标BloombergGPT&#xff0c;训练参数可从61.7亿减少为367万&#xff0c;可预测股价 继Bloomberg提出了500亿参数的BloombergGPT&#xff0c;GPT在金融领域的应用受到了广泛关注&#xff0c;但BloombergGPT是一个非开源的模型&#xff0c;而且…

【ESP32之旅】U8g2 在线仿真和UI调试

前言 几乎每个玩屏幕的电子DIYer都知道万能的屏幕驱动中间件u8g2库&#xff0c;这个库提供了强大的驱动适配和ui设计能力。但是官方没有一个好用的ui设计和仿真软件&#xff0c;在设计UI布局的时候对单片机频繁的烧录调试浪费了大量的时间。最近在论坛看到有一个第三方维护的在…

nginx映射后,公网通过域名无法访问到静态资源

今天发生一件奇怪的事情&#xff0c;首先是阿里云的数字DV证书中pgj.bw580.com和acc.bw580.com无缘无故的消失了&#xff0c; 接着查看https://pgj.bw580.com/css/chunk-ceb11154.aefc15d8.css&#xff0c;在跳板机中可以访问到该资源&#xff0c;但是通过外网能够访问。 通过防…

MySQL 中各种锁的详细介绍

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

P109认识和改造世界

认识世界的根本目的在于改造世界 认识和改造世界之间的辩证关系 感觉只喜欢考 必然和自由的辩证关系 人类创造历史的两个基本活动 &#xff1a; 认识和改造世界所以认识和改造世界的基础是实践 认识改造和三大界之间的联系 改造客观世界和改造主观世界之间的关系 认识世界…

台电x80HD 安装linux系统,可调电压电源供电,外网访问、3D打印klipper固件

一、系统安装 参照https://blog.csdn.net/gangtieren/article/details/102975027安装 安装过程遇到的问题&#xff1a; 1、试了 linux mint 21 、ubuntu20.04 、ubuntu22.04 都没有直接安装成功&#xff0c;u盘选择安装进入系统后一直黑屏&#xff0c;只有ubuntu18.04 选择后稍…

基于Eclipse+Java+Swing+Mysql实现学生成绩管理系统

基于EclipseJavaSwingMysql实现学生成绩管理系统 一、系统介绍二、功能展示1.登陆2.成绩浏览3.班级添加4.班级维护5.学生添加6、学生维护 三、数据库四、其它1.其他系统实现五.获取源码 一、系统介绍 学生&#xff1a;登陆、成绩浏览 管理员&#xff1a;登陆、班级添加、班级维…

多分支merge忽略文件合并

该文章已同步收录到我的博客网站&#xff0c;欢迎浏览我的博客网站&#xff0c;xhang’s blog 1. .gitattributes 文件的作用 .gitattributes 文件是 Git 版本控制系统中的一个配置文件&#xff0c;它用于指定 Git 如何处理文件的二进制数据&#xff0c;以及如何标识文件的类…

字节月薪23k软件测试工程师:必备的6大技能(建议收藏)

软件测试 随着软件开发行业的日益发展&#xff0c;岗位需求量和行业薪资都不断增长&#xff0c;想要入行的人也是越来越多&#xff0c;但不知道从哪里下手&#xff0c;今天&#xff0c;就给大家分享一下&#xff0c;软件测试行业都有哪些必会的方法和技术知识点&#xff0c;作…

夏天到了,给数据中心泼点“冷水”

气温上升&#xff0c;还有什么能比“工作没了”&#xff0c;更能让人一瞬间心里拔凉拔凉的呢&#xff1f; 这个“薪尽自然凉”的故事&#xff0c;就发生在数据中心。 前不久&#xff0c;某电商平台正在购物高峰期&#xff0c;结果IDC冷冻系统故障&#xff0c;机房设备温度快速升…

智能电动汽车充电桩系统及硬件电路研究 安科瑞 许敏

摘要&#xff1a;随着充电桩技术的发展&#xff0c;以及人们对电动汽车快速充电的需求&#xff0c;很多厂商开始对智能充电桩进行研究。以电动 汽车智能充电桩的发展现状为背景&#xff0c;进行了智能电动汽车充电桩系统硬件电路的研究。 关键词&#xff1a;充电桩&#xff1b…

文件转换工具类—基于jodconverter和pdfbox实现的可以自定义各类文件转换和水印

源码获取&#xff1a;原文地址 概览 需要依赖 <dependency><groupId>org.jodconverter</groupId><artifactId>jodconverter-local</artifactId><version>4.4.6</version> </dependency> <dependency><groupId>or…

【MyBatis学习】占位符,sql注入问题,like模糊匹配等可能出现一定的问题,赶快与我一同去了解,避免入坑吧 ! ! !

前言: 大家好,我是良辰丫,今天还是我们的mybatis的学习,主要内容有两个占位符,sql注入问题,like模糊匹配,以及多表查询等,不断提升我们的编程能力,加油哈! ! !&#x1f48c;&#x1f48c;&#x1f48c; &#x1f9d1;个人主页&#xff1a;良辰针不戳 &#x1f4d6;所属专栏&…

MP地面站下载和回放日志

参考 https://ardupilot.org/dev/docs/common-downloading-and-analyzing-data-logs-in-mission-planner.html#common-downloading-and-analyzing-data-logs-in-mission-planner 下载日志 首先连接上飞控 然后在下图页面下载日志&#xff1a; 点击下图下载日志 下载的日志会…

在CentOS 7上安装Python 3.9

前言 这是我在这个网站整理的笔记&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;RodmaChen 在CentOS 7上安装Python 3.9 一. 更新系统软件包二. 安装必要的软件包和依赖项三. 下载Python 3.9四. 解压和编译源代码五. 安装Python 3.9六. 验证安装 一. 更…

SpringCloud Alibaba-Seata分布式事务

SpringCloud Alibaba-Seata 1 常用事务解决方案模型1.1 DTP模型1.2 2PC1.3 3PC1.4 TCC 2 Seata2.1 Seata术语2.1 Seata AT模式2.1.1 AT模式及工作流程2.1.2 Seata-Server安装2.1.3 集成springcloud-alibaba 4.2 Seata TCC模式 3 Seata注册中心3.1 服务端注册中心配置3.2 客户端…