自学SSM之SpringMVC

SSM自学历程 (一)- Spring+Sping MVC+Mybatis 框架整合详细步骤 本例演示从0开始逐一整合SSM的步骤,要学习本知识,需要具备Spring,SpringMVC,Mybatis的基础,如果没有这些基础,请把基础掌握之后再学习,不要跳跃学习,欲速则不达。必读:基于框架的程序要成功运行,对于JAR包的版本,配置文件的正确性有着苛刻的要求,任何一个地方出错了,都会导致框架程序运行失败。 如果你是第一次学习本框架,务必严格按照教程的指导,完全模仿操作,直到成功看... 阅读详情

1、SpringMVC

什么是springmvc?

之前我们在学servlet的时候,有了解过mvc设计模式:

  • M: model,对应着dao、service层

  • V:view,对应着jsp层

  • C:controller,对应着servlet层

Spring 框架提供了构建 web应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架

2、回顾servlet(简单回顾)

  1. 导入依赖包

    1. 父工程
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.ryan</groupId>
        <artifactId>SpringMVC-study</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
        <modules>
            <module>springmvc-servlet</module>
        </modules>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>5.2.6.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
        </dependencies>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <!--修改Language level-->
            <maven.compiler.source>11</maven.compiler.source>
            <!--修改Java Compiler-->
            <maven.compiler.target>11</maven.compiler.target>
        </properties>
    </project>
    
    1. 子模块
        <dependencies>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api -->
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>jsp-api</artifactId>
                <version>2.2</version>
            </dependency>
        </dependencies>
    
  2. 配置web.xml

    <?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_4_0.xsd"
             version="4.0">
        <servlet>
            <servlet-name>hello</servlet-name>
            <servlet-class>com.ryan.controller.HelloServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>hello</servlet-name>
            <url-pattern>/hello</url-pattern>
        </servlet-mapping>
    </web-app>
    
  3. 编写model层:略

  4. 编写view层:

    1. 表单

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>Title</title>
      </head>
      <body>
          <form action="/hello" method="post">
              <input type="text" name="method">
              <input type="submit" value="提交">
          </form>
      </body>
      </html>
      
    2. 界面

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>hello</title>
      </head>
      <body>
      ${msg}
      </body>
      </html>
      
  5. 编写controller层

    package com.ryan.controller;
    
    import java.io.IOException;
    
    public class HelloServlet extends javax.servlet.http.HttpServlet {
        protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
    
            String method = request.getParameter("method");
            if(method.equals("add")){
                request.setAttribute("msg", "执行了" + method + "方法");
            }
            if (method.equals("delete")){
                request.setAttribute("msg", "执行了" + method + "方法");
            }
            request.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(request, response);
    
        }
    
        protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
            this.doPost(request,response);
        }
    }
    
    

小结:mvc框架要做哪些事情

  1. 将url映射到java类或java类的方法
  2. 封装用户提交的数据
  3. 处理请求-调用相关的业务处理-封装响应数据
  4. 将响应的数据进行渲染.jsp/html等表示层数据

3、HelloSpringMVC

