目录
1丶访问静态文件
1.1丶配置springmvc-servlet.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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注解-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--扫描Controller包-->
<context:component-scan base-package="controller"></context:component-scan>
<!--放行jsp所有静态资源-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!--配置静态资源-->
<!--<mvc:resources mapping="/statics/**" location="/statics/"/>-->
<!--两种方式任意选择,第二种方式js文件夹要在statics文件夹下才生效-->
</beans>
1.2丶配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="4.0">
<!--过滤器让整个web项目转发重定向都不会出现中文乱码-->
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--Spring mvc的核心类是一个Servlet,叫做前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
<!--DispatcherServlet是springmvc的核心控制着整个页面的转发和重定向-->
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!--加载spring mvc配置文件-->
<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>
</web-app>
1.3丶导入静态文件
<head>
<title>$Title$</title>
<script src="js/jquery-1.12.4.js"></script>
</head>
1.4丶所需jar包
2丶文件上传与下载
web.xml与jar包与上面一致
2.1丶配置springmvc-servlet.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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注解-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--扫描Controller包-->
<context:component-scan base-package="controller"></context:component-scan>
<!--放行jsp所有静态资源-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!--配置文件上传组装说明书-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--设置文件上传最大大小(字节)-->
<property name="maxUploadSize" value="500000"></property>
<!--设置文件上传格式-->
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
</beans>
2.2丶在web文件下创建statics文件夹
2.3丶创建上传文件的jsp
<%--
Created by IntelliJ IDEA.
User: ACER
Date: 2022/3/11
Time: 10:07
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file"></br>
<input type="text" name="id"></br>
<input type="submit">
</form>
<h1><a href="download?filename=winter.jpg">点我下载</a></h1>
</body>
</html>
2.4丶创建Controller
package controller;
import org.apache.commons.io.FileUtils;
import org.aspectj.util.FileUtil;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.xml.ws.spi.http.HttpHandler;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
/*
* 将类注解为控制器
* */
@Controller
public class FlieController {
@RequestMapping("/upload")
public String upload(String id, @RequestParam MultipartFile file, HttpServletRequest req){
System.out.println("接收到id:"+id);
System.out.println("接收到文件:"+file);
//正式开始文件上传
if(!file.isEmpty()){
//准备好一个文件夹接收上传的文件
//获得服务器虚拟的路径(临时的)
String path=req.getSession().getServletContext().getRealPath("statics");
System.out.println("文件上传的路径是:"+path);
//获得文件名称
String filename=file.getOriginalFilename();
File f=new File(path+File.separator+filename);
try {
//文件上传
file.transferTo(f);
} catch (IOException e) {
e.printStackTrace();
}
}
return "file.jsp";
}
/*文件下载的方法*/
@RequestMapping("/download")
public ResponseEntity<byte[]> download(String filename, HttpServletRequest req, Model m)throws Exception{
/*定义服务器资源所在目录*/
String path="D://javafile";
File file=new File(path+File.separator+filename);
//请求头
HttpHeaders headers=new HttpHeaders();
String downloadFilename=new String(filename.getBytes("UTF-8"),"iso-8859-1");
//请求头设置数据表单
headers.setContentDispositionFormData("attachment",downloadFilename);
//设置请求头的类型
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
};
}
2.5丶运行效果
上传图片:
注意:上传的图片是保存在项目的out目录下,如果out目录删除则上传的图片也将消失!与servlet上传的方式一致。
详情请查看:2022/3/19 Java开发之Java web编程 第七章 使用JSP/Servlet开发复杂业务(分页+上传文件)_Abcdzzr的博客-CSDN博客
下载图片:
注意:此方式下载的文件不能下载临时目录下的文件,只能下载静态文件夹的文件
3丶RestFul 风格
3.1丶概念
Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
3.2丶功能
- 资源:互联网所有的事物都可以被抽象为资源
- 资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。 分别对应 添加、 删除、修改、查询。
3.3丶 传统方式操作资源
通过不同的参数来实现不同的效果!方法单一,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
3.4丶使用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
3.5丶学习测试
1. 在新建一个类 RestFulController
@Controller
public class RestFulController {
}
2. 在Spring MVC中可以使用 @PathVariable 注解,让方法参数的值对应绑定到一个URI模板变量上。
@Controller
public class RestFulController {
//映射访问路径
@RequestMapping("/commit/{p1}/{p2}")
public String index(@PathVariable int p1, @PathVariable int p2,
Model model){
int result = p1+p2;
//Spring MVC会自动实例化一个Model对象用于向视图中传值
model.addAttribute("msg", "结果:"+result);
//返回视图位置
return "test";
}
}
3.我们来测试请求查看下
思考:使用路径变量的好处?
- 使路径变得更加简洁;
- 获得参数更加方便,框架会自动进行类型转换。
- 通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法,如这里访问是的路径是/commit/1/a,则路径与方法不匹配,而不会是参数转换失败。
4. 我们来修改下对应的参数类型,再次测试
//映射访问路径
@RequestMapping("/commit/{p1}/{p2}")
public String index(@PathVariable int p1, @PathVariable String p2, Model
model){
String result = p1+p2;
//Spring MVC会自动实例化一个Model对象用于向视图中传值
model.addAttribute("msg", "结果:"+result);
//返回视图位置
return "test";
}
5.使用method属性指定请求类型
用于约束请求的类型,可以收窄请求范围。指定请求谓词的类型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等
我们来测试一下:
- 增加一个方法
//映射访问路径,必须是POST请求 @RequestMapping(value = "/hello",method = {RequestMethod.POST}) public String index2(Model model){ model.addAttribute("msg", "hello!"); return "test"; }
-
我们使用浏览器地址栏进行访问默认是Get请求,会报错405:
-
如果将POST修改为GET则正常了;
//映射访问路径,必须是Get请求 @RequestMapping(value = "/hello",method = {RequestMethod.GET}) public String index2(Model model){ model.addAttribute("msg", "hello!"); return "test"; }
6.小结
Spring MVC 的 @RequestMapping 注解能够处理 HTTP 请求的方法, 比如 GET, PUT, POST, DELETE 以
及 PATCH。
7.所有的地址栏请求默认都会是 HTTP GET 类型的。
方法级别的注解变体有如下几个: 组合注解
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@GetMapping 是一个组合注解
它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。
平时使用的会比较多!
4丶Spring表单标签及数据效验
详细请查看:学习SpringMVC必知必会(7)~springmvc的数据校验、表单标签、文件上传和下载_一 乐的博客-CSDN博客
Spring MVC数据校验详解_半粒冰块的博客-CSDN博客_springmvc校验注解
4.1丶Spring提供的常用表单标签
标签名称 | 说明 |
<fm:form/> | 渲染表单元素 |
<fm:input/> | 文本框组件标签 |
<fm:password/> | 密码框组件标签 |
<fm:hidden/> | 隐藏框组件标签 |
<fm:textarea/> | 多行文本框组件标签 |
<fm:radiobutton/> | 单选框组件标签 |
<fm:checkbox/> | 复选框组件标签 |
<fm:select/> | 下拉框组件标签 |
<fm:error/> | 显示表单数据效验所对应的错误信息 |
这些标签都拥有以下属性:
- path:属性路径,表示表单对象属性,如account,realName等。
- cssClass:表单组件对应的CSS样式类名。
- cssErrorClass:当提交表单后报错(服务端错误),采用CSS样式类。
- sccStyle :表单组件对应的CSS样式。
- htmlEscape:绑定的表单属性值是否要对HTML特殊字符进行转换,默认为true。
4.2丶JSR 303约束
约束 | 说明 |
@Null | 被注解的元素必须为null |
@NotNull | 被注解的元素必须不为null |
@AssertTrue | 被注解的元素必须为true |
@AssertFalse | 被注解的元素必须为false |
@Min(value) | 被注解的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 被注解的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 被注解的元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 被注解的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max,min) | 被注解的元素必须的大小必须在指定范围内 |
@Digits(integer,fraction) | 被注解的元素必须是一个数字,其值得整数位和小数位上限必须在可接受的范围内 |
@Past | 被注解的元素必须是一个过去的日期 |
@Future | 被注解的元素必须是一个将来的日期 |
@Pattern(value) | 被注解的元素必须符合指定的正则表达式 |
5丶多文件上传
详情请查看:
SpringMvc实现多文件上传_鹿谷門実的博客-CSDN博客_springmvc多文件上传
6丶本章总结
- Spring MVC框架提供了<mvc:default-servlet-handler>与<mvc:resources/>标签来实现静态资源的访问。
- REST风格是当下最流行的API风格,Spring MVC框架对其提供了良好支持,通过@PathVariable注解,可以将URL中的{XXX}占位符参数绑定到控制器处理方法的入参中。
- 在Spring MVC框架中,Servlet API可以作为处理方法的入参使用,使用方式与普通对象类型入参没有区别。
- 在Spring MVC框架中要实现文件上传,需要使用MultipartResolver来处理上传请求,通过CommonsMultipartResolver配置MultipartResolver解析器。
- Spring提供了自己的一套表单标签库,实现了类似EL表达式和JSTL标签库的功能,其中<fm:form>标签通过modelAttribute来指定绑定的模型属性。
- 在Spring MVC框架中,可以使用JSR 303实现服务器端的数据验证功能。