360SDN.COM

Spring MVC学习心得

来源:单明新公众媒体  2017-09-11 11:25:42    评论:0点击:


最近不知道收到什么刺激,突然想学习JAVA开发,于是乎就进入了一个近乎疯狂的学习模式,但是因为疏于开发一线多年,对编码和架构这件事情还是非常困难的,总算皇天不负有心人,最近有了一点粗浅的认识,记录在这里,权且当做一个学习笔记,还希望各位大牛给予批评指正。

现在网络开发的技术层出不穷,然而试图找到一个好的学习路径并不容易,各种框架,各种语言,各种中间件对开发的要求都不一样,同时前端技术也有了长足的发展,变现形式也更加丰富,这也要求学习者必须学习大量的知识,才能完成入门。

在以前的开发过程中,一般只要精通一门语言,会数据库,基本就都可以解决了。例如Delphi,VB,可以快速开发出优美的,性能高效的应用程序,但是在互联网时代,网络开发,才是主流。网络开发语言包括JAVA、.NET、Python、Ruby、PHP等等,网络架构包括Struts、spring、Hibernate等等,开发工具更是五花八门。前段因为HTML5的兴起,加上bootstrap的加入,css的加强,JSTL库的优化,尤其是HTML5对文件访问的加强,需要掌握的知识越来越多了,我的脑子现在都是一团浆糊,似乎都会了,又似乎什么都干不了。

为了能够有个系统的总结,我决定把这些学习内容记录下来。可能要分成几个部分,今天我只记录spring MVC,关于前段和语言部分,哪天有时间再做总结。


一、什么是spring

Spring无疑是当今最流行的开发架构,他的历史已经很长。是在经过重量级的EJB之后,在Hibernate、Struts在逐渐淡出(只是淡出,也是很优秀的框架)的情况下,被大量的开发者所才有。spring的好处不言而喻,他主要有以下几个模块:

(一)        核心容器core。他是实现IoC的基础,使得对象的依赖关系,在配置文件中生成,不在需要编写大量的代码,软件的灵活性得到了极大地加强。

(二)        应用上下文(context)。提供了大量的例如国际化、验证器、转换器、格式化的支持,还提供了很多企业级服务,例如邮件访问、JNDI等。

(三)        AOP,面向切面(方面)编程。是把一些公共的处理进行抽离,从一个对象的切面渗入到所有的对象中去,而使得对象只关心商业逻辑,一些附属的操作都由框架来完成。例如类似乎MFC的错误码封装、数据库访问、日志处理、资源池、持久化等等。

(四)        JDBC抽象和DAO模块。在一个大型的商业应用中,数据库的访问遍布所有的对象,spring提供了已经封装好的处理方式,只需要关心业务逻辑,甚至不用关心数据库的实现。

(五)        对象关系映射集成模块ORM。对于使用struts和Hibernate、IBATIS SQL的开发者来说,这是一个福音,与微软的EF(实体框架)类似。不过,对于我这个SQL 语句重度依赖患者来说,对于复杂的业务,我还是喜欢用关联查询和关联更新,因此,ORM与JDBC结合,也许是我的最终选择,不过还没有实际应用到项目中,还需要后续验证。

(六)        Spring的web模块。它使web编程变得更加轻量,大部分的页面对象处理,都可以交给框架来处理,其中用的比较多的是过滤器、文件的上传下载等,当然普通的页面逻辑也在此范围。

(七)        Spring的MVC框架,这是整个spring最精彩的地方,他让三层或者N层架构的开发变得如此优雅和自然,你需要在配置文件中实例化servlet,然后只关心你的业务逻辑即可,大量的交互细节交给框架来处理。就好像是你买了一个洗衣机,你只需要把衣服和洗衣液放进去,剩下的就是拿出来穿上,并且它是免费的。

二、spring MVC的学习心得

HTTP协议和Servlet/JSP容器这里就不多说了,属于基础的基础,不过在这次学习中,确实也加强了认识。

(一)Spring框架。Spring框架主要实现的就是DI(依赖注入)和IoC(控制反转),他是自动将一些对象注入到相应的对象,尤其是model对象。实现的方式一种是在代码中使用@autowired注解来实现,但是必须引入org.springFramework.beans.factory.annotation.Autowired,对于程序的移植不利(真的能移植吗?),另外一种方法是spring自动通过构造器或者是seter方式进行依赖注入,两种方式都需要config文件支持。

(二)MVC。MVC是在传统的,基于页面之间简单跳转的模式的重大改良。首先在开发模式上,就能实现不同的工种在开发的前后端的分工协作,在访问上,也解决了安全性的问题。

MVC是指(Model、View、Controller)。Model层用来进行业务的处理(一组java bean),Controller实现调度,View成为客户端的容器。一般只需要在上下文的部署描述符中描述servlet的映射即可实现对java bean的调用和对视图的派发,servlet就是一个大将军。他可以再派多个几个controller来具体实现相应的业务分类,这种方式叫做解耦,也就是专业的事情专业的做法。

(三)springMVC介绍

应用程序不用自己建立Dispatcher servlet,而是使用spring MVC框架的,只需要指定一个配置文件即可。配置文件用来配置校验器、转换器、格式化、国际化等。如果再配置一个视图解析器,那么,Dispatcher servlet只需要知道视图名称字符串即可实现视图的派发。相应的javabean只需要在配置文件中进行指出即可,更先进的方法就是使用基于注解的控制器。

(四)基于注解的控制器

基于注解的控制器可以处理多个动作(action),这可以使相同的业务在同一个控制器中进行处理。基于注解的控制器不需要在配置文件中生命动作对应的bean,也使得程序的安全性得到了更大的保障。

