黑马程序员springmvc教程第一天:controller方法的返回值和参数详解
controller的工作原理 -回复

controller的工作原理-回复什么是controller、它的工作原理、它的作用以及在不同应用场景中的实现方式。
什么是controller?Controller是MVC架构中的其中一部分,它通常被用于处理Web应用程序中的输入请求,并将输入数据转化为相应的模型和视图,以便展示或存储数据。
简单来说,控制器是MVC中用于处理数据请求和处理响应的一组组件。
Controller的工作原理Controller的工作原理是通过模型和视图进行数据处理和呈现。
当用户请求一个页面或一个资源时,这个请求会被发送到Controller。
Controller 会根据请求的内容和请求所处的URL来做出相应的响应。
在一个典型的Web应用程序中,请求可能是一个表单提交请求或一个超链接请求等等。
Controller的作用Controller的主要作用是控制用户请求并根据请求所需的参数来处理页面显示和数据传递。
它通常是在用户请求进入Web应用程序时,将用户请求存储在一个仓库中,然后把这个请求传递给相应的服务。
服务在收到请求后,对请求进行处理,然后将处理后的结果返回给Controller。
Controller在收到服务返回的数据后,再将数据转化为视图并使用相应的模板引擎对视图进行渲染,最终将结果返回给用户。
Controller在不同应用场景中的实现方式从应用场景来说,Controller的实现方式有很多种,下面将介绍一些常见的方式。
1、RESTful APIRESTful API是一个可伸缩的Web架构,它可根据需求扩展或缩小应用程序功能范围。
同时,它的Controller也能够轻松地实现和管理。
2、单页面应用程序单页面应用程序是指基于JavaScript的单页面应用程序,通常使用React、Vue或Angular等前端框架来开发。
在这种情况下,Controller的作用是负责管理和渲染页面,并在需要的时候根据用户动作来调用后端服务。
SpringMVC中controller中方法返回类型为ResponseEntity乱码的问题

SpringMVC中controller中⽅法返回类型为ResponseEntity乱码的问题返回类型为ResponseEntity<T>代表我们返回的数据是⼀个对象,在springMVC中,请求数据到对象和对象到响应数据的转换是通过消息转换器来完成的。
HttpMessageConverter是消息转换器的顶层接⼝,所有的消息转换器都必须实现这个接⼝package org.springframework.http.converter;import java.io.IOException;import java.util.List;import org.springframework.http.HttpInputMessage;import org.springframework.http.HttpOutputMessage;import org.springframework.http.MediaType;public interface HttpMessageConverter<T> {boolean canRead(Class<?> clazz, MediaType mediaType);boolean canWrite(Class<?> clazz, MediaType mediaType);List<MediaType> getSupportedMediaTypes();T read(Class<? extends T> clazz, HttpInputMessage inputMessage)throws IOException, HttpMessageNotReadableException;void write(T t, MediaType contentType, HttpOutputMessage outputMessage)throws IOException, HttpMessageNotWritableException;}我们可以看到针对不同的类型,实现了具体消息转换器--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------下⾯先来说说<mvc:annotation-driven></mvc:annotation-driven>,通过这个线索⼀直下去,找到问题的根源。
Controller方法的返回值

Controller方法的返回值Controller 方法的返回值是指在 Spring MVC 中,控制器方法处理请求后返回的结果。
这个结果可以是任何类型,包括简单类型、复杂对象、集合、Map、视图、重定向等。
在控制器方法中,可以通过不同的方式来指定返回值。
1. 返回简单类型:可以直接返回基本数据类型(如int、float等)或其包装类,Spring MVC 会自动将其转换为对应的响应体。
例如:```javapublic int getCounreturn 10;``````javapublic User getUseUser user = new User("John", 25);return user;```3. 返回集合或数组:可以返回 List、Set、数组等类型的对象,Spring MVC 会将其转换为 JSON 或 XML 格式的响应体。
例如:```javapublic List<User> getUserList<User> users = userRepository.findAll(;return users;```4. 返回视图:可以返回视图名称或视图对象,用于展示页面。
默认情况下,Spring MVC 会根据视图解析器的配置来解析视图。
例如:```javapublic String home(Model model)return "home";```5. 返回重定向:可以返回重定向的 URL,让客户端重新发送请求。
可以使用 `RedirectView` 或字符串类型来指定重定向。
例如:```javapublic String logoureturn "redirect:/login";```6. 返回 ResponseEntity:可以返回 ResponseEntity 对象,用于自定义响应头、状态码和响应体。
SpringBoot之Controller接收参数和返回数据总结(包括上传、下载文件)