方式一:原生态,原理讲解

  1. 新建一个module,导入依赖

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>
    </dependencies>
    
  2. 配置web.xml,配置DispatcherServlet,并关联spring配置文件

    <?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_4_0.xsd"
             version="4.0">
    
        <!--配置dispatcherServlet:这个时springmvc的核心:请求分发器,前端控制器-->
        <servlet>
            <servlet-name>SpringMVC</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!--DispatcherServlet要绑定那个spring配置文件-->
            <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>
    
        <!--springmvc中的/和/*
            /:只匹配所有的请求,不会去匹配jsp页面
            /*:匹配所有的请求,包括jsp页面
    
            这样所有的请求都会走上面的servlet
        -->
        <servlet-mapping>
            <servlet-name>SpringMVC</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
    </web-app>
    
  3. 编写SpringMVC的配置文件: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
            https://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!--Dispatcher处理器映射器-->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
        <!--处理器适配器-->
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
        <!--view视图解析器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
            <!--前缀-->
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <!--后缀-->
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <!--这里的id就相当于虚拟路径+跳转页面名称了-->
        <bean id="/hello" class="com.ryan.controller"/>
    </beans>
    
  4. 编写controller实体类,需继承Controller,最后注入到spring容器中

    package com.ryan;
    
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class controller implements Controller {
        @Override
        public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
            ModelAndView mv = new ModelAndView();
            //业务逻辑
            String msg = "HelloSpringMVC";
            mv.addObject("msg",msg);
            //视图跳转
            mv.setViewName("hello");
            return mv;
        }
    }
    
  5. 启动tomcat,跳转到hello页面

测试前请注意两点:

  • 确保依赖已导入
    在这里插入图片描述
  • 确保lib已经导入相关jar包(可能会出现这样的问题)
    在这里插入图片描述
    总结:
  1. 首先用户发起请求,通过DispatcherServlet
  2. BeanNameUrlHandlerMapping处理器找到url的id(/hello),并返回给DispatcherServlet
  3. DispatcherServlet携带结果通过适配器找到相对应的Controller(com.ryan.controller)
  4. com.ryan.controller执行相关业务操作后,最终将视图返回给DispatcherServlet
  5. DispatcherServlet再通过视图解析器跳转到客户请求的页面

以上可以参考下面的流程图来看, 总共可以分为处理器、适配器、解析器三部分

当然这里只是为了理解其中的原理,实际开发不会这么复杂的
在这里插入图片描述

方式二:注解+配置,简化代码

  1. 新建一个module,确保依赖和lib目录都已经导入

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.ryan</groupId>
        <artifactId>SpringMVC-study</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
        <modules>
            <module>springmvc-servlet</module>
            <module>spring-01-hellomvc</module>
            <module>spring-02-HelloSpringMVC</module>
        </modules>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>5.2.6.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api -->
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>jsp-api</artifactId>
                <version>2.2</version>
            </dependency>
        </dependencies>
    
        <build>
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                </resource>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                </resource>
            </resources>
        </build>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <!--修改Language level-->
            <maven.compiler.source>11</maven.compiler.source>
            <!--修改Java Compiler-->
            <maven.compiler.target>11</maven.compiler.target>
        </properties>
    </project>
    
  2. 配置web.xml文件

    • 注册DispatcherServlet
    • 关联SpringMVC配置文件
    • 设置启动等级为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_4_0.xsd"
             version="4.0">
    
        <!--注册DispatcherServlet-->
        <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <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>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    </web-app>
    
  3. 配置SpringMVC的配置文件,对比前面的,处理器映射器和Controller适配器都不需要写了,都交给controller类中使用注解配置

    • 让IOC的注解生效(component-scan)
    • 让SpringMVC不处理静态资源(譬如js css html等资源)
    • MVC的注解驱动
    • 配置视图解析器
    <?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
            https://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">
    
        <!--自动扫描,让指定包下的注解生效,并由IOC容器统一管理-->
        <context:component-scan base-package="com.ryan.controller"/>
        <!--过滤静态资源-->
        <mvc:default-servlet-handler/>
        <!--mvc注解驱动,替代了之前的处理器和适配器-->
        <mvc:annotation-driven/>
    
        <!--视图解析器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
            <!--前缀-->
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <!--后缀-->
            <property name="suffix" value=".jsp"/>
        </bean>
    </beans>
    
  4. 编写controller类,类上注解@Controller,方法上注解@RequestMapping(“访问路径”)

    package com.ryan.controller;
    
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller//相当于之前的实现Controller接口,且等价于component
    public class HelloController {
        @RequestMapping("/hello")//真实访问路径,比如这里写/hi,那么在地址栏上输入/hi
        public String hello(Model model){
            model.addAttribute("msg", "HelloSpringMVC");
            return "hello";
        }
    }
    
    
  5. 最后开启tomcat,测试执行

注意:

  • springmvc配置文件中开启了component扫描,@controller等价于@component(不同的层名字不同)
  • mvc:annotation-driven/这个会自动开启映射器处理器和controller适配器
  • @Controller相当于实现Controller接口
  • @RequestMapping("/hello"),是映射客户访问的真实路径

@Controller详解

  • 使用它标记的类就是一个SpringMVC Controller 对象
  • 分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。
  • @Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器

@RequestMapping详解

  • 该注解用于映射url到控制器类或一个特定的处理程序方法,可用于类或方法上,用于类上,表示类中的所有响应请求的方法都是以该地址为父路径,例如

    @Controller
    @RequestMapping("/admin")
    public class HelloController {
        @RequestMapping("/hello")
        public String hello(Model model){
            model.addAttribute("msg", "HelloSpringMVC");
            return "hello";
        }
    }
    //则如果你想要访问到hello,路径是这样的:localhost:8080/admin/hello
    

总结:

  • 相比servlet,代码精简了非常多
  • 如果想要跳转多个页面,在controller类中多写几个方法并配置对应的访问路径即可,一个视图可以得到复用,不需要像以前那样写多个servlet,这种非常简单的操作,有点接近于实际开发中的操作了
  • 操作简单了,但是你要知道他底层的实现原理,这是面试过程中和hr的谈资

4、RestFul风格

什么是restful风格?

RestFul就是一个资源定位及资源操作的风格,不是标准也不是协议,只是一种风格,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制

功能

  • 资源:互联网所有的事物都可以被抽象为资源
  • 资源操作:使用POST 、DELETE、PUT、GET,使用不同的方法对资源进行操作
  • 分别对应添加、删除、修改、查询,用得比较多的都是post和get

传统方式操作资源:通过不同的参数来实现不同的效果,方法单一

使用RestFul操作资源:可以通过不同的请求方式来实现不同的效果,甚至请求地址完全一样,也可以实现不同的功能

使用:

  1. 创建一个模块,确保依赖和lib已经导入

  2. 配置web.xml和springmvc-servlet.xml

  3. 编写controller类,使用注解

    package com.ryan.RestFulController;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class RestFulController {
        @RequestMapping("/test")
        public String test1(Model model){
            model.addAttribute("msg", "restful");
            return "test";
        }
        /*
            在传统的传参风格中是这样的:localhost:8080/test?a=1&b=2
            而我们经常看到的大多是这样的:localhost:8080/test/1/2,这种就是restful风格的,具体怎么实现呢?
            在参数添加@PathVariable,然后再从映射路径中接收参数
            我们还可以改变注解规定其访问提交数据的方式
         */
        //@RequestMapping("/test/{a}/{b}")
        @GetMapping("/test/{a}/{b}")//此时通过post方式是访问不到这个的
        public String test2(@PathVariable int a, @PathVariable int b, Model model){
            int res = a + b;
            model.addAttribute("msg", "get结果=" + res);
            return "test";
        }
    
        @PostMapping("/test/{a}/{b}")//只有通过Post方式才能访问到
        public String test3(@PathVariable int a, @PathVariable int b, Model model){
            int res = a + b;
            model.addAttribute("msg", "post结果=" + res);
            return "test";
        }
    
        /*
            此时你会发现当test2和test3的访问路径可以完全一样:http://localhost:8080/test/1/2
            但是通过不同的访问方式,会有不同的结果
            通过get方式:get结果=3
            通过post方式:post结果=3
         */
        /*
            还有一个情况说明一下,当controller中存在两个完全一样的访问路径(提交方式也一样),会报一个错
            错误中有一个关键字:Ambiguous mapping,也就是模棱两可的,客户端也不知道访问哪个
         */
    }
    

