• 基础:完成 Tomcat 的安装,并与 IDEA 集成

    • 注意:IDEA 社区版可以使用 Smart Tomcat 插件,具体配置项目的方法可见

      1. 新建 spring-mvc 项目

      image.png
  • 注意:location 中对应 name 的文件必须点击右边的文件符号在本地对应找到,所以事先应先建好;

image.png

  • 下一步是配置 maven 的路径,注意对应好 maven 的 setting.xml 和 repository 路径,其中 repository 路径可作在 setting.xml 中修改 标签;

image.png

  • 为了解决 maven 创建项目加载过慢的问题,可以在 properties 中添加: archetypeCatalog:internal;

image.png

  • 在 main 路径下,创建两个子文件:java、resource,右键 mark directory as 对应选择:Source root 和 Resource root;

image.png

2. 配置文件

2.1 配置 src 路径下的 pom.xml ,并导入依赖包

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>cn.tjufe</groupId>
  6. <artifactId>springmvc_1</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <packaging>war</packaging>
  9. <name>springmvc_1 Maven Webapp</name>
  10. <!-- FIXME change it to the project's website -->
  11. <url>http://www.example.com</url>
  12. <!--版本锁定-->
  13. <properties>
  14. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  15. <maven.compiler.source>1.8</maven.compiler.source>
  16. <maven.compiler.target>1.8</maven.compiler.target>
  17. <spring.version>5.0.2.RELEASE</spring.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework</groupId>
  22. <artifactId>spring-context</artifactId>
  23. <version>${spring.version}</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework</groupId>
  27. <artifactId>spring-web</artifactId>
  28. <version>${spring.version}</version>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework</groupId>
  32. <artifactId>spring-webmvc</artifactId>
  33. <version>${spring.version}</version>
  34. </dependency>
  35. <dependency>
  36. <groupId>javax.servlet</groupId>
  37. <artifactId>servlet-api</artifactId>
  38. <version>2.5</version>
  39. <scope>provided</scope>
  40. </dependency>
  41. <dependency>
  42. <groupId>javax.servlet.jsp</groupId>
  43. <artifactId>jsp-api</artifactId>
  44. <version>2.0</version>
  45. <scope>provided</scope>
  46. </dependency>
  47. </dependencies>
  48. <build>
  49. <finalName>springmvc_day01_01_start</finalName>
  50. <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
  51. <plugins>
  52. <plugin>
  53. <artifactId>maven-clean-plugin</artifactId>
  54. <version>3.0.0</version>
  55. </plugin>
  56. <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
  57. <plugin>
  58. <artifactId>maven-resources-plugin</artifactId>
  59. <version>3.0.2</version>
  60. </plugin>
  61. <plugin>
  62. <artifactId>maven-compiler-plugin</artifactId>
  63. <version>3.7.0</version>
  64. </plugin>
  65. <plugin>
  66. <artifactId>maven-surefire-plugin</artifactId>
  67. <version>2.20.1</version>
  68. </plugin>
  69. <plugin>
  70. <artifactId>maven-war-plugin</artifactId>
  71. <version>3.2.0</version>
  72. </plugin>
  73. <plugin>
  74. <artifactId>maven-install-plugin</artifactId>
  75. <version>2.5.2</version>
  76. </plugin>
  77. <plugin>
  78. <artifactId>maven-deploy-plugin</artifactId>
  79. <version>2.8.2</version>
  80. </plugin>
  81. </plugins>
  82. </pluginManagement>
  83. </build>
  84. </project>

