SpringMVC notas de estudio -08 desarrollo integrado del marco SSM

        SSM es integrar SpringMVC + Spring + MyBatis para el desarrollo, lo más importante es integrar MyBatis en Spring, porque SpringMVC es en realidad parte de Spring. Hay dos formas de integración, una se basa en archivos de configuración XML y la otra se basa en anotaciones.

Combinando el pensamiento de integración:

        Una vez construido el marco de SSM, todo el proyecto se ejecutará de acuerdo con la siguiente estructura:

        El núcleo de SSM es la gestión de dos contenedores. SpringMVC gestiona Controller, y Spring container gestiona Service y Dao (y posiblemente clases de herramientas, etc.) La denominada integración es especificar qué objetos son gestionados por qué contenedor. Además, dado que el controlador es responsable de invocar el servicio, esto implica problemas de acceso entre contenedores. Afortunadamente, la propia Spring ha realizado esta función para permitir que el contenedor SpringMVC acceda a los objetos en el contenedor Spring.

0. Cree una nueva tabla de base de datos

create table t_stu(
    id int(10) primary key auto_increment,
    name varchar(20),
    age int(10)
)charset = utf8;

1. Crea un nuevo proyecto de aplicación web

2. Agregar dependencias

        Springmvc, Spring, MyBatis, jackson (los objetos se convierten en formato json), controlador MySql (conectarse a la base de datos), druid (grupo de conexiones), jsp, dependencia de servlet

<?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>org.example</groupId>
  <artifactId>SSM</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!--servlet依赖-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
    </dependency>
    <!--jsp依赖-->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2.1-b03</version>
      <scope>provided</scope>
    </dependency>
    <!--springmvc依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
    <!--spring依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
    <!--spring-jdbc对事务的支持-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
    <!--mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.1</version>
    </dependency>
    <!--jackson-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
    <!--mybatis-spring依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.1</version>
    </dependency>
    <!--mysql-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.14</version>
    </dependency>
    <!--druid-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.16</version>
    </dependency>
  </dependencies>

  <build>
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>

    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

3. web.xml

1) Registre DispathcherServlet , que se usa para   1. Crear un contenedor SpringMVC al mismo tiempo, y luego crear un objeto Controlador 2. Se usa para recibir solicitudes

2) Registre el ContextLoaderListener de escucha de Spring , que se usa para  crear objetos de contenedor de Spring para crear objetos de Servicio y Dao

3) Registre un filtro de juego de caracteres para resolver el problema de los caracteres chinos confusos en las solicitudes de publicación.

<?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,配置Tomcat启动后就创建-->
  <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.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>

  <!--注册spring监听器-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
  <!--注册字符集过滤器,解决post请求乱码的问题-->
  <filter>
    <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

4. Archivo de configuración

        Springmvc, Spring, MyBatis, archivos de configuración de conexión de base de datos

Springmvc

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       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-3.1.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.1.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">

    <!--声明组件扫描器-->
    <context:component-scan base-package="com.zzt.vo"/>

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--配置注解驱动 1.响应ajax请求,返回json 2.解决静态资源访问冲突-->
    <mvc:annotation-driven/>

    <!--静态资源处理 方式2-->
    <mvc:resources mapping="/static/**" location="/static/" />

</beans>

mybatis

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!--给实体类别名-->
    <typeAliases>
        <package name="com.zzt.vo"/>
    </typeAliases>

</configuration>

primavera

<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <!--配置Service层的扫描器-->
    <context:component-scan base-package="com.zzt.service"/>

    <!--加载数据库连接信息文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!--配置数据源-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!--配置SqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--指定使用的连接池-->
        <property name="dataSource" ref="dataSource"/>
        <!--关联Mybatis-->
        <property name="configLocation" value="classpath:mybatis.xml"/>
    </bean>

    <!--Mapper扫描器,扫描Mapper接口,并自动构建对象,注册到Spring容器中,Bean id为mapperd类名,首字母小写-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--指定sqlsessionFactory-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!--配置要扫描的包-->
        <property name="basePackage" value="com.zzt.dao"/>
    </bean>

</beans>

Perfil de conexión a la base de datos

jdbc.url = jdbc:mysql://localhost:3306/study_mybatis?serverTimezone=GMT%2B8
jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.username = ****
jdbc.password = ****

5. Crear clase de entidad

package com.zzt.vo;

public class Student {
    private Integer id;
    private String name;
    private Integer age;

    public Student() {
    }