5、转发和重定向

package com.ryan.RestFulController;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ControllerTest01 {
    @RequestMapping("/t1")
    public String test01(Model model){
        model.addAttribute("msg", "springmvc");
        //有视图解析器的情况下,return "test"默认就是转发
        //return "test";
        //如果想要重定向的话,需要在前面加一个redirect:的前缀
        return "redirect:/index.jsp";
    }
    //上面的是在有视图解析器的情况下,如果没有视图解析器的话会怎么样呢?
    @RequestMapping("/t2")
    public String test02(Model model){
        model.addAttribute("msg", "你好");
        //如果没有视图解析器,转发也要加上前缀才行
        return "forward:/WEB-INF/jsp/test.jsp";
    }

    //总结:即使没有视图解析器,我们也可以完成转发和重定向的功能
    //但是在实际开发中,没什么事不会这么做的,一般都是有视图解析器的
}

6、springmvc处理数据

处理提交数据,分为三种情况

  1. 提交的域名称和处理方法的参数名一致
    • 可以直接接受
  2. 提交的域名称和处理方法的参数名不一致
    • 需要在参数前添加注解
  3. 提交的数据是一个对象
    • 自定义一个对象,属性和提交的数据名一样即可
package com.ryan.RestFulController;

import com.ryan.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class DataController {

    //用户提交数据名称为name
    //当提交数据名称和处理方法参数名称一致
    @GetMapping("/t1")
    public String test1(String name, Model model){
        model.addAttribute("msg", name);
        return "test";
    }
    //如果不一致,需要添加注解使其一致
    @GetMapping("/t2")
    public String test2(@RequestParam("name") String username, Model model){
        model.addAttribute("msg", "kobe");
        return "test";
    }

    //如果前端传的是一个User对象:id=1&name=ryan&age=18
    //自定一个类,并作为处理方法的参数
    @GetMapping("/t3")
    public String test3(User user, Model model){
        model.addAttribute("msg", user.toString());
        return "test";
    }

    /*
        注意:
            前两种情况,无论名称是否一直,都建议把@RequestParam注解加上,知道是要从前端接收数据的
            第三种情况,对象的属性名称要保持一致, 如果不一致的话,对应的属性就是null
     */
}

