引入jsp-api、servlet-api jstl

注册DispatcherServlet

 <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-servlet.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>

配置springmvc-servlet.xml(出现404,导包putinfo)

  <!--处理器映射,HanderMapping-->
			 <!--<bean name="/hello" class="controller.IndexController"/>-->
			  <!--扫描包-->
			<context:component-scan base-package="controller"/>
			<!--启动注解-->
			<mvc:annotation-driven/>
			 <!--视图解析器-->
			 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
				  <property name="prefix" value="/WEB-INF/jsp/"/>
				  <property name="suffix" value=".jsp"/>
			 </bean>

2、/和/*
	  < url-pattern > / </ url-pattern > 
	          不会匹配到.jsp, 只针对我们编写的请求;即:.jsp 不会进入spring的 DispatcherServlet类 。
		  < url-pattern > /* </ url-pattern > 
		          会匹配 *.jsp,会出现返回 jsp视图 时再次进入spring的DispatcherServlet 类,
		          导致找不到对应的controller所以报404错。
		3、<mvc:default-servlet-handler />: 让Spring MVC不处理静态资源,静态资源过滤 :HTML . JS . CSS . 图片 , 视频 .....

RestFul 风格:

       Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次
	   传统方式操作资源  :通过不同的参数来实现不同的效果!方法单一,post 和 get

			http://127.0.0.1/item/queryItem.action?id=1 查询,GET
			http://127.0.0.1/item/saveItem.action 新增,POST
			http://127.0.0.1/item/updateItem.action 更新,POST
			http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST

       使用RESTful操作资源 :可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同!
			http://127.0.0.1/item/1 查询,GET
			http://127.0.0.1/item 新增,POST
			http://127.0.0.1/item 更新,PUT
			http://127.0.0.1/item/1 删除,DELETE
	   使用路径变量的好处:
           使路径变得更加简洁;
           获得参数更加方便,框架会自动进行类型转换。

所有的地址栏请求默认都会是 HTTP GET 类型的。

     method=RequestMethod.GET/POST/PUT/DELETE
   方法级别的注解变体有如下几个:组合注解
        @GetMapping
		@PostMapping
		@PutMapping
		@DeleteMapping
		@PatchMapping

转发与重定向:

     重定向:
        return "redirect:student/login";  //WEBINF中的jsp必须经过dispatherServlet,重定向只能通过controller之间跳转一个空的请求转发进行重定向,相当于用户第二次访问的是一个controller
        return "redirect:index.jsp";   // WEBINF之外的jsp可不经过dispatherServlet和视图解析器直接;重定向
	 转发:
	    return "index";  //转发,一定会经过视图解析器

接收前端参数

     基本类型和String,提交的域名称和处理方法的参数名一致可自动映射,不一致则使用@RequestParam("name") String userName
      对象,提交的域名称和属性名必须一致,否则为null

向前端返回参数

    ModelAndView
	Model
	Map<String,Object> map
	ModelMap 

解决乱码

		<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>
   	</filter-mapping>		

json转换

 fastJson
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>fastjson</artifactId>
		<version>1.2.76</version>
	</dependency>

解决乱码:

    1、@RequestMapping(value = "/index7",produces = {"application/json;charset=UTF-8"})
    2、xml
 <mvc:annotation-driven>
   <mvc:message-converters register-defaults="true">
	   <bean class="org.springframework.http.converter.StringHttpMessageConverter">
		   <constructor-arg value="UTF-8"/>
	   </bean>
	   <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
		   <property name="objectMapper">
			   <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
				   <property name="failOnEmptyBeans" value="false"/>
			   </bean>
		   </property>
	   </bean>
   </mvc:message-converters>
</mvc:annotation-driven>

在类上直接使用 @RestController ,里面所有的方法都只会返回 json 字符串

文件上传

 1、导入依赖
	   <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
		</dependency>
 2、 <!-- 配置MultipartResolver 用于文件上传 使用spring的CommosMultipartResolver -->
	 <!--        defaultEncoding配置请求的编码格式,默认为iso-8859-1-->
	 <!--        maxUploadSize配置文件的最大单位,单位为字节-->
	 <!--        maxInMemorySize配置上传文件的缓存 ,单位为字节-->
		<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
			<property name="defaultEncoding" value="UTF-8" />
			<property name="maxUploadSize" value="102400000" />
			<property name="maxInMemorySize" value="4096" />
		</bean>
 3、@RequestMapping("fileUpload")
	public String fileUpload(@RequestParam("file") MultipartFile file) {
		// 判断文件是否为空
		if (!file.isEmpty()) {
			try {
				// 文件保存路径
				String filePath = request.getSession().getServletContext().getRealPath("/") + "upload/"
						+ file.getOriginalFilename();  //获取上传文件的原名
				// 转存文件,保存到一个目标文件中。
				file.transferTo(new File(filePath));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
     // 重定向
		return "redirect:/page/uploadfile.html";
	}

  4、<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <webResources>
                    <resource>
                        <!--webapp所在路径,此处我放在项目下,和src同级-->
                        <directory>web</directory>
                    </resource>
                </webResources>
            </configuration>
            </plugin>

多文件上传

  @RequestMapping("filesUpload")
   public String filesUpload(@RequestParam("files") MultipartFile[] files) {
   	//判断file数组不能为空并且长度大于0
   	if(files!=null&&files.length>0){
   		//循环获取file数组中得文件
   		for(int i = 0;i<files.length;i++){
   			MultipartFile file = files[i];
   			//保存文件
   			saveFile(file);
   		}
   	}
   	// 重定向
   	return "redirect:/page/uploadfiles.html";
   }