`

Spring之在Web应用中如何使用框架原理解析

 
阅读更多

 

在Web应用中如何使用Spring框架?

 

在回答这个问题之前,让我们先回顾一下在非Web中使用Spring框架的方式:

 

package xyz.huning.spring4.helloworld;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
	public static void main(String[] args) {
		// 1. 创建Spring的IOC容器
		//    ApplicationContext代表IOC容器,ClassPathXmlApplicationContext:从 类路径下加载配置文件
		ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml");
		// 2. 从IOC容器中获取bean
		Helloworld helloworld = context.getBean("helloWorld", Helloworld.class);
		helloworld.say();
		// 3. 关闭IOC容器
		((ClassPathXmlApplicationContext)context).close();
	}
}

 

不错,我们是通过new一个ApplicationContext的对象,让后加载配置文件来完成的。那么,在Web应有中我们又该如何实现呢?要回答这个问题,我们需要弄清楚一下一个问题:

 

1) Spring 的配置文件有什么不同?

2) 用什么方式创建IOC容器?

3) 在什么时候创建IOC容器?

4) 在 Web 应用的其他组件中如何来访问 IOC 容器?

5) 如何加载Spring配置文件?

 

Spring 的配置文件有什么不同?

因为配置文件中是对bean的配置,并不涉及IOC容器在哪里使用。因此,在Web应用中的配置文件和非Web应用中没有区别。

 

用什么方式创建IOC容器?

非 WEB 应用在 main 方法中直接创建,即在程序启动的时候创建。那么Web应用也应该在程序启动的时候创建,那Web应用是在什么时候启动程序的呢?

显然是在WEB 应用被服务器加载时启动的,因此,应该在 Web 应用被服务器加载时就创建 IOC 容器。查看ServletAPI后,发现在 ServletContextListener接口的

contextInitialized(ServletContextEvent evt) 方法中创建 IOC 容器是最佳时机。

 

在 Web 应用的其他组件中如何来访问 IOC 容器?

考虑到Web容器中存在四中作用域:applIcation(整个应用,对应servlet中ServletContext),session(会话,对应servlet中HttpSession),request(一次请求,对应servlet中HttpServletRequest)和page(当前页面)。

为了在所有范围内访问到IOC容器,在 ServletContextListener接口的contextInitialized(ServletContextEvent evt) 方法中创建 IOC 容器后, 可以把其放在ServletContext(即 application 域)的一个属性中。

 

如何加载Spring配置文件?

如果使用ClassPathXmlApplicationContext来创建IOC容器,则Spring配置文件放置于Classpath类路径中即可。为了增加应用的灵活性,可以利用web.xml中的初始化参数“context-param”来传入配置文件名称。然后使用

ServletContext接口的getInitParameter(String arg)来获取。以此来达到可配置的效果。

 

示例(源代码见附件)

 

1. 创建JavaWeb工程xyz.huning.web.spring4.custom

    
   
 

2. 添加模型类

     

package xyz.huning.web.spring4.custom.bean;

public class User {

	private int id;
	
	private String username;
	
	private String password;
	
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", password="
				+ password + "]";
	}
}

 

3. 配置模型bean

 

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="user1" class="xyz.huning.web.spring4.custom.bean.User">
		<property name="id" value="1"></property>
		<property name="username" value="BluceLi"></property>
		<property name="password" value="123456"></property>
	</bean>
	
</beans>

 

4. 添加ServletContextListener

 

package xyz.huning.web.spring4.custom.loader;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringLoaderListener implements ServletContextListener {

	public static final String APPLICATION_CONTEXT = "xyz.huning.web.spring4.custom.loader.ctx";
	
	private ServletContext servletContext;
	
	@Override
	public void contextDestroyed(ServletContextEvent evt) {
		servletContext = evt.getServletContext();
		ClassPathXmlApplicationContext ctx = (ClassPathXmlApplicationContext)servletContext.getAttribute(APPLICATION_CONTEXT);
		ctx.close();
	}

	@Override
	public void contextInitialized(ServletContextEvent evt) {
		servletContext = evt.getServletContext();
		String springCfgFile = servletContext.getInitParameter("springCfgFile");
		
		ApplicationContext ctx = new ClassPathXmlApplicationContext(springCfgFile);
		servletContext.setAttribute(APPLICATION_CONTEXT, ctx);
	}
}

 

5. 添加测试Servlet

 

package xyz.huning.web.spring4.custom.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.ApplicationContext;

import xyz.huning.web.spring4.custom.bean.User;
import xyz.huning.web.spring4.custom.loader.SpringLoaderListener;

public class UserServlet extends HttpServlet {

	private static final long serialVersionUID = -8200917637630894695L;

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		ApplicationContext ctx = (ApplicationContext)getServletContext().getAttribute(SpringLoaderListener.APPLICATION_CONTEXT);
		User user1 = ctx.getBean("user1", User.class);
		
		PrintWriter pw = new PrintWriter(response.getOutputStream());
		pw.print(user1);
		
		pw.flush();
		pw.close();
	}
}

 

6. 添加web.xml并配置

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	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">

	<context-param>
		<param-name>springCfgFile</param-name>
		<param-value>applicationContext.xml</param-value>
	</context-param>
	
	<listener>
		<listener-class>xyz.huning.web.spring4.custom.loader.SpringLoaderListener</listener-class>
	</listener>
	
	<servlet>
		<servlet-name>userServlet</servlet-name>
		<servlet-class>xyz.huning.web.spring4.custom.servlet.UserServlet</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>userServlet</servlet-name>
		<url-pattern>/userServlet</url-pattern>
	</servlet-mapping>
	
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>
	
</web-app>

 

7. 配置tomcat添加目标工程后启动

8. 在浏览器中输入地址:http://localhost:8080/xyz.huning.web.spring4.custom/userServlet

9. 查看返回结果

 

    
 

 

  • 大小: 20.8 KB
  • 大小: 14.3 KB
分享到:
评论

相关推荐

    Spring技术内幕:深入解析Spring架构与设计原理(第2部分)

     Spring如何在Web环境中集成IoC容器并为Web应用开发提供利器?  我们耳熟能详的MVC模式在Spring中是如何实现的?  Spring MVC如何灵活地集成各种丰富的视图展现方案?  Spring实现远端调用的方案有很多种,你...

    Spring技术内幕:深入解析Spring架构与设计原理

     spring如何在web环境中集成ioc容器并为web应用开发提供利器?  我们耳熟能详的mvc模式在spring中是如何实现的?  spring mvc如何灵活地集成各种丰富的视图展现方案?  spring实现远端调用的方案有很多种,你...

    Spring技术内幕:深入解析Spring架构与设计原理 1/2

     spring如何在web环境中集成ioc容器并为web应用开发提供利器?  我们耳熟能详的mvc模式在spring中是如何实现的?  spring mvc如何灵活地集成各种丰富的视图展现方案?  spring实现远端调用的方案有很多种,你...

    Spring.3.x企业应用开发实战(完整版).part2

    《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用...

    Spring技术内幕:深入解析Spring架构与设计原理(第1部分)

     Spring如何在Web环境中集成IoC容器并为Web应用开发提供利器?  我们耳熟能详的MVC模式在Spring中是如何实现的?  Spring MVC如何灵活地集成各种丰富的视图展现方案?  Spring实现远端调用的方案有很多种,你...

    Spring技术内幕:深入解析Spring架构与设计原理(第一部分)

     Spring如何在Web环境中集成IoC容器并为Web应用开发提供利器?  我们耳熟能详的MVC模式在Spring中是如何实现的?  Spring MVC如何灵活地集成各种丰富的视图展现方案?  Spring实现远端调用的方案有很多种,你...

    Spring技术内幕:深入解析Spring架构与设计原理 2/2

     spring如何在web环境中集成ioc容器并为web应用开发提供利器?  我们耳熟能详的mvc模式在spring中是如何实现的?  spring mvc如何灵活地集成各种丰富的视图展现方案?  spring实现远端调用的方案有很多种,你...

    spring.net中文手册在线版

    Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序。它提供了很多方面的功能,比如依赖注入、面向方面编程(AOP)、数据访问抽象及ASP.NET扩展等等。Spring.NET以Java版的Spring框架为...

    Spring攻略(第二版 中文高清版).part1

    第6章 将Spring与其他Web框架集成 209 6.1 在一般Web应用中访问Spring 209 6.1.1 问题 209 6.1.2 解决方案 210 6.1.3 工作原理 210 6.2 在你的Servlet和过滤器中使用Spring 214 6.2.1 问题 214 6.2.2...

    Spring中文帮助文档

    在应用服务器中使用Hibernate的注意事项 12.3. JDO 12.3.1. 建立PersistenceManagerFactory 12.3.2. JdoTemplate和JdoDaoSupport 12.3.3. 基于原生的JDO API实现DAO 12.3.4. 事务管理 12.3.5. JdoDialect ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    在应用服务器中使用Hibernate的注意点 12.3. JDO 12.3.1. 建立PersistenceManagerFactory 12.3.2. JdoTemplate和JdoDaoSupport 12.3.3. 基于原生的JDO API实现DAO 12.3.4. 事务管理 12.3.5. JdoDialect 12.4. ...

    Spring攻略(第二版 中文高清版).part2

    第6章 将Spring与其他Web框架集成 209 6.1 在一般Web应用中访问Spring 209 6.1.1 问题 209 6.1.2 解决方案 210 6.1.3 工作原理 210 6.2 在你的Servlet和过滤器中使用Spring 214 6.2.1 问题 214 6.2.2...

    Spring高级之注解驱动开发视频教程

    系统的学习Spring框架中各个部分,掌握Spring中一些高级特性的使用。 l Spring IoC n 设计模式-工厂模式 n 基础应用-入门案例 n 基础应用-常用注解使用场景介绍及入门 n 高级特性-自定义BeanNameGenerator n 高级...

    Spring3.x企业应用开发实战(完整版) part1

    《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用...

    SPRING3技术内幕

     Spring如何在Web环境中集成IoC容器并为Web应用开发提供利器?  我们耳熟能详的MVC模式在Spring中是如何实现的?  Spring MVC如何灵活地集成各种丰富的视图展现方案?  Spring实现远端调用的方案有很多种,你...

    Spring 2.0 开发参考手册

    在应用服务器中使用Hibernate的注意点 12.3. JDO 12.3.1. 建立PersistenceManagerFactory 12.3.2. JdoTemplate和JdoDaoSupport 12.3.3. 基于原生的JDO API实现DAO 12.3.4. 事务管理 12.3.5. JdoDialect 12.4...

    Spring API

    在应用服务器中使用Hibernate的注意事项 12.3. JDO 12.3.1. 建立PersistenceManagerFactory 12.3.2. JdoTemplate和JdoDaoSupport 12.3.3. 基于原生的JDO API实现DAO 12.3.4. 事务管理 12.3.5. JdoDialect ...

    spring chm文档

    在应用服务器中使用Hibernate的注意点 12.3. JDO 12.3.1. 建立PersistenceManagerFactory 12.3.2. JdoTemplate和JdoDaoSupport 12.3.3. 基于原生的JDO API实现DAO 12.3.4. 事务管理 12.3.5. JdoDialect 12.4...

    Java Web应用详解.张丽(带详细书签).pdf

    第14章 Spring框架及其应用 14.1 Spring 基础知识 14.2 Spring框架应用实例 14.3 Spring 和 Hibernate 组合开发实例 第15章 SSH整合应用 15.1 SSH整合理念 15.2 网络留言板V7.0 15.3 实例开发步骤 15.4 实例...

Global site tag (gtag.js) - Google Analytics