2019-06-14
Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块,可以取代Servlet,构建轻量级框架。
SpringMVC基本配置
编写Spring控制器
@Controller
public class LoginController{
//给处理方法添加RequestMapping注解
//对应前端请求地址http://localhost:8080/TestApp/login.do
@RequestMapping("/login.do")
public String login(Users users) {
if ("admin".equals(users.getUsername())
&& "123456".equals(users.getPassword())) {
return "index";
} else {
return "login";
}
}
}
可以使用@RequestMapping添加类级别注解
@Controller
@RequestMapping ("/UsersController")
public class UsersController {
@RequestMapping ("/login.do")
public String login() {
return "login";
}
@RequestMapping ("/register.do")
public String register () {
return "register";
}
}
//对应地址http://localhost:8080/TestApp/UsersController/login.do
SpringMVC默认的响应类型为服务器转发,如果不想通过视图解析器进行响应,可以使用如下语句:
return "redirect:/xxx.jsp" //重定向
return "forward:/xxx.jsp" //服务器转发
编写SpringMVC核心配置文件 spring-mvc.xml
text/html;charset=utf-8
配置web.xml,启动Spring
contextConfigLocation
classpath:applicationContext.xml
org.springframework.web.context.ContextLoaderListener
org.springframework.web.context.request.RequestContextListener
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
springmvc
*.do
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
encodingFilter
/*
index.html
index.htm
login.jsp
default.html
default.htm
default.jsp
请求处理方法的参数
如果需要在请求处理方法中使用Servlet API类型,可以将这些类型作为请求参数来接收处理。
可以编写控制器父类拦截Servlet API进行封装。
public class GenericController {
protected HttpServletRequest request;
protected HttpServletResponse response;
protected HttpSession session;
protected ServletContext application;
//被@ModelAttribute注释的方法会在此controller每个方法执行前被执行, 可以用来拦截请求、控制登录权限等
@ModelAttribute
public void setServletApi(HttpServletRequest request,HttpServletResponse response) {
this.request = request;
this.response = response;
this.session = request.getSession();
this.application = request.getServletContext();
}
}
参数类型自动转换
在SpringMVC框架中,对于常用的数据类型,开发者无须手动进行类型转换,SpringMVC框架有许多内置的类型转换器用于完成常用的类型转换。
ModelAndView返回值
SpringMVC提供了org.springframework.web.servlet.ModelAndView类封装逻辑视图及返回值。该类可以添加Map结构数据。
new ModelAndView(逻辑视图);
new ModelAndView(逻辑视图,键,值);
ModelAndView mv = new ModelAndView();
mv.setViewName(逻辑视图);
mv.addObject(键,值);
SpringMVC的工作流程
- 客户端请求被DispatcherServlet(前端控制器)接收,然后根据url映射到业务控制器,然后调用业务控制器的方法做业务逻辑处理。
- 业务控制器返回ModelAndView对象(逻辑视图)给DispatcherServlet。
- DispatcherServlet将获取的逻辑视图传给ViewResolver视图解析器,将逻辑视图解析成物理视图。
- ViewResolver将物理视图返回给DispatcherServlet。
- DispatcherServlet将渲染后的物理视图响应给客户端。
Ajax响应
与Servlet用法基本相同,通过上面的controller父类获取到response对象,拿到输出流写入即可
Spring4的控制器可以使用response对象做出ajax响应,并利用@ResponseBody注解自动将数据生成json响应给浏览器。
@RequestMapping("/UsersController_findById.do")
public @ResponseBody Users findById(String id) {
return this.usersService.findById(id);
}
@RequestMapping("/UsersController_findAll.do")
public @ResponseBody List findAll() {
List lists = this.usersService.findAll();
return lists;
}
@RequestMapping("/UsersController_findAllByMap.do")
public @ResponseBody List
文件上传
SpringMVC框架的文件上传基于commons-fileupload组件实现,只不过SpringMVC框架在原有文件上传组件上做了进一步封装,简化了文件上传的代码实现。
上传表单
控制器
//处理文件上传 如果上传多个文件,
//可以设定MultipartFile数组或List集合参数 List photo
@RequestMapping("/FileController_upload.do")
public String upload(MultipartFile photo) throws Exception {
if (photo.isEmpty()) {
System.out.println("文件未上传");
return "error";
} else {
System.out.println("文件名: " + file.getOriginalFilename());
System.out.println("文件类型: " + file.getContentType());
System.out.println("文件大小: " + file.getSize());
System.out.println("========================================");
String fileName = photo.getOriginalFilename();
String ext = fileName.substring(fileName.lastIndexOf("."),
fileName.length());// 获得上传文件的扩展名
String newFileName = new SimpleDateFormat("yyyyMMddhhmmssSSS")
.format(new Date())+ (10000 + new Random().nextInt(90000)) + ext;
File destFile = new File(this.application
.getRealPath("upload"), newFileName); // 创建目标文件
photo.transferTo(destFile);// 复制文件
return "success";
}
}
spring-mvc.xml文件上传配置
error
MultipartFile API说明
返回值 | 方法名 | 说明 |
---|---|---|
byte[] | getBytes() | 以字节数组类型返回文件内容 |
String | getContentType() | 获取文件类型 |
InputStream | getInputStream() | 获取稳健的输入流 |
String | getName() | 返回参数名称多部分的形式 |
String | getOriginalFilename | 返回文件名 |
long | getSize() | 返回文件大小(字节) |
boolean | isEmpty() | 判断是否为空 |
void | transferTo() | 复制文件到指定文件 |
文件下载
@RequestMapping("/FileController_download.do")
public void downLoad(String id) throws Exception {
String path = this.application.getRealPath("upload") + "\\2017090102581803133040.jpg";
File file = new File(path);
this.response.setContentType("application/x-msdownload;charset=utf-8");
this.response.setHeader("Content-disposition","attachment; filename="
+ new String(file.getName().getBytes("UTF-8"), "iso-8859-1"));
this.response.setHeader("Content-Length", String.valueOf(file.length()));
InputStream input = new FileInputStream(file);
byte data[] = new byte[(int) file.length()];
input.read(data);
input.close();
OutputStream out = this.response.getOutputStream();
out.write(data);
out.close();
}
springmvc异常统一处理
在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种异常需要处理。如果每个过程都单独手动用try-catch处理,则系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大。 Spring MVC提供了统一处理异常的解决方案。
Spring MVC处理异常有3种方式:
- 使用Spring MVC提供的异常处理器SimpleMappingExceptionResolver;
- 实现Spring的异常处理接口HandlerExceptionResolver 自定义异常处理器;
- 使用@ExceptionHandler注解实现异常处理;
修改spring-mvc.mxl
error_myexception