Springmvc及其整合

3 篇文章 0 订阅
1 篇文章 0 订阅

Spring mvc

spring mvc简介以及原理

spring mvc:

​ springmvc全称是spring web mvc,是spring框架一部分,是一个mvc的框架,和struts2一样是一个表现层框架。

​ MVC里面的M指的的Model(通常包含bean、dao(mapper)、service);V指的是View,视图层,视图层主要的技术(JSP、HTML、FreeMaker、Themeleaf);C指的是Controller,控制层。控制层不负责具体数据、逻辑的处理和运算,它只负责将Model层的结果返回给对应的视图层去展示。

​ 在JavaWeb阶段, Controller层指的就是Servlet; View层指的就是JSP或者HTML; Model层指的就是bean、dao、service。

​ 在J2EE阶段,Controller层指的就是SpringMVC、Structs1\2; View层不变还是主流的页面展示技术; Model层包括bean、mybatis、service。

spring mvc 与 strus的区别:

①、SpringMVC 的入口是 Servlet,而Struts2是Filter

②、SpringMVC会稍微比Struts2快些,SpringMVC是基于方法设计的,而Struts2是基于类设计的,每次发一次请求都会实例一个Action.

③、SpringMVC使用更加简洁,开发效率比Struts2高。支持JSR303,处理ajax的请求更方便

④、Struts2的OGNL表达式使页面的开发效率相比SpringMVC更高些。

spring mvc与jsp,servlet的区别:

spring工作原理两张图:

简化一点:

第二张图具体一点:

在这里插入图片描述

sevlet和jsp工作原理图:

servlet和jsp工作原理

小节:

关于springmvc:

1、用户发送请求至前端控制器DispatcherServlet

2、DispatcherServlet收到请求调用HandlerMapping处理器映射器查找Handler。
3、处理器映射器根据请求url找到具体的处理器,生成HandlerExecutionChain对象,其中包含了目标Handler对象和若干个拦截器(可能没有)一并返回给DispatcherServlet。
4、DispatcherServlet通过Handler寻找匹配的HandlerAdapter
5、DispatcherServlet通过找到的HandlerAdapter调用Handler
6、Handler执行完成返回ModelAndView
7、HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet
8、如果Handler返回的View是逻辑视图名称而不是真正的View对象,DispatcherServlet调用resolveViewName方法在配置的所有视图解析器(ViewResolver)中,寻找合适的,最终通过ViewResolver将逻辑视图名解析成真正的View对象
9、ViewResolver通过调用createView方法尝试将视图名解析成View,如果无法解析会返回Null(注:如果ViewResolver是派生自AbstractCachingViewResolver则在调用createView方法前会先尝试根据viewName和locale从缓存中查找对应的视图对象)
10、DispatcherServlet调用View的render方法进行渲染视图(即将模型数据填充至request域)。
11、DispatcherServlet响应用户

关于servlet:

​ 客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对应的servlet,并将request、response对象传递给找到的servlet,servlet根据request就可以知道是谁发出的请求,请求信息及其他信息,当servlet处理完业务逻辑后会将信息放入到response并响应到客户端。

spring mvc的简单使用

1.用到的依赖:

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.1.9.RELEASE</version>
    </dependency>

	<dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
    </dependency>


2.配置DispatcherServlet

1.ContextLoaderListener

作用:在启动Web容器时,自动装配Spring applicationContext.xml的配置信息。
因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。在ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成。

  <!--这是创建DispatcherServlet 相当于电脑的cpu-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--配置容器启动时回去初始化DispatcherServlet对象-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
    </init-param>

    <load-on-startup>1</load-on-startup>

  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
      <!--这种情况下什么也不会显示,原因是: 拦截所有请求(包括*.jsp),可以走到Action中,
      但转发到jsp时再次被拦截,不能访问到jsp-->
    <!--<url-pattern>/*</url-pattern>-->
      <url-pattern>/</url-pattern>
  </servlet-mapping>

3.配置视图解析器:

 <!-- 配置视图解析器,用于将Handler方法中返回的视图名解析成真正可展示的页面 -->
    <mvc:view-resolvers>
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/"/>
            <property name="suffix" value=".jsp"/>
         </bean>
    </mvc:view-resolvers>

4.定义Controller

新建一个普通类,然后添加@Controller注解,就可以了

5.定义请求处理方法(Handler)

在Controller类中定义一个普通的方法,添加@RequestMapping注解就可以了

实例

@Controller
public class HelloController {
    @Autowired
    private GirlService girlService;

 /*    @RequestMapping("/index.jsp")
    public String index() {
        return "girlsTable";
    }*/

    @RequestMapping("hello")
    public String toHelloPasge(@RequestParam String message, Model model){
        message = "后裔射日!";
        model.addAttribute("msg",message);
        return "hello_Springmvc";
    }

    @RequestMapping("girl")
    public String toGirlsTable(Model model){
        String girl = girlService.findGirl();
        model.addAttribute("gName",girl);
        return "girlsTable";
    }
}

