SpringMVC SpringMVC 的入门

墨蓝 2024-02-05 23:10 167阅读 0赞

2.1.环境搭建

2.1.1.创建工程

fa131c6def734302809ff558d61778e0.png

2.1.2.添加web支持

  1. 右键项目选择Add framework support...

    ffe723561b7d448588555ae440d41d03.png
    如果没有,可以参考idea2023版如何新建web项目

2.添加web支持

7e6a9f4569834221a916b966395980de.png

3.效果

35a57add18d04ae38081324089559aca.png

  • 注意:

    1. 不要先添加打包方式
    2. 将web目录要拖拽到main目录下,并改名为webapp

2.1.3.pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.by</groupId>
  7. <artifactId>SpringMVC_day01</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <!--打包方式-->
  10. <packaging>war</packaging>
  11. <dependencies>
  12. <dependency>
  13. <groupId>org.springframework</groupId>
  14. <artifactId>spring-context</artifactId>
  15. <version>5.1.8.RELEASE</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.springframework</groupId>
  19. <artifactId>spring-web</artifactId>
  20. <version>5.1.8.RELEASE</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework</groupId>
  24. <artifactId>spring-webmvc</artifactId>
  25. <version>5.1.8.RELEASE</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>javax.servlet</groupId>
  29. <artifactId>servlet-api</artifactId>
  30. <version>2.5</version>
  31. <scope>provided</scope>
  32. </dependency>
  33. <dependency>
  34. <groupId>javax.servlet.jsp</groupId>
  35. <artifactId>jsp-api</artifactId>
  36. <version>2.0</version>
  37. <scope>provided</scope>
  38. </dependency>
  39. </dependencies>
  40. <build>
  41. <plugins>
  42. <!-- 配置Tomcat插件 -->
  43. <plugin>
  44. <groupId>org.apache.tomcat.maven</groupId>
  45. <artifactId>tomcat7-maven-plugin</artifactId>
  46. <version>2.2</version>
  47. <configuration>
  48. <!--端口号-->
  49. <port>8080</port>
  50. <!--项目名-->
  51. <path>/</path>
  52. </configuration>
  53. </plugin>
  54. </plugins>
  55. </build>
  56. </project>

2.2.入门案例

2.2.1.index.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>$Title$</title>
  5. </head>
  6. <body>
  7. <a href="/hello">hello</a>
  8. </body>
  9. </html>

2.2.2.controller

  1. @Controller
  2. public class HelloController {
  3. //Map<"/hello", hello()>
  4. @RequestMapping("/hello")
  5. public ModelAndView hello() {
  6. //ModelAndView对象封装了模型数据和视图名称
  7. ModelAndView mv = new ModelAndView();
  8. //添加数据,request.setAttribute(“hello”,”hello springmvc!!”)
  9. mv.addObject("hello", "欢迎你 springmvc");
  10. //设置逻辑视图路径
  11. mv.setViewName("success");
  12. //返回数据和视图
  13. return mv;
  14. }
  15. }

2.2.3.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" xmlns:p="http://www.springframework.org/schema/p"
  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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
  8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  9. <!-- 配置创建 spring 容器要扫描的包 -->
  10. <context:component-scan base-package="com.by"></context:component-scan>
  11. <!-- 配置视图解析器 -->
  12. <bean 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注解支持:配置HandlerMapping和HandlerAdapter-->
  17. <mvc:annotation-driven></mvc:annotation-driven>
  18. </beans>

2.2.4.success.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <h2>${msg}</h2>
  8. </body>
  9. </html>

2.2.5.web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6. <servlet>
  7. <servlet-name>springmvc</servlet-name>
  8. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  9. <!-- 配置初始化参数,用于读取 SpringMVC 的配置文件 -->
  10. <init-param>
  11. <param-name>contextConfigLocation</param-name>
  12. <param-value>classpath:springmvc.xml</param-value>
  13. </init-param>
  14. <!-- 表示容器在启动时立即创建servlet对象 -->
  15. <load-on-startup>1</load-on-startup>
  16. </servlet>
  17. <servlet-mapping>
  18. <servlet-name>springmvc</servlet-name>
  19. <url-pattern>/</url-pattern>
  20. </servlet-mapping>
  21. </web-app>

2.2.6.测试

访问:http://localhost:8080/hello

05773a729ea64f40b28b93211db0d5d3.png

2.3.springmvc组件

2.3.1.DispatcherServlet前端控制器

用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。

2.3.2.HandlerMapping处理器映射器

HandlerMapping负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

2.3.3.Handler处理器

它就是我们开发中要编写的具体业务控制器。由DispatcherServlet 把用户请求转发到 Handler。由Handler对具体的用户请求进行处理。

2.3.4.HandlAdapter处理器适配器

通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

cf85035be06d4c50b1ee2c55cc381a09.png

