引入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";
}