本来想写成读书笔记的,结果还是变成翻译,谨作记录,学习。
1.HTML -- 见我前面文章
2.Internet 了解 http 请求和响应的循环 --- 见我前面文章
3.java
Reflection 和 Introspection
反射和内省
内省(IntroSpector)是Java语言对JavaBean 类属性、事件的一种缺省处理方法。
例如类A中有属性name, 那我们可以通过getName,setName 来得到其值或者设置新的值。
通过getName/setName 来访问name属性,这就是默认的规则。
Java中提供了一套API 用来访问某个属性的getter/setter方法,通过这些API 可以使你不需要了解这个规则,这些API存放于包java.beans 中。
一般的做法是通过类Introspector的getBeanInfo方法获取某个对象的BeanInfo 信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后我们就可以通过反射机制来调用这些方法。
反射是一个决定在一个对象中什么成员域和方法是可用的。而内省是一种特殊的反射,它被用在JavaBean Api中。
Struct 使用内省来转换HTTP参数为javaBean 特性并且从javaBean中产生HTML字段。
Properties Files and ResourceBundles
java程序包括网络程序,常常需要配置Properties文件。
Java ResourceBundles 使用更多的Properties文件来提供国际化的信息。
ResourceBundles介绍:
JavaScript, AJAX, and SOAP
JavaScript AJAX 都是一些还不错的前端技术
SOAP可以平衡请求/响应循环。使用它,一个应用可以访问数据,处理业务逻辑。SOAP和AJAX应该有很好的结合。
SOAP:https://en.wikipedia.org/wiki/SOAP 一个特殊的应用层协议。是工作在HTTP或者SMTP之上的协议,使用XML来表示信息。
Servlets, Filters, and Web Containers
因为java是面向对象的语言,java Servlet 用来将http转为面向对象的形式。这样让开发者可以专注于它们应用开发需要的事情。
一个java-aware http server 可以传递一个请求到一个servlet 容器,这个容器可以实现请求或者它可以将请求传回给HTTP服务器。容器通过查找他的servlet列表来决定是否可以处理请求。如果有servlet是为这个请求注册的,就传递这个请求到servlet。
容器需要管理servlet的生命周期,容器创造,调用,并且最终有servlet。
Filters 让你组装一系列的组件来 处理一个请求或者回应。过滤器集中在一个链上,这样每一个过滤器都有机会处理请求或者回应。
来 写下我目前的理解:servlet是在container的,container接收到请求后,通过注册列表来确定是否有对应的servlet可以处理,而servlet可以对请求进行处理。最后就是过滤器,过滤器可以在处理请求过程中对它们做一些处理,但是不太清楚和servlet 的差别。过滤器可以有多个,而servlet 只能有一个。感觉入侵性更小些。
Sessions
HTTP一个很重要的特点是无状态的。这样是没有机制来分辨HTTP是一个同一个用户的下一个请求。这样让想要构建一个应用可以和用户对话有多个请求有些困难。
为此,servlet API通过了一个编程的概念,叫做 session,表示一个对象实现了 javax.servlet.http.HttpSession 接口
containter 会使用两个技术之一(cookies 或者 URL重写)来保证同一个用户的下一个请求将会包括session id 对这次会话来说,这样这个状态信息将会保存在session中和多个请求关联。状态信息将会保存在session 属性( session attributes,在JSP中叫做:session scope beans)
为了防止当用户不能完成一次交互时无期限的占用资源,session配置了超时时间。如果两个请求时间间隔超过了超时时间,这个session就会被删除。
知道Session 数据常常保存在RAM内存是很重要的。取决于你的容器,你也许有不同的方式来避过它。
Web Applications
网页应用,就像一个HTTP服务器可以被用来作为不同的网页的主机,一个servlet容器也可以用来包含多个网站应用。Java Servlet 平台提供一个很好定义的机制用来组织并且部署网页应用。一个应用可以被组装称为一个 Web Application Archive, 或者 WAR file。单个war可以被上传,并且自动部署。
你需要知道你怎么产生一个war文件,并且如何部署。也许需要一些构建工具的知识,比如:Maven:http://maven.apache.org/ 以及一些你服务器容器的阅读文档。
Security
在应用程序部署描述符中可以配置的是 容器管理安全。声明安全可以用来保护请求的URI要满足一定的模式。实用安全可以根据当天的时间,调用的参数,或者这个应用的组件的状态用来微调安全作授权决定。它也可以被用来限制授权根据数据库中的信息。
有一些项目,比如Apache Shiro 或者 Spring Security 可以帮助你保护你的应用。
JavaServer Pages, JSP Tag Libraries, and JavaServer Faces
如果你需要编写一个标准的网页应用,你也许需要一个视图组件。一种就是JSP。http://www.oracle.com/technetwork/java/javaee/jsp/index.html
或者也可以是Velocity 或者 Freemarker,都是structs 支持的。
所有相同的是你要从编写HTML开始同时增加动态的特性使用JSP标签。不太推荐在JSP中使用java。JSTL和 Unified expression language 是推荐的。
http://www.oracle.com/technetwork/java/index-jsp-135995.html这也就是说,你可以轻松的从你的视图来访问你的数据并且合适的展示它。如果你想要使用一个更加现代的方式,也许你会喜欢返回json,通常用来给AJAX作为展示页面。
提到了一些前端的技术,我也还是列出来吧,如果也许我会去看了:
Extensible Markup Language (XML)
可扩展标记语言
这个框架提供的特性常常依赖于很多的对象,那些对象又的时候是通过一个由xml编写的配置文件来部署的。XML同样也可以部署java 应用程序。
幸运的是 Struct2将对XML的需求降低到0,如果你需要使用到它,可以查看: Convention plugin.
Model View Controller (MVC)
基于JSP的网页应用有时会混合数据库代码,页面设计代码,流程控制代码。实践中,我们发现除非这些被分离,否则大型的应用会很难被维护。使用MVC架构可以分离这些问题。Model代表业务或者数据库代码。View代表页面设计代码,Controller代表导航的代码。
MVC这个单词来源于 SmallTalk Model-View-Controller 框架。在SmallTalk MVC中,View根据Model来更新通过观察中模式。原始的MVC模式就像一个封闭的循环,View和Controller 交谈,Controller和Model交谈,Model和View 交谈。
但是模式和页面的直接联系对于网页应用并不实际,我们修改传统的MVC模式让他看起来少点像一个循环,而更像Controller是在中间的地位。
在MVC/Model2设计模式中,应用流是通过一个中心的控制器调解的。这个控制器委托请求到一个合适的handler中。这个handler和一个模式绑定,然后每一个handler扮演一个请求和model之间的适配器。Model代表或者扮演一个应用的商业逻辑或者状态。通常控制会通过Controller传回给合适的页面。流向可以通过咨询一系列的mapping通常是从数据库或者配置文件载入的来确定流向。这个提供一个视图和模型之间很宽松的连接,可以使应用便于维护和创造。
由于MVC是一个便利的范式,很多工作者发现这个也许还有大于三层。比如,在Model层中,常常有独立的业务逻辑层和数据访问层。
这个框架提供控制层给Model2 网页应用。开发者常常使用这一层和其他的标准的技术来构建业务,数据和永久层。
更多关于MVC的事情可以查看:
Business Logic Frameworks
商业逻辑框架
很多团队在POJOs(plain old JavaBeans )构建它们自己的商业逻辑层。所以商业层框架开始出现,包括:- Spring
- Google Guice
- Commons Chain of Responsiblity
- or you can rely on features of the bundled Struts XWork
Data Access Frameworks
数据访问框架
大多数时候,业务层和数据访问层分离,有的团队会开发它们自己的数据访问对象,但是很多的团队转向使用下面的数据访问框架。一些流行的数据访问框架如下:
- Apache Cayenne
- Enterprise Java Beans
- Hibernate
- myBATIS —— 这个看起来就是我用的。