补充:除了用Model之外,我们还可以使用ModelMap,但在使用上,本质上一样的

对比:

Model:只有寥寥几个方法,适合存储数据,简化了新手对Model对象的操作和理解
ModelMap:继承了LinkedMap,除了实现自身的一些方法,同样继承了LinkedMap的方法和特性
ModelAndView:可以在存储数据的同时,进行设置返回的逻辑和视图,进行控制展示层的跳转

当然以后开发考虑更多的是性能和优化,就不能单单仅限于此的了解

建议:请使用80%的时间打好扎实的基础,剩下18%的时间研究框架,2%的时间去学习英语,框架的官方文档永远是最好的教程。

7、乱码问题

在前端提交中文数据的时候,可能会产生乱码的问题,这时候我们该怎么解决呢?

springmvc提供了一个一套解决方案,在web.xml中配置好过滤器就行:

<!--解决中文乱码问题-->
<filter>
    <filter-name>encoding</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>
</filter>
<!--注意这里要写/*,不然会过掉jsp页面-->
<filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

8、json使用

现在都流行前后端分离,有时候前端返回一些json对象给我们,我们要会解析,同样的,我们最后也需要将数据转化为json格式返回给前端,这就要求我们要使用相关工具类了,主要有两个:

方式一:jackson

jackson是目前比较好的json解析器了,当然工具不止这个,比如还有阿里巴巴的fastjson,等会再讲

使用:

  1. 确保导入依赖包和lib

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.10.2</version>
    </dependency>
    
  2. 编写配置文件,并解决乱码 问题

    <?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
            https://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">
    
        <context:component-scan base-package="com.ryan.controller"/>
    
        <!--当我们在实体类都用注解的话,下面这两个也可以省去了-->
        <!--<mvc:default-servlet-handler/>
        <mvc:annotation-driven/>-->
    
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <!--解决json数据中文乱码问题-->
        <mvc:annotation-driven>
            <mvc:message-converters register-defaults="true">
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>text/html;charset=UTF-8</value>
                            <value>application/json;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
            </mvc:message-converters>
        </mvc:annotation-driven>
    
    </beans>
    
  3. 编写实体类测试

    package com.ryan.controller;
    
    import com.alibaba.fastjson.JSON;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.ryan.pojo.User;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import java.util.ArrayList;
    import java.util.List;
    
    @Controller
    public class JsonController {
        //如果添加一个@ResponseBody注解,返回结果就不会走解析器了,直接返回字符串
        @RequestMapping("/j1")
        @ResponseBody
        public String test() throws JsonProcessingException {
            ObjectMapper mapper = new ObjectMapper();
            User user = new User(1, "甘志鹏", 20);
            String str = mapper.writeValueAsString(user);
            return str;//{"id":1,"name":"???","age":20}
            //springmvc可以帮我们解决乱码问题,在spring中配置就好
        }
    
        //java对象转换为json数据
        @RequestMapping("/j2")
        @ResponseBody
        public String tes2() throws JsonProcessingException {
            ObjectMapper mapper = new ObjectMapper();
            List<User> users = new ArrayList<>();
            User user1 = new User(1, "甘志鹏1号", 20);
            User user2 = new User(2, "甘志鹏2号", 20);
            User user3 = new User(3, "甘志鹏3号", 20);
            User user4 = new User(4, "甘志鹏4号", 20);
            users.add(user1);
            users.add(user2);
            users.add(user3);
            users.add(user4);
            String str = mapper.writeValueAsString(users);
            return str;
            /*
            [{"id":1,"name":"甘志鹏1号","age":20},
            {"id":2,"name":"甘志鹏2号","age":20},
            {"id":3,"name":"甘志鹏3号","age":20},
            {"id":4,"name":"甘志鹏4号","age":20}]
            */
        }
    }
    

