zoukankan      html  css  js  c++  java
  • SpringMVC入门学习(一)

    SpringMVC入门学习(一)

    SpringMVC是一个Java WEB框架,现在我们知道Spring了,那么,何为MVC呢?

    MVC是一种设计模式,其分为3个方面

    • model 模型:dao层和service层
    • view 视图:例如jsp和Html
    • controller 控制器

    SpringMVC原理

    SpringMVC工作的原理图如下【图来自于网络,侵删】:


     

    过程如下:

    1. http请求:客户端提交请求到DispatcherServlet。

    2. 寻找处理器:DispatcherServlet是一个Spring提供的前端控制器,所有请求都是他来发放的。但是它需要HandlerMapping定位到具体的Controller。

    3. 调用处理器:在DispatcherServlet通过HandlerMapping找到控制器后,它就将http请求提交到Controller。

    4. 调用模型处理业务:Controller执行相关的逻辑代码。

    5. ModelAndView:在Controller执行完相关的处理后,返回ModelAndView。

    6. 处理视图映射:ViewResolver是视图解析器,将一个逻辑上面的视图名称机械为一个真正的视图同时取出model。(ps:例如:将user解析为:/WEB-INF/jsp/user.jsp【下面的例子】)

    7. 将模型数据传给View显示:将model数据放入view中。

    环境搭建配置

    1. 首先使用maven包快速构建web-app


       

      项目结构图:


       
    2. maven jar包导入:

      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.1.1.RELEASE</version>
      </dependency>
      
    3. 然后将web.xml文件进行更改,使用3.1的版本:

      <?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">
      </web-app>
      
    4. 配置web.xml文件

      首先,先配置前段控制器

      <!-- 配置 Spring MVC DispatchcerServlet 前端控制器
          这里写的这个名字是有讲究的,如果我们不去修改spring配置文件默认的位置,那么SpringMVC他会去WEB-INF下面找一个叫springmvc-servlet.xml的文件
      -->
      <servlet>
          <servlet-name>springmvc</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <!--<init-param>-->
          <!--可以重新声明配置文件的名字-->
          <!--<param-name>namespace</param-name>-->
          <!--将名字变成mvc-->
          <!--<param-value>mvc</param-value>-->
          <!--</init-param>-->
      
          <init-param>
              <!--上下文配置的位置的制定-->
              <param-name>contextConfigLocation</param-name>
              <!--此时是在类路径下面spring文件夹去寻找,也就是resources/spring-->
              <param-value>classpath:spring/springmvc.xml</param-value>
          </init-param>
      </servlet>
      

      然后进行映射配置:

      在web.xml文件中,进行映射配置

      <!--servlet的映射配置-->
      <servlet-mapping>
          <!-- 将所有的请求都交给springmvc处理,即处理方式在springmvc.xm文      件中
          -->
          <servlet-name>springmvc</servlet-name>
          <!--这里统一写/-->
          <url-pattern>/</url-pattern>
      </servlet-mapping>
      

      关于url-pattern的写法问题

      • / 处理所有的请求,但是他不会像/*一样,将这个girl.jsp当成一个新的请求,而是直接将渲染结果给浏览器
      • /* (永远不要这样写):请求/helloController过去的时候,他的视图名称是girl,girl.jsp页面,(出去的时候)它将其当成了一个叫做girl.jsp的请求,去尝试请求对应的controller
      • *.do 例如:/helloController.do

      关于前段控制器的解释:

      springMVC设置的理念是希望我们开发者远离原生的servletAPI【太繁琐了】,希望将操作尽量简化。它将很多东西责任进行了拆分。不希望我们将技术点绑定死,可以做到任意切换。其本身还是基于servlet设计的,分发的servlet。

    5. 配置springmvc.xml文件
      springmvc.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:aop="http://www.springframework.org/schema/aop"
          xmlns:context="http://www.springframework.org/schema/context"
          xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
          http://www.springframework.org/schema/aop
          http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
      
      </beans>
      

      首先先配置视图解析器和控制器:

      <!--配置一个视图解析器
          常用内部资源视图解析器
          这里面的意思是:加入此时viewName为hello,那么它会到WEB-INF/jsp/hello.jsp中去寻找
      -->
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
          <!--1. 前缀-->
          <property name="prefix" value="/jsp/"/>
          <!--2. 后缀-->
          <property name="suffix" value=".jsp"/>
      </bean>
      
      <!-- 注解扫描 -->
      <context:component-scan base-package="com.weno.controller"/>
      

    书写第一份代码

    Controller的写法有两种:

    • 接口式的写法:是一个传统式的写法,类implement一个接口,然后实现接口方法,在modle中填充元素,返回ModelAndView。

      public class HelloController implements org.springframework.web.servlet.mvc.Controller {
          @Override
          public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
      
              ModelAndView mav = new ModelAndView();
              mav.addObject("hello","世界");
              // 寻找web-inf目录下的jsp/hello.jsp文件
              mav.setViewName("hello");
              return mav;
          }
      }
      

      当然这种方法还要在springmvc中配置bean。

      <!-- 此时name相当于URI -->
      <bean class="com.weno.controller.HelloController" name="/hello"/>
      
    • 注解式写法:注解式写法要配置注册扫描【前面已经配置】。

      将前面的换一种写法:

      @org.springframework.stereotype.Controller
      public class HelloController {
          //URI
          @RequestMapping("hello")
          public String hello(Model model){
              model.addAttribute("hello","世界");
              // 寻找web-inf目录下的jsp/hello.jsp文件
              return "hello";
          }
      }
      

      jsp文件

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>Title</title>
      </head>
      <body>
      你好:${requestScope.hello}
      
      </body>
      </html>
      

      结果:

    简单的注意点

    • @RequestMapping可以同时写在类的上面【模块】和方法的上面【业务】
      @org.springframework.stereotype.Controller
      @RequestMapping("product")
      public class HelloController {
          @RequestMapping("add")
          public String add(Model model){
      
              return "";
          }
          @RequestMapping("del")
          public String del(Model model){
      
              return "";
          }
      }
      
      这时候就可以使用/product/add完成add方法执行,/product/del完成del方法执行,这样更好的有利于模块化的执行。
  • 相关阅读:
    iOS resign code with App Store profile and post to AppStore
    HTTPS科普扫盲帖 对称加密 非对称加密
    appid 评价
    使用Carthage安装第三方Swift库
    AngularJS:何时应该使用Directive、Controller、Service?
    xcode7 The operation couldn't be completed.
    cocoapods pod install 安装报错 is not used in any concrete target
    xcode7 NSAppTransportSecurity
    learning uboot how to set ddr parameter in qca4531 cpu
    learning uboot enable protect console
  • 原文地址:https://www.cnblogs.com/xiaohuiduan/p/9941268.html
Copyright © 2011-2022 走看看