SpringBoot之Controller接收参数和返回数据总结(包括上传、下载⽂件)⼀、接收参数(postman发送)1.form表单@RequestParam("name") String name会把传递过来的Form表单中的name对应到formData⽅法的name参数上该注解不能接收json传参该注解表⽰name字段是必须⼊参的,否则会报错@RequestParam(value = "name", required = false) String namerequired = false表⽰必须⼊参@RequestParam(value = "name", defaultValue = "admin") String namedefaultValue = "admin"表⽰当name⼊参为空的时候给它⼀个默认值admin/*** 测试接收form表单、URL的数据。
不能接收Json数据* */@RequestMapping(value = "/test1", method = RequestMethod.POST)public String formData(@RequestParam("name") String name , @RequestParam("age") int age){String result = "receive name = "+name+" age = "+age;System.out.println(result);return result;}2.URL代码跟1.form表单中的代码⼀样3.动态接收URL中的数据@PathVariable将URL中的占位符参数绑定到控制器处理⽅法的⼊参此种情况下,url求情中⼀定要带占位符pageNo,pageSize的值,不然访问失败即访问时⼀定要⽤ http://localhost:8088/sid/test2/2/20如果⽤ http://localhost:8088/sid/test2 则访问失败/*** 测试动态接收URL中的数据* */@RequestMapping(value = "/test2/{pageNo}/{pageSize}", method = RequestMethod.POST) public String urlData(@PathVariable int pageNo , @PathVariable int pageSize){String result = "receive pageNo = "+pageNo+" pageSize = "+pageSize;System.out.println(result);return result;}4.json@RequestBody 接收Json格式的数据需要加这个注解。
Spring_MVC_控制器方法返回值与视图的关系

作为本次请求结束后要定向的页面。
方式
返回值
视图说明
页面取值方式
1
void
prefix前缀+@RequestMapping value +suffix后缀组成
根据key取值,如
${key}
2
String
${stringList[0]}
${stringList[1].username}
6
Set
同1
同5
7
Connection
同1
比较复杂,见方式比较复杂,见方式8
方式7:
方式8:
根据String字符串返回对应的地址prefix前缀+返回值+suffix后缀组成
3
ModelAndView
通过setViewName方法跳转到指定的页面
4
ModelMap
同1
Model
同1
4
Map
同1
5
List
同1
以第一个存入对象的Object.getClass().getSimpleName()+List,如左图所示,取值方式为
返回值视图说明页面取值方式voidprefix前缀requestmappingvaluesuffix后缀组成根据key取值如keystring根据string字符串返回对应的地址prefix前缀返回值suffix后缀组成modelandview通过setviewnam方法跳转到指定的页以第一个存入对象的objectgetclass
1.Spring控制器@Controller方法返回值一般是String或者ModelAndView
controller中方法的参数说明

controller中方法的参数说明
在控制器(Controller)中的方法参数说明如下:
1. HttpServletRequest:表示HTTP请求对象,用于获取请求的各种
信息,如请求头、请求参数等。
2. HttpServletResponse:表示HTTP响应对象,用于向客户端发送
响应。
3. HttpSession:表示会话对象,用于存储用户的会话数据,如登录
状态、购物车等。
4. Model:表示数据模型对象,用于向视图传递数据。
5. ModelMap:同样表示数据模型对象,可以向视图传递数据,并且
支持链式操作。
6. RedirectAttributes:用于重定向时传递参数,可以将参数添加
到重定向URL中。
7. Principal:表示当前登录用户的信息,可以获取用户名、角色等。
以上是常用的控制器方法参数说明,不同的框架和技术可能会有所差异,具体的使用方法和参数说明可以参考相应框架的文档或官方指南。
黑马程序员springmvc教程第一天:程序小结

源码分析(了解)通过前端控制器源码分析springmvc的执行过程。
第一步:前端控制器接收请求调用doDiapatch第二步:前端控制器调用处理器映射器查找 Handler第三步:调用处理器适配器执行Handler,得到执行结果ModelAndView第四步:视图渲染,将model数据填充到request域。
视图解析,得到view:调用view的渲染方法,将model数据填充到request域渲染方法:入门程序小结通过入门程序理解springmvc前端控制器、处理器映射器、处理器适配器、视图解析器用法。
前端控制器配置:第一种:*.action,访问以.action结尾由DispatcherServlet进行解析第二种:/,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析使用此种方式可以实现 RESTful风格的url处理器映射器:非注解处理器映射器(了解)注解的处理器映射器(掌握)对标记@Controller类中标识有@RequestMapping的方法进行映射。
在@RequestMapping里边定义映射的url。
使用注解的映射器不用在xml中配置url和Handler的映射关系。
处理器适配器:非注解处理器适配器(了解)注解的处理器适配器(掌握)注解处理器适配器和注解的处理器映射器是配对使用。
理解为不能使用非注解映射器进行映射。
<mvc:annotation-driven></mvc:annotation-driven>可以代替下边的配置:<!--注解映射器 --><beanclass="org.springframework.web.servlet.mvc.method.annotation.R equestMappingHandlerMapping"/><!--注解适配器 --><beanclass="org.springframework.web.servlet.mvc.method.annotation.R equestMappingHandlerAdapter"/>实际开发使用:mvc:annotation-driven视图解析器配置前缀和后缀:程序中不用指定前缀和后缀:出师表两汉:诸葛亮先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。
SpringMVC处理方法返回值过程解析