index.jsp中

<%--
  Created by IntelliJ IDEA.
  User: BW
  Date: 2019/10/18
  Time: 19:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首页</title>
</head>
<body>
    <a href="/hello?message=你好,旧时光">Hello SpringMvc</a> <br/>
    <a href="/girl" >女神榜</a>
</body>
</html>

hello_Springmvc.jsp中:

<%--
  Created by IntelliJ IDEA.
  User: BW
  Date: 2019/10/18
  Time: 19:42
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>SpringMvc</title>
</head>
<body>
    ${msg}
</body>
</html>

Root WebApplicationContext 和 Servlet WebApplicationContext之间的关系:

在这里插入图片描述

​ 两者之间的关系就像是父子类关系,其中Root WebApplicationContext是父类,Servlet WebApplicationContext是子类.凡是父类中的bean子类中都能用,但是子类中的父类不能用.

springmvc 常用知识点:

定义Controller

定义Controller直接在在普通的类上面加@Controller注解

package com.lanou.web;
@Controller
public class HelloController {
}

处理请求

​ 处理请求:使用注解@RequestMapping(参数),参数就相当于DispatcherServlet经过了HandlerMapping对url,xml,注解解析后找到了HandlerExecution然后到了HandlerAdapter找到了适合的Handler处理器来处理这个请求.

package com.lanou.web;

import com.lanou.bean.Girl;
import com.lanou.service.GirlService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class HelloController {
    @Autowired
    private GirlService girlService;

    @RequestMapping("/hello")
    public String toHelloPasge(@RequestParam String message, Model model){
        message = "后裔射日!";
        model.addAttribute("msg",message);
        return "hello_Springmvc";
    }

}

请求参数自动绑定到参数中:

如果RequestMapping方法的参数中是一个自定义的对象,Spring会调用DataBinder自动将请求中的参数注入到对象的同名属性中。

Controller中:

    @RequestMapping("/girl")
    public String toGirlsTable(Model model){
        Girl girl = new Girl();
        girl.setGId(101);
        girl.setGName("于漫漫");
        girl.setKId(1);
        model.addAttribute("girl",girl);
        return "girlsTable";
    }

jsp:中

<%--
  Created by IntelliJ IDEA.
  User: BW
  Date: 2019/10/18
  Time: 21:50
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<br>
<head>
    <title>女神表</title>
</head>
<body>
女神榜单;${girl} </br>
   ${girl.GId} </br>
    ${girl.KId} </br>
    ${girl.GName} </br>
</body>
</html>

结果:

在这里插入图片描述

请求参数的获得:

请求参数可以直接定义到方法参数里,并通过@RequestParam("key")注解修饰参数,这样SpringMVC会自动解析请求中的参数给你填充到方法参数中。

注意:此注解修饰的参数默认是必传的,如果请求中没有此参数会直接报错,可以通过设置此注解的required属性为false解决

jsp中的代码:

<%--
  Created by IntelliJ IDEA.
  User: BW
  Date: 2019/10/18
  Time: 19:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首页</title>
</head>
<body>
    <a href="/hello?message=你好,旧时光">Hello SpringMvc</a> <br/>
    <a href="/girl" >女神榜</a> </br>
    <a href="/baby?babyname=嬴政&babyid=101" >孩子信息</a>
</body>
</html>

controller中的代码:

    @RequestMapping("/baby")
    public String toShowBoby(@RequestParam("babyname") String babyName,@RequestParam("babyid") int babyId,Model model){
        Baby baby = new Baby();
        baby.setBabyName(babyName);
        baby.setBabyId(babyId);
        model.addAttribute("baby",baby);
        return "baby_list";
    }

测试jsp中的代码以及测试结果:

<%--
  Created by IntelliJ IDEA.
  User: BW
  Date: 2019/10/19
  Time: 14:24
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>boby信息</title>
</head>
<body>
    ${baby.babyName}     </br>
    ${baby.babyId}   </br>
