Springmvc及其整合

mac2026-08-05  7

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工作原理图:

小节:

关于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:

添加FastJSON依赖: <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.57</version> </dependency> 在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)