方式二:FastJson(阿里巴巴的)

  1. 导入依赖

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.68</version>
    </dependency>
    
  2. 编写实体类测试

    package com.ryan.controller;
    
    import com.alibaba.fastjson.JSON;
    import com.ryan.pojo.User;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import java.util.ArrayList;
    import java.util.List;
    
    @Controller
    public class FastJson {
        @ResponseBody
        @RequestMapping("/f1")
        public String test1(){
            List<User> users = new ArrayList<>();
            User user1 = new User(1, "甘志鹏1号", 20);
            User user2 = new User(2, "甘志鹏2号", 20);
            User user3 = new User(3, "甘志鹏3号", 20);
            User user4 = new User(4, "甘志鹏4号", 20);
            users.add(user1);
            users.add(user2);
            users.add(user3);
            users.add(user4);
            String str = JSON.toJSONString(users);
            return str;
            /*
            [{"age":20,"id":1,"name":"甘志鹏1号"},
            {"age":20,"id":2,"name":"甘志鹏2号"},
            {"age":20,"id":3,"name":"甘志鹏3号"},
            {"age":20,"id":4,"name":"甘志鹏4号"}]
             */
    
        }
    }
    

9、ajax

略

10、拦截器

10.1、概述:

  • SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理,开发者可以自己定义一些拦截器来实现特定的功能
  • 过滤器与拦截器的区别:拦截器是AOP思想的具体应用

过滤器:

  • servlet规范中的一部分,任何javaweb工程都可以使用
  • 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

拦截器:

  • 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
  • 拦截器只会拦截访问的控制器方法,如果访问的是jsp/html/css/image/js是不会进行拦截的

10.2、自定义拦截器

那如何实现拦截器呢?

想要自定义拦截器,必须实现HandlerInterceptor接口

  1. 新建一个Module,添加web支持

  2. 配置web.xml和springmvc-servlet.xml文件

    <?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_4_0.xsd"
             version="4.0">
    
        <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <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>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
        <!--解决中文乱码问题-->
        <filter>
            <filter-name>encoding</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>
        </filter>
        <filter-mapping>
            <filter-name>encoding</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
    </web-app>
    
    <?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
            https://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">
    
        <context:component-scan base-package="com.ryan.controller"/>
    
        <mvc:default-servlet-handler/>
        <mvc:annotation-driven/>
    
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <!--解决json数据中文乱码问题-->
        <mvc:annotation-driven>
            <mvc:message-converters register-defaults="true">
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>text/html;charset=UTF-8</value>
                            <value>application/json;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
            </mvc:message-converters>
        </mvc:annotation-driven>
    
        <!--拦截器-->
        <mvc:interceptors>
            <mvc:interceptor>
                <!--拦截哪些请求,/**表示拦截所有请求,我们这里拦截首页的访问请求-->
                <mvc:mapping path="/home"/>
                <!--拦截器在哪-->
                <bean class="com.ryan.interceptor.MyInterceptor"/>
            </mvc:interceptor>
        </mvc:interceptors>
    
    </beans>
    
  3. 编写一个拦截器

    package com.ryan.interceptor;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    //实现HandlerInterceptor接口
    public class MyInterceptor implements HandlerInterceptor {
        //手动重写方法,然后需要到springmvc配置文件中配置拦截信息
        //一般只需要preHandle方法就行
        //从以下三个方法中可以看到和aop非常相似,其实这就是aop思想的一个应用,在访问某个路径时,可以在preHandle方法上增添附属功能
        //可使用request实现转发或者重定向等等
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            /*System.out.println("=========处理前==========");
            //返回false表示拦截,返回true表示放行
            return false;*/
            //那么利用这个拦截器我们做一个真实的案例,譬如没有登陆前不能访问首页,即没登陆的话需要拦截并跳转到登陆页面
            //客户端访问home==>判断是否已经登陆==>,如已登录==>放行,如未登陆==>转发至登陆页面
            HttpSession session = request.getSession();
            String user = (String) session.getAttribute("user");
            if (user != null){
                return true;
            }
            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
            return false;
        }
    
        //后面的两个方法一般没多大用处,需要的话可以作为日志使用
        /*@Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("=========处理后==========");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("=========清理==========");
        }*/
    }
    
    
    package com.ryan.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    @Controller
    public class Test {
    
        @RequestMapping("/home")
        public String home(){
            return "home";
        }
    
        @RequestMapping("/toLogin")
        public String toLogin(){
            return "login";
        }
    
        @RequestMapping("/login")
        public String login(HttpServletRequest request, String username, String password){
            //通常我们会使用session来判断用户是否已经登陆,所以登陆时应该存一个session
            HttpSession session = request.getSession();
            //当然这里规范的应该要新建一个user类的,这里只是为了测试就不建了
            session.setAttribute("user",username);
            return "redirect:/home";
        }
    
    }
    
  4. 测试

