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方法执行,这样更好的有利于模块化的执行。
  • 相关阅读:
    linux下的进程管理
    linux 下的rpm包管理
    计算机基础之OSI模型 & TCP协议簇
    计算机网络基础-IP分类及划分子网实例
    docker容器可被其他主机访问设置
    redis连接问题
    redis五大类型常用命令-string|list|hash|set|zset-订阅-事务
    docker login & push失败问题记录
    linux下 python 和 pip 安装换源及虚拟环境管理详解
    linux 查看系统版本号
  • 原文地址:https://www.cnblogs.com/xiaohuiduan/p/9941268.html
Copyright © 2011-2022 走看看