简介
springmvc本质是servlet
创建项目方式1(导入jar包)
注释:下载jar包导入web-inf/lib文件夹中
(1) spring-aop-4.3.6-RELEASE.jar
(2) spring-beans-4.3.6-RELEASE.jar
(3) spring-context-4.3.6-RELEASE.jar
(4) spring-core-4.3.6-RELEASE.jar
(5) spring-expression-4.3.6-RELEASE.jar
(6) spring-web-4.3.6-RELEASE.jar
(7) spring-webmvc-4.3.6-RELEASE.jar
(8) aopalliance-1.0.jar // AOP切面用到的包
(9) commons-logging-1.2.jar // 日志包,其它jar包会用到
下载jar包方式如下
创建项目方式2(引入maven依赖)
略
1 配置
1.1 web.xml配置
(1) 配置文件方式
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID" version="4.0">
</web-app>
(2) 纯注解方式
纯注解:ServletContainersInitConfig(继承AbstractDispatcherServletInitializer)替代web.xml
需要引入 javax.servlet-api-3.1.0.jar
执行流程:1执行替换web.xml的配置类初始化web容器,2执行createServletApplicationContext方法,3加载SpringMvcConfig类,4执行@componentScan加载bean,5加载Controller,6getServletMappings拦截请求。
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer{
/**
* 加载Springmvc容器对象
*/
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(SpringMvcConfig.class);
return (WebApplicationContext)ctx;
}
/**
* 配置拦截请求
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
/**
* 加载Spring容器对象
*/
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
简化方式:(继承AbstractAnnotationConfigDispatcherServletInitializer)
public class ServletAnnoInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {SpringMvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
}
1.1.1 前置处理器
(1) 处理类:DispatcherServlet (contextConfigLocation, classPath:[xxx].xml // 默认WEB-INF/[xxx]-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID" version="4.0">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classPath:springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
(2) 纯注解:createServletApplicationContext(ServletContainersInitConfig 类)
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(SpringMvcConfig.class);
return (WebApplicationContext)ctx;
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
简化方式(ServletAnnoInitConfig 类)
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {SpringMvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
1.1.2 过滤器
(1) 字符集过滤器:CharacterEncodingFilter // 解决中文乱码,过滤器是Servlet技术
<filter>
<filter-name>encoding</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>encoding</filter-name>
<url-pattern>/*</url-pattern> <!-- 或*.action -->
</filter-mapping>
(2) 纯注解:getServletFilters(ServletContainersInitConfig 类)
@Override
protected Filter[] getServletFilters() {
Filter01Test filter = new Filter01Test();
CharacterEncodingFilter filter2 = new CharacterEncodingFilter();
filter2.setEncoding("UTF-8");
return new Filter[] {filter, filter2};
}
1.2 springmvc.xml
(1) 配置文件
<?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">
</beans>
(2) 纯注解:SpringMvc.java,类注解@Configuration
@Configuration
public class SpringMvcConfig {
}
配置参数:<context:property-placeholder location="classpath*:/xxx/xx/*.properties"/>
注释:外部文件:key.key1=xxx;可通过@Value注解自动赋值
1.3 Bean
(1) Bean注入:<bean id="xx" class="包.类 />
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
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" >
<bean name="/spring20test" class="com.test.controller.Spring2_0_Controller" />
</beans>
(2) 扫描包自动注入:<context:component-scan base-package="包.包" />
<?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">
<!-- 自动注册组件 -->
<mvc:annotation-driven/>
<!-- 扫描注册类,多个包用逗分割 -->
<context:component-scan base-package="com.test.controller" />
</beans>
注释:use-default-filters(是否扫描Component,Controller,Service) include(包含)exclude(不包含)
<context:component-scan base-package="包.包" use-default-filters="false">
<context:include-filter type="annotation" expression="包.Controller" />
</context:component-scan>
<context:component-scan base-package="包.包" use-default-filters="true">
<context:exclude-filter type="annotation" expression="包.Service" />
</context:component-scan>
(3) 纯注解:@Component-scan("xxx") //SpringMvc类注解
@Configuration
@ComponentScan("com.text.controller")
public class SpringMvcConfig {
}
1.4 映射器与适配器
(1) 映射器:<bean class = "org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
(2) 适配器:<bean class = "org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
注释:映射器(不指定默认加载3个)解析RequestMapping方法。适配器(不指定默认加载3个)数据绑定,参数解析。
(3) 注解驱动:<mvc:annotation-driven /> //用于解析Controller RequestMapping注解,xml, json
(4) 纯注解:@EnableWebMvc (SpringMvc类注解)// 转换json用
1.5 视图控制器
注释:初期页面需单独作成Controller类,处理【/】请求
(1) SpringMvc配置:<mvc:view-controller path="/xx" view-name="无后缀页面名" /> 用于初期页面显示
注释:加了mvc:view-controller会使requestMapping失效,需要加映射器适配器或<mvc:annotation-driven /> 使请求生效。
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmls="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:shemaLocation="Http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
<!-- 使页面不经过hander处理,直接响应 -->
<mvc:view-controller path="/xx" view-name="无后缀页面名" />
</beans>
(2) 添加addViewControllers方法(SpringMvcConfig extends WebMvcConfigurerAdapter)
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("login");
}
1.6 静态资源访问
(1) web.xml配置:<servlet-mapping> <servlet-name>default</..> <url-pattern>*.html
(2) SpringMvc.xml配置:<mvc:resources location"/css/" mapping="/css/**"/> // mvc处理
<mvc:resources location="/css/" mapping="/css/**" />
<mvc:resources location="/js/" mapping="/js/**" />
<mvc:resources location="/html/" mapping="/html/**" />
(3) SpringMvc.xml配置:<mvc:default-servlet-handler /> // mvc转给servlet处理
(4) 纯注解: SpringMvc.java 继承WebMvcConfigurerAdapter,实现addResourceHandlers方法
@Configuration
@ComponentScan("com.text.controller")
public class SpringMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/css/**").addResourceLocations("classpath:/css/");
}
}
纯注解(旧)SpringMvc注解@ComponentScan扫描SpringMvcSupport包
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
protected void addResourceHandlers(ResourceHandlerRegistry registry){
registry.addResourceHandler("/pages/**") // 满足条件请求不走拦截器
.addResourceLocations("/pages/"); // 走指定的资源访问
}
}
1.7 拦截器配置
(1) 配置文件拦截
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 拦所有请求不设置url -->
<bean class="com.xx.interceptor.XxxInterceptor" />
<mvc:interceptor>
<mvc:mapping path="/spring30/*" /><!-- 指定拦截RUL -->
<bean class="com.test.interceptor.Test2Interceptor" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/spring31/*" />
<mvc:exclude-mapping path="/spring31/02"/><!-- 指定不拦截RUL -->
<bean class="com.test.interceptor.Test3Interceptor" />
</mvc:interceptor>
</mvc:interceptors>
(2) 纯注解:
注释:旧方式创建SpringMvcSupport继承WebMvcConfigurationSupport内容与下记一致
@Configuration
@ComponentScan({"com.text.controller"})
public class SpringMvcConfig extends WebMvcConfigurerAdapter {
@Autowired
private Test1Interceptor interceptor1;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(interceptor1).addPathPatterns("/");
// 拦截器链 registry.addInterceptor(interceptor1).addPathPatterns("/");
}
1.8 视图解析器
使Controller返回页面不需要写Jsp文件路径,及文件后缀
(1) 配置文件:
<!-- 视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/WEB-INF/jsp/" /> <!-- 页面前缀 -->
<property name="suffix" value=".jsp" /> <!-- 页面后缀 -->
</bean>
(2) 纯注解(@Configuration注解的类SpringMvcConfig)
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver irvr = new InternalResourceViewResolver();
irvr.setPrefix("WEB-INF/jsp");
irvr.setSuffix(".jsp");
return (ViewResolver)irvr;
}
1.9 文件上传
1.9.1 配置
导入 commons-fileupload.jar,及其依赖 commons-io.jar
(1) 方式1:配置文件
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 最大上传大小 单位字节kb -->
<property name="maxUploadSize" value="1024"></property>
<!-- 最大内存占用,超出生产临时文件 单位字节kb -->
<property name="maxInMemorySize" value="1024"></property>
<!-- 临时路径 -->
<property name="uploadTempDir" value="fileUpload/tem"></property>
</bean>
(2) 方式2:纯注解
(@Configuration注解的类SpringMvcConfig)
@Bean
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver cmr = new CommonsMultipartResolver();
cmr.setDefaultEncoding("UTF-8");
cmr.setMaxUploadSize(1024);
return cmr;
}
1.9.2 实现
(1) Controller
@RequestMapping("/fileUpload")
public String getUser(@RequestParam String id, @RequestParam("file") MultipartFile file) {
System.out.println("表单:"+id);
System.out.println("文件:"+file.getName());
return "init";
}
(2) 表单
<form id="form1" name="form1" action="/SpringMvcXml/fileUpload"
method="post" encType="multipart/form-data">
id<input type="text" id="id" name="id"/><br/>
file<input type="file" id="file" name="file"/><br/>
<input type="submit" value="上传" />
</form>
2 拦截器
2.1 拦截器实现
需要配置springmvc.xml的<mvc:interceptors>, 无需扫描拦截器的包
(1) 配置文件
实现HandlerInterceptor接口
继承HandlerInterceptor接口的实现类(例:HandlerInterceptorAdapter)
注释:纯注解方式,添加类注解@Component
public class Test1Interceptor implements HandlerInterceptor{
// Controller执行前执行,true继续执行,false不继续执行
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("Test1Interceptor:执行了");
return true;
}
// Controller执行后执行,返回视图前执行,可修改页面数据
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("Test1Interceptor:执行完了");
}
// 资源清理
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
}
}
2.2 拦截器处理流程
按springmvc-config.xml的上下配置顺序执行
(1) 单个拦截器:1 preHandle, 2 Controller, 3 postHandle, 4 DispatcherServlet, 5 afterCompletion
(2) 多个拦截器:1 preHandle1->preHandle2, 2 Controller, 3 postHandle2->postHandle1,4 DispatcherServlet, 5 afterCompletion2->afterCompletion1
3 控制器
3.1 创建Controller
(1) 配置文件方式:实现Controller接口
注释:springmvc.xml配置<bean name="/xx" class="com.XxxController" />
public class XxxController implements org.springframework.web.servlet.mvc.Controller {
@override
public ModelAndView handlerRequest(HttpServletRequest req, HttpServletResponse res) {
ModelAndView v = new ModelAndView();
v.addObject("msg", "message内容");
v.setViewName("/WEB-INF/jsp/xx.jsp"): //请求转发
return v;
}
}
(2) 注解方式:添加@Controller类注解
注释:无需springmvc.xml配置bean,需要配置包扫描(需要spring-aop-4.3.6-RELEASE.jar)
@Controller
public class XxxController {
@RequestMapping(value={"/"}, method={requestMethod.HEAD} )
public string head() {
return "xx.jsp";
}
@requestMapping(value={"/index", "/"}, method={requestMethod.GET})
public string index(Model model) throw Exception {
model.addAttribute("msg" , "xxx" );
return "xx.jsp";
}
}
3.2 请求URL
(1) 注解:@RequestMapping(value="/xxController") // value可省略,注解类或方法
请求方式:method=RequestMethod.GET // ={RequestMethod.GET, RequestMethod.POST}
请求参数值:params={"id", "name",...} // 指定必传参数值
请求参数头:headers={"Content-Type"} // 指定必传参数头
(2) 请求方式注解:@GetMapping("/.."), @PostMapping, @PutMapping, @DeleteMapping
注释:springmvc4.3加入
(3) 请求URL通配符:(xx?/xx任意1个字符)(xx/*/xx任意多个字符)(xx/**/xx任意多层路径)
@Controller
@RequestMapping("/xxx")
public class XxxController {
@RequestMapping(value="/xx")
public ModelAndView xx() {
...
}
// GET POST PUT DELETE
@RequestMapping(value="/xx",Method=RequestMethod.GET)
public ModelAndView xx() {
...
}
}
4 请求
4.1 基本类型
(1) 参数表单同名:public String xx(Integer id) // 表单 name=id
(2) 参数表单不同:public String xx(@RequestParam(value="id") Integer myId) // 表单name=id
注释:@RequestParam属性(required=true参数是否必须,默认true。defaultValue="0"默认值)
4.2 对象类型
(1) 基本属性:表单 name=name,name=age // public String xx(User user) 属性 name, age
(2) 集合属性:表单 name=hobby // public String xx(User user) 属性 List<String>
(3) 对象属性:表单 address.first // public String xx(User user) 属性 address 类的 first 属性
(4) 对象集合:表单 name="属性名[下标].属性" // public String xx(User user) 属性List<类>
4.3 数组类型
(1) 参数表单同名:表单 name=hobby //public String xx(String[] hobby) // 需要判断null
4.4 集合
(1) 参数表单同名:表单 name=hobby //public String xx(@RequestParam List<String> hobby) // 不可以为空集合
4.5 日期
(1) 默认日期格式:表单 text value="yyyy/MM/dd" // (Date date)
(2) 指定日期格式:表单 text value="yyyy-MM-dd" // (@DateTimeFormat(pattern="yyyy-MM-dd") Date date)
注释:时间格式“yyyy-MM-dd HH:mm:ss”
4.6 其它参数
(1) 请求头:public String xx(@RequestHeader(value="xx" String xxx)
(2) 请求Cookie:public String xx(@CoolieValue(value="JSESSIONID", required=true) String sessionid)
(3) 请求响应参数:public String xx(HttpServletRequest req, HttpServletResponse res)
5 响应
5.1 响应页面与数据
(1) ModelAndView // 返回视图与数据
注释:ModelAndView设定的视图不能设定视图解析器,否则路径与后缀名重复
@RequestMapping("/xx")
public ModelAndView xx(Integer id) {
ModelAndView m = new ModelAndView();
m.addObject("key","values");
m.setViewName("无后缀文件名");
return m;
}
(2) String + Model // 配置了视图解析器,return "xx"; 可返回 /WEB-INF/xx.jsp页面
@RequestMapping("/xx")
public String xx(HttpServletRequest req, HttpServletResponse res, Model model) {
model.addAttribute("msg", "内容"); // 存放到请求域中
return "/WEB-INF/jsp/xx.jsp";
}
@RequestMapping("/xx")
public String xx(@ModelAttribute(value="id") String id) {
return "/WEB-INF/jsp/xx.jsp";
}
注释:@ModelAttribute(value="id"), 等价于 参数Model, model.addAttribute("参数名", 参数值);
(3) String + Map
@RequestMapping("/xx")
public String xx(Map<String, Object> map, String id) {
map.put("key", "value"); // request域取值
return "/WEB-INF/jsp/xx.jsp";
}
注释:类注解@SessionAttribute({"mapkey"}) 使入参Map的值同时put到session中
5.2 重定向与转发
(1) return "页面名" // 转发到页面
(2) return "forward:/xxx/xxx" // 转发到另一个请求
(3) return "redirect:/xxx/xxx" // 重定向到另一个请求
6 JSON
6.1 下载配置
(1) jar包下载地址:https://mvnrepository.com/artifact/com.fasterxml.jackson.core
Jackson-annoations-2.8.8.jar // Json转换注解包
Jackson-core-2.8.8.jar // Json核心jar包
Jackson-databind-2.8.8.jar // Json转换数据绑定
(2) 注解驱动:<mvc:annotation-driven /> // 支持json的读写
(3) 纯注解:@EnableWebMvc // SpringMvc.java类注解,用于支持Json读写
6.2 JSON数据结构
(1) 字面量:"xxx"
(2) 对象:{ 属性名: 属性值, "属性名" : "属性值" }
(3) 数组:[ 值1, 值2, ... ]
注释:复合结构对象 { "name": "zs", "xx" : [1,2,3], "adress" : { "国家": "xx", "城市": "xx" }, ... }
6.3 JSON注解
(1) JSON请求:@RequestBody
(2) JSON响应:@ResponseBody // return String, return Object, return List
(3) JSON响应类注解:@RestController // 相当于类内全部方法加 @ResponseBody
JSON测试:<script src="/SpringMvcXml/js/jquery-1.12.4.js"></script>
function xx(){
var name = $("#loginname").val();
$.ajax({
url:"${pageContext.request.contextPath}/xxJson",
type: "post",
data:JSON.stringfy({loginname:name,...}), //请求数据
contentType:"application/json;charset=UTF-8", //JSON请求方式
dataType:"json", //响应数据类型,可省略(自动识别)
success:function(data){
if(data != null) {
data... //data为对象 或 数组
}
}
});
}
例1: 传对象,接对象
例2:传数组,接集合
注释:后端也可用List<String> xx 接收JSON数组
注释:@RequestBody用于接收【application/json】,@RequestParam用于接收【application/x-www-form-urlencoded】的表单处理
7 restful
spring3.0新增(HiddenHttpMethodFilter,将表单"_method"的值转为delete或put)
7.1 restURL
传统URL:www.xxx/ssServlet?id=1
(1) 全查:url/user // GET
(2) 单查:url/user/1 // GET,URL参数用@PathVariable注解,url与参数不一致需指定名称
(3) 新增:url/user // POST
(4) 修改:url/user // PUT
(5) 删除:url/user/1 // DELETE
注释:传对象需指定JSON格式数据,后端加@RequestBody主键
前后端代码例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="/SpringMvcXml/js/jquery-1.12.4.js"></script>
<script type="text/javascript">
function getUser() {
var uid = $("#uid").val();
$.ajax({
url:"/SpringMvcXml/rest/user/"+uid,
type: "GET",
success:function(data){
if(data != null) {
console.dir(data.name);
}
}
});
}
function getUsers() {
var uname = $("#uname").val();
$.ajax({
url:"/SpringMvcXml/rest/users/"+uname,
type: "GET",
success:function(data){
if(data != null) {
console.dir(data.name);
}
}
});
}
function getAllUser() {
$.ajax({
url:"/SpringMvcXml/rest/user",
type: "GET",
contentType:"application/json;charset=UTF-8", //JSON请求方式
success:function(data){
if(data != null) {
console.dir(data.name);
}
}
});
}
function addUser() {
var uid = $("#uid").val();
var uname = $("#uname").val();
$.ajax({
url:"/SpringMvcXml/rest/user",
type: "POST",
data:JSON.stringify({"name":uname}), //请求数据
contentType:"application/json;charset=UTF-8", //JSON请求方式
success:function(data){
if(data != null) {
console.dir(data.name);
}
}
});
}
function updUser() {
var uid = $("#uid").val();
var uname = $("#uname").val();
$.ajax({
url:"/SpringMvcXml/rest/user",
type: "PUT",
data:JSON.stringify({"name":uname}), //请求数据
contentType:"application/json;charset=UTF-8", //JSON请求方式
success:function(data){
if(data != null) {
console.dir(data.name);
}
}
});
}
function delUser() {
var uid = $("#uid").val();
var uname = $("#uname").val();
$.ajax({
url:"/SpringMvcXml/rest/user",
type: "DELETE",
data:JSON.stringify({"name":uname}), //请求数据
contentType:"application/json;charset=UTF-8", //JSON请求方式
success:function(data){
if(data != null) {
console.dir(data.name);
}
}
});
}
</script>
</head>
<body>
<form>
id<input type="text" id="uid" name="uid"/><br/>
name<input type="text" id="uname" name="uname"/><br/>
<input type="button" value="查询id" onclick="getUser()" />
<input type="button" value="查询名" onclick="getUsers()" />
<input type="button" value="查询全部" onclick="getAllUser()" />
<input type="button" value="添加" onclick="addUser()" />
<input type="button" value="更新" onclick="updUser()" />
<input type="button" value="删除" onclick="delUser()" />
</form>
</body>
</html>
package com.test.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.test.model.User;
@RestController
public class Spring3_0_Controller_07Rest {
@RequestMapping(value="/rest/user/{id}", method=RequestMethod.GET)
public User getUser(@PathVariable String id) {
System.out.println("查询:"+id);
User user = new User();
user.setName("张三");
return user;
}
@RequestMapping(value="/rest/users/{name}", method=RequestMethod.GET)
public User getUsers(@PathVariable("name") String myName) {
System.out.println("查询名称:"+myName);
User user = new User();
user.setName("张三");
return user;
}
@RequestMapping(value="/rest/user", method=RequestMethod.GET)
public User getAllUser() {
System.out.println("查询:all");
User user = new User();
user.setName("张三");
return user;
}
@RequestMapping(value="/rest/user", method=RequestMethod.POST)
public User addUser(@RequestBody User user) {
System.out.println("添加:"+user.getName());
return user;
}
@RequestMapping(value="/rest/user", method=RequestMethod.PUT)
public User updUser(@RequestBody User user) {
System.out.println(user.getName());
user.setName("更新:"+user.getName()+"a");
return user;
}
@RequestMapping(value="/rest/user", method=RequestMethod.DELETE)
public User delUser(@RequestBody User user) {
System.out.println("删除:"+user.getName());
return user;
}
}
8 异常处理
(1) 方式1Controller类中:@ExceptionHandler({异常类.class}) // 返回String或ModelAndView,只能处理当前Controller异常。
@Controller
public class SpringMvcAnnoExceptionTestController {
@ExceptionHandler({Exception.class})
public String handleException(Exception e) {
System.out.println("异常了:"+e.getMessage());
return "error";
}
@ExceptionHandler({Exception.class})
public String handleException(Exception e, Map<String,Object> map) {
System.out.println("异常了:"+e.getMessage());
map.put("msg", "异常信息");
return "error";
}
(2) 方式2异常处理类:添加类注解@ControllerAdvice或@RestControllerAdvice
注释:扫描类的包,写异常方法,controller类中找不到的异常处理,到该异常处理类中查找。SpringMvcConfig需要添加@EnableWebMvc
//@RestControllerAdvice
@ControllerAdvice
public class BusinessException {
// BUsiness, System, 其它
@ExceptionHandler({Exception.class})
public String handleException(Exception e) {
System.out.println("业务异常了:"+e.getMessage());
return "error";
}
}
注释:状态码异常 => 新建异常类,继承或实现源生异常类(RuntimeException等),添加注解@ResponseStatus(value=HttpStatus.状态码, reason="提示信息"),controller抛异常,则页面显示该状态码及信息。
9 其它
9.1 前后端数据整合
(1) 后端类
public class Result {
private Integer code;
private Object data;
private String msg;
(2) 后端处理(Json格式)
@RestController
public class SpringMvcAnnoDataController {
@RequestMapping("getUser")
@ResponseBody
public Result getData() {
User user= new User();
user.setName("张三");
user.setAge(102);
Result res = new Result();
res.setCode(123);
res.setData(user);
res.setMsg("错误信息");
return res;
}
}
(3) 前端请求
function getUser() {
$.ajax({
url:"/SpringMvcAnno/getUser",
type: "post",
success:function(res){
if(res != null) {
alert(res.msg);
console.dir(res.data.name);
console.dir(res.data.age);
$("msg").val()
}
}
});
}