适配器对应的处理器以及这些处理器的作用:

  1. AnnotationMethodHandlerAdapter 主要是适配注解类处理器,注解类处理器就是我们经常使用的 @Controller 的这类处理器
  2. HttpRequestHandlerAdapter 主要是适配静态资源处理器,静态资源处理器就是实现了 HttpRequestHandler 接口的处理器,这类处理器的作用是处理通过 SpringMVC 来访问的静态资源的请求
  3. SimpleControllerHandlerAdapter 是 Controller 处理适配器,适配实现了 Controller 接口或 Controller 接口子类的处理器,比如我们经常自己写的 Controller 来继承 MultiActionController.
  4. SimpleServletHandlerAdapter 是 Servlet 处理适配器, 适配实现了 Servlet 接口Servlet 的子类的处理器,我们不仅可以在 web.xml 里面配置 Servlet,其实也可以用 SpringMVC 来配置 Servlet,不过这个适配器很少用到,而且 SpringMVC 默认的适配器没有他,默认的是前面的三种。

2.3.5.View Resolver视图解析器

ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象返回给DispatcherServlet

2.3.6.View视图渲染器

view对象会调用render将model中的数据全部存放到request中完成了请求的处理,源码如下:

  1. public interface View {
  2. String RESPONSE_STATUS_ATTRIBUTE = View.class.getName() + ".responseStatus";
  3. String PATH_VARIABLES = View.class.getName() + ".pathVariables";
  4. String SELECTED_CONTENT_TYPE = View.class.getName() + ".selectedContentType";
  5. @Nullable
  6. default String getContentType() {
  7. return null;
  8. }
  9. //把model里的数据存放到request,request和response负载跳转
  10. void render(Map<String, ?> model, HttpServletRequest request,
  11. HttpServletResponse response) throws Exception;
  12. }

2.4.SpringMVC执行流程

3aafd0ebfeb84bc58c119c976a5e9f5c.png

  • 具体步骤

    Ø 第一步:发起请求到前端控制器(DispatcherServlet)

    Ø 第二步:前端控制器请求HandlerMapping查找 Handler

    Ø 第三步:处理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象,多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略

    Ø 第四步:前端控制器调用处理器适配器去执行Handler

    Ø 第五步:处理器适配器HandlerAdapter将会根据适配的结果去执行Handler

    Ø 第六步:Handler执行完成给适配器返回ModelAndView

    Ø 第七步:处理器适配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一个底层对象,包括 Model和view)

    Ø 第八步:前端控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可

    Ø 第九步:视图解析器向前端控制器返回View

    Ø 第十步:前端控制器进行视图渲染 (将数据(在ModelAndView对象中)填充到request域)

    Ø 第十一步:前端控制器向用户响应结果

2.RequestMapping注解

2.1.使用说明

  • 作用:用于建立请求URL和处理请求方法之间的对应关系。
  • 出现位置:

    • 类上:

      请求 URL的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。它出现的目的是为了使我们的 URL 可以按照模块化管理,例如:

      账户模块:

      /account/add

      /account/update

      /account/delete …

      订单模块:

      /order/add

      /order/update

      /order/delete

      红色的部分就是把RequsetMappding写在类上,使我们的URL更加精细。

    • 方法上:

      请求URL的第二级访问目录,可以窄化请求路径

  • 属性:

    value:用于指定请求的URL。它和path属性的作用是一样的。

    method:用于指定请求的方式。

    注意:以上属性只要出现2个或以上时,他们的关系是与的关系。

2.2.窄化路径示例

  • 使用二级目录访问

    1. @Controller
    2. @RequestMapping("/account")
    3. public class AccountController {
  1. @RequestMapping("/findAccount")
  2. public ModelAndView findAccount() {
  3. ModelAndView mv = new ModelAndView();
  4. mv.addObject("msg", "欢迎你 springmvc");
  5. mv.setViewName("success");
  6. return mv;
  7. }
  8. }
  • 在index.jsp里面定义超链接

    1. <a href="/account/findAccount">窄化路径</a>

2.3.method属性示例

  • 描述需要使用指定的请求方式来请求该方法

    1. @Controller
    2. @RequestMapping("/account")
    3. public class AccountController {
    4. //指定的请求方式
    5. @RequestMapping(value = "/findAccount1", method = RequestMethod.POST)
    6. public ModelAndView findAccount1() {
    7. ModelAndView mv = new ModelAndView();
    8. mv.addObject("msg", "欢迎你 springmvc");
    9. mv.setViewName("success");
    10. return mv;
    11. }
    12. }
  • 测试:在index.jsp里使用get方式请求

    1. <a href="/account/findAccount1">请求方式</a>

    结果:

    0a548293e38f4051a6e9ff2fda7390f5.png

  • 我们再换一种请求方式

    1. <form action="account/findAccount1" method="post">
    2. <input type="submit" value="保存账户,post 请求">
    3. </form>

    结果:

    5e73b33479f541f49d6f98cd1f0c3257.png

发表评论

表情:
评论列表 (有 0 条评论,167人围观)

还没有评论,来说两句吧...

相关阅读