springMVC_day05_

本文详细解析了SpringMVC框架的使用,包括@Controller、@RequestMapping的运用,请求映射、异常处理、图片上传及JSON数据交互等核心功能,帮助企业级应用开发更高效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@RequestMapping的使用

  • 放在方法上使用:URL到方法之间的映射
  • 放在类上使用,多一级目录访问,分模块化管理
  • 限制请求方式访问

Controller返回值类型

1. ModelAndView

  • Model : 模型,封装数据
  • View  :视图,封装视图地址用的

2. String

2.1 简单String类型

不包含关键字:forward,redirect关键字的,被称为是简单类型的String

默认为视图名称,走视图解析器

2.2 复杂String类型

包含关键字的:forward,redirect

  URLRequest域传递参数
forward请求转发不变不变Request,Model
redirect重定向Session,Model

说明

  • Model底层是基于Request域来开发的,只封装了Request.setArr***(),
  • Request域变了以后不能传递参数,但是Model可以
  • Model重定向的情况下给后面加了?参数
  • Model不能接收请求参数,Model传递参数就行

2.3 void 类型

在企业中不用!!!

SpringMVC异常处理

运行时异常(系统异常)

BUG

int i = 1/0;

预期异常

根据我们的业务参数非法输入的这种异常被称为预期异常

捕获异常类:在容器中存在的,随时等待捕获异常!

步骤

  • 编写异常类
  • 编写捕获异常类(实现HandlerExceptionResolver接口)
  • springmvc配置文件中配置捕获异常类

案例

package com.itheima.exception;

/**
 * @ClassName: ItemException
 * @Description:异常类
 */
public class ItemException extends Exception{

	private String message;

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public ItemException() {
		super();
	}
	
	public ItemException(String message) {
		super();
		this.message = message;
	}

	
}
package com.itheima.exception;

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

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

/**
 * @ClassName: GlobalException
 * @Description:捕获异常
 * @author jsz
 * @date 2018年9月8日
 */
public class GlobalException implements HandlerExceptionResolver {

	@Override
	public ModelAndView resolveException(HttpServletRequest requset, HttpServletResponse response, Object arg2,
			Exception exc) {
		ItemException exception = null;

		// 判断捕获的异常是否为自定的商品异常
		if (exc instanceof ItemException) {
			exception = (ItemException) exc;
		} else {
			// 是系统异常
			// 企业化操作:
			// 1、通过栈中获取异常信息,写入日志
			// 2、发短信给维护人员,获取开发者
			// 3、发邮件维护人员,获取开发者

			exception = new ItemException("不好意思,系统繁忙请稍后重试...");
		}

		ModelAndView mv = new ModelAndView();
		// 封装数据
		mv.addObject("message", exception.getMessage());
		// 返回页面
		mv.setViewName("error");
		return mv;
	}

}
<!-- 配置捕获异常类 -->
<bean class="com.itheima.exception.GlobalException"></bean>

图片上传

图片服务器

  • 阿里云——OSS文件存储
  • 七牛云存储
  • FSDTDFS

Tomcat服务器

能不能直接访问图片,能

但是Nginx服务器负载均衡的时候,有的服务器会访问不到图片

什么实现图片上传

SpringMVC帮我们实现了图片上传的接口,但是没有实现,谁来实现?第三方jar:两个

我们需要在SpringMVC核心配置文件中配置图片上传的属性

步骤

  • 页面提交from表单的时候,enctype = "multipart/from-data"
  • 在方法形参中接收 MultiPartFile 形参名必须和input type = file name属性名一致
  • 获取文件全名
  • 截取文件后缀名
  • 起别名+后缀名
  • 写入磁盘
  • 保存数据库

案例

页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>修改商品信息</title>

</head>
<body> 
	<!-- 上传图片是需要指定属性 enctype="multipart/form-data" -->
	<form id="itemForm" action="${pageContext.request.contextPath }/updateItem.action" method="post" enctype="multipart/form-data">
		<input type="hidden" name="id" value="${item.id }" /> 修改商品信息:
		<table width="100%" border=1>
			<tr>
				<td>商品名称</td>
				<td><input type="text" name="name" value="${item.name }" /></td>
			</tr>
			<tr>
				<td>商品价格</td>
				<td><input type="text" name="price" value="${item.price }" /></td>
			</tr>
			 
			<tr>
				<td>商品生产日期</td>
				<td><input type="text" name="createtime"
					value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>" /></td>
			</tr>
		
			<tr>
				<td>商品图片</td>
				<td>
					<c:if test="${item.pic !=null}">
						<img src="/pic/${item.pic}" width=100 height=100/>
						<br/>
					</c:if>
					<input type="file"  name="pictureFile"/> 
				</td>
			</tr>
			
			<tr>
				<td>商品简介</td>
				<td><textarea rows="3" cols="30" name="detail">${item.detail }</textarea>
				</td>
			</tr>
			<tr>
				<td colspan="2" align="center"><input type="submit" value="提交" />
				</td>
			</tr>
		</table>

	</form>