学习来源:B站up主:狂神说,有兴趣的同学可以关注学习一波,感觉还不错

自学ssm框架制作的简单的学生管理系统 自学ssm框架制作最简单的管理系统当自己做通一遍之后,之后做项目我觉得将会很难,特此做一个笔记,将自己的东西记录下这是文件结构目录:通过mevan仓进行jar包的管理先来看一下后台的代码:ok,首先需要做的就是数据库的设计:本人比较懒所以只进行了一个表的设计,数据库设计好后,就开始写我们的 pojo类以及最重要的就是dao层和mapper的映射此处以user类为主来进行记录:我的UserMappe... 阅读详情

相关推荐

微信好友恢复全攻略(2025年3月更新)

适用于仅被拉黑场景(成功率100%)针对7天内误删场景(成功率78%)

2301_77933942的博客 1万+

SSM框架自学(八)——SpringMVC如何返回JSON格式的数据

前言:在如今前后端分离的趋势下,后端基本不需要再去关心前端页面的事情,只需要把数据处理好并通过相应的接口返回数据给前端即可。在SpringMVC中,我们可以通过@ResponseBody注解来返回JSON数据或者是XML数据。一般返回的是更轻量级的JSON 格式数据,移动端的Android、IOS客户端和Web网页前端都可以利用JSON解析器很好地解析出数据并展示。相同的后台接口适用于不同的前端使...

何哥的博客 1万+

unity中VideoPlayer播放视频,使用Shader除去黑底且无黑边

1. 创建一个Shader 和 一个 材质球;Shader中复制如下代码:(此Shader代码为“ChromaKeyKit”插件中的ChromaKey_Alpa_Genera代码,但因只需要除去视频黑底而挂一个插件有点不合适) // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "ChromaKeyKit/ChromaKey/ChromaKey_Alpha_General"

weixin_42065078的博客 1747

SSM-SpringMVC(自学时笔记)

自学时的一些笔记

LLLYYYF的博客 349

World Creator地形导入UE

导出预设选择高度图(heigh map)格式选择PNG 16位,或者RAW 16位,需要反转y轴(与虚幻不同),命名格式会自动带一个× , 将×改成_ 或者删掉自己命名 (虚幻名称不支持x符号)导入虚幻 , 修改Z轴 , 就是用 地形最高 - 地形最低 , 然后除以512 , 再乘以100。把这个数字填入Z轴缩放 , 点击生成即可。

UE星空 2155

quartusII简易CPU设计

优点可以实现八种运算,数据的存取及运算都能很好的实现,上板也很成功。缺点首先由于自己知识储备的缺乏,只能实现较为简单的8种运算,也是最简单的直接寻址。其次为了方便操作,没有从外部输入数据,都是直接使用存储在存储器中的数据。后续发展后续会在此简易CPU的基础上增加一些功能对CPU进行完善,如算术运算可以考虑是补码运算,输入、输出采用存储缓冲等等,直至完整的全功能的处理器。收获通过这次实践,更熟悉Quartus软件的操作。能过更加清楚每个器件的操作,比如计数器,运算器,译码器等的实现功能。

Kong08242022的博客 3484

【SSM框架自学(八)】SpringMVC如何返回JSON格式的数据

一、JSON格式简介(使用过的朋友可以直接跳过这一步) JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation),是轻量级的文本数据交换格式。类似于XML,但JSON 比 XML 更小、更快、更易解析,而且JSON 具有自我描述性,更易理解。 JSON 最常见的用法之一,是从 web 服务器上读取 JSON 数据(作为文件或作为 HttpRequest),将 JSON 数据转换为 JavaScript 对象,然后在网页中使用该数据。 1、JSON实例.

Luck_And_Destiny的博客 547

手把手教你学Simulink--电机电磁兼容与可靠性​场景示例:基于Simulink的电机轴电压与轴电流抑制仿真

本文带你完成了电机轴电压与轴电流抑制的Simulink仿真,实现了:✅ 揭示了共模电压 → 寄生电容 → 轴电压 → 轴承电蚀的完整链路✅ 搭建了含寄生参数的高频电机等效模型共模电压最小化PWM(源头抑制)dv/dt滤波器(路径阻断)轴接地(终端泄放) ✅ 通过仿真验证了轴电压从68 V降至<3 V的显著效果 ✅ 为高可靠性电机系统提供低成本、高效益的轴承保护方案。

