1.返回值JSON、XML
//JSON
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
//XML
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.1</version>
</dependency>
导入对应的依赖包,@ResponseBody:被改注解所标记的请求处理方法将返回JSON格式或XML(如果配置了xml注解)的数据,绕开视图解析器
@XmlRootElement
public class Person {
private String name;
private Integer age;
@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;
}
}
因为springmvc底层还是servlet,所以还必须添加serlvet依赖。
2.Controller接收参数以及乱码
get请求从tomcat8开始就不会乱码了
post请求要配置CharacterEncodingFilter
<filter>
<filter-name>character</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>character</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Controller接收参数,可以多样化接收,不行的加上@RequestParam试试
@RequestParam的required属性默认为true,不传就会报400错,设置参数为可选的把required改为false
接收到的对象,不是null,属性是null,数组是null
@Controller
@RequestMapping("/test")
public class TestController {
@GetMapping("/json")
@ResponseBody
public String testJson(Person p, String name, String age, @RequestParam Map<String,String> map){
System.out.println(p);
System.out.println(name);
System.out.println(age);
System.out.println(map);
Person person = new Person();
person.setName("jack");
person.setAge(11);
return "你好啊";
}
}
返回值乱码,可以配置messageconverter,包括String,json,xml
<mvc:annotation-driven >
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="defaultCharset" value="UTF-8"></property>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="defaultCharset" value="UTF-8"></property>
</bean>
<bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter">
<property name="defaultCharset" value="UTF-8"></property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
也可以在Controller里设置
@GetMapping(value = "/json",produces = "text/html; charset=UTF-8")
@ResponseBody
public String testJson(@RequestParam Person p, @RequestParam(required = false) String name, String age)
3.前后端路径问题总结
@RequestMapping("/mv1")
public ModelAndView mv(HttpServletRequest request){
ModelAndView modelAndView = new ModelAndView("/page/person.jsp");
Person person = new Person();
person.setAge(12);
person.setName("jack");
//相当于request.setAttribute();
modelAndView.addObject("person",person);
return modelAndView;
}
在java代码中,路径问题总结
1.假设请求路径是:http://IP地址:端口/context_path/path1/path2/path3
2.假设转发路径是:/page/test.jsp
以斜线( / )开头,参考路径就是context_path,http://IP地址:端口/context_path + /page/test.jsp
3.假设转发路径是:page/test.jsp
不以斜线(/)开头,参考路径是当前请求路径的上一层
所以最终转发路径直接替换:http://IP地址:端口/context_path/path1/path2/ + page/test.jsp
在jsp、html代码中,路径问题总结
1.假设请求路径是:http://IP地址:端口/context_path/path1/path2/path3
2.假设转发路径是:/page/test.jsp
以斜线( / )开头,参考路径就是http://IP地址:端口,http://IP地址:端口 + /page/test.jsp
不以斜线开头同上
4.springmvc中的转发和重定向
@RequestMapping("/mv2")
public String mv1(HttpServletRequest request){
return "redirect:/page/person.jsp";
}
@RequestMapping("/mv1")
public ModelAndView mv(HttpServletRequest request){
ModelAndView modelAndView = new ModelAndView("redirect:/page/person.jsp");
Person person = new Person();
person.setAge(12);
person.setName("jack");
//相当于request.setAttribute();
modelAndView.addObject("person",person);
return modelAndView;
}
重定向用redirect标识,转发和重定向都有String和ModelAndView两种,重定向其实是发了两次请求,所以数据不能共享,只能在路径后面拼接请求参数,但是ModelAndView的addObject会把简单的参数拼接,jsp通过request.getParameter或者${param.name}获取参数
注意和servlet不同,redirect的路径不需要加上context_path
5.PathVariable
@GetMapping("/json1/{age}")
@ResponseBody
public String testJson1(@PathVariable String age){//@PathVariable("age") String age
System.out.println(age);
Person person = new Person();
person.setName("哈哈");
person.setAge(11);
return "你好啊";
}
和@RequestParam类似,也有Required属性,默认为true
6.TomCat的2个默认Servlet和dispatchServlet和静态资源放行
可以在TOMCAT_HOME的conf/web.xml中找到
DefaultServlet:url-pattern是/,可以处理静态资源
JspServlet:url-pattern是*.jsp,处理jsp
springmvc配置的dispatchServlet,url-pattern/拦截了请求和静态资源
静态资源放行一:
将静态资源交还给tomcat的defaultServlet处理
<mvc:default-servlet-handler />
原理:通过DefaultServletHttpRequestHandler对象将静态资源转发给tomcat的defaultservlet
加上<mvc:default-servlet-handler />后,会导致controller无法处理请求,加上<mvc:annotation-driven >即可保证controller正常使用
静态资源放行二:
springmvc框架内部来处理静态资源(内部通过ResourceHttpRequestHandler对象)
代表所有子路径
mapping是请求路径
location是静态资源的位置
<mvc:resources mapping="/assert/" location=“/assert/” />
同样加上<mvc:annotation-driven >,保证controller正常使用
7.controller可以通过参数名得到值,从java8开始存储了参数名信息
maven编译是存储在局部变量表中,javac -parameter *.java,也存储了,普通编译就没有
8. Map<String, String[]> parameterMap = request.getParameterMap()
name相同的可以获得数组数据,但是String age1 = request.getParameter(“age”);只能得到单个数据,springmvc可以在controller方法上接收数组数据
9.直接配置请求路径<mvc:view-controller path=“/test/json3” view-name=“/index.jsp”/>
直接配置请求路径path和vie-name,当没有controller处理这个path时才会交给mvc:view-controller处理,同样加上<mvc:annotation-driven >,保证controller正常使用
10.InternalResourceViewResolver和InternalResourceView
默认实现会询问程序的所有ViewResolvers,拿到所有的视图解析器,解析视图,一单返回的view对象不为空,则停止解析,直接返回
,view的render方法渲染,把ModelAndView中的模型数据放到request域中的
受InternalResourceViewResolver影响的有
1.通过返回值ModelAndView设置viewname
2.通过返回值String设置的viewname
3.通过<mvc:view-controller>设置的viewname
可以配置多个InternalResourceViewResolver,order值越小,优先级越高
忽略InternalResourceViewResolver配置的有
1.在viewname前面加上“forward:”或“redirect:”
2.通过ModelAndView的setView方法
之前是根据具体情况创建对应的View对象
InternalResourceView ,JstlView,RedirectView
@GetMapping(value = "/json")
public ModelAndView testJson(ModelAndView modelAndView){
modelAndView.setView(new RedirectView("/t/index.jsp",true));//true代表使用contextpath,默认没有
modelAndView.setView(new InternalResourceView("/t/index.jsp"));//也有true,代表include模式不是forward,输出流开启时间不同
modelAndView.setView(new JstlView("/t/index.jsp"));//使用JstlView要导入jstljar包
modelAndView.addObject("age",14);
return modelAndView;
}
InternalResourceViewResolver会有欺骗,配置多个也只会有一个起作用
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="order" value="0"/>
</bean>
11.ResponseStatus
@GetMapping(value = "/json")
@ResponseStatus(value = HttpStatus.BAD_REQUEST,reason = "哈哈哈哈哈")
public ModelAndView testJson(ModelAndView modelAndView){
modelAndView.setView(new RedirectView("/t/index.jsp",true));
modelAndView.setView(new InternalResourceView("/index.jsp"));
//modelAndView.setView(new JstlView("/index.jsp"));
modelAndView.addObject("age",14);
return modelAndView;
}