</body>

</html>

controller

package com.itheima.controller;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.itheima.exception.ItemException;
import com.itheima.pojo.Items;
import com.itheima.pojo.QueryVo;
import com.itheima.service.ItenService;

@Controller
public class ItemController {

	@Autowired
	private ItenService itemService;

	/**
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("itemEdit")
	public String itemEdit(HttpServletRequest request, Model model) throws Exception {// Model:模型,封装数据传递用的
		// 获取参数
		String idStr = request.getParameter("id");
		// 根据商品ID查询商品信息
		Items items = itemService.findItemById(Integer.parseInt(idStr));

		if (items == null) {
			throw new ItemException("不好意思,没有找到商品");
		}
		// 封装数据传给页面
		model.addAttribute("item", items);

		return "editItem";
	}

	
	/**
	 * @MethodName:updateItem
	 * @Description:
	 * @param pictureFile
	 * @param item
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("updateItem")
	public String updateItem(MultipartFile pictureFile, Items item, Model model) throws Exception {
		@RequestMapping("updateItem")
	public String updateItem(MultipartFile pictureFile, Items item, Model model) throws Exception {
		// 获取上传的图片名称
		String fileName = pictureFile.getOriginalFilename();
		// 获取图片的后缀名
		String houzhui = fileName.substring(fileName.lastIndexOf("."));
		// 起别名
		String newFileName = UUID.randomUUID().toString() + houzhui;
		// 写入磁盘
		pictureFile.transferTo(new File("D:/picture"));
		// 保存
		item.setPic(newFileName);
		// 根据商品ID修改商品信息
		itemService.updateItemById(item);
		// 请求转发到商品修改页面
		model.addAttribute("id", item.getId());
		// 当重定向本Controller中的方法的话,不用加/
		return "redirect:itemEdit.action";
	}

}

JSON数据交互

注解驱动下的数据交互

SpringMVC帮我们写了json数据交互的接口但是没有实现,谁来实现的?第三方jar:三个

只要我们配置了注解驱动那么就和SpringMVC框完美结合了,不用再SpringMVC核心配置问中配置了

常用注解

  • @RequestBody

作用:

读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容(json数据)转换为java对象并绑定到Controller方法的参数上

把json数据转成java对象,根据json中Key和对象属性之间映射的

 

 

  • @ResponseBody

将Controller的方法返回的对象,通过springmvc提供的HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端

把java对象转成json数据

案例

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.4.4.min.js"></script>
<title>查询商品列表</title>
<script type="text/javascript">
		function requestJSON(){
			$.ajax({
				type:"post",
				url:"${pageContext.request.contextPath }/requestJson.action",
				contentType:"application/json;charset=utf-8",
				data:'{"name":"测试商品","price":99.9}',
				success:function(data){
					alert(data);
				}
			});
		}

</script>
</head>
<body> 
<form action="${pageContext.request.contextPath }/item/queryitem.action" method="post">
查询条件:
<table width="100%" border=1>
<tr>
<td><input type="button" value="requestJSON" onclick="requestJSON()"/></td>
<td><input type="submit" value="查询"/></td>
</tr>
</table>
商品列表:
<table width="100%" border=1>
<tr>
	<td>商品名称</td>
	<td>商品价格</td>
	<td>生产日期</td>
	<td>商品描述</td>
	<td>操作</td>
</tr>
<c:forEach items="${itemList }" var="item">
<tr>
	<td>${item.name }</td>
	<td>${item.price }</td>
	<td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
	<td>${item.detail }</td>
	
	<td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>

</tr>
</c:forEach>

</table>
</form>
</body>

</html>
package com.itheima.controller;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.itheima.exception.ItemException;
import com.itheima.pojo.Items;
import com.itheima.pojo.QueryVo;
import com.itheima.service.ItenService;

@Controller
public class ItemController {

	@Autowired
	private ItenService itemService;

	@RequestMapping("list")
	public String itemList(Model model) {
		List<Items> list = itemService.findAllItem();
		// 封装数据传给页面
		model.addAttribute("itemList", list);
		return "itemList";
	}
	
	@RequestMapping("requestJson")
	@ResponseBody
	public Items requestJson(@RequestBody Items item){
		return item;
	}

}

不使用注解驱动

需要给处理器适配器配置json转换器,参考之前学习的自定义参数绑定

<!--处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
	<property name="messageConverters">
		<list>
			<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
		</list>
	</property>
</bean>

 

 

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态感器,它集成了三轴陀螺仪和三轴加速度计。这款感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化感器、读取数据等方法。例如,`begin()`函数用于设置感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值