</body>
</html>

测试结果:

在这里插入图片描述

拦截器

拦截器和过滤器

过滤器:是servlet规范中提供的一项技术,不依赖第三方技术,过滤请求的,加工请求

拦截器:springmvc封装的一项基于拦截handler的一项技术,也就是说只有在springmvc中才有拦截器的概念

拦截器的使用步骤:

创建一个类继承HandlerInterceptor,例如

public class PrivilegeToInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 			Object handler) throws Exception {

        return false;
    }

}

然后再dispatcher-servlet.xml中配置

    <mvc:interceptors>
<!--    权限拦截    -->
        <mvc:interceptor>
            <mvc:mapping path="/admin/views/**"/>
            <mvc:exclude-mapping path="/interceptor/**"/>
            <bean class="com.lanou.interceptor.PrivilegeToInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

需要注意的式拦截器执行的时期及其原理:

原理

在这里插入图片描述

SSM整合过程

Mybatis和Spring的整合

加载依赖

1.spring的依赖:spring-context;

 <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.0.RELEASE</version>
 </dependency>

2.mybatis的依赖:mybatis

 <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.6</version>
    </dependency>

3.整合的包:mybatis-spring

<dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.2</version>
    </dependency>

4:数据库驱动的包:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.18</version>
</dependency>

5.事务相关的包:spring-jdbc

 <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.2.0.RELEASE</version>
    </dependency>

6.其他依赖:lombok,logback

  <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.10</version>
      <scope>provided</scope>
    </dependency>
在Spring核心配置文件中配置SqlSessionFactoryBean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
       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.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://mybatis.org/schema/mybatis-spring
        http://mybatis.org/schema/mybatis-spring.xsd
        ">
<!--  开启扫描  -->
    <context:component-scan base-package="com.lanou.service" />
    <mybatis:scan base-package="com.lanou.mapper" />

<!-- 把数据库连接的参数拿过来   -->
    <context:property-placeholder location="classpath*:jdbc.properties" />

<!-- 配置数据源   -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="url" value="${jdbc.url}"/>
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

    </bean>
<!--  配置sqlSessionFactoryBean,这个本身就是mybatis的配置文件  -->
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean" >
        <property name="dataSource" ref="dataSource" />
<!--    这是给类起别名,相当于加前缀    -->
        <property name="typeAliasesPackage" value="com.lanou.bean" />
        <property name="mapperLocations" value="classpath*:mappers/QueenMapper.xml" />
    </bean>
</beans>
配置mybatishexin文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
       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.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://mybatis.org/schema/mybatis-spring
        http://mybatis.org/schema/mybatis-spring.xsd
        ">
<!--  开启扫描  -->
    <context:component-scan base-package="com.lanou.service" />
    <mybatis:scan base-package="com.lanou.mapper" />

<!-- 把数据库连接的参数拿过来   -->
    <context:property-placeholder location="classpath*:jdbc.properties" />

<!-- 配置数据源   -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="url" value="${jdbc.url}"/>
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

    </bean>
<!--  配置sqlSessionFactoryBean,这个本身就是mybatis的配置文件  -->
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean" >
        <property name="dataSource" ref="dataSource" />
<!--    这是给类起别名,相当于加前缀    -->
        <property name="typeAliasesPackage" value="com.lanou.bean" />
        <property name="mapperLocations" value="classpath*:mappers/QueenMapper.xml" />
    </bean>
</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>
    <properties resource="jdbc.properties" />

    <settings>
<!--    开启小驼峰映射    -->
        <setting name="mapUnderscoreToCamelCase " value="true"/>
    </settings>
    
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.user}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mappers/studentMapper.xml"/>
        <mapper resource="mappers/QueenMapper.xml" />
    </mappers>
