SpringMVC学习笔记

简介

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 (contextConfigLocationclassPath:[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()
				}
			}
		});
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值