文章详情

randy
2023-07-22
386
原创

springmvc

一.springmvc本质

本质上就是spring的一部分,可以创建spring容器对象,用上@Controller注解可以创建对象

二.springmvc工作流程

前端请求---->dispatcherServlet----->spring容器对应Controller对象的对应方法--->dispatcherServlet--->前端响应结果

三.springmvc程序搭建步骤

  1. 创建maven web工程
  2. pom文件中引入servlet-api和spring-webmvc两个依赖坐标
     <dependency>
        <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <version>2.5</version>
      </dependency>
      <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.5.RELEASE</version>
      </dependency>
    
  3. webapp下的WEB-INF目录下创建web.xml文件
    • 创建DispatherServlet对象(中央调度器),springmvc中前端所有的请求都会先交给它处理
      <servlet>
        <servlet-name>dispatherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
            <!--服务器启动时创建DispatcherServlet-->
            <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
          <servlet-name>dispatherServlet</servlet-name>
          <url-pattern>/</url-pattern>
      </servlet-mapping>
      
    • DispatherServlet对象本质上就是一个Servlet,同样继承了httpServlet,该对象创建过程中会执行init方法,在init方法中会执行创建springmvc容器对象,创建该容器时需要读取springmvc的xml配置文件,创建springmvc容器其实就是把所有的Controller对象创建好,放到容器中,等到程序需要用时,直接拿出来用
    • 因为DispatherServlet创建过程会创建springmvc容器对象,所有建议把DispatherServlet创建过程放到服务器启动后执行,即配置load-on-startup
      <load-on-startup>1</load-on-startup>
      
    • 由于创建springmvc容器对象时,系统默认读取servletname-web.xml文件,该方式不够灵活,所以需要配置contextConfigLocation属性的值为当前项目springmvc配置文件名称
      <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
      </init-param>
      
  4. 在resource目录下创建springmvc的配置文件
    <?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"
           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">
        <context:component-scan base-package="com.randycout.controller"/>
    </beans>
    
  5. 创建controller对象
    @Controller
    public class HelloController {
        public HelloController(){
            System.out.println("helloController!!!!!!!!!!!!!");
        }
        @RequestMapping("/hello")
        public ModelAndView index(){
            ModelAndView modelAndView=new ModelAndView();
            modelAndView.addObject("index","hello world!!!!!!!");
            modelAndView.setViewName("index.jsp");
            return modelAndView;
        }
    }
    
    
  6. 创建响应页面
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
        <p>hello 你好呀!!!</p>
    </head>
    <body>
    
    </body>
    </html>
    

四.相关注解

  1. @RequestParam
    • 当前后端参数名称不一致的时候,利用此注解进行参数统一,例如: public void test(@RequestParam("sname") String name){},这表示接受前端请求中参数名为sname的值,赋值给参数name
    • 参数主要就放在方法的形参位置,要知道web开发本质是程序员实现业务逻辑方法,系统来调用我们实现的方法.
    • @RequestParam(value = "sage",required = true), required为true,表示请求必须携带这个参数.不加报错.

五.参数接收

  1. 单个参数自动接收

    @Controller对象方法形参中定义前端携带的形参,框架会自动

  2. 对象类型参数自动接收

其他

  1. 快速复制模块做法

    • 电脑目录下复制项目

      7cf65480e8a049a1fad80142cdf26fa6.png

    • 删除多余的文件,只保留src和pom文件夹

      85a822199ce3f2c0ce0a08afc944ae71.png

    b6f956215a7a481b53ddd3f957815cb4.png

      <img src="attachment:b6f956215a7a481b53ddd3f957815cb4" alt="截图" style="zoom:50%;" />
    
    • idea的file--->project structure----->modules菜单中import新模块

    2bbc9ce41887e35b355a44063b0a9f50.png

    • 在父项目中的Import Module中选择Import module from external model--->Maven,然后一路下一步

    069c457699311bc83a901f5d8fa6512c.png

    • 看到dependencies中有pom中的依赖就表示成功了!

    1690030972332.png

    • tomcat中部署模块

    573b92d81bd785a76b62b6ff0971c312.png

    821e22b0e574cc30618621af375da737.png

    0981334593cf3ece62567fd68a8b113a.png

    • 启动tomcat,浏览器中访问模块

遇到的问题

  1. DispatherServlet中的url-pattern中 / 和 /* 有何区别?平时为什么写的都是/ ?
  2. 为什么controller中requestMapping写"/" ,不生效?怎么样才会生效?
  3. webapp下面的html页面不能直接通过地址访问,而jsp则可以通过地址访问,解决方式如下:

    这是因为默认方式所有的请求方式都会交给DispatherServlet处理,这导致即便访问html静态资源也会拦截

    <servlet-mapping>
            <servlet-name>default</servlet-name>
            <url-pattern>*.html</url-pattern>
    </servlet-mapping>
    
  4. modelAndView.setViewName("/hello.jsp") 中既可以写"/hello.jsp",也可以写成"hello.jsp",但是建议写成前面那种,显示这是个分路径
  5. post请求会乱码,在web.xml中配置字符集过滤器
     <filter>
            <filter-name>encodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
            <init-param>
                <param-name>forceRequestEncoding</param-name>
                <param-value>true</param-value>
            </init-param>
            <init-param>
                <param-name>forceResponseEncoding</param-name>
                <param-value>true</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>encodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
SpringMVC
JavaWeb

评论区

  1. 目录
留言