</configuration>
Mybatis的逆向工程
配置及说明:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    
	<!-- 引入第三方依赖包 -->
	
	<classPathEntry location=".\lib\mysql-connector-java-8.0.12.jar" />
	
	
	<!--
     targetRuntime常用值:
        MyBatis3Simple(只生成基本的CRUD和少量的动态SQL)
        MyBatis3(生成完整的CRUD,包含CriteriaAPI方法Example后缀的方法)
     -->
    <context id="localhost_mysql" targetRuntime="MyBatis3">

        <!-- 不生成注释 -->
        <commentGenerator><!--注解编辑器-->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>

        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/day05?characterEncoding=utf8&amp;serverTimezone=UTC"
                        userId="root"
                        password="123456">
        </jdbcConnection>

        <javaTypeResolver >
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

		<!-- 生成实体类 -->
        <javaModelGenerator targetPackage="com.lanou.bean" targetProject="src/main/java">
            <property name="enableSubPackages" value="false" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

		<!-- 生成XML Mapper -->
        <sqlMapGenerator targetPackage="src/main/resources/mappers" targetProject=".">
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>

		<!-- 生成Mapper接口 -->
        <!-- 生成的Mapper类型:ANNOTATEDMAPPER(注解)、MIXEDMAPPER(混合)、XMLMAPPER(XML) -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.lanou.mapper"  targetProject="src/main/java">
            <!-- 是否将数据库中的schema作为包名的一部分,默认就是false -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>
        
		<table tableName="queen">
		<!--
        <table schema="day05" tableName="girl domainObjectName="TbContent">
		-->
            <!-- 是否用数据库中的字段名作为POJO属性名(不自动转小驼峰),默认值是false -->
            <!--
            <property name="useActualColumnNames" value="true"/>
            -->
            <!-- 生成代码时支持获取插入数据后自增的ID, 需要通过sqlStatement配置数据库类型。 -->
			
            <generatedKey column="id" sqlStatement="mysql" identity="true" />
			
            <!-- 此标签用于在生成代码时忽略数据库中的某个字段 -->
            <!--
            <ignoreColumn column="FRED" />
            -->
            <!-- 通过此标签重写mybatis从数据库读到的元信息,自定义列相关配置,包括(名称、类型) -->
            <!--
            <columnOverride column="aa" property="sname" />
            -->
        </table>            
    </context>
</generatorConfiguration>
对某个类的Example的理解

​ mybatis的逆向工程中会生成实例及实例对应的example,example用于添加条件,相当where后面的部分

xxxExample example = new xxxExample(); 
Criteria criteria = new Example().createCriteria();
1.增加
  //增
        Queen queen = new Queen();
        queen.setqId(103);
        queen.setqName("妲己");
        queen.setkId(1);
        queenMapper.insert(queen);

在这里插入图片描述

2.查询
 //查询
		QueenExample queenExample = new QueenExample();
        QueenExample.Criteria queenExampleCriteria = 						queenExample.createCriteria();
        queenExampleCriteria.andKIdEqualTo(1);
        queenExampleCriteria.andQIdIsNotNull();
        List<Queen> queens = queenMapper.selectByExample(queenExample);
        for(Queen queen : queens){
            System.out.println(queen.toString());
        }

在这里插入图片描述

3.修改
//更改
        QueenExample queenExample = new QueenExample();
        QueenExample.Criteria criteria = queenExample.createCriteria();
        //创建条件:要修改的是kId是102的王后
        criteria.andQIdEqualTo(102);
        Queen queen = new Queen();
        //本次测试的着三个属性不能为空
        queen.setqId(102);
        queen.setqName("甄姬");
        queen.setkId(1);
        int i = queenMapper.updateByExample(queen, queenExample);
        System.out.println(i);

//逆向工程更新执行的sql语句
// update queen  set q_id = ?, q_name = ?,k_id = ? WHERE (  q_id = ? )

在这里插入图片描述

4.删除
 QueenExample queenExample= new QueenExample();
        QueenExample.Criteria criteria = queenExample.createCriteria();
        QueenExample.Criteria criteria1 = criteria.andQIdEqualTo(103);
        int i = queenMapper.deleteByExample(queenExample);
        System.out.println(i);

在这里插入图片描述

Mybatis+Spring+Springmvc的整合

加入依赖

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.0.RELEASE</version>
    </dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

配置web.xml(最好是支持el表达式的头)

以下是支持El表达式的头:

​ 解决的问题是:再jsp页面上El表达式取不出来值得问题.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
          http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         id="WebApp_ID" version="3.1">
    
</web-app>

监视器解决乱码问题

  <!-- 过滤器:解决乱码 -->
  <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>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

配置父上下文

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
          http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         id="WebApp_ID" version="3.1">
      <!--配置父上下文-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:applicationContext.xml</param-value>
  </context-param>
    
</web-app>

配置listener加载父上下文

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
          http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         id="WebApp_ID" version="3.1">
      <!--配置父上下文-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:applicationContext.xml</param-value>
  </context-param>
  //父上下文监听器,与上下文的加载有关
      <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>