SpringMVC处理⽅法返回值过程解析这篇⽂章主要介绍了Spring MVC处理⽅法返回值过程解析,⽂中通过⽰例代码介绍的⾮常详细,对⼤家的学习或者⼯作具有⼀定的参考学习价值,需要的朋友可以参考下对于Spring MVC处理⽅法⽀持⽀持⼀系列的返回⽅式:(1)ModelAndView(2)Model(3)ModelMap(4)Map(5)View(6)String(7)Void(8)Object⼀,ModelAndView@RequestMapping("/threadRequest*")public ModelAndView threadRequest(){ModelAndView mv=new ModelAndView();mv.setViewName("index");mv.addObject("user","王五");return mv;}通过ModelAndView构造⽅法可以指定返回的页⾯名称,也可以通过setViewName()⽅法跳转到指定的页⾯ ,使⽤addObject()设置需要返回的值,addObject()有⼏个不同参数的⽅法,可以默认和指定返回对象的名字。
调⽤addObject()⽅法将值设置到⼀个名为ModelMap的类属性,ModelMap是LinkedHashMap的⼦类,⼆,ModelModel是⼀个接⼝,其实现类为ExtendedModelMap,继承了ModelMap类。
model.addAttribute("pojo", pojo);三,ModelMapModel 是⼀个接⼝,其实现类为ExtendedModelMap,继承了ModelMap类。
四,Map@RequestMapping("/show")public Map<String, String> getMap() {Map<String, String> map = new HashMap<String, String>();map.put("key1", "value-1");map.put("key2", "value-2");return map;}五,View可以返回pdf excel六,String@RequestMapping("/RequestMethod")public String index(Model model) {String retVal = "user/index";List<User> users = userService.getUsers();model.addAttribute("users", users);return retVal;}1、如果返回值为null,那么以请求名作为视图名进⾏跳转2、如果指定返回值,那么按照指定返回值作为视图名进⾏跳转,可以通过model,modeMap携带数据。
聊聊springmvc中controller的方法的参数注解方式

