上期说到Spring中会分为下列几层然后交给Spring管理:
1.@Component 除三层之外的类
2.@Controller 把web层的类交给Spring管理。因为 Servlet/Filter 对象不能交给spring管理,所以后期我们选择替换掉Servlet,采用新的框架SpringMVC!(毕竟那玩意妨碍到我们偷懒了,那就得想办法干掉)(但是这一期我们讲的还是使用的@WebServlet()!)
3.@Service 把业务层的业务类交给spring管理
4.@Repository 把Dao层的Dao类交给spring管
但是也正是由于Servlet和Fileter无法交给Spring管理,所以后期我们选择替换掉Servlet/Filter,下面我们就来看看这是怎么实现的!
一、Spring与Web层整合。
①Spring容器自动创建:监听Web服务器,在其启动时自动创建spring容器
②创建好的spring容器,保存起来,方便在后面的代码中获取,对所有用户,所有请求共享, 存在Application域中。
那么实现步骤如下:
事前准备:
我们需要有一个父项目,然后在父项目中加入下列配置:
目录结构如下:
在父类的pom.xml加入下列配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>Spring-Web-Create</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>Spring-web-create-test</module>
</modules>
<properties>
<spring.version>4.3.10.RELEASE</spring.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>4.3.10.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<!-- 插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
</plugins>
<!--设置maven拷贝那些目录下的文件-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
</project>
然后我们正式开始!
①创建一个Spring-web的Mudule:
然后自己改个名字然后一路next到最后。
②添加Spring-web的依赖:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!--spring的依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.10.RELEASE</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<!--导入spring-web-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<!--servlet-api-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<!--jsp-api-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
③然后新建三个文件夹:
④写下相应的实体类:
[1]DAO层:
//这里是分开的,我懒写在一起
//UserDAO接口
public interface UserDAO {
public void testDAO();
}
//UserDAO实现类
@Component("userDAO")
public class UserDAOImpl implements UserDAO {
public void testDAO() {
System.out.println("这是DAO层");
}
}
[2]Service层:
//这里本来是分开的,我懒,所以写在一起
//Service接口
public interface UserService {
public void UserService();
}
//Service实现类
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDAO userDAO;
public void UserService() {
System.out.println("这是service");
userDAO.testDAO();
}
}
[3]实体类(这里偷懒加了Lombok依赖然后用了注解,可以看上一篇有讲解):
//我懒,不分,另加一个lombok依赖
//User实体类
@Data //替换get、set方法
@AllArgsConstructor //全参构造方法
@NoArgsConstructor //无参数构造方法
@EqualsAndHashCode //equals和hashCode方法
@ToString //toString方法
@Component
public class User {
private String username;
private String password;
}
//Order实体类
@Data //替换get、set方法
@AllArgsConstructor //全参构造方法
@NoArgsConstructor //无参数构造方法
@EqualsAndHashCode //equals和hashCode方法
@ToString //toString方法
@Component
public class Order {
private String[] arr;
private List<User> list;
private Set<User> set;
private Map<String, User> map;
private Properties prop;
private String orderName;
}
总体效果如下:
⑤去webapp下的WEB-INF下的web.xml进行如下配置:
配置一个过滤器,监听web服务器启动时候,创建Spring容器
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
然后
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
是用于设置加载的配置文件的,不写的话就默认加载WEB-INF下的web.xml文件
⑥创建一个applicationContext.xml文件
然后开启Spring的注解扫描:
<?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"
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">
<!-- 开启扫描注解 -->
<context:component-scan base-package="com.test" />
</beans>
⑦去写一个新建一个Controller层下的AServlet文件:
⑧使用注解@WebServlet()设置访问路径,然后继承HttpServlet:
然后通过
ApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
来获取Spring容器(放心吧!以后SpringMVC往后会换注解配置的放心!我也不想背这么长!)
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取Spring容器,它存在Application域 ServletContext
ApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
app.getBean(UserService.class).UserService();
}
}
⑧我们配置一个Tomcat然后跑起来:
然后执行完后就可以运行成功啦!结果如下:
然后spring和web层的整合就完成啦,当然啦,在后续的学习中我们还会不断的演化,到了SSM的时候就会出现下面这种情况,完全使用注解进行代码整合,下面是我写SSM项目的时候的一个小片段,你会发现其实过滤器和@WebServlet也被替换掉了,但是我们要知道他们的前身是什么,知其因果,循序渐进!
所以到这里Spring和web层的整合就结束啦,谢谢!