异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
C语言接口与实现:创建可重用软件的技术 如今的程序员忙于应付大量关于API(Application Programming Interface)的信息。但是,大多数程序员都会在其所写的几乎每一个应用程序中使用API并实现API的库,只有少数程序员会创建或发布新的能广泛应用的API。
本节书摘来自异步社区《Clojure程序设计》一书中的导读,作者 【美】Stuart Halloway , Aaron Bedra,更多章节内容可以访问云栖社区“异步社区”公众号查看
尽管在很多场景下通过组件扫描和自动装配实现Spring的自动化配置是更为推荐的方式,但有时候自动化配置的方案行不通,因此需要明确配置Spring。比如说,你想要将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加@Component和@Autowired注解的,因此就不能使用自动化装配的方案了。
和CompactDisc接口一样,SgtPeppers的具体内容并不重要。你需要注意的就是SgtPeppers类上使用了@Component注解。这个简单的注解表明该类会作为组件类,并告知Spring要为这个类创建bean。
这方面,并没有唯一的正确答案。你所做出的选择必须要适合你和你的项目。而且,谁说我们只能选择其中的一种方案呢?Spring的配置风格是可以互相搭配的,所以你可以选择使用XML装配一些bean,使用Spring基于Java的配置(JavaConfig)来装配另一些bean,而将剩余的bean让Spring去自动发现。
在本章,我们先体验了Spring的DI。DI是组装应用对象的一种方式,借助这种方式对象无需知道依赖来自何处或者依赖的实现方式。不同于自己获取依赖对象,对象会在运行期赋予它们所依赖的对象。依赖对象通常会通过接口了解所注入的对象,这样的话就能确保低耦合。
当本书的第3版交付印刷的时候,当时Spring的最新版本是3.0.5。那大约是在3年前,从那时到现在发生了很多的变化。Spring框架经历了3个重要的发布版本——3.1、3.2以及现在的4.0——每个版本都带来了新的特性和增强,以简化应用程序的研发。
当谈论Spring时,其实它远远超出我们的想象。事实上,Spring远不是Spring框架所下载的那些。如果仅仅停留在核心的Spring框架层面,我们将错过Spring Portfolio所提供的巨额财富。
Spring容器并不是只有一个。Spring自带了多个容器实现,可以归为两种不同的类型。bean工厂(由org.springframework.beans.factory.BeanFactory接口定义)是最简单的容器,提供基本的DI支持。
在Java近20年的历史中,它经历过很好的时代,也经历过饱受诟病的时代。尽管有很多粗糙的地方,如applet、企业级JavaBean(Enterprise JavaBean,EJB)、Java数据对象(Java Data Object,JDO)以及无数的日志框架,但是作为一个平台,Java的历史是丰富多彩的,有很多的企业级软件都是基于这个平台构建的。
Java Servlet技术简称Servlet技术,是Java开发Web应用的底层技术。由Sun公司于1996年发布,用来代替CGI——当时生成Web动态内容的主流技术。CGI技术的主要问题是每个Web请求都需要新启动一个进程来处理。创建进程会消耗不少CPU周期,导致难以编写可扩展的CGI程序。
本章中,你已经学习了会话管理的概念以及4种会话管理技术,URL重写和隐藏域是轻量级的会话跟踪技术,适用于那些仅跨少量页面的数据。而cookies和HttpSession对象,更加灵活但也有限制,尤其是在应用HttpSession时会消耗服务器内存。
没有参数的getSession方法会返回当前的HttpSession,若当前没有,则创建一个返回。getSession(false)返回当前HttpSession,如当前存在,则返回null。getSession(true)返回当前HttpSession,若当前没有,则创建一个getSession(true)同getSession()一致。
Cookies是一个很少的信息片段,可自动地在浏览器和Web服务器间交互,因此cookies可存储在多个页面间传递的信息。Cookie作为HTTP header的一部分,其传输由HTTP协议控制。此外,你可以控制cookies的有效时间。浏览器通常支持每个网站高达20个cookies。
使用隐藏域来保持状态类似于URL重写技术,但不是将值附加到URL上,而是放到HTML表单的隐藏域中。当表单提交时,隐藏域的值也同时提交到服务器端。隐藏域技术仅当网页有表单时有效。该技术相对于URL重写的优势在于:没有字符数限制,同时无须额外的编码。但该技术同URL重写一样,不适合跨越多个界面。
清单2.1中的Top10Servlet类会显示最受游客青睐的10个伦敦和巴黎的景点。信息分成两页展示,第一页展示指定城市的5个景点,第二页展示另外5个。该Servlet使用URL重写来记录所选择的城市和页数。该类扩展自HttpServlet,并通过/top10访问。
Servlet技术是Java EE技术的一部分。所有Servlet都运行在Servlet容器中,容器和Servlet间的接口为javax.servlet.Servlet。javax.servlet包还提供了一个名为GenericServlet的Servlet实现类,该类是一个辅助类,以便可以方便的创建一个servlet。
使用部署描述符有诸多好处。其一,可以将在@WebServlet中没有对等元素的元素,如load-on-startup元素。这个元素使得Servlet在应用程序启动时加载,而不是在第一次调用时加载。如果Servlet的init方法需要花一些时间才能完成的话,使用load-on-startup意味着第一次调用Servlet所花的时间并不比后续的调用长,这项功能就特别有用。
复选框比较奇特。核查过的复选框会发送字符串“on”到服务器。未经核查的复选框则不向服务器发送任何内容,ServletRequest.getParameter(fieldName)返回null。
不说全部,至少大多数应用程序都要与HTTP结合起来使用。这意味着可以利用HTTP提供的特性。javax.servlet.http包是Servlet API中的第二个包,其中包含了用于编写Servlet应用程序的类和接口。
前面的例子中展示了如何通过实现Servlet接口来编写Servlet。但你注意到没有?它们必须给Servlet中的所有方法都提供实现,即便其中有一些根本就没有包含任何代码。此外,还需要将ServletConfig对象保存到类级变量中。
ServletContext表示Servlet应用程序。每个Web应用程序只有一个上下文。在将一个应用程序同时部署到多个容器的分布式环境中,每台Java虚拟机上的Web应用都会有一个ServletContext对象。
当Servlet容器初始化Servlet时,Servlet容器会给Servlet的init方法传入一个ServletConfig。ServletConfig封装可以通过@WebServlet或者部署描述符传给Servlet的配置信息。
在发送任何HTML标签前,应该先调用setContentType方法,设置响应的内容类型,并将“text/html”作为一个参数传入。这是在告诉浏览器,内容类型为HTML。在没有内容类型的情况下,大多数浏览器会默认将响应渲染成HTML。
getParameter是在ServletRequest中最常用的方法。该方法通常用于返回HTML表单域的值。在本章后续的“处理表单”小节中,将会学到如何获取表单值。
其实,编写Servlet应用程序出奇简单。只需要创建一个目录结构,并把Servlet类放在某个目录下。本节将教你如何编写一个名为app01a的Servlet应用程序。最初,它会包含一个Servlet,即MyServlet,其效果是向用户发出一条问候。
getServletConfig,这个方法会返回由Servlet容器传给init方法的ServletConfig。但是,为了让getServletConfig返回一个非null值,必须将传给init方法的ServletConfig赋给一个类级变量。
用户请求致使Servlet容器调用Servlet的Service方法,并传入一个ServletRequest实例和一个ServletResponse实例。ServletRequest中封装了当前的HTTP请求,因此,Servlet开发人员不必解析和操作原始的HTTP数据。
直到现在,这些对于Java开发人员来说都非常遥远和复杂。随着Spring Boot的诞生和云平台的平民化,我们可以在有限的时间内创建精彩的应用并让所有的人来访问,而这个过程不需要花一分钱。
在本章中,我们学习了如何实现良好的MVC架构,看到了Spring MVC内部的一些运行机制,并通过非常少量的配置使用了Spring Social Twitter的功能。通过使用WebJars,可以设计非常漂亮的Web应用。
本节书摘来自异步社区《精通Spring MVC 4》一书中的第2章,第2.10节,作者:【美】Geoffroy Warin著,更多章节内容可以访问云栖社区“异步社区”公众号查看
在Java Web应用中,Redirect/Forward是典型的可选方案。它们都会改变展现给用户的视图,其中的区别在于Redirect会发送一个302头信息,它会在浏览器内部触发导航,而Forward则不会导致URL的变化。
可能你对lambda还不太了解,在Java 8中,每个集合都会有一个默认的方法stream(),它能够实现函数式风格的操作。这些操作可以是中间操作(intermediate_operation),它会返回一个流,这样就能将其连接起来,也可以是终止操作(terminal operation),这样的话会返回一个值。
当然,如果搜索没有得到任何结果的话,这段蹩脚的代码将会因为ArrayOutOfBoundException异常而导致失败。因此,可以抓紧发一条Tweet来解决这个问题!注意,我们在这里使用了Java 8的流来收集Tweet的信息。
从请求参数中获取数据我们已经能够在视图中展现来自服务端的数据,但是,如果想获取用户的输入该怎么办呢?根据HTTP协议,有很多方式可以实现这一点,其中最简单的就是传递查询参数到URL之中。
让我们从这个新的“Hello World”页面后退一步,尝试去理解在这个Web应用中到底发生了什么。为了做到这一点,需要跟踪浏览器所发送的HTTP请求的行程以及它是如何从服务器端得到响应的。
对于Web设计人员来说,Thymeleaf有一项很大的优势,那就是在服务器没有运行的时候,模板中所有的动态内容都可以采用一个默认值。资源URL可以采用相对的路径来指定,每个标签都可以包含占位符。在前面的样例里面,如果是在应用的上下文中,那么文本“Hello html”将不会显示,但是如果直接在Web浏览器中打开这个文件的话,那么它就会显示了。
在Spring MVC中,模型是由Spring MVC的Model或ModelAndView封装的简单Map。它可以来源于数据库、文件、外部服务等,这取决于你如何获取数据并将其放到模型中。与数据层进行交互的推荐方式是使用Spring Data库:Spring Data JPA、Spring Data MongoDB等。
DDD所涉及的内容远不止上述的规则:实体(Entity)、值类型(value type)、通用语言(Ubiquitous Language)、限界上下文(Bounded Context)、洋葱架构(Onion Architecture)以及防腐化层(anti corruption layer),我强烈建议你自行学习一下这些原则。
大多数人对MVC这个缩写应该不会感到陌生。它代表的是模型(Model)、视图(View)和控制器(Controller),它会将数据和展现层进行解耦,被视为构建用户界面的一种很流行的方式。
我们现在已经有了一个非常简陋的Spring Web应用,虽然我们没有对其进行什么配置,但是它可以输出RESTful JSON的“Hello world”。我们已经看到过Spring Boot做了什么、是如何实现的,也了解到如何重写默认的自动配置。
可以将Spring Boot与Tomcat、tc-server、Jetty或者Undertow结合使用。服务器可以很容易地进行替换,只需将spring-boot-starter-tomcat JAR依赖移除掉,并将其替换为Jetty或Undertow对应的依赖即可。
至于转码的问题,非常简单的HttpEncodingAutoConfiguration将会负责处理相关的事宜,这是通过提供Spring的CharacterEncodingFilter类来实现的。通过spring.http.encoding.charset配置,我们可以覆盖默认的编码(“UTF-8”),也可以通过spring.http.encoding.enabled禁用这项配置。
一般会通过@Order注解来声明优先等级,可以看到DispatcherServletAutoConfiguration需要优先进行配置; 其中也可以包含一些提示信息,如@AutoConfigureAfter或@AutoConfigureBefore,从而进一步细化配置处理的顺序; 它还支持在特定的条件下启用某项功能。
如果你还不熟悉Gradle的话,那么可以将其视为Maven的继任者,它是一个现代化的构建工具。与Maven类似,它会使用约定,例如如何组织Java应用的结构。我们的源码依然会放在“src/main/java”之中,Web应用的代码放到“src/main/webapp”之中,诸如此类。
本节书摘来自异步社区《深入理解Scala》一书中的导读,作者[美]Josh Suereth,更多章节内容可以访问云栖社区“异步社区”公众号查看
本节书摘来自异步社区《精通Spring MVC 4》一书中的第1章,第1.4节,作者:【美】Geoffroy Warin著,更多章节内容可以访问云栖社区“异步社区”公众号查看
在这里所看到的配置选项与STS中是相同的,点击“Generate Project”按钮后将会下载一个ZIP文件,这个文件中会包含我们的Stater项目。
IntelliJ IDEA是在Java开发人员中非常流行的一个工具。在过去的几年中,因为这个很棒的编辑器,我非常心甘情愿地为Jetbrains支付了年费。
为Web应用生成一个JAR文件?将Web应用打包为JAR文件,这一点你们可能会觉得有些诡异。尽管仍然可以将其打包为WAR,但这并不是推荐的实践。在默认情况下,Spring Boot将会创建一个胖JAR包(fat JAR),这个JAR包中包含了应用所有的依赖,提供了通过“java-jar”命令便捷启动Web应用的方法。