    public Student(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

6. Interfaz de Dao y configuración xml [se requiere el mismo nombre cuando se importa el paquete]

[Nota]: La anotación @Autowried se puede inyectar sin el método establecido

package com.zzt.dao;

import com.zzt.vo.Student;

import java.util.List;

public interface StudentDao {
    int insertStudent(Student student);
    List<Student> queryStudents();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zzt.dao.StudentDao">

    <cache/>

    <insert id="insertStudent" parameterType="Student">
        insert into t_stu(name,age) values (#{name},#{age});
    </insert>

    <select id="queryStudents" resultType="Student">
        select id,name,age from t_stu
    </select>

</mapper>

7. Lógica empresarial

package com.zzt.service;

import com.zzt.vo.Student;

import java.util.List;

public interface StudentService {
    public int addStudent(Student student);
    public List<Student> queryStudents();
}
package com.zzt.service.Impl;

import com.zzt.dao.StudentDao;
import com.zzt.service.StudentService;
import com.zzt.vo.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class StudentServiceImpl implements StudentService {
    @Autowired
    private StudentDao studentDao;

    @Override
    public int addStudent(Student student) {
        return studentDao.insertStudent(student);
    }

    @Override
    public List<Student> queryStudents() {
        return studentDao.queryStudents();
    }
}

8. Controlador

package com.zzt.controller;

import com.zzt.service.StudentService;
import com.zzt.vo.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("/student")
public class StudentController {

    @Autowired
    private StudentService studentService;

    @RequestMapping("/addStudent")
    public ModelAndView addStudent(Student student){
        ModelAndView modelAndView = new ModelAndView();

        String msg = "";
        int num = studentService.addStudent(student);
        if( num > 0 ){
            msg = "学生" + student.getName() + "注册成功";
        }
        modelAndView.addObject("msg",msg);
        modelAndView.setViewName("result");
        
        return modelAndView;
    }

}

9. Portada

/index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String basePath = request.getScheme()+ "://" +
            request.getServerName() + ":" + request.getServerPort() +
            request.getContextPath() + "/";
%>
<html>
<head>
    <title>SSM框架实例</title>
    <base href="<%=basePath%>" />
</head>
<body>
    <div align="center">
        <img src="static/images/ssm.jpg">
        <table>
            <tr>
                <td><a href="registerStudent.jsp">注册学生</a></td>
            </tr>
            <tr>
                <td><a href="queryStudents.jsp">查询学生</a></td>
            </tr>
        </table>
    </div>
</body>
</html>

/registerStudent.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String basePath = request.getScheme()+ "://" +
            request.getServerName() + ":" + request.getServerPort() +
            request.getContextPath() + "/";
%>
<html>
<head>
    <title>学生注册</title>
    <base href="<%=basePath%>" />
</head>
<body>
    <div align="center">
        <form action="student/addStudent" method="post">
            姓名:<input type="text" name="name">
            <br>
            年龄:<input type="text" name="age">
            <br>
            <input type="submit" name="注册">
        </form>
    </div>
</body>
</html>

/WEB-INF/view/result.jsp :

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    注册结果:${pageContext.request.getAttribute("msg")}
</body>
</html>

10. Resultados de la aplicación

11. Realizar análisis de procesos

        En este proyecto que construimos, el proceso de ejecución es:

12. Estudiantes de consulta de funciones completas

        Dado que solo se deben transferir los datos, usamos Ajax para transferir; agregue un botón para iniciar la solicitud de consulta Ajax en la página de consulta para evitar la necesidad de una actualización global para volver a consultar. Para usar Ajax, necesitamos introducir jquery.

    // 使用ajax
    @RequestMapping("/queryStudents")
    @ResponseBody
    public List<Student> queryStudents(){
        System.out.println("进入查询方法");
        List<Student> students = studentService.queryStudents();
        for (Student student : students) {
            System.out.println(student);
        }
        return students;
    }
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String basePath = request.getScheme()+ "://" +
            request.getServerName() + ":" + request.getServerPort() +
            request.getContextPath() + "/";
%>
<html>
<head>
    <title>Title</title>
    <base href="<%=basePath%>" />
    <script type="text/javascript" src="static/js/jquery-3.5.1.js"></script>
    <script type="text/javascript">
        $(function () {
            // 当当前页面的的DOM对象加载完成后,执行loadStudents函数
            loadStudents();
            // 使用id选择器
            $("#btnLoader").click(function () {
                loadStudents();
            })
        })

        function loadStudents() {
            $.ajax({
                url:"student/queryStudents",
                type:"get",
                dataType:"json",
                success:function (receive) {
                    // 清除已有的数据
                    $("#info").html("")

                    $.each(receive,function (i,student) {
                        $("#info").append("<tr>")
                            .append("<td>" + student.id + "</td>")
                            .append("<td>" + student.name + "</td>")
                            .append("<td>" + student.age + "</td>")
                            .append("</tr>")
                    })
                }
            })
        }
    </script>
</head>
<body>
    <div align="center">
        <table>
            <thead>
                <td>学号</td>
                <td>姓名</td>
                <td>年龄</td>
            </thead>
            <tbody id="info">

            </tbody>
        </table>
        <input type="button" id="btnLoader" value="查询">
    </div>
</body>
</html>

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_39304630/article/details/112984326
Recomendado
Clasificación