5.Spring-mvc处理器方法返回值
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 对象,用于自定义响应头、状态码和响应体。
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:。
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
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携带数据。
spring mvc面试知识点

Spring MVC面试知识点1. 什么是Spring MVCSpring MVC是一个基于Java的框架,用于构建Web应用程序。
它是Spring框架的一部分,提供了用于处理HTTP请求和响应的组件和功能。
Spring MVC的核心目标是实现MVC(Model-View-Controller)设计模式,以实现松耦合、可重用和可测试的Web应用程序。
2. MVC设计模式MVC设计模式是一种将应用程序分为三个主要组件的架构模式:模型(Model)、视图(View)和控制器(Controller)。
这个模式的目标是将应用程序的数据逻辑、业务逻辑和用户界面分离开来,以提高代码的可维护性和可测试性。
•模型(Model):模型代表应用程序的数据和业务逻辑。
它负责处理数据的读取、写入和验证,并包含与业务逻辑相关的方法和操作。
•视图(View):视图是应用程序的用户界面。
它负责以用户可以理解的方式呈现数据,并处理与用户交互的相关操作。
•控制器(Controller):控制器是模型和视图之间的协调者。
它负责接收用户的请求,处理请求,并相应地更新模型和视图。
3. Spring MVC的核心组件在Spring MVC中,有几个核心组件负责处理请求和响应。
•DispatcherServlet:DispatcherServlet是Spring MVC的前端控制器(Front Controller)。
它是整个请求处理流程的中央处理器,负责接收所有的HTTP请求,并将它们分发给相应的处理器。
•HandlerMapping:HandlerMapping负责将URL映射到具体的处理器(Controller)上。
它根据请求的URL确定要执行的处理器,并返回一个处理器对象。
•HandlerAdapter:HandlerAdapter负责根据请求的处理器的类型,调用相应的处理方法。
它根据处理器的类型和方法的参数,将请求的参数传递给处理器,并处理返回值。
SpringMVC框架知识点详解

SpringMVC框架知识点详解官⽅的下载⽹址是:⼀、Spring MVC简介1.1Spring MVC⼯作流程映射器:主要是根据浏览器上输⼊的url来映射所有满⾜要求的Handle(控制器类)适配器:主要是决定调⽤哪个Handler来实现具体的业务逻辑1.2Spring MVC VS Struts21)springmvc的⼊⼝是⼀个servlet,即前端控制器;struts2⼊⼝是⼀个filter过虑器,即前端过滤器,2)springmvc是基于⽅法开发(控制器类是单例的,不可能维护实体变量),传递参数是通过⽅法形参,可以设计为单例;struts2是基于类开发(维护⼀个实体变量),传递参数是通过类的属性,只能设计为多例3)springmvc通过参数解析器是将request对象内容进⾏解析成⽅法形参,将响应数据和页⾯封装成ModelAndView对象,最后⼜将模型数据通过request对象传输到页⾯;struts采⽤值栈存储请求和响应的数据,通过OGNL存取数据4)springmvc开发运⾏速度快于struts2⼆、Spring MVC⼯程搭建(xml)2.1导⼊springioc,springweb , springmvc相关的jar包2.2在/WEB-INF/ web.xml⽂件配置SpringMVC的前端控制器DispatcherServlet(前端控制器)<!-- 注册springmvc核⼼控制器 --><servlet><!-- servlet-name名字随便写 --><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 通知DispatcherServlet去指定的⽬录下加载springmvc.xml配置⽂件classpath:是在⼯程的src路径下寻找如果不配置init-param的话,控制器会⾃动寻找/WEB-INF/<servlet-name>-servlet.xml⽂件--><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>*.action</url-pattern>//拦截请求</servlet-mapping>注:在默认情况下:springmvc框架的配置⽂件必须叫<servlet-name>-servlet.xml且必须放在/WEB-INF/⽬录下,我们可以在web.xml⽂件中,为DispatcherServlet配置⼀个初始化参数,让它去我们指定的⽬录下加载springmvc.xml配置⽂件2.3配置springmvc.xml注:该配置⽂件的命名规则遵循web.xml⽂件中核⼼控制器配置。
SpringMVC学习总结(三)——请求处理方法Action详解

SpringMVC学习总结(三)——请求处理⽅法Action详解Spring MVC中每个控制器中可以定义多个请求处理⽅法,我们把这种请求处理⽅法简称为Action,每个请求处理⽅法可以有多个不同的参数,以及⼀个多种类型的返回结果。
⼀、Action参数类型如果在请求处理⽅法中需要访问HttpSession对象,则可以添加HttpSession作为参数,Spring会将对象正确的传递给⽅法,如:public Stringaction(HttpSession session);若需要访问客户端语⾔环境和HttpServletRequest对象,则可以在⽅法签名上包含这样的参数,如:public Stringaction(HttpServletRequest request,Locale locale)。
可以在请求中出现的参数类型有:org.springframework.web.context.request.WebRequestorg.springframework.web.context.request.NativeWebRequestjava.util.Locale 当前请求的语⾔环境java.util.TimeZone 时区java.io.InputStream或java.io.Readerjava.io.OutputStream或java.io.Writerorg.springframework.http.HttpMethodjava.security.PrincipalHttpEntity <?>参数⽤于访问Servlet的HTTP请求的标题和内容java.util.Map / org.springframework.ui.Model / org.springframework.ui.ModelMap 视图隐含模型org.springframework.web.servlet.mvc.support.RedirectAttributes 重定向命令或表单对象基本数据类型,如int,String,double...复杂数据类型,如⾃定义的POJO对象HandlerAdapterorg.springframework.validation.Errors / org.springframework.validation.BindingResult 验证结果org.springframework.web.bind.support.SessionStatus 会话状态org.springframework.web.util.UriComponentsBuilder@PathVariable 注解参数访问URI模板变量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
处理器方法返回值
1、放回值为ModelAndView,ModelAndView对象可以添加model数据并制定view视图
2、返回void
在Controller方法形参上可以定义request和response,使用request或response指定响应结果:
a、使用request转向页面
request.getRequestDispatcher("页面路径").forward(request, response);
b、也可以通过response页面重定向:
response.sendRedirect("url")
c、也可以通过response指定响应结果,例如响应json数据如下:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");
3、返回字符串
a、字符串为逻辑视图名称,controller方法返回字符串可以指定逻辑视图名,通过视图
解析器解析为物理视图地址。
b、Redirect重定向
Contrller方法返回结果重定向到一个url地址,如下商品修改提交后重定向到商品查询方法,参数无法带到商品查询方法中。
redirect方式相当于“response.sendRedirect()”,转发后浏览器的地址栏变为转发后
的地址,因为转发即执行了一个新的request和response。
由于新发起一个request原来的参数在转发时就不能传递到下一个url,如果要传参
数可以/item/queryItem.action后边加参数,如下:
/item/queryItem?...&…..
c、forward转发
controller方法执行后继续执行另一个controller方法,如下商品修改提交后转向到商品修改页面,修改商品的id参数可以带到商品修改方法中。