2.2 配置 src/main/webapp/WEB-INF/web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app>
  3. <display-name>Archetype Created Web Application</display-name>
  4. <!--配置解决中文乱码的过滤器-->
  5. <filter>
  6. <filter-name>characterEncodingFilter</filter-name>
  7. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  8. <init-param>
  9. <param-name>encoding</param-name>
  10. <param-value>UTF-8</param-value>
  11. </init-param>
  12. </filter>
  13. <filter-mapping>
  14. <filter-name>characterEncodingFilter</filter-name>
  15. <url-pattern>/*</url-pattern>
  16. </filter-mapping>
  17. <servlet>
  18. <servlet-name>dispatcherServlet</servlet-name>
  19. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  20. <init-param>
  21. <param-name>contextConfigLocation</param-name>
  22. <param-value>classpath:springmvc.xml</param-value>//说明 ioc 容器的文件路径
  23. </init-param>
  24. <load-on-startup>1</load-on-startup>//确定初始化的优先级,数字越小,优先级越高
  25. </servlet>
  26. <servlet-mapping>
  27. <servlet-name>dispatcherServlet</servlet-name>
  28. <url-pattern>/</url-pattern>
  29. </servlet-mapping>
  30. </web-app>
  • 若遇到报错:The content of element type “web-app” must match “(icon?,display- name?,description?…

    • 解决方法:调整配置的顺序,删除 • <!DOCTYPE web-app PUBLIC”-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN…….”

      2.3 配置 src/main/resources/springmvc.xml

  • 注意:文件的名字必须与 web.xml 中对应一致

image.png

  • 注意:使用 能自动加载 RequestMappingHandlerMapping(处理映射器)、RequestMappingHandlerAdapter(处理适配器),可用在 springmvc.xml 配置文件中替代注解处理器和适配器的配置,但是视图解析器得自己配置;

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:mvc="http://www.springframework.org/schema/mvc"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
    8. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
    9. <!-- 包扫描 -->
    10. <context:component-scan base-package="cn.tjufe"/>
    11. <!-- 视图解析器对象-->
    12. <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    13. <property name="prefix" value="/WEB-INF/pages/"></property>
    14. <property name="suffix" value=".jsp"></property>
    15. </bean>
    16. <!--开启 SpringMVC 框架注解的支持-->
    17. <mvc:annotation-driven/>

    3. 配置 TomcatServer

    image.png
    image.png

    4. 写一个简单的 HelloController

  • 调用逻辑

springmvc.png

  • 结果

image.png
image.png

5. 其他

5.1 请求参数的绑定

mvc2.pngmvc3.png

用 IDEA 实现简单的 SpringMVC 程序 - 图14
用 IDEA 实现简单的 SpringMVC 程序 - 图15

5.2 自定义类型转换器

mvc1.png

5.3 响应数据和结果视图

  • 如果想将响应数据返回的话,可使用参数 Model、ModelAndView 或 HttpServletResponse;
  • 返回的字符串一般是响应的结果视图 xxx.jsp;
  • 处理返回结果为 void 时,除了可使用转发(依赖 request)或重定向(依赖 response),也可以利用 response.getWriter() 直接响应结果;
  • 以下案例 1、2 实现的功能一样,且 1 的底层调用逻辑就是 2 ;
  • 推荐使用关键字(forward:xxx,rediret:xxx)来进行返回值为 String 类型的转发或重定向操作

    1. @Controller
    2. @RequestMapping("/user/")
    3. public class ParamController {
    4. //1. 返回的是字符串
    5. @RequestMapping("getUser1")
    6. public String getUser(Model model){
    7. User1 user = new User1();
    8. user.setId("1");
    9. user.setAge(18);
    10. model.addAttribute("user",user);
    11. return "result01";
    12. }
    13. //2. 返回的是ModelAndView
    14. @RequestMapping("testModelAndView")
    15. public ModelAndView testModelAndView(){
    16. ModelAndView mv = new ModelAndView();
    17. User1 user = new User1();
    18. user.setId("1");
    19. user.setAge(18);
    20. mv.addObject("user",user);
    21. mv.setViewName("result01");
    22. return mv;
    23. }
    24. //返回为空 void
    25. @RequestMapping("dealVoid")
    26. public void getUser(HttpServletRequest request, HttpServletResponse response) throws Exception {
    27. System.out.println("dealVoid 方法执行了...");
    28. //编写请求转发的程序
    29. // request.getRequestDispatcher("/WEB-INF/pages/result01.jsp").forward(request, response);
    30. //重定向
    31. // response.sendRedirect(request.getContextPath() + "/index.jsp");
    32. response.setCharacterEncoding("UTF-8");
    33. response.setContentType("text/html;charset=UTF-8");
    34. //直接进行响应
    35. response.getWriter().print("你好");
    36. return;
    37. }
    38. /**
    39. * 使用关键字来进行返回值为String类型的转发或重定向操作
    40. * @return
    41. */
    42. @RequestMapping("testForwardOrRedirect")
    43. public String testForwardOrRedirect(){
    44. System.out.println("testForwardOrRedirect方法执行了");
    45. // return "forward:/WEB-INF/pages/result01.jsp";
    46. return "redirect:/index.jsp";
    47. }
    48. }

    mvc1.png

    5.4 Ajax 与 JSON 字符串

  • 在 pom.xml 中需要导入的 jar 包

    1. <dependency>
    2. <groupId>com.fasterxml.jackson.core</groupId>
    3. <artifactId>jackson-databind</artifactId>
    4. <version>2.9.0</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>com.fasterxml.jackson.core</groupId>
    8. <artifactId>jackson-core</artifactId>
    9. <version>2.9.0</version>
    10. </dependency>
    11. <dependency>
    12. <groupId>com.fasterxml.jackson.core</groupId>
    13. <artifactId>jackson-annotations</artifactId>
    14. <version>2.9.0</version>
    15. </dependency>

    mvc1.png

    5.6 文件上传

  • pom.xml 中的 jar 包配置

    1. <!--文件上传-->
    2. <dependency>
    3. <groupId>commons-fileupload</groupId>
    4. <artifactId>commons-fileupload</artifactId>
    5. <version>1.3.1</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>commons-io</groupId>
    9. <artifactId>commons-io</artifactId>
    10. <version>2.4</version>
    11. </dependency>
    12. <!--实现跨服务器的文件上传-->
    13. <dependency>
    14. <groupId>com.sun.jersey</groupId>
    15. <artifactId>jersey-core</artifactId>
    16. <version>1.18.1</version>
    17. </dependency>
    18. <dependency>
    19. <groupId>com.sun.jersey</groupId>
    20. <artifactId>jersey-client</artifactId>
    21. <version>1.18.1</version>
    22. </dependency>

    (1)传统文件上传
    image.png

      @RequestMapping("testFileUpLoad")
      public String testFileUpLoad(HttpServletRequest request) throws Exception {
          System.out.println("文件上传....");
          // 1. 上传的位置
          String path = request.getSession().getServletContext().getRealPath("/uploads/");
          // 2. 判断路径是否存在,并创建该文件夹
          File file = new File(path);
          if (!file.exists()) {
              file.mkdir();
          }
          // 3. 解析 request 对象,获取上传文件项
          DiskFileItemFactory factory = new DiskFileItemFactory();
          ServletFileUpload upload = new ServletFileUpload(factory);
          List<FileItem> items = upload.parseRequest(request);
          // 4. 遍历判断当前 item 对象是否是上传文件项
          for (FileItem item:items){
              if (item.isFormField()) {
                  //说明是普通表单项
              } else {
                  String filename = item.getName();
                  //通过 UUID 把文件的名称设置为唯一值
                  String uuid = UUID.randomUUID().toString().replace("-","");
                  filename = uuid + "_" + filename;
                  //依据获取的文件名称和设定的文件路径完成文件上传
                  item.write(new File(path, filename));
                  //删除临时文件
                  item.delete();
              }
          }
          return "result01";
      }
    

    (2)SpringMVC 文件上传

      @RequestMapping("testFileUpLoad2")
      public String testFileUpLoad2(HttpServletRequest request, MultipartFile upload) throws Exception {
          System.out.println("文件上传...");
          // 1. 上传的位置
          String path = request.getSession().getServletContext().getRealPath("/uploads/");
          // 2. 判断路径是否存在,并创建该文件夹
          File file = new File(path);
          if(!file.exists()){
              file.mkdir();
          }
          // 3. 通过 MultipartFile 解析 request 对象来获取上传文件项
          String filename = upload.getOriginalFilename();
          String uuid = UUID.randomUUID().toString().replace("-","");
          filename = uuid + "_" + filename;
          // 4. 通过 MultipartFile 完成文件上传
          upload.transferTo(new File(path, filename));
          return "result01";
      }
    

    (3)跨服务器文件上传

    • 注意两点,一是 index.jsp 中的文件命名,而是 spring.mvc 配置 multipartResolver 的 id 默认不能修改;