1、@Controller注解,声明是一个控制器类。为了节省应用程序扫描控制器的时间,一般在spring MVC的配置文件中加入<context:component-scanbase-package=basepackage/>

2、@RequestMapping(value=“”)声明一个动作对应的方法或者是类。映射到类的一般是为了限定具体方法的范围,在方位的时候一般采用/Method/action的方式。在spring MVC中,各种请求的处理方法中可以出现的参数类型特别重要,特别是Model,他是在进行调用时,spring MVC进行创建并注入到各种对象的MAP。

3、@Autowired 显式注入一个对象,例如注入一个服务,之后,spring就会自动注入,无需再初始化。

4、@Service 声明一个服务,这也是处理某些业务逻辑进行解耦Controller的主要方式。

5、重定向和flash属性。

重定向可以避免重复加载页面,但是传值变得困难。Spring3.1以后,可以通过flash属性进行传值。RedirectAttributes属性注入即可。

6、请求参数@RequestParam和路径变量@PathVariable。使用路径变量有时浏览器会默认为是上下文,所以,还需要引入JSTL标记,从而保证正确的URL。因此,尽量不建议使用路径变量。

7、@ModelAttribute注释的方法,每次控制器类被调用时都会被调用。标注的对象,在方法被调用时自动加到Model中。

(五)数据绑定和表单标签

有了数据绑定以后,form(表单)中的数据区域的一个标签,就可以与model中的一个对象的属性绑定,在输入和输出中都不需要单独处理,这时候就需要在文档类型前面引入<%@taglib uri=http://java.sun.com/jsp/jstl/coreprefix=c%>.这是引入标准标签库的核心库,如果要引入spring的标签库,%@tagliburi=http://www.springFramework.org/tags/form prefix=form%,就可以使用spring表单标签库的强大功能了。

(六)转换器和格式化

转换器(Converter)和格式化(Formatter)都是将数据进行转换和格式化的,但是不同的人理解不同,converter可能更加通用一些。

(七)验证器Validator

Spring有一个org.springframework.validation.validationUtils的验证器类,可以直接使用静态方法进行验证。另外一种验证器是JSR303的validation,因为是JAVAvia标准,所以更好用,只是JSR303需要注解。新的项目建议使用JSR303验证器。验证器的属性文件很重要,要提前编辑。

(八)JSP的表达式语言(EL)和JSP的标准标签库(JSTL)

JSP表达式语言(EL)使得访问存储在JavaBean中的数据变得非常简单。JSP EL既可以用来创建算术表达式也可以用来创建逻辑表达式其基本方式是${Expression}.他不能访问JSP的隐含对象,但是可以访问自己的隐含对象,基本可以和JSP的隐含对象一一映射,例如pagecontext、cookie,initParam等,基本语法与js类似,在访问从Controller返回的model对象,特别有用。要使EL起作用,isELIgnored一定要设为True。

JSTL是专门针对JSP设计的,在javax.servlet.jsp.jstl中,需要单独下载和声明。JSTL共有5个区域,分别是core(核心),xml,fmt(国际化),SQL、fn(函数),有了这些标签,一些小型的应用是可以通过JSP直接开发的。在jsp页面之前只需要声明<%taglib url=http://java.sun.com/jsp/jstl/coreprefix=c>即可引入JSTL核心库。语言类型有点类似于VBScript,与JAVA的语法不像。

有了JSTL,JSP本身更像一门语言,加上EL可以访问对象,配合起来还是不错的,只是安全性不知道咋样。

(九)国际化

Spring是国际化变得非常的简单,通过简单的配置,就可以发布多国版本的应用。

首先在spring MVC配置文件中配置一个java bean,指定是reloadableResourceBundMessageSource的bean,并指定消息文件和标签文件的位置,bean就会到指定的位置去找到key和value。解析器尽量使用AcceptHeaderLocalResolver,这样在头文件的声明就会被应用程序获得。

其次,在jsp中的头文件中,使用spring的标签<%@taglib prefix=springuri=http://www.springframework.org/tags,需要显示的地方使用message:code的地方,就会翻译成本地语言。

在浏览器中更改语言首选项或者是在JSP页面的文件头中修改accept-language,就会得到相应的效果。

(十)文件上传和下载

Servlet3.0以前版本文件的上传一直以来需要依靠apache commons支持的commons FileUpload才能正常工作(可以免费下载)。在spring提供了MultipartFile bean,可以实现文件上传工作的控制,只需要在MVC配置文件进行配置即可,包括bean和解析器。

Servlet3.0以后,就不需要FIleUpload元件了,容器中提供了javax.servlet.http.part用于处理文件的上传,但是servlet必须进行@multipartconfig标注。然而spring MVC的servlet是不能标注的,所以,只能在web.xml中加入<multipart-config>章节,实现对DipatcherServlet的标注,在mvc配置文件中,对应的也要把解析器从commonsMultiPartResolver改为standardServletMultiPartResolver。

但实际上,这两种解决方案都不好,客户端无法知道文件上传的进度,要想有进度,需要大量的交互或者是第三方解决。HTML5的DOM中添加了File API,实现了客户端你的文件上传,简单而明晰。

文件的下载,除了防止交叉引用而隐藏资源以外,没有什么难点,如果不是为了防止交叉引用,超链接即可实现下载。

阅读原文

为您推荐

友情链接 |九搜汽车网 |手机ok生活信息网|ok生活信息网|ok微生活
 Powered by www.360SDN.COM   京ICP备11022651号-4 © 2012-2016 版权