MHD0815的博客 317

SpringMVC:学习

学习方式

希望有点用 217

YOLO + SubspaceAD:一张良品图,检出所有未知缺陷

当YOLO遇上子空间建模,工业质检正迎来从“见多识广”到“举一反三”的质变时刻。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 500

图像修复的万能模型:用Instruct-IPT统一解决去雨、去雾、去模糊三大难题

从原理到实战,你已经掌握了Instruct-IPT的核心逻辑和使用方法。它不仅能一站式解决多种图像退化问题,还能通过文本指令灵活控制,是图像恢复领域的“多面手”。现在,不妨找几张有雨雪、雾霾、模糊问题的图像,用Instruct-IPT亲手试试效果。当你看到模糊的图像变得清晰,被雨雾遮挡的细节重新浮现时,你会真切感受到这项技术的魅力。后续还可以尝试调整文本指令的描述方式,看看模型的响应有什么变化——探索的过程,就是你技术进阶的最好见证。

m0_71589036的博客 227

java自学基础、项目实战网站推荐

推荐一个自学的好平台,有Java前端,后端,基础的内容都有讲解,还有框架的讲解和实战项目,特别适合自学 JAVA 自学网站 JAVA 练习题 Mybatis 教程 Spring MVC 教程 模仿天猫官网后端JEE 模范天猫官网SSH 模范天猫官网SSM 模仿天猫官网SpringBoot 模仿天猫官网前端 JAVA 桌面软件练手项目,一本糊涂账 转载于:https://www....

weixin_30786617的博客 633

【AI就业干货12】机器学习八股文速通:从损失函数到 XGBoost,一篇带走全部面试点

本文总结了机器学习面试的核心知识点,涵盖监督与非监督学习、线性模型、正则化、决策树、KNN/K-means、SVM、集成学习、梯度下降、评估指标、特征工程、降维、概率模型等内容。重点包括:损失函数选择(MSE/交叉熵)、正则化作用(L1稀疏/L2平滑)、决策树划分准则、集成学习方法(Bagging降方差/Boosting降偏差)、XGBoost优化等。提供了30秒速记口诀和XGBoost代码示例,帮助快速掌握面试要点。全文采用公式+代码+口诀的形式,系统梳理了机器学习从理论到实践的常见考点。

m0_51738372的博客 731

【J2EE课程总结】SSM+Mybatis+SpringMVC

大二下学期开设了J2EE课,然后会惊奇的发现老师讲了一个学期还不如自己看几篇博客。 写课程设计的话一开始没有用meaven+ssm包管理和其它配置的地方出了很多问题,所以事实上可以直接上手ssm,然后搭完环境就可以直接开始写课程设计了。有很多地方一开始都是不明白的,所以一开始可以选择性的忽略,写了一部分之后,自然会想去弄懂,这样学起来效率更高。 搭框架的教程有很多,找的时候直接找SSM+Mybat...

SinceNov 674

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

ssm框架重定向_【框架】128:springMVC最后一天

今天是刘小爱自学Java的第128天。感谢你的观看,谢谢你。学习内容安排如下:Jstl标签的使用,既然又提到了,还是学一学好了,反正也不要太多时间。写了一个文件上传的案例。最后关于转发和重定向在springMVC中的使用,以及这两者之间的区别。拦截器的使用。自此SSM框架也就告一段落了。一、Jstl标签的使用这个Jstl是当初学jsp时的知识点,因为动不动就有人说Jsp技术被淘汰了,所以...

weixin_39669265的博客 104

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

SpringMVC

SpringMVC SSM: MyBatis + Spring + SpringMVC MVC三层架构 JavaSE: 认真学习,老师带,入门快 JavaWeb: 认真学习,老师带,入门快 SSM框架: 研究官方文档,锻炼自学能力,锻炼笔记能力,锻炼项目能力 SpringMVC + Vue + SpringBoot + SpringCloud + Linux SSM=JavaWeb做项目; Spring: IOC 和 AOP SpringMVC: SpringMVC的执行流程! Spring

工一木子 153

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

推荐文章:掌握SSM框架基础,从这份软件体系架构PPT开始

