博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用spring 4.0 + maven 构建超简单的web项目
阅读量:6651 次
发布时间:2019-06-25

本文共 8453 字,大约阅读时间需要 28 分钟。

一.需求

使用spring去管理web项目,是目前非常流行的一种思路,本文将介绍使用maven+spring 4.0.2 来构建一个简单的web项目.

 

二.实现

1.新建一个maven项目,如下图所示:

 

 

这里因为是构建web项目,所以,选择的是webapp.

项目的架构图:

 

 

2.在pom.xml中添加所依赖的jar包,如下所示:

4.0.0
com.amos
ssh_integrated
war
0.0.1-SNAPSHOT
ssh_integrated Maven Webapp
http://maven.apache.org
org.springframework
spring-web
4.0.2.RELEASE
junit
junit
3.8.1
test
org.springframework
spring-context
4.0.2.RELEASE
ssh_integrated_spring

 

3.新建一个接口com.amos.service.IHello.java,并实现接口.

package com.amos.service;public interface IHello {        public String sayHi();    }

com.amos.service.HelloImpl.java

package com.amos.service;import java.util.Date;public class HelloImpl implements IHello{    private String msg;    public void setMsg(String msg) {        this.msg = msg;    }        public String sayHi() {                return "当前时间:"+new Date()+" msg:"+msg;    }   }

 

4.新建一个Servlet,并实现此Servlet

com.amos.web.HelloServlet

package com.amos.web;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.context.ApplicationContext;import org.springframework.web.context.support.WebApplicationContextUtils;import com.amos.service.IHello;@WebServlet(name="HelloServlet",urlPatterns={"/hello"})public class HelloServlet extends HttpServlet {    private static final long serialVersionUID = 2801654413247618244L;    private IHello hello;    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {                //方法1,使用传统方式去加载beans.xml,每次请求时加载        //ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");                //方法2,使用监听器的方式加载beans.xml,在一启动的时候就加载监听器,避免多次加载,提高效率        //ApplicationContext applicationContext  = (ApplicationContext) this.getServletContext().getAttribute("SpringApplicationContext");                //方法3,使用spring自带的监听器去加载beans.xml        //ApplicationContext applicationContext  = (ApplicationContext) this.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);        //使用webapplicationcontextutils这个工具类可以很方便的获取ApplicationContext,只需要传入servletContext        ApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext());                hello = applicationContext.getBean(IHello.class);        String sayHi = hello.sayHi();        System.err.println("sayHi:" + sayHi);        resp.setContentType("text/html;charset=utf-8");        resp.getWriter().write("

" + sayHi + "

"); }}

注:这里要注意的是实现spring管理Bean的三种方式.

第一种:最传统的方式,同时也是效率最低的一种,因为,每次发一个请求都要重新加载一次,而且对于不同的Servlet的要每个都去加载,会大大降低效率.

第二种:使用监听器来实现加载beans.xml,每次项目启动的时候加载一次就可以了.这样大提高了效率.

com.amos.web.InitSpringFactoryListener.java

package com.amos.web;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class InitSpringFactoryListener implements ServletContextListener {    public InitSpringFactoryListener() {    }    public void contextInitialized(ServletContextEvent arg0) {        //这里将加载beans.xml加载到内存中,放到servletcontext中,名称可以随便取,这里取为SpringApplicationContext,        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");        arg0.getServletContext().setAttribute("SpringApplicationContext", applicationContext);    }    public void contextDestroyed(ServletContextEvent arg0) {    }}

 

同时,web.xml中要定义一个listener属性.

 

第三种:针对第二种方法,其实spring中已经封装好了一种监听器,人工去配置即可,原理和第二种方法一致.

 

只需要在web.xml中加入如下代码即可.

org.springframework.web.context.ContextLoaderListener

但运行进会报如下错误:

org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:343)    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303)    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:216)    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:187)    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:540)    ........    Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]    at org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:141)    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:329)    ... 22 more

说找不到applicationContext.xml文件,那么如何解决这个问题呢?

他说找不到,那就在WIB-INF目录下建一个即可.

然后引入自定义的beans.xml即可.

这个时候问题解决.

这里HelloSerlvet中如何获取对应的ApplicationContext呢?

//方法3,使用spring自带的监听器去加载beans.xml        //ApplicationContext applicationContext  = (ApplicationContext) this.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

这个是需要查看源码才能发现其属性名称,所以比较麻烦.这里还有一种较简便的方法,如下所示:

//使用webapplicationcontextutils这个工具类可以很方便的获取ApplicationContext,只需要传入servletContext        ApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext());

第三种方法,基本上配置完毕,但还会感觉很不爽,因为还要新建一个applicationContext.xml去专门import bean.xml,是相当讨厌的.

其实还可以在web.xml中配置自定义的xml文件名称,如下所示:

contextConfigLocation
classpath:beans.xml

 

org.springframework.web.context.ContextLoaderListener中有这样一段说明:

Processes a {@link #CONFIG_LOCATION_PARAM "contextConfigLocation"}* context-param and passes its value to the context instance, parsing it into* potentially multiple file paths which can be separated by any number of* commas and spaces, e.g. "WEB-INF/applicationContext1.xml,* WEB-INF/applicationContext2.xml". Ant-style path patterns are supported as well,* e.g. "WEB-INF/*Context.xml,WEB-INF/spring*.xml" or "WEB-INF/**/*Context.xml".* If not explicitly specified, the context implementation is supposed to use a* default location (with XmlWebApplicationContext: "/WEB-INF/applicationContext.xml").*

可以自定义spring默认加载的xml文件的名称,可以以逗号和空格进行分隔,也可以使用Ant类型的去标记.xml如,WEB-INF/spring*.xml

否则默认的加载的就是applicationContext.xml.

可以在web.xml中进行配置其参数.

所以,最终的web.xml如下:

Archetype Created Web Application
contextConfigLocation
classpath:beans.xml
org.springframework.web.context.ContextLoaderListener

 

5.运行效果

6.本文源码

 

 

 

转载地址:http://kjuto.baihongyu.com/

你可能感兴趣的文章
DNS服务器在域环境中的作用
查看>>
大话IT第十七期:体验Ubuntu 11.10
查看>>
卢松松:谷歌中国的死亡螺旋
查看>>
Photoshop制作一只可爱的卡通小鸟
查看>>
华为5700系列交换机常用配置示例
查看>>
COM本质论 笔记
查看>>
VisualStudio2010扩充插件
查看>>
java.io.IOException:stream closed 异常的原因及处理
查看>>
ACM HDU 1029Ignatius and the Princess IV
查看>>
iOS开发之一些字符串常用的代码
查看>>
Android开发笔记之adb参数指南
查看>>
SQL中sum(),avg()等统计结果为null的解决方法
查看>>
初学Java的几个tips
查看>>
cvDilate
查看>>
android照相及照片上传
查看>>
关于信息隐藏的感想及其它废话
查看>>
RCP学习:Bundle的生命周期
查看>>
现代 C++ 编程指南
查看>>
记录我的旅程8之JavaScript Dom学习笔记
查看>>
.NET中的加密算法总结(自定义加密Helper类续)
查看>>