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来完成。
<servlet>
<servlet-name>dispatcherServlet
</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<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>
<url-pattern>/
</url-pattern>
</servlet-mapping>
3.配置视图解析器:
<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("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>
<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>
<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" />
<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>
<sqlMapGenerator targetPackage="src/main/resources/mappers" targetProject=".">
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.lanou.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<table tableName="queen">
<generatedKey column="id" sqlStatement="mysql" identity="true" />
</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();
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
);
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">
<bean class="com.alibaba.fastjson.support.config.FastJsonConfig">
<property name="dateFormat" value="yyyy-MM-dd HH:mm:ss" />
</bean>
</property>
<property name="supportedMediaTypes">
<list>
<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
);
}
}