概述
在日常的开发中Web项目集成Spring框架,已经越来越重要,而Spring框架已经成为web开发的主流框架之一。本文主要讲解Java开发Web项目集成Spring框架的简单使用,以及使用Spring和不使用Spring框架,两者之间的差异。 仅供学习分享使用,如有不足之处,还请指正。
页面访问流程图
本示例的页面访问流程图如下所示:

不使用Spring框架的开发流程
步骤如下:
1. 新增Service和Dao对应的类及接口实现
如下所示:在Service中对Dao进行了强关联

1 package com.hex.Dao;
2
3 /**
4 * 学生Dao
5 * @author Administrator
6 *
7 */
8 public interface IStudentDao {
9 public String GetStudentById(int id);
10 }
11 ////////////////////////////////////////
12 package com.hex.Dao;
13
14 /**
15 * 学生Dao
16 * @author Administrator
17 *
18 */
19 public class StudentDaoImpl implements IStudentDao {
20
21 /**
22 * 查询学生信息
23 */
24 @Override
25 public String GetStudentById(int id) {
26
27 return "hex";
28 }
29
30 }
31 ////////////////////////////////////////
32 package com.hex.Service;
33
34 /**
35 * 学生服务接口
36 * @author Administrator
37 *
38 */
39 public interface IStudentService {
40 public String GetStudentById(int id);
41 }
42 ////////////////////////////////////////
43 package com.hex.Service;
44
45 import com.hex.Dao.IStudentDao;
46 import com.hex.Dao.StudentDaoImpl;
47
48 /**
49 * 学生服务实现类
50 * @author Administrator
51 *
52 */
53 public class StudentServiceImpl implements IStudentService {
54
55 private IStudentDao studentDao;
56
57 public void setStudentDao(IStudentDao studentDao) {
58 this.studentDao = studentDao;
59 }
60
61 @Override
62 public String GetStudentById(int id) {
63 //studentDao=new StudentDaoImpl();
64 return studentDao.GetStudentById(id);
65 }
66
67 }
2. 新增HomeServlet类,并需要通过new的方式声明studentService对象
如下所示:
1 package com.hex.servlet;
2
15 /**
16 * 访问Servlet实现类
17 */
18 public class HomeServlet extends HttpServlet {
19 private static final long serialVersionUID = 1L;
20
21 private IStudentService studentService;
22
23
24 /**
25 * 构造函数26 */
27 public HomeServlet() {
28
29 }
30
31 /**
32 * 初始化时声明studentService对象
33 */
34 @Override
35 public void init() throws ServletException {
36 studentService=new StudentServiceImpl();
37 }
38
39 /**
40 * Get方法
41 */
42 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
43
44 String studentName=studentService.GetStudentById(0);
45 request.setAttribute("studentName", studentName);
46 request.getRequestDispatcher("/jsp/Home.jsp").forward(request, response);
47 }
48
49 /**
50 * Post方法,此处和Get方法同
51 */
52 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
53 // TODO Auto-generated method stub
54 doGet(request, response);
55 }
56
57 }
3. 前端页面进行访问即可
如下所示:
1 <a href="../HomeServlet">点击进入</a>
4. 缺点:
此处形成了强依赖,即HomeServlet需要StudentServiceImpl对象。且StudentServiceImpl需要StudentDao的支持。
采用Spring的方式进行访问
1. 需要在web.xml文件中配置Spring对应的监听器
如下所示:
applicationContext.xml 位于src目录,所以需要加上classpath,是Spring容器的配置文件
1 <context-param> 2 <param-name>contextConfigLocation</param-name> 3 <param-value>classpath:applicationContext.xml 4 </param-value> 5 </context-param> 6 <!-- 配置spring-web.jar对应的监听器 ,Tomcat启动时,自动初始化IOC容器 --> 7 <listener> 8 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 9 </listener>
2. 配置Spring的IOC容器
如下所示:依赖引用对象属性采用ref方式,如果是值对象,则采用value方式。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans.xsd"> 6 <!-- Dao依赖于数据库的底层操作,本示例不予深入 --> 7 <bean id="studentDao" class="com.hex.Dao.StudentDaoImpl"></bean> 8 <!-- Service层依赖于StudentDao,采用set的方式注入 --> 9 <bean id="studentService" class="com.hex.Service.StudentServiceImpl"> 10 <property name="studentDao" ref="studentDao"></property> 11 </bean> 12 </beans>
3. 在Servlet中,引入ApplicationContext对象,将Tomcat容器和Spring的IOC容器进行关联
如下所示:其他方法保持不变,增加studentService对象的getter和setter方法,然后通过容器注入的声明方式产生对象。在StudentServiceImpl中对StudengDao的依赖采用同样方法进行注入。
1 package com.hex.servlet;
2
3 /**
4 * Servlet实现类
5 */
6 public class HomeServlet extends HttpServlet {
7 private static final long serialVersionUID = 1L;
8
9 private IStudentService studentService;
10
11 public IStudentService getStudentService() {
12 return studentService;
13 }
14
15 public void setStudentService(IStudentService studentService) {
16 this.studentService = studentService;
17 }
18
19 /**
20 * 初始化时获取Sping的IOC容器中的bean对象
21 */
22 @Override
23 public void init() throws ServletException {
24 //Web项目获取Spring上下文对象。
25 ApplicationContext context=WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
26 studentService=(IStudentService)context.getBean("studentService");
27 }
28 }
4. 优势:
此方式将Servlet和Service及Dao之间进行了解耦,灵活扩展性大大增强。
小知识
如果Spring的IOC容器文件有多个,可以采用Import的方式进行引入,如下所示:
1 <!-- 第二种方式,采用import方式引入其他容器文件 --> 2 <import resource="applicationContext2.xml"/>
在web.xml中配置servlet的方式,如下所示:

1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 3 <display-name>FirstWebSpring</display-name> 4 <servlet> 5 <description> 6 </description> 7 <display-name>HomeServlet</display-name> 8 <servlet-name>HomeServlet</servlet-name> 9 <servlet-class>com.hex.servlet.HomeServlet</servlet-class> 10 </servlet> 11 <servlet-mapping> 12 <servlet-name>HomeServlet</servlet-name> 13 <url-pattern>/HomeServlet</url-pattern> 14 </servlet-mapping> 15 <welcome-file-list> 16 <welcome-file>index.html</welcome-file> 17 <welcome-file>index.htm</welcome-file> 18 <welcome-file>index.jsp</welcome-file> 19 <welcome-file>default.html</welcome-file> 20 <welcome-file>default.htm</welcome-file> 21 <welcome-file>default.jsp</welcome-file> 22 </welcome-file-list> 23 <!-- 配置容器地址 --> 24 <!-- 第一种方式如果要加载多个配置文件,可以写多个,如下所示: 25 <param-value> 26 classpath:applicationContext.xml, 27 classpath:applicationContext2.xml 28 </param-value> 29 --> 30 <context-param> 31 <param-name>contextConfigLocation</param-name> 32 <param-value> 33 classpath:applicationContext.xml 34 </param-value> 35 </context-param> 36 <!-- 配置spring-web.jar对应的监听器 ,Tomcat启动时,自动初始化IOC容器 --> 37 <listener> 38 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 39 </listener> 40 </web-app>
备注
绳锯木断,水滴石穿。