聊聊springmvc中controller的⽅法的参数注解⽅式绪论相信接触过springmvc的同学都知道,在springmvc的控制层中,我们在⽅法的参数中可以使⽤注解标识。
⽐如下⾯例⼦:public Map<String, Object> login(@PathVariable("loginParams") String loginParams)@PathVariable注解就标识了这个参数是作为⼀个请求地址模板变量的(不清楚的同学可以先学习⼀下restful设计风格)。
这些注解都是spring内置注解,那么我们可不可以⾃定义注解来实现⾃⼰的业务逻辑处理呢?答案是可以的,spring团队的⼀⼤设计哲学思想就是让⾃⼰的系统有⽆限可能性的拓展。
spring框架底层⼜是如何解析这些参数的注解的呢?那么在学习⾃定义参数注解之前,我们先了解⼀下spring底层是怎么来解析这些注解参数的。
实际上,这些处理过程是要涉及到配置⽂件的加载和解析以及⼀堆的各种处理,⼩弟功⼒尚浅,就分析不到那么多了,只是简单过⼀下。
内置参数注解的解析下⾯,我们从源码⾓度来分析:⾸先,sping定义了⼀个统⼀的⽅法参数注解解析接⼝HandlerMethodArgumentResolver,所有⽅法参数解析类都需要实现这个接⼝,接⼝很简单,定义了两个⽅法:public interface HandlerMethodArgumentResolver {/*** 判断⽅法参数是否包含指定的参数注解* 含有返回true,不含有返回false*/boolean supportsParameter(MethodParameter parameter);/*** 在给定的具体的请求中,把⽅法的参数解析到参数值⾥⾯,返回解析到的参数值,没有返回null* 只有在supportsParameter返回true的时候,resolveArgument⽅法才会执⾏*/Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception;}现在,带着⼤家看看@PathVariable参数注解的解析具体过程,源代码如下:public class PathVariableMethodArgumentResolver extends AbstractNamedValueMethodArgumentResolverimplements UriComponentsContributor {/** 这⾥省略其它⽅法*/@Overridepublic boolean supportsParameter(MethodParameter parameter) {// 不含有PathVariable注解,返回falseif (!parameter.hasParameterAnnotation(PathVariable.class)) {return false;}// PathVariable注解的参数类型是Map类型if (Map.class.isAssignableFrom(parameter.getParameterType())) {String paramName = parameter.getParameterAnnotation(PathVariable.class).value();return StringUtils.hasText(paramName);}return true;}// PathVariableMethodArgumentResolver没有重写resolveArgument,直接使⽤AbstractNamedValueMethodArgumentResolver默认⾏为/** 如果supportsParameter返回true,在这⾥真正处理参数**/protected void handleResolvedValue(Object arg, String name, MethodParameter parameter,ModelAndViewContainer mavContainer, NativeWebRequest request) {String key = View.PATH_VARIABLES;int scope = RequestAttributes.SCOPE_REQUEST;Map<String, Object> pathVars = (Map<String, Object>) request.getAttribute(key, scope);if (pathVars == null) {pathVars = new HashMap<String, Object>();request.setAttribute(key, pathVars, scope);}// 把参数的key-value放进请求域,也就是把值赋给了⽅法参数,⽐如请求路径是: api/v1/task/{id},⽅法参数@PathVariable("id") String taskId,那么此时name=taskId, org=id的值// 当然,怎么把请求地址中对应的值获取出来,不在这篇博客的讨论范畴。
详解SpringMVC中Controller的方法中参数的工作原理

详解SpringMVC中Controller的⽅法中参数的⼯作原理前⾔SpringMVC是⽬前主流的Web MVC框架之⼀。
SpringMVC中Controller的⽅法参数可以是Integer,Double,⾃定义对象,ServletRequest,ServletResponse,ModelAndView等等,⾮常灵活。
本⽂将分析SpringMVC是如何对这些参数进⾏处理的,使读者能够处理⾃定义的⼀些参数。
现象本⽂使⽤的demo基于maven。
我们先来看⼀看对应的现象。
@Controller@RequestMapping(value = "/test")public class TestController {@RequestMapping("/testRb")@ResponseBodypublic Employee testRb(@RequestBody Employee e) {return e;}@RequestMapping("/testCustomObj")@ResponseBodypublic Employee testCustomObj(Employee e) {return e;}@RequestMapping("/testCustomObjWithRp")@ResponseBodypublic Employee testCustomObjWithRp(@RequestParam Employee e) {return e;}@RequestMapping("/testDate")@ResponseBodypublic Date testDate(Date date) {return date;}}⾸先这是⼀个Controller,有4个⽅法。
他们对应的参数分别是带有@RequestBody的⾃定义对象、⾃定义对象、带有@RequestParam的⾃定义对象、⽇期对象。
SpringMVC上的Controller的详解

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为 父路径。
6种属性:
value: 指定请求的实际地址,指定的地址可以是URI Template 模式; method: 指定请求的method类型, GET、POST、PUT、DELETE等; consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html; produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回; params: 指定request中必须包含某些参数值是,才让该方法处理。 headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
用于指示Spring类的实例是一个控制器。Controller接口的实现类只能处理一个单一请求动作,而@Controller注解的控制器可以支持同时处 理多个请求动作,更加灵活。Spring使用 扫描机制 查找应用程序中所有基于注解的控制器类。分发处理器 会扫描使用了该注解的类的方 法,并检测该方法是否使用了@RequestMapping注解,而使用@RequestMapping注解的方法才是真正处理请求的处理器。为了保证能找到 控制器,需要完成两件事情:
浏览器根本不知道服务器发送的内容从哪里来的因为这个跳转过程实在服务器实现的并不是在客户端实现的所以客户端并不知道这个跳转动作所以它的地址栏还是原来的地址
SpringMVC上的 Controller的详解
@Controller @Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。单单使用@Controller 标记在一个类上还不能真 正意义上的说它就是SpringMVC 的一个控制器类,因为这个时候Spring 还不认识它,这个时候就需要我们把这个控制器类交给Spring 来管 理。
Spring-boot配置Aop获取controller里的request中的参数以及其返回值

Spring-boot配置Aop获取controller⾥的request中的参数以及其返回值⽰例:当前url:http://localhost:8080/CarsiLogCenter_new/idpstat.jsp?action=idp.sptopnrequest.getRequestURL() http://localhost:8080/CarsiLogCenter_new/idpstat.jsprequest.getRequestURI() /CarsiLogCenter_new/idpstat.jsprequest.getContextPath()/CarsiLogCenter_newrequest.getServletPath() /idpstat.jsprequest.getQueryString() action=idp.sptopnpublic static String getLastAccessUrl(HttpServletRequest request) {StringBuffer requestURL = request.getRequestURI();String queryString = request.getQueryString();if (queryString == null) {return requestURL.toString();}return requestURL + "?" + queryString;}1、request.getRequestURL()返回的是完整的url,包括Http协议,端⼝号,servlet名字和映射路径,但它不包含请求参数。
2、request.getRequestURI()得到的是request URL的部分值,并且web容器没有decode过的3、request.getContextPath()返回 the context of the request.4、request.getServletPath()返回调⽤servlet的部分url.5、request.getQueryString()返回url路径后⾯的查询字符串⾸先在你的Maven的pom⽂件⾥加⼊aop的依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>在spring boot⾥⾯⼀切配置都是很简单的,下⾯为我所有被请求到的controller加上Aop的功能吧,看码:import javax.servlet.http.HttpServletRequest;import ng.ProceedingJoinPoint;import ng.annotation.Around;import ng.annotation.Aspect;import ng.annotation.Pointcut;import org.springframework.context.annotation.Configuration;import org.springframework.web.context.request.RequestAttributes;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import com.google.gson.Gson;import org.slf4j.Logger;import org.slf4j.LoggerFactory;;@Aspect //定义⼀个切⾯@Configurationpublic class LogRecordAspect {private static final Logger logger = LoggerFactory.getLogger(UserInterceptor.class);// 定义切点Pointcut@Pointcut("execution(* com.jiaobuchong.web.*Controller.*(..))")public void excudeService() {}@Around("excudeService()")public Object doAround(ProceedingJoinPoint pjp) throws Throwable {RequestAttributes ra = RequestContextHolder.getRequestAttributes();ServletRequestAttributes sra = (ServletRequestAttributes) ra;HttpServletRequest request = sra.getRequest();String url = request.getRequestURL().toString();String method = request.getMethod();String uri = request.getRequestURI();String queryString = request.getQueryString();("请求开始, 各个参数, url: {}, method: {}, uri: {}, params: {}", url, method, uri, queryString);// result的值就是被拦截⽅法的返回值Object result = pjp.proceed();Gson gson = new Gson();("请求结束,controller的返回值是 " + gson.toJson(result));return result;}}。
黑马程序员:Spring web mvc框架课程day2

黑马程序员:Spring web mvc框架课程day2第1章课程计划1、高级参数绑定a)数组类型的参数绑定b)List类型的绑定2、@RequestMapping注解的使用3、Controller方法返回值4、Springmvc中异常处理5、图片上传处理6、Json数据交互7、Springmvc实现Restful8、拦截器第2章高级参数绑定2.1绑定数组2.1.1需求在商品列表页面选中多个商品,然后删除。
2.1.2需求分析此功能要求商品列表页面中的每个商品前有一个checkbook,选中多个商品后点击删除按钮把商品id传递给Controller,根据商品id删除商品信息。
2.1.3Jsp中实现:生成html代码如下:页面选中多个checkbox向controller方法传递</table>2.1.4ControllerController方法中可以用String[]接收,或者pojo的String[]属性接收。
两种方式任选其一即可。
定义如下:@RequestMapping("/queryitem")public String queryItem(QueryVo queryVo, String[] ids) {System.out.println(queryVo.getItems().getName());System.out.println(queryVo.getItems().getPrice());System.out.println(ids.toString());returnnull;}或者:查看结果:2.2将表单的数据绑定到List2.2.1需求实现商品数据的批量修改。
2.2.2需求分析要想实现商品数据的批量修改,需要在商品列表中可以对商品信息进行修改,并且可以批量提交修改后的商品数据。
2.2.3接收商品列表的pojoList中存放对象,并将定义的List放在包装类中,使用包装pojo对象接收。
SpringMVCController返回值及异常的统一处理方法

