MyException - 我的异常网
当前位置:我的异常网» 软件架构设计 » javaEE中的spring配置札记

javaEE中的spring配置札记

www.MyException.Cn  网友分享于:2013-09-19  浏览:0次
javaEE中的spring配置笔记

 

0 JavaEE的工程目录

0.1 WebContent

    项目的主目录,在eclipse新建工程时可以自己命名,部署时会把该文件夹的内容发布到tomcat的webapps里。

    该目录下可以建立JS/CSS/JSP文件夹和index.jsp作为用户访问的前端内容。servlet和springMVC会通过所谓的转发器把这里的前端请求转发到后台java去。

    0.1.1 WEB-INF

        (0) WEB-INF文件夹是禁止通过URL访问的

        (1) lib: 放第三方jar包

        (2) classes: 发布时会把编译后的文件放在这里

        (3) web.xml: Web应用程序的部署描述符,项目启动时web容器先读取这个进行一系列的配置。

 0.2 src

    源文件路径,一般存放java源文件。(官网:www.fhadmin.org) 这个路径在eclipse中可以右键-Property-Java Build Path进行更改。比如增加一些放有配置文件的文件夹路径,比如resource/spring.xml。

0.3 build/classes

    这个路径也可以在eclipse中可以右键-Property-Java Build Path进行更改。发布时会把这些文件搬到WebContent/WEB-INF/classes下。

0.4 一般的项目结构

 

1 web.xml

1.1 加载顺序

    web.xml 的加载顺序是: context-param -> listener -> filter -> servlet 。而同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的。

1.2 context-param

 
<!-- 用于设定上下文参数contextConfigLocation,指定spring相关文件的位置 (官网:www.fhadmin.org)-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring.xml </param-value>
</context-param>
<!-- 在此设定的参数,可以在servlet中用getServletContext().getInitParameter("contextConfigLocation ")来取得 -->
 

1.3 listener

 
<!-- 开启spring功能 -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- 防止内存溢出监听器 --> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener>
 

ContextLoaderListener基于Web上下文级别的监听器:在启动服务器时,

(1) 创建上下文对象

(2读取contextConfigLocation参数,加载Spring文件创建Bean并放入上下文对象

(3) 将上下文对象放入ServletContext(就是Java Web的全局变量)中

1.4 filter

 
<!-- 配置字符集过滤器 (官网:www.fhadmin.org)-->
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
    
<!-- 配置项目的编码mapping -->
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
 

 1.5 servlet

 
<!-- 配置spring mvc -->
<servlet>
    <servlet-name>springMvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<!-- 配置spring mvc mapping -->
<servlet-mapping>
    <servlet-name>springMvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
 

load-on-startup 元素在 web 应用启动的时候指定了 servlet 被加载的顺序,它的值必须是一个整数。如果它的值是一个负整数或是这个元素不存在,那么容器会在该 servlet 被调用的时候才加载这个 servlet 。如果值是正整数或零,容器在配置的时候就加载并初始化这个 servlet ,容器必须保证值小的先被加载。

 

DispatcherServlet和ContextLoaderListner

 DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下:

1、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;

2、通过HandlerMapping,将请求映射到处理器,BeanNameUrlHandlerMappingURLBean名字映射。

3、通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器)

4、通过ViewResolver解析逻辑视图名到具体视图实现;InternalResourceViewResolver将逻辑视图名映射为jsp视图。

5、本地化解析;渲染具体的视图等;

6、如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。

DispatchServlet会创建Spring应用上下文,并加载配置文件。(官网:www.fhadmin.org) DispatchServlet加载包含Web组件的bean,如控制器,视图解析器,处理器映射。可自行指定配置文件的位置。ContextLoaderListner加载应用中的其他bean,通常是驱动应用后端的中间层和数据层组件。加载根据上下文参数contextConfigLocation

 

关于WebContextLoaderListenerDispatcherServlet的大致处理可参考下图。

 

3 spring理论知识

3.1 spring核心

Spring框架的核心是Spring容器。容器负责管理应用中组件的生命周期,它会创建这些组件并保证它们的依赖能够得到满足。Spring自带多个容器实现,可以归为两种不同类型。

    bean工厂:最简单的容器,提供基本的DI支持,由org.springframework.beans.factory.beanFactory接口定义。

    应用上下文:基于BeanFactory构建,提供应用框架级别的服务,由org.springframework.context.ApplicationContext接口定义。Spring自带了多种类型的应用上下文。AnnotationConfigWebApplication:从一或多个基于java的配置类中加载Spring Web上下文。XmlWebApplicationContext:(官网:www.fhadmin.org) 从Web应用下的一或多个XML配置文件中加载上下文定义。应用上下文准备就绪后,可以调用上下文的getBean方法从容器中获取bean。   

    

 Spring致力于简化企业级java开发,促进代码的松散耦合。成功的关键在于DI和AOP。DI有助于应用对象之间的解藕,而AOP可以实现横切关注点与它们所影响的对象之间的解藕。

    DI是组装应用对象的一种方式,借助这种方式对象无需知道依赖来自何处或者依赖的实现方式。AOP帮助应用将散落在各处的逻辑汇集于一处,即切面。散布于应用中多处的功能被称为横切关注点,比如日志,安全,缓存,事务管理。通常来讲这些横切关注点从概念上是与应用的业务逻辑相分离的,把它们相分离正是AOP要解决的问题。

    Bean的类型有以下几种。

    单例(Singleton):整个应用,只创建bean的一个实例。
    原型(Prototype):每次注入或通过Spring应用上下文获取时创建新的实例。
    会话(Session):在Web应用中,为每个会话创建一个bean实例
    请求(Request):在Web应用中,为每个请求创建一个bean实例。

 

 3.2  Web中的Spring

