Spring-MVC

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的工作流程

1560472921825.png
  • 客户端请求被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> findAllByMap () {
    List> lists = this.usersService.findAll();
    return results;
}

文件上传

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
            
        
    

你可能感兴趣的:(Spring-MVC)