使用Spring开发web项目(STS 3.0)

目录

前言

一、如何使用STS3.0开发web项目

二、拆分配置文件 

1.Java项目与web项目拆分

2.Spring整合项目

总结


前言

spring开发web项目在STS3.0中的配置基本和eclipse配置Tomcat一致。spring开发web项目主要考虑的问题在于如何将IOC容器的一次性实现新建所有bean对应的对象,由于web项目中没有相应的 main函数,不能在每一层需要调用该IOC时 都 实现一次 该代码 片段:

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applictionContext.xml");

可以考虑在Javaweb项目中的web.xml中配置对应的 监听器,实现web项目启动自动执行IOC初始化,因此,spring官方提供了  spring-web-5.2.6.RELEASE.jar 实现该功能。


提示:以下是本篇文章正文内容,下面案例可供参考

一、如何使用STS3.0开发web项目

在sts3.0中新建 动态web项目与eclipse基本一样,引入spring对应的jar包后,如果想实现在该web项目中实现一次启动,处处可以使用IOC容器初始化新建的bean对应的对象,需要对web.xml进行一些配置,在 webapp标签下新建标签listener标签,在其中新建子标签 <listener-class>,搜索快捷键为 Ctrl+shift+T,查找 ContextLoaderListener,进行点击后如图所示:

spring 老项目 spring web项目_spring

复制红框中的全类名,之后写入  <listener-class>中。

...........

  <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  <!-- 配置 spring-web.jar 提供的监听器,该配置在服务器启动初始化IOC容器 -->
  </listener>
  
</web-app>

之后对将 IOC容器(此处指 applicationContext.xml 配置文件)的具体位置也配置到web.xml中。  <context-param>标签与   <listener> 同级,子标签 <param-name>的值要注意为某个固定值。其来源为:首先关联上面配置<listener-class>时的源码关联(spring-web-source.jar),找到对应类中的父类ContextLoader,如图:

spring 老项目 spring web项目_xml_02

 点击进去,发现第101行:

spring 老项目 spring web项目_web项目_03

其中 contextConfigLocation  就是子标签 <param-name>的值。该值代表着寻找 applicationContext.xml 配置文件的位置,该位置的值为 classpath:applicationContext.xml ,其中classpath 代表着配置文件 applicationContext.xml 在类路径 src下。

......
  <context-param>
 <param-name>contextConfigLocation</param-name>
  <!-- 寻找 applicationContext.xml 配置文件的位置-->
  <param-value>classpath:applicationContext.xml</param-value>
   <!--  IOC容器(此处指 applicationContext.xml 配置文件)的具体位置 -->
  </context-param>

  <listener>
  <!-- 配置 spring-web.jar 提供的监听器,该配置在服务器启动初始化IOC容器 -->
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
</web-app>

applicationContext.xml 在src路径下,也就是在类路径下,因此前面有classpath: 修饰。

或者直接使用约定的方式,将标签   <context-param> 删除,将 applicationContext.xml文件移动到web-inf文件夹下,注意,该配置文件只能叫 applicationContext.xml,并且位置必须固定。

spring 老项目 spring web项目_web项目_04

二、拆分配置文件 

1.Java项目与web项目拆分

Java项目不存在拆分与否,配置文件想如何命名都没问题。

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applictionContext001.xml");
  ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applictionContext002.xml");  
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applictionContext003.xml");

但是在web项目中对配置文件(applicationContext.xml)的拆分与合并,需要进行配置(按功能或者三层模型拆分):

 

spring 老项目 spring web项目_java_05

将多个配置文件合并的方法为:  

spring 老项目 spring web项目_web项目_06

也可以直接在 applicationContext.xml 文件中直接使用 import标签中引入相关的配置文件。

2.Spring整合项目

在以往的项目中,项目调用Dao,Service层的对象都是直接使用new的方式进行,之后调用相应对象中的参数。现使用 spring IOC容器实现依赖注入,即可对项目代码实现Spring整合。如果不将IOC容器加载到Tomcat容器中,启动项目后网页向servlet发送请求就会报错(空指针异常),要想解决,就需要在servlet进行初始化时(init方法)将IOC容器加载到web容器中。

spring 老项目 spring web项目_spring 老项目_07

代码如下(示例):

/**
 * Servlet implementation class QueryServlet , init() 初始化IOC对象
 */
@WebServlet("/QueryServlet")
public class QueryServlet extends HttpServlet implements Servlet {
	  
		IServiceQuery serviceQuery   ;// = new ServiceQueryImpl();// 
		
     @Override
    	public void init( ) throws ServletException {
    		// TODO = new ClassPathXmlApplicationContext, web项目获取 IOC容器(上下文)
    		 ApplicationContext  context = 
    		WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext());
    		 serviceQuery =(IServiceQuery)context.getBean("serviceQueryBeanId") ;
     }

		public void setServiceQuery(IServiceQuery serviceQuery) {
			this.serviceQuery = serviceQuery;
		}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String queryResult = serviceQuery.serviceQuery(96);
	request.setAttribute("infor", queryResult);
	request.getRequestDispatcher("result.jsp").forward(request, response);
	}

}

在web项目中不在通过new对象(ApplicationContext)该处使用固有的对象与方法: WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext());


总结

spring整合web 项目,如何将对象自动注入到web中需要进行许多繁琐的配置,之后使用springMVC将会将该IOC自动装载到web容器中,不必像servlet原生配置如此麻烦。