推荐文章:掌握SSM框架基础,从这份软件体系架构PPT开始 去发现同类优质开源项目:https://gitcode.com/ 软件体系架构PPT简介 专为SSM框架初学者设计的入门级教程,全面覆盖Spring、SpringMVC、Mybatis基础知识。 项目介绍 在当今的软件开发领域,掌握主流框架是提高开发效率、提升项目质量的关键。SSM框架作为Java领域的经典组合,受到了广大开发者的青睐。今...

gitblog_06741的博客 925

ssm框架的整合搭建(一)

一个转行菜鸟半年多工作的开始学习历程。。。。。。。。。。。。 我是自学,也是我的记录,我学习的见证,如果你有幸看见,不要吐槽,不足之处请指点,相互学习,谢谢!! 请一起共勉!!!!!!!! 使用技术:spring --springMVC --mybatis --mysql --bootstrap --maven 使用工具:eclipse Navicat 项目的一切我会顺便使用g...

weixin_30602505的博客 98

SpringMVC 01 简介和回顾Servlet

MVC:三层架构,视图层、控制层、模型层(dao、pojo、service)。而 SpringMVC 就是 Spring 版本的 MVC,是为了 方便 我们开发 WEB 项目的 框架。再牛逼的 WEB 框架,底层的核心 也都是 servlet,所以 学会 servlet 原生态 的 开发 web 程序 是很重要的。:pojo 的拆分类,就是 也是实体类,只不过 删掉了 一些 原有的属性,保留了 关键核心的属性。常用在 前端领域。 再新建 一个 空的 子 maven 模块。 3. 添加 WEB 框架支

小哞^同^学的技术博客 264

基于node+Node+SSMc语音自学交流平台(源码+LW+调试文档+讲解等)/C语言自学论坛/C语言学习交流平台/C语言自学社区/C语言自学网站/C语言交流群/C语言自学资源平台

前端:Spring+SpringMVC+Mybatis后端:Node、Node.js,后端语言node)数据库:MySQL、SQLServer开发工具:IDEA、Eclipse、Navicat等✌关于毕设项目技术实现问题讲解也可以给我留言咨询!!!SSM 框架在程序设计中具有不可替代的地位。它不仅提供了丰富的功能和强大的性能,还能够提高开发效率、降低维护成本。无论是大型企业级项目还是小型应用开发,SSM 都能为程序设计者提供可靠的技术支持,助力实现高质量的软件产品。

2401_88036107的博客 779

基于SSM的C语言程序设计在线自学习系统计算机毕设

其中,SpringMVC用于Web应用程序的开发,MyBatis用于数据层的开发和连接,Spring用于系统的核心和基础。该在线自学习系统采用SSM框架进行开发,SSM框架具有良好的稳定性和可靠性,可以满足系统的技术要求。通过对系统的测试和评估,证明本系统具有良好的性能、可靠性和易用性,能够满足在线自学习系统的需求。该在线自学习系统的建设成本相对较低,因为使用SSM框架开发,采用Java语言和MySQL数据库,开发过程简单,人员成本相对较低。管理员也可以通过拖拽方式添加学生信息,以方便快捷地添加学生信息。

276

0 基础 Java 自学之路(2024年最新版)(1)

如果你想要学习Java的话,我给你分享一些Java的学习资料,你不用浪费时间到处搜了,从Java入门到精通的资料我都给你整理好了,这些资料都是我做Java这几年整理的Java最新学习路线,Java笔试题,Java面试题,Java零基础到精通视频课程,Java开发工具,Java练手项目,Java电子书,Java学习笔记,PDF文档教程,Java程序员面经,Java求职简历模板等,这些资料对你接下来学习Java一定会带来非常大的帮助,每个Java初学者都必备,请你进我的**=、>、=、

2401_85018578的博客 818

SpringMVC(1)

ssm:mybatis+Spring+SpringMVC MVC三层架构 JavaSE:认真学习,老师带,入门快 JavaWeb:认真学习,老师带,入门快 SSM框架:讲究官方文档,锻炼自学能力,锻炼笔记能力,锻炼项目能力 SpringMVC+Vue+SpringBoot+SpringCloud+Linux SSM=javaWeb做项目: SPring:IOC和AOP SpringMVC:SpringMVC的执行流程! SpingMVC:SSM框架整合! Spring MVC:模型(

weixin_51287725的博客 376
上一篇: 关于导入eureka依赖后,返回数据格式变为xml的问题和解决
下一篇: 自学SSM之整合SSM框架
codebeef
博客等级 码龄7年 8粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值