SpringMVC简介
SpringMVC是基于Model2实现的技术框架,spring MVC是围绕(DispatcherServlet)分发器设计的,其作用就是将请求分发到不同的控制器。
Spring MVC的工作原理
Maven 依赖
spring:
beans,
context,
context-support,
core,
aop,
aspect,
expression,
web,
webmvc
aspectj:
aspectjweaver
aopalliance
commons:
logging
fileupload
控制器处理输入参数
请求映射方式
- 根据请求方式 method = GET
- Ant风格的URL路径
- 支持?//*三种匹配符
- ?—— 匹配一个字符
- /*/path —— 匹配文件名的任意字符,即匹配一层路径
- ** —— 匹配多层路径
- Restful风格的路径
请求参数接收
- 直接接收参数(Get))
/**
* 1.直接把表单的参数写在Controller相应的方法的形参中
* @param username
* @param password
* @return
*/
@RequestMapping("/addUser1")
public String addUser1(String username,String password) {
System.out.println("username is:"+username);
System.out.println("password is:"+password);
return "demo/index";
}
url形式:http://localhost/SSMDemo/demo/addUser1?username=lixiaoxi&password=111111 提交的参数需要和Controller方法中的入参名称一致。
- @PathVariable接收参数
/**
* 4、通过@PathVariable获取路径中的参数
* @param username
* @param password
* @return
*/
@RequestMapping(value="/addUser4/{username}/{password}",method=RequestMethod.GET)
public String addUser4(@PathVariable String username,@PathVariable String password) {
System.out.println("username is:"+username);
System.out.println("password is:"+password);
return "demo/index";
}
例如,访问http://localhost/SSMDemo/demo/addUser4/lixiaoxi/111111 路径时,则自动将URL中模板变量{username}和{password}绑定到通过@PathVariable注解的同名参数上,即入参后username=lixiaoxi、password=111111。
- @RequestParam接收参数
当请求参数username不存在时会有异常发生,可以通过设置属性required=false解决,例如: @RequestParam(value=”username”, required=false)
- HttpServletRequest接收参数(Get/Post)
/**
* 2、通过HttpServletRequest接收
* @param request
* @return
*/
@RequestMapping("/addUser2")
public String addUser2(HttpServletRequest request) {
String username=request.getParameter("username");
String password=request.getParameter("password");
System.out.println("username is:"+username);
System.out.println("password is:"+password);
return "demo/index";
}
- 通过Bean来接收参数(Get/Post)
Bean
···
package demo.model;
public class UserModel {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
···
通过Bean获取参数
/**
* 3、通过一个bean来接收
* @param user
* @return
*/
@RequestMapping("/addUser3")
public String addUser3(UserModel user) {
System.out.println("username is:"+user.getUsername());
System.out.println("password is:"+user.getPassword());
return "demo/index";
}
- @ModelAttribute获取POST请求参数
pojo
public class Pojo{
private String a;
private int b;
//setter...
}
通过pojo获取参数
@RequestMapping(method= RequestMethod.POST)
public String processSubmit(@ModelAttribute( " pojo " ) Pojo pojo) {
return " helloWorld " ;
}
注意:
Restful——@PathVariable,主要指向资源,当指向状态时,用@RequestParam.
控制器处理返回值类型
- ModelMap类型
@RequestMapping(value = "getModel",method = RequestMethod.GET)
public ModelMap getModel(){
ModelMap modelMap = new ModelMap();
modelMap.put("1","hello world");
return modelMap;
}
- Map类型
@RequestMapping(value = "/getMethod",method = RequestMethod.GET) //二级URL
public Map<String,Object> getMethod(){
Map data = new HashMap<String,Object>();
data.put("1","hello world");
return data;
}
- ModelAndView类型
保存模型到HttpSession
通过控制器(类)上标记@SessionAttributes注解,可将模型数据保存到HttpSession中,以便多个请求之间共用该模型属性。
@SessionAttributes(“key”)
控制器类型转换,格式化和数据校验
通过@InitBinder实现数据格式化
通过在属性上添加相应注解实现格式化
pom.xml
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.9.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jboss.logging/jboss-logging -->
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.3.2.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml/classmate -->
<dependency>
<groupId>com.fasterxml</groupId>
<artifactId>classmate</artifactId>
<version>1.4.0</version>
</dependency>
Person.java
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birth;
在属性上添加相应注解实现数据校验
package cn.edu.scnu.po;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Date;
public class Person {
@NotNull
private Integer id;
@Size(min = 6,max = 16)
private String name;
@NotNull
@Range(min = 18,max = 45)
private Integer age;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birth;
@Email
@NotNull
private String email;
//setters和getters
}
Spring MVC实现Restful接口
SpringMVC 实现文件上传和下载
Pom.xml
文件上传与下载——基于springboot
文件上传本质上是文件复制,即将获得的MultiPartFile复制到服务器。
文件下载也是一个文件复制过程,即将服务器上的文件复制到response中。
package cn.edu.scnu.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
@RestController
@RequestMapping("/file")
public class FileController {
/**
* w
* @param srcFile
* @return
*
* 文件上传本质上就是一个文件复制过程
*/
@RequestMapping(value = "/upload",method = RequestMethod.POST)
public String fileUpload(@RequestParam("file")MultipartFile srcFile) throws IOException {
if(!srcFile.isEmpty()){
String path = "D://text";
String fileName = srcFile.getOriginalFilename();
//获取源文件输入流
InputStream inputStream = srcFile.getInputStream();
//获取输出流
OutputStream outputStream = new FileOutputStream(new File(path));
int value = 0;
while((value=inputStream.read())!=-1){
outputStream.write(value);
}
inputStream.close();
outputStream.close();
return "文件上传成功";
}else {
return "文件上传失败";
}
}
@RequestMapping("downloadFile")
public void downloadFile(HttpServletResponse response){
//下载的文件
File downloadFile = new File("C:\\Users\\lay77\\Pictures\\timgbjn.jpg");
//输入流\
InputStream inputStream =null;
//输出流是response
OutputStream outputStream = null;
try {
inputStream = new FileInputStream(downloadFile);
outputStream = response.getOutputStream();
//文件复制_通过缓存数组复制
byte[] bytes = new byte[1024];
int len = 0;
while((len = inputStream.read(bytes))!=-1){
outputStream.write(bytes,0,len);
}
System.out.println("下载成功");
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
inputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}