码迷,mamicode.com
首页 > 编程语言 > 详细

SpringMVC

时间:2021-02-09 12:30:34      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:tco   app   重定向   load   link   put   传统   ppc   https   

SpringMVC的执行流程

简要分析执行流程

  1. DispatcherServlet表示前端控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。

    我们假设请求的url为 : http://localhost:8080/SpringMVC/hello

    如上url拆分成三部分:

    http://localhost:8080服务器域名

    SpringMVC部署在服务器上的web站点

    hello表示控制器

    通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。

  2. HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。(在还没有用注解开发时,最开始会在xml中配置handler)

    <!--Handler-->
        <bean id="/hello" class="com.ccunix.controller.HelloCoontroller"/>
  3. HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello。

  4. HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。

  5. HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。

  6. Handler让具体的Controller执行。

  7. Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。

  8. HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。

  9. DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。

  10. 视图解析器将解析的逻辑视图名传给DispatcherServlet。

  11. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。

  12. 最终视图呈现给用户。

技术图片

技术图片

配置SpringMVC的步骤

第一种方式

1、在web.xml中配置前端控制器

<!--前端控制器-->
  <servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--加载springMVC的配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <!--加载的级别 数字越小级别越大-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  
  <!--拦截的路径-->
  <servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <!--
    /与/*的区别
    /不会拦截.jsp文件
    /*会拦截.jsp文件和url路径
    -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>

2、springmvc-servlet.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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--添加 处理映射器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--添加 处理器适配器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <!--视图解析器:DispatcherServlet给他的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
    
    <!--Handler-->
    <bean id="/xxx" class="xx.xx.xx.controller.xx"/>
</beans>


第二种方式

1、在web.xml中配置前端控制器,与第一种方式的一样

2、springmvc-servlet.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:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--开启扫描 因为springmvc是负责controller层的  所以只扫描controller就好了-->
    <context:component-scan base-package="xx.xx.controller"/>

    <!--前端控制器,哪些静态资源不拦截 比如.css .js-->
    <mvc:default-servlet-handler/>

    <!--开启springMVC框架注解的支持-->
    <!--
       支持mvc注解驱动
       在spring中一般采用@RequestMapping注解来完成映射关系
       要想使@RequestMapping注解生效
       必须向上下文中注册DefaultAnnotationHandlerMapping
       和一个AnnotationMethodHandlerAdapter实例
       这两个实例分别在类级别和方法级别处理。
       而annotation-driven配置帮助我们自动完成上述两个实例的注入。
    -->
    <mvc:annotation-driven/>

    <!--视图解析器:DispatcherServlet给他的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--配置文件解析器 要求id值必须为multipartResolver-->
    <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver">
        <!--10*1024*1024 10M-->
        <property value="10485760" name="maxUploadSize"/>
    </bean>

    <!--拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/admin/**"/>
            <bean class="org.ccunix.coffee.interceptor.AdminLoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>

 

RestFul风格

这个是传统的url地址

http://localhost:8080/index/user/add?a=1&b=2

@Controller
@RequestMapping("/user")
public class RestFulController {
    @RequestMapping("/add")
    public String add( Integer a,  Integer b, Model model){
        int result = a + b;
        model.addAttribute("msg","结果为"+result);
        System.out.println(result);
        return "add";
    }
}

restful风格的url

http://localhost:8080/user/mult/1/2

@RequestMapping(value = "/mult/{a}/{b}",method = RequestMethod.GET)
    public String mult( @PathVariable("a") Integer a,  @PathVariable("b") Integer b, Model model){
        int result = a + b;
        model.addAttribute("msg","结果为"+result);
        System.out.println(result);
        return "add";
    }

@RequestMapping(value = "/mult/{a}/{b}",method = RequestMethod.GET)相当于是Get方法的restFul请求
可以简写
@GetMapping("/mult/{a}/{b}")

restFul接口请求分类
get、post、put、delete、patch
同理这些请求提交方式也都有相应的注解

SpringMVC中我们可以直接return "页面名",然后根据视图解析器进行拼接成为要访问的页面。

在没有配置视图解析器时,就要自己配置访问的路径return "/WEB-INFO/jsp/xx" 但是地址栏的url并没有改变,所以这个操作就是转发,也可以写为return "forward: /WEB-INFO/jsp/xx"。

在配置了视图解析器时,这个return "页面名" 相当于 return "forword : 页面名",当然也可以用重定向 return "redirect: 页面名" 但是它不会走视图解析器,而且还不能访问WEB-INFO下的页面。

为什么redirect重定向不能访问WEB-INF目录下的内容?

WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。

页面放在WEB-INF目录下面,这样可以限制访问,提高安全性.如JSP,html。
原因
既然WEB-INF是安全目录,客户端无法访问,而重定向就相当于用户直接从客户端访问了的路径,自然就不可以啦,只有程序内部转发的时候才能转发到WEB-INF下的JSP。

遇到的问题

(1)构建web项目中webapp没有小蓝点,需要在project structure中设置。

技术图片

技术图片

技术图片

 

在这里将webapp的路径,正确的填入。

 技术图片

 

这时就成为了完整的web项目。

 (2)启动项目时Tomcat报错

Caused by: java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/catalina/loader/WebappClassLoader) previously initiated loading for a different type with name "javax/servlet/ServletContext"

这是因为在pom.xml文件中导入servlet坐标时没有设置好作用域

技术图片

 

这样就好了,成功解决问题。

 

SpringMVC

标签:tco   app   重定向   load   link   put   传统   ppc   https   

原文地址:https://www.cnblogs.com/sc19/p/14391629.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!