SpringMVC框架之第三篇

2.高级参数绑定(重点)
			2.1.数组类型
			数组类型的参数可以传递一批相同的数据到Controller的方法中。
			2.1.1.需求
			批量删除:在商品列表页面选中多个商品,然后删除。
			2.1.2.需求分析
			此功能要求商品列表页面中的每个商品前有一个checkbook,选中多个商品后点击删除按钮把商品id传递给Controller,根据商品id删除商品信息。
			功能分解
			前端:1)能选中多个商品;2)能提交选中的多个商品
			后端:1)能接收到选中商品的id;2)进行删除处理
			2.1.3.演示代码
			1.Jsp
			可以重新创建一个专门演示批量删除的画面【itemListDelBatch.jsp】,利用原来的itemList.jsp拷贝一个,然后在表格的最前面增加一列checkbox。
			【itemListDelBatch.jsp】
			<%@ 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> 
				<form action="${pageContext.request.contextPath }/delAll.action" method="post">
					查询条件:
					<table width="100%" border=1>
						<tr>
							<td><input type="submit" value="批量删除"/></td>
						</tr>
					</table>
					商品列表:
					<table width="100%" border=1>
						<tr>
							<td></td>
							<td>商品名称</td>
							<td>商品价格</td>
							<td>生产日期</td>
							<td>商品描述</td>
							<td>操作</td>
						</tr>
						<c:forEach items="${itemList }" var="item">
						<tr>
							<td><input type="checkbox" name="ids" value="${item.id }" /></td>
							<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 }/toEdit.action?id=${item.id}">修改</a></td>
						</tr>
						</c:forEach>
					</table>
				</form>
			</body>
			</html>
			2.Controller
			【ItemsController.java】先定义一个方法用于itemListDelBatch.jsp页面的显示:
				@RequestMapping("/listForDel")
				public ModelAndView getListForDel() throws Exception {
					List<Items> itemsList = itemsService.getItemsList();
					ModelAndView modelAndView = new ModelAndView();
					// request.setAttribute(key, value)
					// 底层仍然是把属性名和属性值放到request对象中
					// jsp页面永远是从request对象中取得数据的
					modelAndView.addObject("itemsList", itemsList);
					modelAndView.setViewName("items/itemListDelBatch");
					return modelAndView;
				}
				


			然后再定义一个执行删除的方法(这里主要是学习如何传参数,不做具体的删除操作)
			方式一:直接传递数组参数
			·传参规范:页面上input框的name属性值必须等于接收时数组参数的变量名称。
				/**
				 * 演示接收数组(直接接收数组)
				 */
				@RequestMapping("/delAll")
				public String delAll(Integer[] ids) throws Exception {
					// 批量删除:可以循环这个ids数组,逐条删除即可。
					return "success";
				}

			方式二:在Vo中传递数组参数
			【QueryVo.java】
			package cn.baidu.pojo;

			import java.util.List;

			public class QueryVo {

				private Integer[] ids;

				// getter/setter方法。。。。。。
			}	

			·传参规范:页面上input框的name属性值必须等于接收时Vo中数组类型属性的变量名称。
				/**
				 * 演示接收数组(用Vo传递数组)
				 */
				@RequestMapping("/delAll")
				public String delAll(QueryVo vo) throws Exception {
					// 批量删除:可以循环这个Vo中的ids数组,逐条删除即可。
					return "success";
				}

			2.1.4.传参规范
			总结上面两种规范:Input框的name与Controller方法参数中的数组名要相同。(无论数组定义在方法形参中还是定义在形参Vo中)
			2.2.List集合类型
			可以利用List集合类型的参数传递多条数据进行批量处理。比如批量更新。
			2.2.1.需求
			批量更新:实现商品数据的批量修改。
			2.2.2.需求分析
			要想实现商品数据的批量修改,需要在商品列表中可以对商品信息进行修改,并且可以批量提交修改后的商品数据。提交的数据应该是一个List。
			功能分解:
				前端:1)列表改成input输入框;2)定义改好的input框的name属性;
				后端:1)能接收到提交过来的更新数据;2)批量更新处理
			2.2.3.演示代码
			1.接收商品列表的pojo
			注意:SpringMVC不能直接传递List集合类型的参数,必须包装在Vo中。这是SpringMVC框架的强制要求。
			【QueryVo.java】
			package cn.baidu.pojo;

			import java.util.List;

			public class QueryVo {

				private List<Items> updateItemsList;
				
				// setter/getter方法。。。。。。。

			}	

			2.Jsp
			可以重新创建一个专门演示批量更新的画面【itemListUpdBatch.jsp】,利用原来的itemList.jsp拷贝一个,然后将表格中的项目都改成input输入框,可以直接修改数据。
			【itemListUpdBatch.jsp】代码如下: 
			<%@ 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> 
			<form action="${pageContext.request.contextPath }/updateAll.action" method="post">
			查询条件:
			<table width="100%" border=1>
			<tr>
			<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" varStatus="status"> <!-- status.index表示集合的下标,从0开始 -->
			<tr>
				<td><input type="text" name="updateItemsList[${status.index }].name" value="${item.name }" /></td>
				<td><input type="text" name="updateItemsList[${status.index }].price" value="${item.price }" /></td>
				<td><input type="text" name="updateItemsList[${status.index }].createtime" value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>" /></td>
				<td><input type="text" name="updateItemsList[${status.index }].detail" value="${item.detail }" /></td>
				
				<td><input type="hidden" name="updateItemsList[${status.index }].id" value="${item.id}" />
					<a href="${pageContext.request.contextPath }/toEdit.action?id=${item.id}">修改</a>
				</td>
			</tr>
			</c:forEach>
			</table>
			</form>
			</body>

			</html>
			附:
			varStatus属性常用参数总结下:
			${status.index}      输出行号,从0开始。
			${status.count}      输出行号,从1开始。
			${status.current}   当前这次迭代的(集合中的)项
			${status.first}  判断当前项是否为集合中的第一项,返回值为truefalse
			${status.last}   判断当前项是否为集合中的最后一项,返回值为truefalse
			begin属性、end属性、step属性分别表示:起始序号,结束序号,跳跃步伐。

			3.Controller
			【ItemsController.java】先定义一个方法用于itemListDelBatch.jsp页面的显示:
				@RequestMapping("/listForUpd")
				public ModelAndView getListForUpd() throws Exception {
					List<Items> itemsList = itemsService.getItemsList();
					ModelAndView modelAndView = new ModelAndView();
					// request.setAttribute(key, value)
					// 底层仍然是把属性名和属性值放到request对象中
					// jsp页面永远是从request对象中取得数据的
					modelAndView.addObject("itemsList", itemsList);
					modelAndView.setViewName("items/itemListUpdBatch");
					return modelAndView;
				}

			再定义一个方法,用来更新处理。这里不做具体的更新,我们主要学习如何接收List参数。
				/**
				 * 演示接收List
				 */
				@RequestMapping("/updateAll")
				public String updateAll(QueryVo vo) throws Exception {
					System.out.println(vo);
					
					// 批量修改:遍历List,逐个修改。
					return "success";
				}

			2.2.4.传参规范
			1.SpringMVC不能直接传递List集合类型的参数,必须包装在java bean中。这是SpringMVC框架的强制要求。
			2.页面上input框的name属性值必须等于Controller方法形参java bean中List属性名 + [集合下标] + . + List泛型中的属性名。
			例如:
			<input type="text" name="itemsUpdLst[${status.index }].name" value="${item.name }" />







			3.@RequestMapping(重点)
			注解@RequestMapping控制着url到请求方法的映射,对url能访问到Controller中正确的响应方法起到了至关重要的作用。
			3.1.使用在方法上
			标记url到请求方法的映射,即通过一段url找到Controller中对应的方法。这个在以前的示例中已经练习了。
			3.2.使用在类上
			官方的说法叫做窄化请求映射,其实就是为了防止你和你的同事起的url重名,在类上多给url加了一层目录。
			【ItemsController.java】的修改:
			@Controller
			@RequestMapping("/items")
			public class ItemsController {
			。。。。。。
			}
			访问地址从【http://localhost:8080/ssm-1/list.action】变成了【http://localhost:8080/ssm-1/items/list.action】,多了一层【/items】目录。
			注意:
			此时SpringMVC.xml中的视图解析器的前缀的开头要加斜杠/WEB-INF/jsp,如果写成WEB-INF/jsp就会被SpringMVC认为是相对路径,直接拼在类上面@RequestMapping中url的后面。
			3.3.限制请求类型
			1.Http请求类型:post、get、put、delete等,不过put、delete现在已经很少使用了。
			2.post与get:
			必须明确指定是post时,才是post请求;否则默认是get请求。
			在浏览器中输入url提交的请求是get请求。
			3.@RequestMapping使用方式:
			a)默认方式:之前使用@RequestMapping都是它的默认使用方式,默认的@RequestMapping支持所有的Http请求类型。
			b)正常方式:@RequestMapping(value=”具体url路径”, method=某一种http请求类型)
			指定了Http请求类型就限制只能用指定的请求类型提交请求。
			c)多请求方式:@RequestMapping(value=”具体url路径”, method={请求类型1, 请求类型2,……})
			4.示例:
			◆限定只允许GET方法访问:
					@RequestMapping(value=/list”, method = RequestMethod.GET)
			◆限定只允许POST方法访问:
					@RequestMapping(value=/list”, method = RequestMethod.POST) 
			◆GET和POST方法都可以:
					@RequestMapping(value=/list”, method = {RequestMethod.POST, RequestMethod.GET })@RequestMapping(/list”)

			以商品列表画面的访问为例,是通过get方式访问的,因此可以在@RequestMapping的method属性中设置请求的类型是【RequestMethod.GET】:
				@RequestMapping(value="/list", method=RequestMethod.GET)
				public ModelAndView itemsList() throws Exception {
					
					List<Items> itemsList = itemsService.findItemsList();

					// 1. 设置返回页面需要的数据    2. 指定返回页面的地址
					ModelAndView modelAndView = new ModelAndView();
					
					// 1. 设置返回页面需要的数据
					modelAndView.addObject("itemList", itemsList);
					
					// 2. 逻辑视图名称的设置(就是视图文件的文件名)
					modelAndView.setViewName("itemList");

					return modelAndView;
				}
				尝试是否能访问成功。
				然后把【RequestMethod.GET】改成【RequestMethod.POST】,再试一次,会报405错误:
					HTTP Status 405 - Request method 'GET' not supported
				这说明请求访问受限了。
				同样如果用POST方法访问【RequestMethod.GET】修饰的URL也会报405错误:
					HTTP Status 405 - Request method 'POST' not supported
			3.4.用途
			大家是不是有一个疑问,感觉这个功能多余,还不如不限制。是的,如果在传统web系统中这个限制功能使用的很少。但在RESTful的url中十分有用。
			4.Controller方法的返回值(重点)
			提到Controller方法的返回值主要指两方面内容:
			1.怎样指定返回页面的路径?
			2.怎样指定返回页面的数据?
			4.1.ModelAndView模型和视图
			可以调用里面的方法指定页面的地址;还可以调用里面的方法指定返回给页面的数据。
			这个在第一天的内容中已经介绍过了。这里就不多说了。
			4.2.字符串
			4.2.1.返回普通的字符串
			Controller方法如果返回的是普通字符串,那就是视图文件的逻辑视图名或者是视图文件的物理地址。这个在第一天的代码示例中已经介绍过了,这里不多说了。
			对于处理好的数据可以借助于默认的参数Model将数据返回给页面。
			4.2.2.请求转发与重定向
			1.请求转发和重定向的特征(也是区别):
			请求转发时浏览器中URL不发生改变,说明还是在同一个请求中,因此request对象是一个,request域中的数据可以带到转发后的方法中。
			重定向时浏览器中的URL发生改变,说明是重新发起了一个请求,因此request对象不是一个,重定向前request域中的数据不能带到重定向后的方法中。
			4.2.3.请求转发字符串
			1.SpringMVC中请求转发的字符串特征:
			返回的字符串中以【forward:】开头,后面跟转发的URL路径。
			这个URL必须是Controller方法上@RequestMapping注解配置的URL。这样就可以转发到对应的方法中进行处理然后返回给页面。
			2.对代码的改造:
			比如:我们可以设计在商品的详细修改页面点击【保存】后,又重新回到详细页面。用请求转发的方式转发到商品详细页面的检索方法【itemEdit】中。
			具体改造代码【ItemsController.java】:
				/**
				 * 演示请求转发:
				 * 	在Controller方法返回的字符串中以【forward:】开头为请求转发,后面跟转发的url路径
				 */
				@RequestMapping("/update")
				public String updateItems(Items items, Model model) throws Exception {
					itemsService.updateItems(items); 
					// 将转发后商品详细信息查询需要的主键id传递过去。
					// 用model可以,因为在底层model仍然是把数据放到了request域中。 
					model.addAttribute("id", items.getId());
					// 因为jsp是从request对象中接收参数,因此也可以直接用request对象直接传值。
					// 也可以直接用request对象直接传。

					// 请求转发
					return "forward:toEdit.action";
				}

			因为请求转发前后的request对象是同一个,所以也可以直接用request对象直接传值:
				/**
				 * 演示请求转发:
				 * 	在Controller方法返回的字符串中以【forward:】开头为请求转发,后面跟转发的url路径
				 */
				@RequestMapping("/update")
				public String updateItems(Items items, Model model, HttpServletRequest request) throws Exception {
					itemsService.updateItems(items); 
					// 也可以直接用request对象直接传。
					request.setAttribute("id", items.getId());

					// 请求转发
					return "forward:toEdit.action";
				}	

			4.2.4.重定向字符串
			1.重定向的字符串特征:
			返回的字符串中以【redirect:】开头,后面跟重定向的URL路径。
			这个URL必须是Controller方法上@RequestMapping注解配置的URL。这样就可以转发到对应的方法中进行处理然后返回给页面。
			2.对代码的改造:
			还是上面的例子我们也可以用重定向来做,但重定向前和后是两个独立的request域,因此传递主键id时不能使用request对象来传递,只能通过model对象完成,底层model会把数据赋给新的request域中。
			具体代码【ItemsController.java】改造:
			可以先试一试看看用request对象是不是真的传递不过去。
				/**
				 * 演示重定向:
				 * 	在Controller方法返回的字符串中以【redirect:】开头的为重定向,后面跟重定向的url路径
				 */
				@RequestMapping("/update")
				public String updateItems(Items items, HttpServletRequest request, Model model) throws Exception {
					itemsService.updateItems(items);
					request.setAttribute("id", items.getId());
					return "redirect:toEdit.action";
				}
				此处用request设置了id,然后可以debug到【itemEdit】方法中看id能否传过去,结果是id无法传过去。
			使用model对象传值:
				/**
				 * 演示重定向:
				 * 	在Controller方法返回的字符串中以【redirect:】开头的为重定向,后面跟重定向的url路径
				 */
				@RequestMapping("/update")
				public String updateItems(Items items, Model model) throws Exception {
					itemsService.updateItems(items);
					// 将重定向后商品信息详细查询需要的主键id传递过去。
					model.addAttribute("id", items.getId());
					return "redirect:toEdit.action";
				}
			此处用Model设置了id,然后可以debug到【itemEdit】方法中看id能否传过去,结果id被传递到了【itemEdit】方法中。
			这就是为什么SpringMVC不推荐直接用request对象传值的原因,它自己定义了一个用于传值的对象Model,这样就不怕跨不同request对象的重定向传值问题了。
			也有人说还可以用session传递,这个没错,是可以传的,但是session在实际工作中是不可以随便往里面放数据的,session需要有项目负责人统一规划可以往里面放的数据,比如用户登录信息。因此不可以使用session。
			4.2.5.请求转发和重定向的路径写法为什么不以/开头
			1.这就是url的相对路径和绝对路径的问题。
			以【localhost:8080/ssm-1/items/toEdit.action】为例说明问题:
			url相对路径:相对于当前目录下的路径,示例中的当前目录是/items,当对于它下的相对路径是/toEdit.action
				url绝对路径:从项目名后开始的完整的url路径:/items/toEdit.action
			2.SpringMVC怎么才能区分出相对路径还是绝对路径呢?
			SpringMVC规定:在请求转发和重定向关键字后以斜杠/开头的url为绝对路径,不以斜杠/开头的是相对路径。
			由此可知:
			请求转发的相对路径:forward:toEdit.action
			请求转发的绝对路径:forward:/items/toEdit.action
			重定向的相对路径:redirect:toEdit.action
			重定向的绝对路径:redirect:/items/toEdit.action
			3.两种路径的使用范围:
			url相对路径:
			在Controller类上有@RequestMapping并且是在此Controller内部方法间跳转时可使用。
			url绝对路径:
			任何时候都可以使用,但是在跳转到其他Controller方法的时候必须用绝对路径。
				如果实在记不住:就一律用绝对路径。
			4.3.void
			如果使用void为返回值,那么就需要使用原生的HttpServletRequest,HttpServletResponse等,这样就不走SpringMVC的视图解析器,这样就破坏了SpringMVC的体系结构,所以一般不要使用。这里只是提一下。
			返回值为void一般在ajax的时候使用,用response.getWriter().write("。。。")返回数据
			示例代码【ItemsController.java】
				/**
				 * 演示void
				 */
				@RequestMapping("/update")
				public void updateItems(Items items, HttpServletRequest request, HttpServletResponse response) throws Exception {
					itemsService.updateItems(items); 
					request.setAttribute("id", items.getId());
					request.getRequestDispatcher("/WEB-INF/jsp/editItem.jsp").forward(request, response); 
					response.setCharacterEncoding("utf-8");
					response.setContentType("application/json;charset=utf-8");
					response.getWriter().write("json串");
				}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值