return "success.jsp"
return "/success.jsp"
return "/jsp/success.jsp"
通过ModelAndView对象返回有四种方式,代码示例如下
环境准备工作均省略,可详见快速入门
controller
包下的UserController类代码如下
package at.guigu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
//将Usercontroller放到Spring容器中
@Controller
@RequestMapping("/user")
public class Usercontroller {
/**
* SpringMVC页面跳转——直接返回字符串
* @return
*/
@RequestMapping(value = "/quick1")
public String save1() {
System.out.println("Usercontroller save...");
return "success";
// 等同于return "/user/success.jsp";
}
/**
* SpringMVC页面跳转——返回ModelAndView对象 方式一
* @return
*/
@RequestMapping("/quick2")
public ModelAndView save2() {
/*
Model:模型 用来封装数据
View:视图 用来展示数据
*/
ModelAndView mv = new ModelAndView();
// 设置模型数据
mv.addObject("username", "zhangsan");
// 设置视图名称
mv.setViewName("success");
return mv;
}
/**
* SpringMVC页面跳转——返回ModelAndView对象 方式二
* @return
*/
@RequestMapping("/quick3")
public ModelAndView save3(ModelAndView mv) {
/*
Model:模型 用来封装数据
View:视图 用来展示数据
*/
// 设置模型数据
mv.addObject("username", "zhangsan");
// 设置视图名称
mv.setViewName("success");
return mv;
}
/**
* SpringMVC页面跳转——返回ModelAndView对象 方式三
* @return
*/
@RequestMapping("/quick4")
public String save4(Model model) {
/*
Model:模型 用来封装数据
View:视图 用来展示数据
*/
// 设置模型数据
model.addAttribute("username", "zhangsan");
// 返回jsp视图文件
return "success";
}
/**
* SpringMVC页面跳转——返回ModelAndView对象 方式四
* 方式四不常用,了解知道即可
* @return
*/
@RequestMapping("/quick5")
public String save5(HttpServletRequest request) {
/*
Model:模型 用来封装数据
View:视图 用来展示数据
*/
// request代替model来设置模型数据
request.setAttribute("username", "zhangsan");
// 返回jsp视图文件
return "success";
}
}
success.jsp代码如下
<%@...%>
标签体内加上isELIgnored="false"
,作用:防止Tomcat配置禁用EL表达式<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>...Success Running...</h1>
<h2>${username}</h2>
</body>
</html>
Tomcat运行该Web项目后截图如下所示
<img alt="image-20240719195230082">
注意
public ModelAndView save3(ModelAndView mv)
是通过参数传入ModelAndView
对象以供使用,==原理是:== SpringMVC会自动根据方法的参数进行相应的注入,以该save3
为例,当SpringMVC检测到其参数为ModelAndView
,而这个类是SpringMVC所有的,此时SpringMVC框架就会自动为其提供一个ModelAndView
对象以供该方法使用public String save5(HttpServletRequest request)
的原理也是Spring会根据方法的参数进行相应的注入在Web基础阶段,客户端访问服务器端,若想直接回写字符串作为响应体返回的话,只需要使用response.getWriter("Hello World")
方法即可,而在Controller中若想直接返回字符串的方式如下:
response
对象(即参数为response
对象),然后使用response
对象的getWriter().print("Hello World")
方法回写数据即可
void
@ResponseBody
注解告知SpringMVC框架,该方法返回的是字符串不是页面跳转(即它是直接在http响应体中返回的字符串)
@ResponseBody
注解作用:标注该注解的方法的返回值会直接写入 HTTP 响应体中。该注解通常用于 RESTful Web 服务或 AJAX 请求处理,以便返回 JSON、XML 或其他格式的数据。方式一的代码示例如下
在controller包下重现创建一个示例类UserControllerTwo
,代码如下
package at.guigu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* SpringMVC回写数据
*/
//将Usercontroller放到Spring容器中
@Controller
@RequestMapping("/userTwo")
public class UserControllerTwo {
/**
* SpringMVC回写数据——直接返回字符串方式一
* @param response
* @throws IOException
*/
@RequestMapping(value = "/quick1")
public void save(HttpServletResponse response) throws IOException {
response.getWriter().print("Hello World!");
}
}
<img alt="image-20240722151738481">
方式二的代码示例如下
package at.guigu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* SpringMVC回写数据
*/
//将Usercontroller放到Spring容器中
@Controller
@RequestMapping("/userTwo")
public class UserControllerTwo {
/**
* SpringMVC回写数据——直接返回字符串方式一
* @param response
* @throws IOException
*/
@RequestMapping(value = "/quick1")
public void save(HttpServletResponse response) throws IOException {
response.getWriter().print("Hello World!");
}
/**
* SpringMVC回写数据——直接返回字符串方式二
* @return
*/
@ResponseBody
@RequestMapping(value = "/quick2")
public String save2(){
return "Hello World!";
}
}
<img alt="image-20240722151917529">
方式二中我们一般会返回指定格式的字符串,比如JSON格式,代码步骤示例如下(以对象转为JSON格式为例)
注意:将对象转换为JSON格式进行输出时我们需要借助JSON的转换工具将对象转换为JSON格式的字符串,然后在返回
Step1: 在pom.xml文件中导入坐标jackson-core
、jackson-databind
、jackson-annotations
<!--jackson-core-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.17.1</version>
</dependency>
<!--jackson-databind-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.1</version>
</dependency>
<!--jackson-annotations-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.17.1</version>
</dependency>
Step2: 创建一个pojo包,在该包下创建一个User类,代码如下
package at.guigu.pojo;
public class User {
private String name;
private int age;
public User() {}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Step3: UserControllerTwo
类代码如下
package at.guigu.controller;
import at.guigu.pojo.User;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* SpringMVC回写数据
*/
//将Usercontroller放到Spring容器中
@Controller
@RequestMapping("/userTwo")
public class UserControllerTwo {
/**
* SpringMVC回写数据——直接返回字符串方式一
* @param response
* @throws IOException
*/
@RequestMapping(value = "/quick1")
public void save(HttpServletResponse response) throws IOException {
response.getWriter().print("Hello World!");
}
/**
* SpringMVC回写数据——直接返回字符串方式二:直接返回普通字符串数据
* @return
*/
@ResponseBody
@RequestMapping(value = "/quick2")
public String save2(){
return "Hello World!";
}
/**
* SpringMVC回写数据——直接返回字符串方式二:返回JSON格式响应字符串数据
* @return
* @throws JsonProcessingException
*/
@ResponseBody
@RequestMapping(value = "/quick3")
public String save3() throws JsonProcessingException {
User user = new User();
user.setName("zhangsan");
user.setAge(18);
//使用JSON的转换工具将对象转换为JSON格式的字符串,然后在返回
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
return json;
}
}
<img alt="image-20240722154542304">
注意:我们可以利用@RestController
注解来代替@Controller
和@ResponseBody
这两个注解
原因:在类级别使用 @RestController
注解,就不需要在每个方法上单独使用 @ResponseBody
注解。@RestController
本质上是 @Controller
和 @ResponseBody
的组合。
此时UserControllerTwo
类中方式二的代码可更改如下
package at.guigu.controller;
import at.guigu.pojo.User;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* SpringMVC回写数据
*/
//将Usercontroller放到Spring容器中
@RestController
@RequestMapping("/userTwo")
public class UserControllerTwo {
/**
* SpringMVC回写数据——直接返回字符串方式二:直接返回普通字符串数据
* @return
*/
@RequestMapping(value = "/quick2")
public String save2(){
return "Hello World!";
}
/**
* SpringMVC回写数据——直接返回字符串方式二:返回JSON格式响应字符串数据
* @return
* @throws JsonProcessingException
*/
@RequestMapping(value = "/quick3")
public String save3() throws JsonProcessingException {
User user = new User();
user.setName("zhangsan");
user.setAge(18);
//使用JSON的转换工具将对象转换为JSON格式的字符串,然后在返回
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
return json;
}
}
在 SpringMVC回写数据——直接返回字符串 的示例中使用JSON的转换工具将对象转换为JSON格式的字符串,然后在返回
这种方式每次都需要如下两句代码
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
这样就造成了代码冗余,为避免冗余我们可对其进行优化,已便于达到如下目的:SpringMVC自动将对象或集合转为JSON格式的字符串
原理:找到SpringMVC默认组件配置的配置文件DispatherServlet.properties
(可详见SpringMVC核心配置文件解析),然后找到处理器适配器HandlerAdapter
接口下的RequestMappingHandlerAdapter
类,该类下有一个public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters)
方法可用来设置一个JSON转换的转换器
@RequestMapping
注解的控制器方法。它是 HandlerAdapter
接口的一个具体实现,负责调用带有 @RequestMapping
注解的方法来处理 HTTP 请求。<img alt="image-20240722160905336">
优化步骤如下
Step1: SpringMVC核心配置文件代码如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--配置Controller层的注解的组件扫描-->
<context:component-scan base-package="at.guigu.controller"></context:component-scan>
<!--等同于
<context:component-scan base-package="at.guigu">
type指定要扫描的内容为注解,expression指定要扫描的对应注解的全限定名
只扫描at.guigu包下有@Controller注解的类
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
-->
<!--配置内部资源视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--将InternalResourceViewResolver类中的前缀属性prefix的值设为/jsp/-->
<property name="prefix" value="/user/"></property>
<!--将InternalResourceViewResolver类中的前缀属性suffix的值设为.jsp-->
<property name="suffix" value=".jsp"></property>
</bean>
<!--配置处理器适配器-->
<bean id="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>
</beans>
配置内部资源视图解析器以及处理器适配器都用到了setter方法注入,只是说一个是普通数据类型注入,一个是集合注入。具体注入方法解释可详见Spring完整知识点汇总一中的依赖注入
Step2: 直接返回字符串方式二:返回JSON格式响应字符串数据的代码更改如下
package at.guigu.controller;
import at.guigu.pojo.User;
import com.fasterxml.jackson.core.JsonProcessingException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
//将Usercontroller放到Spring容器中
@Controller
@RequestMapping("/userTwo")
public class UserControllerFour {
/**
* SpringMVC回写数据——直接返回字符串方式二:返回JSON格式响应字符串数据
* @return
* @throws JsonProcessingException
*/
@ResponseBody
@RequestMapping(value = "/quick3")
public User save3() throws JsonProcessingException {
User user = new User();
user.setName("zhangsan");
user.setAge(18);
return user;
}
}
<img alt="image-20240722161920459">
在SpringMVC核心配置文件中进行处理器适配器的配置还稍显麻烦,我们可以在SpringMVC核心配置文件中使用mvc的注解驱动来代替对处理器适配器进行的配置
mvc的注解驱动代码:<mvc:annotation-driven/>
RequestMappingHandlerMapping
和处理器适配器RequestMappingHandlerAdapter
,并且它的底层会继承jackson进行对象或集合的JSON格式字符串的转换此时SpringMVC的核心配置文件代码如下
注意:mvc的注解驱动代码需要引入mvc的命名空间以及约束路径(可详见Spring快速入门代码实现)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--配置Controller层的注解的组件扫描-->
<context:component-scan base-package="at.guigu.controller"></context:component-scan>
<!--等同于
<context:component-scan base-package="at.guigu">
type指定要扫描的内容为注解,expression指定要扫描的对应注解的全限定名
只扫描at.guigu包下有@Controller注解的类
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
-->
<!--配置内部资源视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--将InternalResourceViewResolver类中的前缀属性prefix的值设为/jsp/-->
<property name="prefix" value="/user/"></property>
<!--将InternalResourceViewResolver类中的前缀属性suffix的值设为.jsp-->
<property name="suffix" value=".jsp"></property>
</bean>
<!--mvc的注解驱动-->
<mvc:annotation-driven/>
<!--等同于配置处理器适配器-->
<!--<bean id="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>-->
</beans>
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。