image.png
image.png

    @RequestMapping("testFileUpLoad3")
    public String testFileUpLoad3(MultipartFile upload) throws Exception {
        System.out.println("跨服务器文件上传...");
        //1.定义要上传的文件服务器路径
        String path = "http://localhost:9090/uploads/";
        //2.通过 MultipartFile 解析 request 对象来获取上传文件项
        String filename = upload.getOriginalFilename();
        String uuid = UUID.randomUUID().toString().replace("-","");
        filename = uuid + "_" + filename;
        //3.创建客户端的对象,并和图片服务器进行连接
        Client client = Client.create();
        WebResource webResource =  client.resource(path + filename);
        //4.上传文件
        webResource.put(upload.getBytes());
        return "result01";
    }

5.7 spring MVC 异常处理

image.png
mvc1.png

5.8 自定义拦截器

  • 通过定义两个 MyInterceptor 来测试拦截链的执行顺序mvc1.png

    5.9 springmvc 常用注解

    6. 异常记录

  • requestBody 从客户端传来的 json 字符串乱码,会导致服务端的 json 无法被 spring 自动解析成相应的 bean 对象;

image.png

  • maven 在新添依赖包的时候,如果某次下载失败,之后会自动跳过,解决方法有两个:
    • 一是找到 maven 的 repository,从中找到下载失败的文件夹然后删掉(里边没有下载好 jar 包),然后再到右边的 maven 图标点更新;
    • 二是在 maven_repository 的官网找到对应的包并下载下来(ps. 官网会提供对应 jar 包在 pom.xml 中的 dependecy 描述);
  • 跨服务器上传文件的时候,报错 404(还未解决,实在不知道怎么搞)
    • 尝试一:将 web.xml 中 servlet 的 readOnly 设置为 false;
    • 尝试二:在 server.xml 添加一个配置在标签内部

image.png

参考

黑马教程-springmvc教程IDEA版