SpringMVCController返回值及异常的统⼀处理⽅法旧的设计⽅案开发api的时候,需要先定义好接⼝的数据响应结果.如下是⼀个很简单直接的Controller实现⽅法及响应结果定义.@RestController@RequestMapping("/users")public class UserController {@Injectprivate UserService userService;@GetRequest("/{userId:\\d+}")public ResponseBean signin(@PathVariable long userId) {try {User user = userService.getUserBaseInfo(userId);return ResponseBean.success(user);} catch (ServiceException e) {return new ReponseBean(e.getCode(), e.getMsg());} catch (Exception e) {return ResponseBean.systemError();}}}{code: "",data: {}, // 可以是对象或者数组msg: ""}从上⾯的代码,我们可以看到对于每个 Controller ⽅法,都会有很多重复的代码出现,我们应该设法去避免重复的代码。
将重复的代码移除之后,可以得到如下的代码,简单易懂。
@RestController@RequestMapping("/users")public class UserController {@Injectprivate UserService userService;@GetRequest("/{userId:\\d+}")public User signin(@PathVariable long userId) {return userService.getUserBaseInfo(userId);}}在以上的实现中,还做了⼀个必要的要求,就是 ServiceException 需要定义为 RuntimeException的⼦类,⽽不是 Exception 的⼦类。
SpringMVC中的Controller方法的(返回值参数类型)

SpringMVC中的Controller⽅法的(返回值参数类型)⼀. Controller⽅法的返回值:1、返回的ModelAndViewModelAndView 存放数据, addObject(),往model(request域)添加数据ModelAndView 添加逻辑视图名, setViewName(), 经过视图解析器,得到物理视图, 转发到物理视图@RequestMapping("/getUser.action")public ModelAndView getUser(@RequestParam(name="userId",required = true)Integer id) throws Exception{System.out.println("id="+id);ModelAndView modelAndView = new ModelAndView();User user = userService.queryOne(id);modelAndView.addObject("user", user);modelAndView.setViewName("userinfo");return modelAndView;}2、 String类型, 返回的视图 a. 逻辑视图名, 经过视图解析器,得到物理视图, 转发@RequestMapping("/index.action")public String toIndex() {return "index"; b. redirect:资源路径, 不经过视图解析器,要求这个资源路径写完整的路径: /开头, 表⽰/项⽬名重定向到资源@RequestMapping("/index.action")public String toIndex() {//重定向到index.jsp, 完整的路径return "redirect:/jsp/index.jsp"; c. forward:资源路径, 不经过视图解析器,要求这个资源路径写完整的路径: /开头,表⽰/项⽬名转发向到资源@RequestMapping("/index.action")public String toIndex() {return "forward:/jsp/index.jsp"; d.响应给前端的字符串,(数据),需要结合@ResponseBody//将user对象以json的格式响应给前端页⾯@RequestMapping("/queryUserByCondition.action")@ResponseBodypublic User queryUserByCondition(User user) throws Exception{return user;}3、Java对象 需要结合@ResponseBody, 发⽣的数据,(json)主要⽤来接收前端传递给后端的json字符串中的数据的(请求体中的数据的),只能是post提交,get没有请求体@RequestMapping("/queryUserByCondition.action")@ResponseBodypublic User queryUserByCondition( @RequestBody User user) throws Exception{return user;}4、 void, 默认逻辑视图名 controller的@RequestMapping() 前缀+ ⽅法名, 很少使⽤⼆. Controller⽅法的参数类型1、直接注⼊Servlet API相关的类1) HttpServletRequest 通过request对象获取请求信息2) HttpServletResponse 通过response处理响应信息3) HttpSession 通过session对象得到session中存放的对象//使⽤Servlet API 对象@RequestMapping("/fun2.action")public String fun2(HttpServletRequest request, HttpServletResponse response, HttpSession session) { System.out.println("fun2().....");request.setAttribute("hello", "request_hello");session.setAttribute("hello", "session_hello");Cookie cookie = new Cookie("haha","xixi");//把cookie保存客户端response.addCookie(cookie);return "hello";}2、Model/ModelMap往model存放/取数据, request域如果我们只是往request域存放数据, 推荐使⽤Model, Controller类与ServletAPI 解耦//推荐写法@RequestMapping("/fun3.action")public String fun3(Model model) {System.out.println("fun3().....");// SpringMVC 框架帮我们把model中的数据, ⼀个⼀个添加到request域// Model 不能替换Request对象,model.addAttribute("hello","model_hello");model.addAttribute("xx", 123);return "hello";}3、接收请求参数 a、基本数据类型参数名与请求参数名⼀样,⾃动进⾏映射如果参数名与请求参数名不⼀样, 使⽤@RequestParam 来进⾏映射 b、参数是java对象,是⼀个pojo对象案例添加⽤户:Pojo对象的属性名与请求参数的name⼀样, ⾃动映射@RequestMapping(value="/addUser.action",method=RequestMethod.POST)public String addUser(User user,Model model) {userService.saveUser(user);model.addAttribute("msg", "添加成功");return "msg";}前端页⾯:<body><h1>添加⽤户:</h1><form action="${pageContext.request.contextPath }/user/addUser.action" method="post">⽤户名:<input type="text" name="username"/><hr />密 码:<input type="text" name="password"/><hr />性 别:<input type="radio" name="sex" value="男" id="man"checked /><label for="man">男</label><input type="radio" name="sex"value="⼥" id="woman"/><label for="woman">⼥</label><hr />⽣ ⽇:<input type="text" name="brithday" readonly id="brithday"/><hr />地 址:<input type="text" name="address"/><hr /><button>添加</button></form></body>View CodeString类型,SpringMVC 不能⾃动转换为Date类型 , 需要⼿动配置1、局部的转换器, @DateTimeFormat(⽇期格式) 只对某⼀个属性进⾏转换 ,只需要在⽇期类型的属性上添加@DateTimeFormat(pattern = "yyyy-MM-dd")private Date brithday;2、全局的转换器, 对整个项⽬的所有的date类型进⾏转换第⼀步: 编写⼀个转换器类, 实现Converter接⼝public class MyDateConverter implements Converter<String, Date>{private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//转换的⽅法@Overridepublic Date convert(String source) {try {return sdf.parse(source);} catch (ParseException e) {e.printStackTrace();throw new RuntimeException("⽇期格式不对,⽇期格式:yyyy-MM-dd");}}}第⼆步: 在springmvc的配置⽂件进⾏配置<!-- 基于注解的处理器映射器,处理器适配器 --><mvc:annotation-driven conversion-service="conversionService"/><!-- 配置全局转换器 --><bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"><set><!--内部bean: 这个bean 只能在包括他的bean内部使⽤ --><bean class="spring09.converter.MyDateConverter"/><!-- 配置多个转换器类的bean --></set></property></bean>对整个项⽬的Date类型进⾏转换 c、参数是集合属性Controller参数写法: 需要封装成⼀个类, 作为这个类的属性(list集合)//批量添加 @RequestMapping(value="/bathAddUser.action",method=RequestMethod.POST)public String bathAddUser(UserVo userVo,Model model) {model.addAttribute("msg", "添加成功");return "msg";}UserVo类:public class UserVo {private List<User> users = new ArrayList<>();public List<User> getUsers() {return users;}public void setUsers(List<User> users) {ers = users;}前端页⾯:name="users[0].password"UserVo中的users属性,list数组,⾥⾯的对象下标从0开始,可以使⽤js赋值,以下页⾯作为显⽰效果<h1>批量添加⽤户:</h1><form action="${pageContext.request.contextPath }/user/bathAddUser.action" method="post"><h1>第⼀个⽤户:</h1>⽤户名:<input type="text" name="users[0].username"/><hr />密 码:<input type="text" name="users[0].password"/><hr />性 别:<input type="radio" name="users[0].sex" value="男" id="man"checked /><label for="man">男</label><input type="radio" name="users[0].sex"value="⼥" id="woman"/><label for="woman">⼥</label><hr />⽣ ⽇:<input type="text" name="users[0].brithday" readonly class="brithday"/> <hr />地 址:<input type="text" name="users[0].address"/><hr /><h1>第⼆个⽤户:</h1>⽤户名:<input type="text" name="users[1].username"/><hr />密 码:<input type="text" name="users[1].password"/><hr />性 别:<input type="radio" name="users[1].sex" value="男" id="man"checked /><label for="man">男</label><input type="radio" name="users[1].sex"value="⼥" id="woman"/><label for="woman">⼥</label><hr />⽣ ⽇:<input type="text" name="users[1].brithday" readonly class="brithday"/> <hr />地 址:<input type="text" name="users[1].address"/><hr /><button>添加</button>View Code数组类型:JSP页⾯端:Controller:Map集合JSP页⾯端:包装类:Controller:。
Controller方法的返回值

Controller⽅法的返回值⽅法的返回值1、ModelAndView这个就不多说,这是最基础的,前⾯定义⼀个ModelAndView,中途使⽤addObject⽅法添加属性,再返回。
视图解析器会⾃动扫描到的。
2、String这个就有三种情况了:<1>return普通的string这个string的表⽰逻辑视图名,真正跳转的视图名=前缀+逻辑视图名+后缀返回值为string也可以实现类似于ModelAndView的效果,如何进⾏给视图值呢?我们可以给⽅法加⼀个Model的参数,然后调⽤model的addAttribute⽅法加信息,三种string的类型都能这样使⽤⼩例⼦:@RequestMapping(value="/editItems",method={RequestMethod.POST,RequestMethod.GET})public String editItem(Model model)throws Exception{//......model.addAttribute("itemsCustom",itemsCustom));return "items/editItems";}<2>return "redirect:xxx" xxx是⼀个Path,重定向,有点感觉吧,哈哈。
我们前⾯的servlet⼯具类<3>return “forward:xxx" xxx是⼀个Path,转发转发和重定向的区别和Servlet中的⼀样,我们如何判断我们重定向后的信息没有丢失呢?我们可以给⽅法加上⼀个request参数,然后request.getParameter获取判断⼩例⼦:@RequestMapping("/queryItems")public String queryItems(HttpServletRequest request) throws Exception{System.out.println(request.getParameter("id"));//...}3、返回void(和我们使⽤Http的处理器映射器基本⼀样)在controller犯法形参上可以定义request和response,使⽤request或response指向响应结果:1、使⽤request转向页⾯,如下:request.getRequestDispatcher("页⾯路径").forward(request,response);2、也可以通过response重定向:response.sendRedirect("url");3、也可以通过response指定响应结果,例如响应json数据:response.setCharacterEncoding("utf-8");response.setContentType("application/json;charset=utf-8");response.getWriter().write("json串)。
关于SpringMVC在Controller层方法的参数解析详解

关于SpringMVC在Controller层⽅法的参数解析详解⽬录⾃定义参数解析器实现效果实现和配置Spring提供解析器⼀些使⽤Tricky总结使⽤版本:spring-boot: 2.1.6.RELEASEsping: 5.1.8.RELEASEjava: openjdk 11.0.13⾃定义参数解析器为了能够实现⾃定义参数解析器,只需要实现 HandlerMethodArgumentResolver 并将添加到WebMvcConfigurer#addArgumentResolvers 即可。
实现效果下⾯以添加⼀个获取请求头的 client-type 参数为例进⾏是实现。
定义注解 @ClientTypeMark 以及enum ClientType ,⽤于注⼊header中的值。
@Target({ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface ClientTypeMark {}public enum ClientType {WEB,MOBILE,UNKNOWN;}最终实现的效果为在Controller的⽅法中,可以按照如下实现使⽤。
@RestController@RequestMapping("/client")public class ClientTypeEndpoint {@GetMapping("/cur")public ClientType getCurClientType(@ClientTypeMark ClientType clientType) {return clientType;}}实现和配置按照如下⽅法实现 HandlerMethodArgumentResolver ,⽤于解析header中的 client-type 并转化为 ClientType 。
SpringMVCController介绍及常见注解

SpringMVCController介绍及常见注解⼀、简介 在SpringMVC中,控制器Controller负责处理由DispatcherServlet分发的请求,它把⽤户请求的数据经过业务处理层处理之后封装成⼀个Model,然后再把该Model返回给对应的View进⾏展⽰。
在SpringMVC中提供了⼀个⾮常简单的定义Controller的⽅法,你⽆需继承特定的类或实现特定的接⼝,只需使⽤@Controller标记⼀个类是Controller,然后使⽤@RequestMapping和@RequestParam等⼀些注解⽤以定义URL请求和Controller⽅法之间的映射,这样的Controller就能被外界访问到。
此外Controller不会直接依赖于HttpServletRequet和HttpServletResponse等HttpServlet对象。
例1:@Controllerpublic class MyController {@RequestMapping ( "/showView" )public ModelAndView showView() {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName( "viewName" );modelAndView.addObject( " 需要放到 model 中的属性名称 " , " 对应的属性值,它是⼀个对象 " );return modelAndView;}}View Code 在上⾯的⽰例中,@Controller 是标记在类MyController 上⾯的,所以类MyController 就是⼀个SpringMVC Controller 对象了,然后使⽤@RequestMapping(“/showView”) 标记在Controller ⽅法上,表⽰当请求/showView.do 的时候访问的是MyController 的showView ⽅法,该⽅法返回了⼀个包括Model 和View 的ModelAndView 对象。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
controller方法的返回值
⏹返回ModelAndView
需要方法结束时,定义ModelAndView,将model和view分别进行设置。
⏹返回string
如果controller方法返回string,
1、表示返回逻辑视图名。
真正视图(jsp路径)=前缀+逻辑视图名+后缀
2、redirect重定向
商品修改提交后,重定向到商品查询列表。
redirect重定向特点:浏览器地址栏中的url会变化。
修改提交的request数据无法传到重定向的地址。
因为重定向后重新进行request(request无法共享)
3、forward页面转发
通过forward进行页面转发,浏览器地址栏url不变,request可以共享。
⏹返回void
在controller方法形参上可以定义request和response,使用request或response指定响应结果:
1、使用request转向页面,如下:
request.getRequestDispatcher("页面路径").forward(request, response);
2、也可以通过response页面重定向:
response.sendRedirect("url")
3、也可以通过response指定响应结果,例如响应json数据如下:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");
参数绑定
spring参数绑定过程
从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上。
springmvc中,接收页面提交的数据是通过方法形参来接收。
而不是在controller 类定义成员变更接收!!!!
默认支持的类型
直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。
在参数绑定过程中,如果遇到下边类型直接进行绑定。
1.2.1.1HttpServletRequest
通过request对象获取请求信息
1.2.1.2HttpServletResponse
通过response处理响应信息
1.2.1.3HttpSession
通过session对象得到session中存放的对象
1.2.1.4Model/ModelMap
model是一个接口,modelMap是一个接口实现。
作用:将model数据填充到request域。