配置DispatcherServlet大总管

  <!-- 配置大总管 -->
  <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

以上都是再web.xml中配置的.

dispatcher-servlet.xml配置

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

</beans>

开启扫描

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

        <context:component-scan base-package="com.lanou.web" />
        <context:component-scan base-package="com.lanou.mapper"/>

</beans>

视图解析器

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

        <context:component-scan base-package="com.lanou.web" />
        <context:component-scan base-package="com.lanou.mapper"/>
    <!--  静态资源的管理  -->
    <mvc:resources mapping="/static/**" location="/static/"/>
<!--    视图解析器    -->
        <mvc:view-resolvers>
            <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="prefix" value="/admin" />
                <property name="suffix" value=".jsp" />
            </bean>
        </mvc:view-resolvers>
    <!-- 开启直接驱动:里面有默认的消息转换器   -->

</beans>

开启注解驱动,消息转换器

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

        <context:component-scan base-package="com.lanou.web" />
        <context:component-scan base-package="com.lanou.mapper"/>
    <!--  静态资源的管理  -->
    <mvc:resources mapping="/static/**" location="/static/"/>
<!--    视图解析器    -->
        <mvc:view-resolvers>
            <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="prefix" value="/admin" />
                <property name="suffix" value=".jsp" />
            </bean>
        </mvc:view-resolvers>
    <!-- 开启直接驱动:里面有默认的消息转换器   -->
    <mvc:annotation-driven>
    </mvc:annotation-driven>

    <mvc:interceptors>
<!--    权限拦截    -->
        <mvc:interceptor>
            <mvc:mapping path="/admin/views/**"/>
            <mvc:exclude-mapping path="/interceptor/**"/>
            <bean class="com.lanou.interceptor.PrivilegeToInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

</beans>

普通工程转maven工程中的注意点

1.这两处path问题:

决定了你的整个webapp文件存放的位置

第一个:到项目的web.xml下

第二个:到项目的webapp下

在这里插入图片描述

2.注意这里:

在这里插入图片描述
最好把原来的删了,把新的加进来.

2.父子工程问题

如果父工程下面有子工程入:

在这里插入图片描述

子工程要用到的是父工程总的pom.xml文件这样写会出现这样的结果:

在这里插入图片描述

这是把war改成pom就可以,只用父亲的pom.xml文件.

3.消息转换器问题:

在这里插入图片描述
这个问题是消息转换器没加:解决办法如下:

SpringMVC默认使用Jackson将我们返回的对象类型转换成JSON格式数据,我们只需要做好以下两步:

1、添加Jackson依赖

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.7</version>
</dependency>

2、在dispatcher-servlet.xml中开启MVC注解支持

<mvc:annotation-driven />

除了使用默认的Jackson来处理JSON,我们还可以用其他的JSON库,比如国内的FastJSON:

  1. 添加FastJSON依赖:
<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>fastjson</artifactId>
     <version>1.2.57</version>
</dependency>
  1. 在dispatcher-servlet.xml中配置消息转换器:
<mvc:message-converters>
    <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
        <property name="defaultCharset" value="UTF-8" />
        <property name="fastJsonConfig">
            <!-- 设置转换JSON的参数 -->
            <bean class="com.alibaba.fastjson.support.config.FastJsonConfig">
                <property name="dateFormat" value="yyyy-MM-dd HH:mm:ss" />
            </bean>
        </property>
        <property name="supportedMediaTypes">
        <!-- 指定转换完JSON后返回的响应头和编码,添加text/html是为了处理在IE下application/json会弹出下载框问题 -->
            <list>
                <!--<value>text/html;charset=UTF-8</value>-->                
                <value>application/json;charset=UTF-8</value>
            </list>
        </property>
    </bean>
</mvc:message-converters>

使用方法: 在Controller中可以通过直接在类上添加@RestController或者在方法上添加@ResponseBody注解, 然后返回任意Java类型即可(包括自定义类型)
示例:

@ResponseBody
@RequestMapping("/getStudent")
public Student getStudent(@RequestParam("id") Integer id) {
    return studentService.findStudentById(id);
}

Git的使用

1.注册码云账号

2.创建一个仓库

3.对仓库的简单配置

4.再IDEA中的简单配置

在这里插入图片描述

5.对现在的项目交给git管理

在这里插入图片描述
在这里插入图片描述

6.创建.gitignore文件进行忽略上传文件的,范围

