美文网首页
Spring-MVC

Spring-MVC

作者: Mr_J316 | 来源:发表于2019-06-14 14:25 被阅读0次

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

<?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:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context-4.3.xsd
                           http://www.springframework.org/schema/aop 
                           http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
                           http://www.springframework.org/schema/tx 
                           http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
                           http://www.springframework.org/schema/mvc
                           http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">

    <!--启用spring mvc注解 -->
    <mvc:annotation-driven />

    <!--设置使用注解的类所在的包路径 -->
    <context:component-scan base-package="com.jevon.controller" />

    <!--视图解析器 -->
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--prefix和suffix:配置视图页面的前缀和后缀(前缀[逻辑视图名]后缀 -->
        <property name="prefix" value="/" />
        <property name="suffix" value=".jsp" />
        <!--JstlView视图类 -->
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="contentType">
            <value>text/html;charset=utf-8</value>
        </property>
    </bean>

    <!-- 静态资源不经过controller -->
    <mvc:resources mapping="/images/**" location="/images/" />
    <mvc:resources mapping="/css/**" location="/css/" />
    <mvc:resources mapping="/js/**" location="/js/" />

</beans>

配置web.xml,启动Spring

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee  
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1">
    <!--指定配置文件路径 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <!--通过ContextLoaderListener启用spring容器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!--请求监听器 -->
    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>
    <!--核心控制器 -->
    <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:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    <!--请求编码过滤器 -->
    <filter>
        <filter-name>encodingFilter</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>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!--启动页 -->
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>login.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
</web-app>

请求处理方法的参数

如果需要在请求处理方法中使用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<Users> findAll() {
    List<Users> lists = this.usersService.findAll();
    return lists;
}

@RequestMapping("/UsersController_findAllByMap.do")
public @ResponseBody List<Map<String, String>> findAllByMap () {
    List<Map<String, String>> lists = this.usersService.findAll();
    return results;
}

文件上传

SpringMVC框架的文件上传基于commons-fileupload组件实现,只不过SpringMVC框架在原有文件上传组件上做了进一步封装,简化了文件上传的代码实现。

上传表单

<form action="FileController_upload.do" method="post" enctype="multipart/form-data">
    <p>
        请选择照片:<input type="file" name="photo" />
    </p>
    <input type="submit" value="上传" />
</form>

控制器

//处理文件上传 如果上传多个文件,
//可以设定MultipartFile数组或List集合参数 List<MultipartFile> 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文件上传配置

<!--文件上传处理器 -->  
<bean id="multipartResolver"  
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
    <property name="defaultEncoding" value="UTF-8"/>  
    <!-- 指定所上传文件的总大小不能超过512K。
         注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 
    -->  
    <property name="maxUploadSize" value="512000"/>  
</bean>  
      
<!--文件上传异常处理器 -->  
<bean id="exceptionResolver" 
      class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
    <property name="exceptionMappings">  
        <props>  
            <!-- 抛出异常时,自动跳转到指定页面 -->  
            <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">
               error
            </prop>  
        </props>  
    </property>  
</bean> 

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

<!-- 异常处理器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <!-- 定义默认的异常处理页面 -->
    <property name="defaultErrorView" value="error"></property>
    <!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception -->
    <property name="exceptionAttribute" value="ex"></property>
    <!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常处理页名作为值 -->
    <property name="exceptionMappings">
        <props>
            <prop key="com.exception.MyException">error_myexception</prop>
            <!-- 这里还可以继续扩展对不同异常类型的处理 -->
        </props>
    </property>
</bean>

相关文章

  • spring-mvc

    spring-mvc spring-mvc不是spring的core内容,需要额外引入jar包spring-mvc...

  • springmvc xml

    spring-beans.xml spring-context.xml spring-mvc spring-dat...

  • 源码分析spring-mvc启动流程

    spring-mvc 的启动流程 1、request 请求到达 dispatchServlet-> doServi...

  • spring-mvc

  • spring-mvc

    springmvc DispatcherServlet:前端控制器 概念:spring在web层的一个mvc架构的...

  • Spring-MVC

    监听器初始化ioc 配置文件拆分 @ControllerAdvice全局异常拦截 @RestControllerA...

  • Spring-MVC

    2019-06-14 Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块,可以取代Servlet...

  • spring-mvc

    您有一份文件待查收!即刻点击链接获取文件: https://cowtransfer.com/s/8f865d551...

  • Spring-MVC

    Spring MVC是Spring给我们提供的一个用于简化Web开发的框架 简介 MVC体系 常用的开发框架一般基...

  • 0509-web:app页面完善:s-mvc交互框架(数据绑定)

    spring-mvc交互框架 概述 Controller会返回一个ModelAndView的实例 Spring根据...

网友评论

      本文标题:Spring-MVC

      本文链接:https://www.haomeiwen.com/subject/lmzufctx.html