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&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);
}
}