7.右击项目名,饭后点击git

8.把项目add一下,交给git管理

9.remotes设置

这里把码云仓库的HTTPS地址克隆一下,粘贴到remote设置中

在这里插入图片描述

10.push and commit

11.解决合并冲突

合并,需要什么,左右移动到中间的result中即可

12.新的一天拉取pull,也要进行解决冲突.

合并,需要什么,左右移动到中间的result中即可

项目相关文题及其解决方案问题:

相关知识点

RESTful+layui+分页(异步请求)

layui中

先声明自己要用到的组件:

    <script type="text/javascript" >
<%--    初始化组件,即使用哪一个初始化哪一个    --%>
        layui.use(['table'], function(){
            var table = layui.table;
        });
    </script>

然后去找自己要用的组件的相关用法,比如表格

    <script type="text/javascript" >
<%--    初始化组件,即使用哪一个初始化哪一个    --%>
        layui.use(['table'], function(){
            var table = layui.table;
            //第一个实例
            table.render({
                elem: '#demo'
                ,height: 312
                ,url: '/student_data' //数据接口
                ,page: true //开启分页
                ,cols: [[ //表头
                    {field: 'id', title: 'ID', width:80, sort: true, fixed: 'left'}
                    ,{field: 'name', title: '姓名', width:80}
                    ,{field: 'sex', title: '性别', width:80, sort: true}
                    ,{field: 'age', title: '年龄', width:80}
                ]]
            });
        });
    </script>
RESTful控制层:
@RequestMapping("student_data")
@RestController
public class RestfulController {
    @Autowired
    private StudentService studentService;
    @GetMapping("")
    public LayUiData<Student> toGetStudent(@RequestParam(value = "page",required = false,defaultValue = "1")int page,
                                           @RequestParam(value = "limit",required = false,defaultValue = "5")int limit){
        System.out.println(page + " 和 " +limit);
        LayUiData<Student> layUiData = studentService.queryStudents(page,limit);
        return layUiData;
    }
}

逻辑层Service
    @Override
    public LayUiData<Student> queryStudents(int page,int limit) {
        cache = studentMapper.query();
        int startIndex = (page - 1)*limit;
        int endIndex = page*limit;
        if(endIndex > cache.size()) {
            endIndex = cache.size();
        }
        List<Student> studentList = cache.subList(startIndex, endIndex);
        LayUiData<Student> layUiData = new LayUiData<>();
        layUiData.setCode(0);
        layUiData.setMsg("");
        layUiData.setCount(studentList.size());
        layUiData.setData(studentList);
        return layUiData;
    }

树形动态菜单(递归)

这是自己写的简单的前端代码

<%--
  Created by IntelliJ IDEA.
  User: BW
  Date: 2019/10/31
  Time: 19:30
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>tree</title>
    <script type="text/javascript" src="/static/jquery.min.js"  ></script>
    <script type="text/javascript" src="/static/layui/layui.js" ></script>
    <link rel="stylesheet" type="text/css" href="/static/layui/css/layui.css">
</head>
<body>
        <div id="treefile">
        </div>
</body>
<script>
                $.ajax("tree_data", {
                    type: "GET",
                    data: {
                        action: "json"
                    },
                    dataType: "json",
                    success: function(data, status_text){

                        console.log(data)
                        layui.use('tree',function () {
                                var tree = layui.tree;
                                //    渲染
                                var insert = tree.render({
                                    elem:'#treefile'
                                    ,data:[data]
                                });
                        });
                    },
                    error: function(xhr, textStatus, errorThrow) {
                        console.log("请求失败");
                    }
                });
</script>
</html>

后端测试代码及其数据格式

import com.alibaba.fastjson.JSON;
import com.lanou.bean.LayUiStype;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

public class MyTest {
    @Test
    public void testLayuiStyle(){
        ConcurrentHashMap<String,List<LayUiStype>> map = new ConcurrentHashMap<>();
//  一级标题
        LayUiStype layUiStype = new LayUiStype();
        layUiStype.setTitle("山东");
//  二级标题集合
        List<LayUiStype> layUiStypeList = new ArrayList<>();
        LayUiStype layUiStype1 = new LayUiStype();
        layUiStype1.setTitle("济源");
        layUiStypeList.add(layUiStype1);
//  把二级标题放到对应的父节点下面
        layUiStype.setChildren(layUiStypeList);
        String s = JSON.toJSONString(layUiStype);
        System.out.println(s);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值