一、普通文本、HTML返回值
// 普通文本
@Controller
public class UserController {
@RequestMapping(value = "/plainText", produces = "text/plain; charset=UTF-8")
@ResponseBody
public String plainText() {
return "This is 普通文本";
}
}
// HTML
@RequestMapping(value = "/html", produces = "text/html; charset=UTF-8")
@ResponseBody
public String html() {
return "<h1>This is 普通文本</h1>";
}
二、XML返回值(有两种方式)
- 手动拼接xml格式,繁琐易错
// 方法1
@RequestMapping(value = "/xml1", produces = "application/xml; charset=UTF-8")
@ResponseBody
public String xml1() {
Person person = new Person();
person.setName("Tom");
person.setAge(20);
Car car = new Car();
car.setName("BWM");
car.setPrice(1234);
person.setCar(car);
// 加上xml的识别
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<person name=\"" + person.getName() + "\" age = \"" + person.getAge() + "\">"
+ "<car name=\"" + car.getName() + "\" age = \"" + car.getPrice() + "\"/>"
+"</person>";
}
- 引入三方库进行返回如下:
<!--模型转XML的库-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.4.0-b180830.0359</version>
</dependency>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.1</version>
</dependency>
配置文件设置
<contexg:component-scan base-package="com.mj"/>
<mvc:annotation-driven/>
类需要加上xml的注解
package com.mj.domain;
import com.sun.xml.txw2.annotation.XmlElement;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "person")
public class Person {
private String name;
private Integer age;
private Car car;
@XmlAttribute
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlAttribute
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@XmlElement
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
}
测试类:
// 方法2
@RequestMapping(value = "/xml2")
@ResponseBody
public Person xml2() {
Person person = new Person();
person.setName("Tom");
person.setAge(20);
Car car = new Car();
car.setName("BWM");
car.setPrice(1234);
person.setCar(car);
// 加上xml的识别
return person;
}
三、JSON数据格式返回(两种方式)
- 直接手拼JSON字符串,如下
@RequestMapping(value = "/json1", produces = "application/json; charset=UTF-8")
@ResponseBody
public String json1() {
return "{\"name\":\"\"Jack, \"age\":20},\"car:{\"name\":\"BWM\",\"price\":1234}}\"";
}
- 引入三方库,如下配置
<!-- Model转JSON字符串 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.2</version>
</dependency>
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:contexg="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<contexg:component-scan base-package="com.mj"/>
<mvc:annotation-driven>
<!--处理服务器返回的中文乱码问题-->
<mvc:message-converters>
<!--影响返回值是String的内容-->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="defaultCharset" value="UTF-8"/>
</bean>
<!--影响返回值是Model对象(最后通过JAXB转成XML字符串)-->
<bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter">
<property name="defaultCharset" value="UTF-8"/>
</bean>
<!--影响返回值是Model对象(最后通过Jackson转成JSON字符串)-->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="defaultCharset" value="UTF-8"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!--默认的转发方式-->
<mvc:default-servlet-handler/>
</beans>
测试类:
@RequestMapping("/json2")
@ResponseBody // 默认返回JSON
public Student json2() {
List<String> list = new ArrayList<String>();
list.add("haha1");
list.add("haha2");
list.add("haha3");
Student student = new Student();
student.setName("xiaomage");
student.setNickNames(list);
student.setAge(12);
Dog dog = new Dog();
dog.setName("haha");
dog.setPrice(123);
student.setDog(dog);
return student;
}
四、返回视图
- 在viewName前面加上"redirect:"表示重定向,比如:"redirect:/page/jsp4.jsp"
- 可以使用<mvc:view_controller>直接配置请求路径和viewName,如果以下两个都存在,会以java代码优先级高。也就是当没有Controller去处理这个path时才会交给配置文件。
<mvc:view-controller path="/jsp5" view-name="/WEB-INF/page/jsp5.jsp"/>@RequestMapping("/jsp5") public String jsp5() { // 转发 return "/WEB-INF/page/jsp4.jsp"; }
可以通过InternalResourceViewResolver设置试图路径的公共前缀、后缀,受InternalResourceViewResolver影响的有如下:
- 通过返回值ModelAndView设置viewName
- 通过返回值String设置的viewName
- 通过<mvc:view-controller>设置的viewName
可以配置多个InternalResourceViewResolver
- order值越小,优先级越高
- 可以利用ModelAndView将数据和视图绑定到一起,返回给客户端 /* 在Java代码中,路径问题总结 1、假设请求路径是:"http://IP地址:端口/context_path/path1/path2/path3" 2、假设转发路径是:"/page/test.jsp" 1> 以斜线(/)开头,参考路径是context_path 2> 最终转发路径是:"http://IP地址:端口/context_path" + "/page/test.jsp" 3、假设转发路径是:"page/test.jsp" 1> 不以斜线开头,参考路径是当前请求路径的上一层路径 2> 最终转发路径是:"http://IP地址:端口/context_path/path1/path2" + "/page/test.jsp" 在jsp、html代码中、路径问题总结 1、假设请求路径是:"http://IP地址:端口/context_path/path1/path2/path3" 2、假设跳转路径是:"/page/test.jsp" 1> 以斜线(/)开头,参考路径是"http://IP地址:端口" 2> 最终转发路径是:"http://IP地址:端口" + "/page/test.jsp" 3、假设转发路径是:"page/test.jsp" 1> 不以斜线开头,参考路径是当前请求路径的上一层路径 2> 最终转发路径是:"http://IP地址:端口/context_path/path1/path2" + "/page/test.jsp"
@Controller @RequestMapping("/test") public class Jsp2Controller { @RequestMapping("/jsp1") public String jsp1() { return "jsp1"; } @RequestMapping("/jsp2") public ModelAndView jsp2() { return new ModelAndView("jsp2"); } }
以下两种情况不受InternalResourceViewResolver影响:
- 在viewName前面加上"forward:"活"redirect:"
- 通过ModeAndView的setView方法
• */
@Controller
public class JspController {
@RequestMapping("/path1/jsp1")
public ModelAndView jsp1() {
ModelAndView mv = new ModelAndView();
Dog dog = new Dog();
dog.setName("大黄");
dog.setPrice(200);
// 本质就是request.setAttribute
mv.addObject(dog);
// 转发
mv.setViewName("/page/jsp1.jsp");
return mv;
}
}
/*
在Java代码中,路径问题总结
1、假设请求路径是:"http://IP地址:端口/context_path/path1/path2/path3"
2、假设转发路径是:"/page/test.jsp"
1> 以斜线(/)开头,参考路径是context_path
2> 最终转发路径是:"http://IP地址:端口/context_path" + "/page/test.jsp"
3、假设转发路径是:"page/test.jsp"
1> 不以斜线开头,参考路径是当前请求路径的上一层路径
2> 最终转发路径是:"http://IP地址:端口/context_path/path1/path2" + "/page/test.jsp"
在jsp、html代码中、路径问题总结
1、假设请求路径是:"http://IP地址:端口/context_path/path1/path2/path3"
2、假设跳转路径是:"/page/test.jsp"
1> 以斜线(/)开头,参考路径是"http://IP地址:端口"
2> 最终转发路径是:"http://IP地址:端口" + "/page/test.jsp"
3、假设转发路径是:"page/test.jsp"
1> 不以斜线开头,参考路径是当前请求路径的上一层路径
2> 最终转发路径是:"http://IP地址:端口/context_path/path1/path2" + "/page/test.jsp"
*/
• 不加@ResponseBody的String返回值,也代表viewName
- 可以利用ModelAndView将数据和视图绑定到一起,返回给客户端 /* 在Java代码中,路径问题总结 1、假设请求路径是:"http://IP地址:端口/context_path/path1/path2/path3" 2、假设转发路径是:"/page/test.jsp" 1> 以斜线(/)开头,参考路径是context_path 2> 最终转发路径是:"http://IP地址:端口/context_path" + "/page/test.jsp" 3、假设转发路径是:"page/test.jsp" 1> 不以斜线开头,参考路径是当前请求路径的上一层路径 2> 最终转发路径是:"http://IP地址:端口/context_path/path1/path2" + "/page/test.jsp" 在jsp、html代码中、路径问题总结 1、假设请求路径是:"http://IP地址:端口/context_path/path1/path2/path3" 2、假设跳转路径是:"/page/test.jsp" 1> 以斜线(/)开头,参考路径是"http://IP地址:端口" 2> 最终转发路径是:"http://IP地址:端口" + "/page/test.jsp" 3、假设转发路径是:"page/test.jsp" 1> 不以斜线开头,参考路径是当前请求路径的上一层路径 2> 最终转发路径是:"http://IP地址:端口/context_path/path1/path2" + "/page/test.jsp"
- 在viewName前面加上"redirect:"表示重定向,比如:"redirect:/page/jsp4.jsp"
- 可以使用<mvc:view_controller>直接配置请求路径和viewName,如果以下两个都存在,会以java代码优先级高。也就是当没有Controller去处理这个path时才会交给配置文件。
<mvc:view-controller path="/jsp5" view-name="/WEB-INF/page/jsp5.jsp"/>@RequestMapping("/jsp5")
public String jsp5() {
// 转发
return "/WEB-INF/page/jsp4.jsp";
}
可以通过InternalResourceViewResolver设置试图路径的公共前缀、后缀,受InternalResourceViewResolver影响的有如下:
- 通过返回值ModelAndView设置viewName
- 通过返回值String设置的viewName
- 通过<mvc:view-controller>设置的viewName
可以配置多个InternalResourceViewResolver
- order值越小,优先级越高
@Controller
@RequestMapping("/test")
public class Jsp2Controller {
@RequestMapping("/jsp1")
public String jsp1() {
return "jsp1";
}
@RequestMapping("/jsp2")
public ModelAndView jsp2() {
return new ModelAndView("jsp2");
}
}
以下两种情况不受InternalResourceViewResolver影响:
- 在viewName前面加上"forward:"活"redirect:"
- 通过ModeAndView的setView方法