Spring通常用来开发Web应用。SpringMVC基于MVC模式实现,能够帮助你构建Spring框架那样灵活和松耦合的Web应用程序。

三层架构:UIL,BLL,DCL(User Interface Layer, Business Logic Layer, Data Control Layer)。这与MVC是不同的。

大多数基于Java的Web框架中,所有请求都会通过一个前端控制器,在Spring MVC中,DispatchServlet就是前端控制器。DispatchServlet会查询处理器映射将请求发送到不同的控制器。Controller完成逻辑处理(委托给service完成),数据信息以model的形式传递

搭建Spring MVC

1:配置DispatchServlet和ContextLoaderListener。(可以在web.xml,也可以在java中配置)

2:启用SpringMVC(可以用XML,也可以用注解)(官网:www.fhadmin.org):启用SpringMVC,启用组件扫描,配置JSP视图解析器,配置静态资源的处理。

3:编写控制器@Controller@RequestMapping:注解映射Url,处理请求,传递model到视图view中,模型数据会作为请求属性放到Request中。

4:Spring MVC的高级技术:其中一个就是文件上传,multipart格式的数据将一个表单拆分为多个部分(part),每个部分对应一个输入域,可以允许某个部分为二进制数据。DispatchServlet没有实现解析multipart数据的功能,它将解析任务委托给MultipartResolver接口的实现。Spring内置了两个实现类,其中一个是CommonsMultipartResolver。Spring提供了MultipartFile接口用于处理multipart数据。表单form中enctype="multipart/form-data"告诉浏览器以multipart数据形式提交表单。

 

3.3  后端中的Spring

Spring的数据访问哲学:Spring的目标之一就是允许我们开发时能遵循OO原则中的“针对接口编程”。Spring对数据访问的支持也不例外,为了避免应用与特定的数据访问策略耦合在一起,编写良好的DAO应该以接口的方式暴露功能。此外,持久化方式的选择独立于DAO。

数据访问模板化:Spring的模板类处理数据访问的固定部分,事务控制,管理资源和处理异常。你只需要关心自己的数据访问逻辑。

配置数据源:通过JDBC驱动程序定义的数据源;连接池的数据源;等等

Spring中使用JDBC(模板):不要求掌握其它框架的查询语言,它是建立在SQL之上的;使用JDBC能够更好地对数据访问的性能进行调优,允许你使用数据库的所有特性;JDBC让我们在更低层次上处理数据。

在Spring中集成Hibernate(ORM工具)
1:org.Hibernate.Session接口提供基本的数据访问功能,如保存,更新,删除以及从数据库加载对象的功能。
2:获取Session对象的标准方式是借助于SessionFactory接口的实现类,它主要负责Session的打开,关闭以及管理。
3:我们要通过Spring的某一个session工厂bean来获取Hibernate SessionFactory。
4:在Spring应用上下文中配置完Session工厂bean后,就可以创建自己的DAO了。通常需要配置数据源,数据库连接属性,扫描包。

 

3.4  Spring集成

消息转换将控制器产生的数据转换为服务于客户端的表述形式。Spring自带了各种各样的转换器,满足了常见的将对象转换为表述的需要。(根据请求头信息转换数据)

需要在控制器方法添加@ResponseBody注解。它告诉DispatchServlet考虑请求头信息,并查找能够为客户端提供所需表述形式的消息转换器。

与之类似,@RequestBody也能告诉Spring查找一个消息转换器,将来自客户端的资源表述转换为对象。

文章评论

程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
鲜为人知的编程真相
鲜为人知的编程真相
一个程序员的时间管理
一个程序员的时间管理
10个调试和排错的小建议
10个调试和排错的小建议
为什么程序员都是夜猫子
为什么程序员都是夜猫子
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
 程序员的样子
程序员的样子
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
我的丈夫是个程序员
我的丈夫是个程序员
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
中美印日四国程序员比较
中美印日四国程序员比较
Java程序员必看电影
Java程序员必看电影
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
总结2014中国互联网十大段子
总结2014中国互联网十大段子
那些争议最大的编程观点
那些争议最大的编程观点
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
程序员和编码员之间的区别
程序员和编码员之间的区别
编程语言是女人
编程语言是女人
每天工作4小时的程序员
每天工作4小时的程序员
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员都该阅读的书
程序员都该阅读的书
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
代码女神横空出世
代码女神横空出世
如何成为一名黑客
如何成为一名黑客
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
旅行,写作,编程
旅行,写作,编程
程序员必看的十大电影
程序员必看的十大电影
老程序员的下场
老程序员的下场
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员的鄙视链
程序员的鄙视链
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有