SpringMVC框架01
Spring MVC是Spring家族中的一个web成员,它是一种基于Java的实现了Web MVC设计思想的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring MVC也是要简化我们日常Web开发的。
1.MVC&SpringMVC框架概念及特点
(1)什么是MVC?
模型-视图-控制器(MVC)是一个众所周知的以设计界面应用程序为基础的设计思想。它主要通过分离模型、视图及控制器在应用程序中的角色将业务逻辑从界面中解耦。通常,模型负责封装应用程序数据在视图层展示。视图仅仅只是展示这些数据,不包含任何业务逻辑。控制器负责接收来自用户的请求,并调用后台服务(service或者dao)来处理业务逻辑。处理后,后台业务层可能会返回了一些数据在视图层展示。控制器收集这些数据及准备模型在视图层展示。MVC模式的核心思想是将业务逻辑从界面中分离出来,允许它们单独改变而不会相互影响。
具体操作:
(2)什么是SpringMVC?
Spring MVC是Spring家族中的一个web成员,它是一种基于Java的实现了Web MVC设计思想的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring MVC也是要简化我们日常Web开发的。
(3)SpringMVC的好处
1.让我们能非常简单的设计出干净的Web层;
2.进行更简洁的Web层的开发;
3.天生与Spring框架集成(如IOC容器、AOP等);
4.提供强大的约定大于配置的契约式编程支持;
5.能简单的进行Web层的单元测试;
6.支持灵活的URL到页面控制器的映射;
7.非常容易与其他视图技术集成,如jsp、Velocity、FreeMarker等等,因为模型数据不放在特定的API里,而是
放在一个Model里(Map数据结构实现,因此很容易被其他框架使用);
8.非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API;
9.支持灵活的本地化等解析;
10.更加简单的异常处理;
11.对静态资源的支持;
12.支持Restful风格。
2.SpringMVC请求流程&环境搭建
2.1 SpringMVC请求处理流程分析
Spring MVC框架也是一个基于请求驱动的Web框架,并且使用了前端控制器模式(是用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理来进行设计,再根据请求映射规则分发给相应的页面控制器(动作/处理器)进行处理。首先让我们整体看一下Spring MVC处理请求的流程:
1.首先用户发送请求,请求被SpringMvc前端控制器(DispatherServlet)捕获;
2. 前端控制器(DispatherServlet)对请求URL解析获取请求URI,根据URI,调用HandlerMapping;
3.前端控制器(DispatherServlet)获得返圍的HandlerExecutionChain(包括Handler对象以及Handler对象对应的拦截器);
4. DispatcherServlet 根据获得的HandlerExecutionChain,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler( ….. )方法);
5.HandlerAdapter根据请求的Handler适配并执行对应的Handler;HandlerAdapter(提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据配置,Spring将做一些额外的工作:HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息。
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等数据格式化:
数据格式化。如将字符串转换成格式化数字或格式化日期等。
6.Handler执行完毕,返回一个ModelAndView(即模型和视图)给HandlerAdaptor
7. HandlerAdaptor适配器将执行结果ModelAndView返回给前端控制器。
8.前端控制器接收到ModelAndView后,请求对应的视图解析器。
9.视图解析器解析ModelAndView后返回对应View;
10.渲染视图并返回渲染后的视图给前端控制器。
11、最终前端控制器将渲染后的页面响应给用户或客户端
2.2 SpringMVC环境搭建
(1)新建Maven webApp
(2)pom.xml坐标添加
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxxx</groupId>
<artifactId>springmvc01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>springmvc01 Maven Webapp</name>
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- spring web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<!--spring mvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<!--web servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
</dependencies>
<build>
<finalName>springmvc01</finalName>
<!-- 编译环境插件-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!--jetty插件 -->
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.27.v20200227</version>
<configuration>
<!-- 设置端口-->
<httpConnector>
<port>8080</port>
</httpConnector>
<!-- 设置项目路径 -->
<webAppConfig>
<contextPath>/springmvc01</contextPath>
</webAppConfig>
</configuration>
</plugin>
</plugins>
</build>
</project>
(3)servlet-context.xml配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- <!– 开启扫描器 -- >-->
<context:component-scan base-package="com.xxxx.springmvc.controller"/>
<!-- <!– 使用默认的 Servlet 来响应静态文件 -- >-->
<mvc:default-servlet-handler/>
<!-- 开启注解驱动 -->
<mvc:annotation-driven/>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!--前缀:在WEB-INF目录下的jsp目录下 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 后缀:以.jsp结尾的资源 -->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
(4)配置web.xml
<web-app id="webApp_ID" version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<!-- 编码过滤 -->
<filter>
<description>char encoding filter</description>
<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请求分发器 -->
<servlet>
<servlet-name>springMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:servlet-context.xml</param-value>
</init-param>
<!-- 表示启动容器时初始化该Servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMvc</servlet-name>
<!-- 这是拦截请求,“/”代表拦截所有请求,”.do”拦截所有.do请求 -->
<!--<!– <url-pattern>/</url-pattern> -- >-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
(5)页面控制器的编写
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/*
* 页面控制器*/
@Controller
public class HelloController {
/*
* 请求地址映射
* /hello.do
* */
@RequestMapping("/hello")
public ModelAndView hello(){
ModelAndView modelAndView=new ModelAndView();
//设置数据
modelAndView.addObject("hello","Hello SpringMVC");
//视图名称
modelAndView.setViewName("hello");
return modelAndView;
}
}
(6)添加页面视图
<%@ page language="java" import="java.util .* " pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML>
<html>
<head>
<base href=" <= basePath %">
<title>My JSP 'hello.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http http-equiv="description" content="This is my page">
</head>
<body>
<%-- el表达式接收参数值 --%>
${hello}
</body>
</html>
(7)启动jetty服务器
配置完毕后,输入下图的网址,启动jetty服务器
2.3 URL地址映射配置&参数绑定
地址映射配置:通过注解@RequestMapping 将请求路径与方法进行绑定,可以声明在方法级别和类级别。
声明级别: 1.方法级别 2.类级别+方法级别
2.3.1 映射单个URL
声明在方法上,映射单个url
格式:@RequestMapping(“请求路径”)/@RequestMapping(value=“请求路径”)
例如:
@RequestMapping("/test01")
public ModelAndView test01(){
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("hello", "test01");
modelAndView.setViewName("hello");
return modelAndView;
}
@RequestMapping(value="/test01")
public ModelAndView test01(){
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("hello", "test01");
modelAndView.setViewName("hello");
return modelAndView;
}
访问地址:http://localhost:8080/springmvc01/test01
2.3.2 映射多个URL
声明在方法上,映射多个URL 支持一个方法绑定多个URL的操作。
使用方式: 1. @RequestMapping({"请求路径","请求路径"}) 2.@RequestMapping(value={"请求路径","请求路径"})
例如:
@RequestMapping({"test03_01","test02_01"}) public ModelAndView test03(){ ModelAndView modelAndView=new ModelAndView(); modelAndView.addObject("hello", "test03"); modelAndView.setViewName("hello"); return modelAndView; } 访问地址: 1. http://localhost:8080/springmvc01/test03_01 2. http://localhost:8080/springmvc01/test02_01
2.3.3 映射URL在控制器上
声明在类上,类中的方法都要以该路径作为父路径。
* 声明级别: * 类级别+方法级别 (/类路径/方法路径)
@Controller
@RequestMapping("/
")
例如:
@Controller @RequestMapping("/url") public class UrlController {
@RequestMapping("/test04") public ModelAndView test04(){ ModelAndView modelAndView=new ModelAndView(); modelAndView.addObject("hello", "test04"); modelAndView.setViewName("hello"); return modelAndView;
}
*访问地址: http://localhost:8080/springmvc01/url/test04
2.3.4 设置URL映射的请求方式
通过method属性设置请求方式,默认get和post等请求方式都支持。 注意:如果设置了请求方式,则必须通过制定请求方式访问
格式:
@RequestMapping(value="", method= RequestMethod. )
例如:
@RequestMapping(value="test06", method= RequestMethod.POST) public ModelAndView test06(){ ModelAndView modelAndView=new ModelAndView(); modelAndView.addObject("hello", "test06"); modelAndView.setViewName("hello"); return modelAndView; }
访问地址:(只能通过post请求) * http://localhost:8080/springmvc01/url/test06
2.3.5 通过参数名称映射URL
通过参数的形式访问 * 通过参数的形式访问 * 访问地址: * http://localhost:8080/springmvc01/url?test05 * */ @RequestMapping(params = "test05") public ModelAndView test05(){ ModelAndView modelAndView=new ModelAndView(); modelAndView.addObject("hello", "test05"); modelAndView.setViewName("hello"); return modelAndView; }
2.4 参数绑定
2.4.1 基本类型
* 基本类型数据绑定 * 通过注解@RequestParam 标记一个参数作为请求参数(注解声明在参数前面) * 可以通过注解的属性设置相关内容 * 设置参数默认值 defaultValue默认值 (避免基本类型的数据为空时的500异常) * 设置参数的参数名(参数的别名) name属性(如果设置了别名,此时客户端擦混低的参数名要与别名保持一致) * @param age * @param money 例如:
@RequestMapping("/data1") public void data1(int age,double money) { System.out.println("age:"+age+",money:"+money); }
@RequestMapping("/data2") public void data2(@RequestParam(defaultValue = "10") int age, @RequestParam(defaultValue = "20.0") double money) { System.out.println("age:"+age+",money:"+money); }
@RequestMapping("/data3") public void data3(@RequestParam(defaultValue = "10" ,name ="userAge" ) int age, @RequestParam(defaultValue = "20.0" ,name="userMoney") double money) { System.out.println("age:"+age+",money:"+money); }
2.4.2 包装类型
请求的参数名要与方法的形参名要保持一致(在未设置别名的情况下),默认为null。 *可以通过设置@requestParam的属性设置 默认值和别名 * * @param age * @param money
例如:
@RequestMapping("/data4") public void data4(Integer age,double money) { System.out.println("age:"+age+",money:"+money); }
2.4.3 字符串类型
/* * 字符串类型数据绑定 * 请求的参数名要与方法的形参名要保持一致(在未设置别名的情况下),默认为null。 *可以通过设置@requestParam的属性设置 默认值和别名 * * @param userName * @param userPassword * */
例如:
@RequestMapping("/data5") public void data5(String userName,String userPassword) { System.out.println("userName:"+userName+",userPassword:"+userPassword); }
2.4.4 数组类型
/*数组类型数据绑定 客户端传参方式:hobboys=sing&&hobboys=run&hobboys=... @param hobbys * */ @RequestMapping("/data6") public void data6(String []hobboys) { for(String hobbys:hobboys){ System.out.println(hobbys); } }
2.4.5 JavaBean类型
/* * javaBean类型数据绑定 * 客户端请求的参数名与javaBean对象的属性字段保持一致。 * * * * @param user * */ @RequestMapping("/data7") public void data7(User user) { System.out.println(user); }
public class User { private Integer id; private String userName; private String userPassword; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } @Override public String toString() { return "User{" + "id=" + id + ", userName='" + userName + '\'' + ", userPassword='" + userPassword + '\'' + '}'; } }
2.4.6 集合类型
/* * List集合类型数据绑定 * 注:集合类型的数据,使用JavaBean对象进行包装 * */
例如:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>List集合类型数据绑定</title> </head> <body> <form action="data8" method="post"> <%-- <input name="ids" value="123456" /> <input name="ids" value="4576" />--%> <input name="ids[0]" value="123456" /> <input name="ids[1]" value="4576" /> <input name="phoneList[0].num" value="457634343" /> <input name="phoneList[1].num" value="4576434439" /> <%--javaBean--%> <button type="submit"> 提交</button> </form> </body> </html>
public class Phone { private String num; public String getNum() { return num; } public void setNum(String num) { this.num = num; } @Override public String toString() { return "Phone{" + "num='" + num + '\'' + '}'; } }
import java.util.List; public class User { private Integer id; private String userName; private String userPassword; //添加集合属性 private List<Integer>ids; private List<Phone>phoneList; public List<Phone> getPhoneList() { return phoneList; } public void setPhoneList(List<Phone> phoneList) { this.phoneList = phoneList; } public List<Integer> getIds() { return ids; } public void setIds(List<Integer> ids) { this.ids = ids; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } @Override public String toString() { return "User{" + "id=" + id + ", userName='" + userName + '\'' + ", userPassword='" + userPassword + '\'' + ", ids=" + ids + ", phoneList=" + phoneList + '}'; } }
@RequestMapping("/data8") public void data8(User user){ System.out.println(user); }
2.5 请求域绑定
* 请求域对象设置API * 1.ModelAndView
@RequestMapping("/model01") public ModelAndView model01(){ /* * 数据模型:Model * 视图:View * */ // 设置数据模型(请求访问对象的数据) ModelAndView modelAndView=new ModelAndView(); modelAndView.addObject("hello", "Hello Model01"); //设置视图 modelAndView.setViewName("hello"); return modelAndView; }
* 2.ModelMap
@RequestMapping("/model02") public String model02(ModelMap modelMap){ /* * 数据模型:Model * 视图:View * */ // 设置请求域对象 modelMap.addAttribute("hello", "Hello Model02"); //返回视图 return "hello"; }
* 3.Model
@RequestMapping("/model03") public String model02(Model model){ // 设置请求域对象 model.addAttribute("hello", "Hello Model03"); //返回视图 return "hello"; }
* 4.Map
@RequestMapping("/model04") public String model04(Map map){ // 设置请求域对象 map.put("hello", "Hello Model04"); //返回视图 return "hello";
* 5.HttpServletRequest
@RequestMapping("/model04") public String model05(HttpServletRequest httpServletRequest){ // 设置请求域对象 httpServletRequest.setAttribute("hello","Hello Model05"); //返回视图 return "hello"; }
2.6请求转发与重定向的问题
2.6.1 重定向
定义:重定向是发一个302状态码给浏览器,浏览器自己去请求跳转的网页,地址栏也会发生改变。
举例:
/* * 请求转发与重定向 * */ @Controller public class ViewController { /* * 重定向到JSP页面 * @return * */ @RequestMapping(value = "/view01") public String view01(){ return "redirect:view.jsp"; } /* * 传递参数 * */ @RequestMapping("/view02") public String view02(){ return "redirect:view.jsp?name=dsdad&password=222323"; } /* * 重定向到JSP页面 * 传递中文参数(传递中文参数会出现乱码) * @return * */ @RequestMapping("/view03") public String view03(){ return"redirect:view.jsp?name=张三&password=232323"; } /*重定向到JSP页面 传递参数(通过RedirectAttributes 对象设置重定向的参数,避免中文乱码问题) *@param * */ @RequestMapping("/view04") public String view04(RedirectAttributes redirectAttributes){ //设置参数 redirectAttributes.addAttribute("name","张三"); redirectAttributes.addAttribute("password","232323"); return "redirect:view.jsp"; } /*重定向到JSP页面 返回的是ModelAndView对象 * */ @RequestMapping("/view05") public ModelAndView view05(ModelAndView modelAndView){ //设置模型数据 modelAndView.addObject("name", "sds"); modelAndView.addObject("password", "2132"); //设置视图 modelAndView.setViewName("redirect:view.jsp"); return modelAndView; } /*重定向到Controller 返回 ModelAndView对象 @param modelAndView @return * */ @RequestMapping("/view06") public ModelAndView view06(ModelAndView modelAndView){ //设置模型数据 modelAndView.addObject("name", "王五"); modelAndView.addObject("password", "ds2132"); //设置视图 modelAndView.setViewName("redirect:text"); return modelAndView;
2.6.2 请求转发
/*请求转发到JSP页面
* 传递参数
* @return
* */
@RequestMapping("/view07")
public String view07(){
return "forward:/../../view.jsp";
}
/*请求转发到JSP页面
* 传递参数(中文不乱码)
* @return
* */
@RequestMapping("/view08")
public String view08(){
return "forward:/../../view.jsp?name=张三&password=2323";
}
/*请求转发到JSP页面
设置请求域
*
* */
@RequestMapping("/view09")
public String view09(Model model){
model.addAttribute("name","管理员");
return "forward:/../../view.jsp?name=张三&password=2323";
}
/*请求转发到JSP页面
设置请求域
*
* */
/*
* 请求转发到JSP页面(默认)
* 默认会去指定的目录下查找JSP页面(配置文件中设置的)
* @param model
* */
@RequestMapping("/view10")
public String view10(Model model){
model.addAttribute("name","管理员");
return "/../../view";
}
/* *请求转发Controller * @param modelAndView * * */
@RequestMapping("/view11")
public ModelAndView view11(ModelAndView modelAndView){
modelAndView.setViewName("forward:text");
return modelAndView;
}
@RequestMapping("/view12")
public ModelAndView view12(ModelAndView modelAndView){
modelAndView.setViewName("forward:text?name=admin&password=1312");
return modelAndView;
}
}
2.7 JSON数据开发
2.7.1 注解
(1)@ResponseBody
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到 Response对象的body数据区。
返回的数据不是html标签的页面,而是其他某种格式的数据(如json、xml等)使用(通常用于ajax请求)
(2) @RequestBody
该注解用于读取Request 请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上,再把HttpMessageConverter返回的对象数据绑定到 controller 中方法的参数上。
2.7.2 使用配置
(1)pom.xml添加json相关坐标。
<!--添加jackson依赖jar包--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.10.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.10.0</version> </dependency>
(2)修改servlet-context-xml
<!-- mvc 请求映射 处理器与适配器配置 -- >
<mvc: annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter" />
<bean
class="org.springframework.http.converte].json.MappingJackson2HttpMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>
(3)注解使用
1>@ResponseBody
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用(通常用于ajax请
求)。
2> @RequestBody
该注解用于读取Request 请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)