文章目录
1、AOP:面向切面编程
AOP可以在不改动源代码的情况下增加新的功能
传统的编程方式都是纵向开发,从 数据库–>dao层—>service层—>controller层—>前端页面,而AOP是横向开发,面向切面编程。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
如下图,业务逻辑中的增删改查是问我们要具体实现的代码,而对于日志、验证参数等固定操作,就不用我们每次都自己实现,可以使用AOP,将验证参数、日志等操作提取出来,切进增删改查业务中,从而降低程序的耦合度,提高程序可重用性
1、AOP在Spring中的应用
允许用户自定义切面,切入点等
-
横切关注点
跨越应用程序多个模块的方法或功能,与业务逻辑无关,但是程序中还必须要有的部分,比如日志、缓存、安全、事务等
-
切面
可以理解为一个类,在这个类中定义要切入的方法,即通知
-
通知
切面类中的方法,用来切入其他类中,比如处理日志、缓存、事务的方法
-
目标
被通知的对象
-
代理
向目标对象应用通知之后创建的对象
-
切入点
通知执行的地点,就是切面中的方法在哪个地方生效
-
连接点
与切面匹配的执行点
Spring中的AOP,通过Advice定义横切逻辑(前置、后置、环绕、异常抛出、引介通知),分别如下
2、方式一:使用增强配置类(实现接口)
不影响原来的业务情况下,动态添加功能,也是为了解耦
-
导入Maven依赖
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.2.1.RELEASE</version> </dependency>
-
创建UserService接口及实现类
//接口 public interface UserService { void insert(); void delete(); } //接口实现类 public class UserServiceImpl implements UserService { public void insert() { System.out.println("插入方法"); } public void delete() { System.out.println("删除方法"); } }
-
创建config配置包,创建切面类
-
实现MethodBeforeAdvice接口—前置
在业务代码之前执行的方法
import org.springframework.aop.MethodBeforeAdvice; import java.lang.reflect.Method; //实现MethodBeforeAdvice接口,表示该切面中的方法会在目标方法执行后执行 public class UserServiceBefore implements MethodBeforeAdvice { public void before(Method method, Object[] objects, Object o) throws Throwable { //打印类名和方法名 System.out.println(o.getClass().getName()+"类的"+method.getName()+"方法在之前被执行了"); } }
-
实现AfterReturningAdvice接口—后置
在业务代码之后前执行的方法
import org.springframework.aop.AfterReturningAdvice; import java.lang.reflect.Method; //实现AfterReturningAdvice接口,在目标方法之后执行 public class UserServiceAfter implements AfterReturningAdvice { public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable { //打印类名和方法名 System.out.println(o1.getClass().getName()+"类的"+method.getName()+"方法在之后被执行了"); } }
-
-
将类配置到配置文档中
- 配置xml文件头
- 配置bean
- 配置AOP
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> <!--开启注解支持--> <context:annotation-config/> <!--第一种方式--> <!--定义bean--> <bean id="userservice" class="org.westos02.service.impl.UserServiceImpl"/> <bean id="beforelog" class="org.westos02.config.UserServiceBefore"/> <bean id="afterlog" class="org.westos02.config.UserServiceAfter"/> <!--定义AOP配置--> <aop:config> <!--定义切入点,expression后的表达式为切入点,表示UserServiceImpl类下所有的方法,..表示方法的参数列表--> <aop:pointcut id="pc-userservice" expression="execution(* org.westos02.service.impl.UserServiceImpl.*(..))"/> <!--定义在切入点切入的方法(通知),引用上面定义的切面类的bean--> <aop:advisor advice-ref="afterlog" pointcut-ref="pc-userservice"/> <aop:advisor advice-ref="beforelog" pointcut-ref="pc-userservice"/> </aop:config> </beans>
-
测试
@Test public void test() { ApplicationContext context = new ClassPathXmlApplicationContext("users.xml"); UserService userservice = (UserService) context.getBean("userservice"); userservice.insert(); /* 输出结果 在org.westos02.service.impl.UserServiceImpl类的insert方法之前被执行了 插入方法 在org.westos02.service.impl.UserServiceImpl类的insert方法之后被执行了 */ }
3、方式二:使用切面实现(自定义切面)
-
创建切面类,和普通类一样
public class UserServiceAop { public void before() { System.out.println("方法执行前"); } public void after() { System.out.println("方法执行后"); } }
-
在xml中注册配置
使用配置标签来控制增强的类型
<!--第二种方式--> <!--要切入的类--> <bean id="userservice2" class="org.westos02.service.impl.UserServiceImpl"/> <!--切面类--> <bean id="aop" class="org.westos02.config.UserServiceAop"/> <aop:config> <!--定义切面--> <aop:aspect ref="aop"> <!--定义切点--> <aop:pointcut id="pc-userservice2" expression="execution(* org.westos02.service.impl.UserServiceImpl.*(..))"/> <!--定义通知类型、切入的通知、切点--> <aop:before method="before" pointcut-ref="pc-userservice2"/> <aop:after method="after" pointcut-ref="pc-userservice2"/> </aop:aspect> </aop:config>
-
测试
@Test public void test2() { //获得Spring配置文档连接对象 ApplicationContext context = new ClassPathXmlApplicationContext("users.xml"); //获得配置文档中注入的对象 UserService userservice = (UserService) context.getBean("userservice2"); //执行插入方法 userservice.insert(); /* 执行结果 方法执行前 插入方法 方法执行后 */ }
3、方式三:使用注解实现增强
-
创建注解类
- @Aspect,表示这是一个切面类
- @Before,通知类型为前置环绕
- @After,通知类型为后置环绕
- @Around,通知类型为包围
- execution(表达式),表示该通知生效的地方
package org.westos02.config; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; //切面类 @Aspect public class UserAnnotation { @Before("execution(* org.westos02.service.impl.UserServiceImpl.*(..))") public void before() { System.out.println("方法执行前"); } @After("execution(* org.westos02.service.impl.UserServiceImpl.*(..))") public void after() { System.out.println("方法执行后"); } @Around("execution(* org.westos02.service.impl.UserServiceImpl.*(..))") public void around(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("环绕前"); System.out.println(joinPoint.getSignature()); Object proceed = joinPoint.proceed(); System.out.println("环绕后"); System.out.println(proceed); } }
-
xml配置
<!--第三种方式,注解--> <bean id="userservice3" class="org.westos02.service.impl.UserServiceImpl"/> <!--让Spring识别注解,一定要添加--> <aop:aspectj-autoproxy/>
-
测试
@Test public void test3() { ApplicationContext context = new ClassPathXmlApplicationContext("users.xml"); UserService userservice = (UserService) context.getBean("userservice3"); userservice.insert(); }
2、Spring整合MyBatis
对应版本要求
1、创建MyBatis项目
-
创建Maven项目,导入Maven依赖
<dependencies> <!--junit依赖--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>RELEASE</version> <scope>test</scope> </dependency> <!--spring-webmvc依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.9.RELEASE</version> </dependency> <!-- lombok依赖 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency> <!--spring-aop依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.2.1.RELEASE</version> </dependency> <!--aspectjweaver依赖--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency> <!--spring-jdbc依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.10.RELEASE</version> </dependency> <!--mybatis依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.3</version> </dependency> <!--mysql依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> </dependencies>
-
添加Web框架支持,编写Mybatis.config.xml配置文件
<?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核心配置文件--> <configuration> <!--别名设置,简化开发--> <typeAliases> <package name="org.westos.pojo"/> <!--<typeAlias type="org.westos.pojo.User" alias="User"/>--> </typeAliases> <!--一个environments里面可以有多个environment标签,通过id值进行切换--> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <!--固定写法,驱动和URL--> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/> <!--MySQL数据库账号--> <property name="username" value="root"/> <!--MySQL数据库密码--> <property name="password" value="123"/> </dataSource> </environment> </environments> <!--添加用户映射配置,扫描dao包下的所有的mapper接口--> <mappers> <package name="org.westos.dao"/> </mappers> </configuration>
-
添加工具类
import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class MyBatisUtil { private static SqlSessionFactory sqlSessionFactory; static { try { //因为mybatis-config.xml配置文件在resource根目录下,所以可以直接写文件名 String resource = "mybatis-config.xml"; //固定的写法 InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } // 获取sqlSession的连接 public static SqlSession getSession() { return sqlSessionFactory.openSession(); } // 获取sqlSession的连接,可以设置自动提交事务 public static SqlSession getSession(boolean flag) { return sqlSessionFactory.openSession(flag); } }
-
创建实体类和对应dao层接口
//实体类 import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class User { private int id; private String name; private String pwd; } //接口 import org.westos.pojo.User; import java.util.List; public interface UserMapper { List<User> getUserList(); }
-
创建对应的mapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.westos.dao.UserMapper"> <!--查询数据库user表中所有的记录--> <select id="getUserList" resultType="User"> select * from user; </select> </mapper>
-
测试类测试
@Test public void test1() throws IOException { UserMapper mapper = MyBatisUtil.getSession().getMapper(UserMapper.class); for (User user : mapper.getUserList()) { System.out.println(user); } }
2、整合MyBatis
步骤
-
创建applicationContext.xml
- 编写数据源,使用Spring的数据源替换mybatis配置
- sqlSessionFactory工厂,绑定MyBatis配置文件和mapper.xml路径
- 根据构造器索引,从sqlSessionFactory中获取sqlSession
- 使用sqlSession给Mapper实现类的属性赋值,并将Mapper实现类注入到IOC容器中
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 1、整合mybatis数据源 使用Spring的数据源替换Mybatis配置 org.springframework.jdbc.datasource.DriverManagerDataSource --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="123"/> </bean> <!-- 2、注入sqlSessionFactory sqlSession工厂 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!--绑定Mabatis配置文件--> <property name="configLocation" value="classpath:mybatis-config.xml"/> <!--绑定映射器的路径,在dao包下找对应的xml配置文件--> <property name="mapperLocations" value="classpath:org/westos/dao/*.xml"/> </bean> <!-- 3、创建sqlSession SqlSessionTemplate:就是我们使用的sqlSession 从sqlSession工厂中获得sqlSession --> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <!--只能使用构造器注入sqlSessionFactory,因为它没有set方法--> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean> <!--4、 使用获得的sqlSession给UserMapper实现类属性赋值 --> <bean id="userMapperImpl" class="org.westos.dao.UserMapperImpl"> <property name="sqlSession" ref="sqlSession"/> </bean> </beans>
-
创建UserMapper实现类
import org.mybatis.spring.SqlSessionTemplate; import org.westos.pojo.User; import java.util.List; public class UserMapperImpl implements UserMapper { //sqlSession属性由Spring自动注入 private SqlSessionTemplate sqlSession; public void setSqlSession(SqlSessionTemplate sqlSession) { this.sqlSession = sqlSession; } public List<User> getUserList() { //具体的sql实现还是由mapper.xml完成 UserMapper mapper = sqlSession.getMapper(UserMapper.class); return mapper.getUserList(); } }
-
创建mapper.xml配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.westos.dao.UserMapper"> <!--查询数据库user表中所有的记录--> <select id="getUserList" resultType="User"> select * from user; </select> </mapper>
-
测试
@Test public void test2() { //得到IOC容器连接对象 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //从容器中得到UserMapperImpl实现类对象 UserMapperImpl userMapperImpl = (UserMapperImpl) context.getBean("userMapperImpl"); //调用对象的方法,打印信息 for (User user : userMapperImpl.getUserList()) { System.out.println(user); } }
3、Spring声明式事务
-
mapper接口
import java.util.List; public interface UserMapper { //查询表中的所有用户信息 List<User> getUserList(); //添加用户 int addUser(User user); //根据ID删除用户 int deleteUser(int id); }
-
mapper.xml文档配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.westos.dao.UserMapper"> <!--查询数据库user表中所有的记录--> <select id="getUserList" resultType="User"> select * from user; </select> <!--添加用户--> <insert id="addUser" parameterType="User"> INSERT INTO `user` (`id`,`name`,`pwd`) VALUES (#{id},#{name},#{pwd}) </insert> <!-- 根据id删除用户 在这里我们先故意写错delete语句,测试一下事务 --> <delete id="deleteUser" parameterType="int"> DELETE FROM `user` WHERE `id`=#{id} </delete> </mapper>
-
mapperImpl实现类实现
import org.mybatis.spring.SqlSessionTemplate; import org.westos.dao.UserMapper; import org.westos.pojo.User; import java.util.List; public class UserMapperImpl implements UserMapper { //sqlSession属性由Spring自动注入 private SqlSessionTemplate sqlSession; public void setSqlSession(SqlSessionTemplate sqlSession) { this.sqlSession = sqlSession; } //得到user表中的所有用户的信息 public List<User> getUserList() { //具体的sql实现还是由mapper.xml完成 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //我们在getUserList方法里面进行一些错误的操作 mapper.addUser(new User(5, "田七", "777777")); //deleteUser方法的sql语句是有错误的 mapper.deleteUser(4); return mapper.getUserList(); } //添加用户 public int addUser(User user) { //具体的sql实现还是由mapper.xml完成 UserMapper mapper = sqlSession.getMapper(UserMapper.class); return mapper.addUser(user); } //根据ID删除用户 public int deleteUser(int id) { //具体的sql实现还是由mapper.xml完成 UserMapper mapper = sqlSession.getMapper(UserMapper.class); return mapper.deleteUser(id); } }
-
测试
//测试getUserList方法 @Test public void test3() { //得到IOC容器连接对象 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //从容器中得到UserMapperImpl实现类对象 UserMapper userMapperImpl = (UserMapperImpl) context.getBean("userMapperImpl"); //调用对象的方法,打印信息 for (User user : userMapperImpl.getUserList()) { System.out.println(user); } } //异常:Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELETES FROM `user` WHERE `id`=4' at line 1 //显示SQl异常,我们在mapper.xml文档中故意写错的delete语句
但是我们查看user表中的数据,发现在getUserList()方法中的SQL操作中,插入操作成功了但是删除和查询操作却失败了,这对于数据库的ACID原则就造成了破坏,同一组SQ操作应该要么都成功,要么都失败
一组事务中有错误的SQL语句,但是还是有一部分执行成功了,这种情况下就应该添加事务,事务不影响业务代码
-
整合事务,使用AOP给数据库操作添加事务
- 导入事务的命名空间tx
- 整合事务
- 在pom.xml中配置aspectjweaver依赖
- 配置事务增强,相当于一个切面
- AOP配置,导入AOP命名空间,配置AOP
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 1.导入事务的命名空间tx 2.整合事务 3.在pom.xml中配置aspectjweaver依赖 4.配置事务增强,相当于一个切面 5.AOP配置,导入AOP命名空间,配置AOP --> <!--整合事务--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <constructor-arg ref="dataSource"/> </bean> <!--配置事务增强 id连接AOP,transaction-manager连接前面的整合事务--> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!--所有的方法都配置事务 propagation配置事务的传播特性,常用的有REQUIRED,没有就创建--> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <!--配置AOP--> <aop:config> <!--定义切点--> <aop:pointcut id="txPointCut" expression="execution(* org.westos.dao.*.*(..))"/> <!--定义切入的通知(事务)--> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/> </aop:config> <aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 1、整合mybatis数据源 使用Spring的数据源替换Mybatis配置 org.springframework.jdbc.datasource.DriverManagerDataSource --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="123"/> </bean> <!-- 2、注入sqlSessionFactory sqlSession工厂 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!--绑定Mabatis配置文件--> <property name="configLocation" value="classpath:mybatis-config.xml"/> <!--绑定映射器的路径,在dao包下找对应的xml配置文件--> <property name="mapperLocations" value="classpath:org/westos/dao/*.xml"/> </bean> <!-- 3、创建sqlSession SqlSessionTemplate:就是我们使用的sqlSession 从sqlSession工厂中获得sqlSession --> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <!--只能使用构造器注入sqlSessionFactory,因为它没有set方法--> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean> <!--4、 使用获得的sqlSession给UserMapper实现类属性赋值 --> <bean id="userMapperImpl" class="org.westos.dao.impl.UserMapperImpl"> <property name="sqlSession" ref="sqlSession"/> </bean> </beans>
-
再次测试
发现在程序继续报错,但是数据库数据并没有发生变化
-
修改mapper.xml中的错误,再次测试
发现所有的操作都可以完成,事务完整
以后写SQL操作代码就不用再写事务操作,而是由AOP自动切入
-
思考
为什么需要事务
- 如果不配置事务,可能存在数据提交不一致的情况
- 如果我们不在Spring中去配置声明式事务,我们就需要在代码中手动配置事务,麻烦
- 事务在项目的开发中十分重要,设计到数据的一致性和完整性问题,不容马虎
4、SpringMVC
入门案例:创建一个简单的SpringMVC项目
-
原始的:jsp+servlet+web.xml
-
SpringMVC
SpringMVC给我们提供了一个DispatcherServelet,我们只需要将
-
创建Maven项目,添加Web框架支持,配置Tomcat服务器
启动服务器,确保服务器可以正常启动
-
添加Maven依赖
<!--spring-webmvc依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.9.RELEASE</version> </dependency> <!--servlet依赖--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> </dependency>
-
在web.xml文件中注册servlet
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--注册DispatcherServlet,Servlet调度,Spring提供--> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--关联SpringMVC的配置文件--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> <!--设置初始化参数--> </init-param> <!--服务器启动的时候就启动--> <load-on-startup>1</load-on-startup> </servlet> <!-- / 和 /* 的区别 / 匹配所有的请求,不包括.jsp文件 /* 匹配所有的请求,包括.jsp文件 --> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <!--匹配所有的请求,不包括.jsp文件--> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
-
springmvc-servlet.xml文件配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--固定配置--> <!--扫描控制层包,和前端进行页面数据交互的--> <context:component-scan base-package="org.westos.controller"/> <!--开启注解驱动--> <mvc:annotation-driven/> <!--开启静态资源扫描--> <mvc:default-servlet-handler/> <!--视图解析器--> <!--匹配好的路径为:/WEB-INF/views/***.jsp--> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--文件路径前缀--> <property name="prefix" value="/WEB-INF/views/"/> <!--文件名后缀--> <property name="suffix" value=".jsp"/> </bean> </beans>
-
创建hello.jsp页面,用来跳转到的界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Hello</title> </head> <body> <h1>11111</h1> <%-- 从Controller中获得的参数,打印在页面上 --%> <h1>${msg}</h1> </body> </html>
-
创建HelloController类
import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; //注解表示是控制层的 @Controller public class HelloController { //URL请求路径 @RequestMapping("/hello") //Model可以用来想前端传递参数 public String hello(Model model) { //设置值,msg:Hello,SpringMvc model.addAttribute("msg", "Hello,SpringMvc"); //返回jsp界面 //经过视图解析器解析后成为:/WEB-INF/views/hello.jsp //有该界面就返回,没有就报404 return "hello"; } }
-
创建lib目录
-
启动Tomcat服务器测试
网站的核心就是交互
-
前端传值
-
后台处理数据,与数据库打交道,返回数据给前端
-
控制层控制页面跳转,控制请求