Hibernate

load与get

load(Object, Serializable):根据id查询 。查询返回的是代理对象,不会立刻访问数据库,是懒加载的。当真正去使用对象的时候才会访问数据库。
load()的时候会发现不会打印出查询语句,而使用get()的时候会打印出查询语句。
使用load()时如果在session关闭之后再查询此对象,会报异常:could not initialize proxy – no Session。处理办法:在session关闭之前初始化一下查询出来的对象:Hibernate.initialize(entity);

load()默认支持延迟加载,在用到对象中的其他属性数 据时才查询数据库,但是万一数据库中不存在该记录,只能抛异常ObjectNotFoundException;所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理。
get()先在一级缓存找,没有就去二级缓存找,再没有就去数据库找,最后若没有就返回null ;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

JSP

使用jstl
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

jsp界面的$通常不嵌套
jstl的字符串拼接不需要+,直接让多个$相邻即可。

标签及函数使用示例:

${fn:substring(image.path,7,pathLength)}
‘${sub}’,${strArray}

jsp页面中jstl标签详解
http://blog.csdn.net/justjackwang/article/details/8804528

在java领域,表现层技术主要有三种:jsp、freemarker、velocity。

jsp是大家最熟悉的技术
优点:
1、功能强大,可以写java代码
2、支持jsp标签(jsp tag)
3、支持表达式语言(el)
4、官方标准,用户群广,丰富的第三方jsp标签库
5、性能良好。jsp编译成class文件执行,有很好的性能表现
缺点:
jsp没有明显缺点,非要挑点骨头那就是,由于可以编写java代码,如使用不当容易破坏mvc结构。

velocity是较早出现的用于代替jsp的模板语言
优点:
1、不能编写java代码,可以实现严格的mvc分离
2、性能良好,据说比jsp性能还要好些
3、使用表达式语言,据说jsp的表达式语言就是学velocity的
缺点:
1、不是官方标准
2、用户群体和第三方标签库没有jsp多。
3、对jsp标签支持不够好

freemarker
优点:
1、不能编写java代码,可以实现严格的mvc分离
2、性能非常不错
3、对jsp标签支持良好
4、内置大量常用功能,使用非常方便
5、宏定义(类似jsp标签)非常方便
6、使用表达式语言
缺点:
1、不是官方标准
2、用户群体和第三方标签库没有jsp多

选择freemarker的原因:
1、性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差(虽然只是几毫秒到十几毫秒的差距)。但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tag和el的jsp好。
2、宏定义比jsp tag方便
3、内置大量常用功能。比如html过滤,日期金额格式化等等,使用非常方便
4、支持jsp标签
5、可以实现严格的mvc分离

Servlet

Servlet容器默认采用单实例多线程的方式来处理所有请求,这样减少产生Servlet实例的开销,提升了对请求的响应时间。对于Tomcat可以在server.xml中通过元素设置线程池中线程的数目。
servlet中的init方法只有在启动(例如web容器启动,要看loadOnStartup的设置)的时候调用,也就是只初始化一次,这就是单实例。
servlet在处理请求的时候调用的是service方法。

动态网页的技术进化

1.在程序中输出html:最早实现动态网页的方法是使用Perl和CGI。在Perl程序中输出HTML内容,由HTTP服务器调用Perl程序,将结果返回给客户端。这种方式在互联网刚兴起的20世纪90年代非常流行。但问题在于如果HTML内容比较多,维护非常不方便。
2.以模板为中心的架构:大概在2000年左右,以ASP、PHP、JSP 的为代表的以模板为基础的语言出现了,这种语言的使用方法与CGI相反,是在以HTML为主的模板中插入程序代码。这种方式在2002年前后非常流行,但它的问题是页面和程序辑紧密耦合,任何一个网站规模变大以后,都会遇到结构混乱,难以处理的问题。
3.MVC架构:为了解决这种问题,以MVC架构为基础的平台逐渐兴起, Ruby on Rails、Django、Zend Framework 都是基于 MVC 架构。

web服务端

Session又称为会话状态,用于维护和当前浏览器实例相关的一些信息。举例来说,我们可以把已登录用户的用户名放在Session中,这样就能通过判断Session中的某个Key来判断用户是否登录,如果登录的话用户名又是多少。
Session对于每一个客户端(或者说浏览器实例)是“人手一份”,用户首次与Web服务器建立连接的时候,服务器会给用户分发一个SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端。

搭建SpringMVC开发环境

下载安装jdk,maven,
eclipse(Eclipse Java EE IDE for Web Developers.Version: Mars.2 Release (4.5.2)Build id: 20160218-0600)
http://www.oracle.com/
http://maven.apache.org/

解压maven后,新建环境变量MAVEN_HOME,在PATH里加入maven的bin的路径。
配置完成,可打开命令行,输入mvn -v,测试。
http://dead-knight.iteye.com/blog/1841658

在mac os中配置maven
http://www.jianshu.com/p/191685a33786

下载Spring
http://repo.spring.io/libs-release-local/org/springframework/spring/

在创建maven项目过程中,Select an Archetype时选择maven-archetype-webapp
下一步中Artifact id是工程的名字,Group id是组织的名字,packge可手动置空。
src/main/java是源代码目录
src/main/resources是项目配置目录
src/test/java是测试源代码目录
src/test/resources是测试配置目录
它们都应该出现在java build path中。
由于项目打包、发布时不需要测试代码、测试的配置文件、以及运行时产生的额外文件(target),所以配置web目录也就是Deployment Assembly,不需要src/test及target路径下的内容。

如果报Could not resolve archetype org.apache.maven.archetypes:maven-archetype-webapp
则可能是网络有问题下载地址不能正常访问,等待网络正常。
如果下载一闪而过,而转到这个目录 /Users/admin/.m2/repository/org/apache/maven/archetypes/maven-archetype-webapp,查看其中的内容可能未下载完全,则删除这个目录。
http://blog.csdn.net/afgasdg/article/details/12757433

http://www.iteye.com/topic/973166
http://www.itnose.net/detail/6098368.html

http://www.admin10000.com/document/6436.html
http://blog.csdn.net/clj198606061111/article/details/20492887

jsp文件放到WEB-INFO中可以使其不被直接访问到,WEB-INF是Java的WEB应用的安全目录,客户端无法访问,只有服务端可以访问。如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。

如果报javax.http.servlet找不到,是因国还没有添加Server runtime,在Jararva Build Path/Library中点击add library,选择server runtime…

Spring3.1新特性

Spring2.5之前是通过实现Controller接口或其实现来定义处理器类。
Spring2.5引入注解式处理器支持,通过@Controller 和 @RequestMapping注解定义处理器类,并且提供了一组强大的注解:
需要通过处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter来开启支持@Controller 和 @RequestMapping注解的处理器。
@Controller:用于标识是处理器类;
@RequestMapping:请求到处理器功能方法的映射规则;
@RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定;
@ModelAttribute:请求参数到命令对象的绑定;
@SessionAttributes:用于声明session级别存储的属性,放置在处理器类上,通常列出模型属性(如@ModelAttribute)对应的名称,则这些属性会透明的保存到session中;
@InitBinder:自定义数据绑定注册支持,用于将请求参数转换到命令对象属性的对应类型;
Spring3.0引入RESTful架构风格支持(通过@PathVariable注解和一些其他特性支持),并且又引入了更多的注解支持:
@CookieValue:cookie数据到处理器功能处理方法的方法参数上的绑定;
@RequestHeader:请求头(header)数据到处理器功能处理方法的方法参数上的绑定;
@RequestBody:请求的body体的绑定(通过HttpMessageConverter进行类型转换);
@ResponseBody:处理器功能处理方法的返回值作为响应体(通过HttpMessageConverter进行类型转换);
@ResponseStatus:定义处理器功能处理方法/异常处理器返回的状态码和原因;
@ExceptionHandler:注解式声明异常处理器;
@PathVariable:请求URI中的模板变量部分到处理器功能处理方法的方法参数上的绑定,从而支持RESTful架构风格的URI;
还有比如:
JSR-303验证框架的无缝支持(通过@Valid注解定义验证元数据);
使用Spring 3开始的ConversionService进行类型转换(PropertyEditor依然有效),支持使用@NumberFormat 和 @DateTimeFormat来进行数字和日期的格式化;
HttpMessageConverter(Http输入/输出转换器,比如JSON、XML等的数据输出转换器);
ContentNegotiatingViewResolver,内容协商视图解析器,它还是视图解析器,只是它支持根据请求信息将同一模型数据以不同的视图方式展示(如json、xml、html等),RESTful架构风格中很重要的概念(同一资源,多种表现形式);
Spring3 引入 一个 mvc XML的命名空间用于支持mvc配置,包括如:

自动注册基于注解风格的处理器需要的DefaultAnnotationHandlerMapping、AnnotationMethodHandlerAdapter
支持Spring3的ConversionService自动注册
支持JSR-303验证框架的自动探测并注册(只需把JSR-303实现放置到classpath)
自动注册相应的HttpMessageConverter(用于支持@RequestBody 和 @ResponseBody)(如XML输入输出转换器(只需将JAXP实现放置到classpath)、JSON输入输出转换器(只需将Jackson实现放置到classpath))等。
:注册自定义的处理器拦截器;
:和ParameterizableViewController类似,收到相应请求后直接选择相应的视图;
:逻辑静态资源路径到物理静态资源路径的支持;
:当在web.xml 中DispatcherServlet使用/ 映射时,能映射静态资源(当Spring Web MVC框架没有处理请求对应的控制器时(如一些静态资源),转交给默认的Servlet来响应静态文件,否则报404找不到资源错误,)。
Spring3.1新特性:
对Servlet 3.0的全面支持。
@EnableWebMvc:用于在基于Java类定义Bean配置中开启MVC支持,和XML中的功能一样;
新的@Contoller和@RequestMapping注解支持类:处理器映射RequestMappingHandlerMapping 和 处理器适配器RequestMappingHandlerAdapter组合来代替Spring2.5开始的处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter,提供更多的扩展点,它们之间的区别我们在处理器映射一章介绍。
新的@ExceptionHandler 注解支持类:ExceptionHandlerExceptionResolver来代替Spring3.0的AnnotationMethodHandlerExceptionResolver,在异常处理器一章我们再详细讲解它们的区别。
@RequestMapping的”consumes” 和 “produces” 条件支持:用于支持@RequestBody 和 @ResponseBody,
1consumes指定请求的内容是什么类型的内容,即本处理方法消费什么类型的数据,如consumes=”application/json”表示JSON类型的内容,Spring会根据相应的HttpMessageConverter进行请求内容区数据到@RequestBody注解的命令对象的转换;
2produces指定生产什么类型的内容,如produces=”application/json”表示JSON类型的内容,Spring的根据相应的HttpMessageConverter进行请求内容区数据到@RequestBody注解的命令对象的转换,Spring会根据相应的HttpMessageConverter进行模型数据(返回值)到JSON响应内容的转换
URI模板变量增强:URI模板变量可以直接绑定到@ModelAttribute指定的命令对象、@PathVariable方法参数在视图渲染之前被合并到模型数据中(除JSON序列化、XML混搭场景下)。
@Validated:JSR-303的javax.validation.Valid一种变体(非JSR-303规范定义的,而是Spring自定义的),用于提供对Spring的验证器(org.springframework.validation.Validator)支持,需要Hibernate Validator 4.2及更高版本支持;
@RequestPart:提供对“multipart/form-data”请求的全面支持,支持Servlet 3.0文件上传(javax.servlet.http.Part)、支持内容的HttpMessageConverter(即根据请求头的Content-Type,来判断内容区数据是什么类型,如JSON、XML,能自动转换为命令对象),比@RequestParam更强大(只能对请求参数数据绑定,key-alue格式),而@RequestPart支持如JSON、XML内容区数据的绑定;详见本章的第×××节;
Flash 属性 和 RedirectAttribute:通过FlashMap存储一个请求的输出,当进入另一个请求时作为该请求的输入,典型场景如重定向(POST-REDIRECT-GET模式,1、POST时将下一次需要的数据放在FlashMap;2、重定向;3、通过GET访问重定向的地址,此时FlashMap会把1放到FlashMap的数据取出放到请求中,并从FlashMap中删除;从而支持在两次请求之间保存数据并防止了重复表单提交)。
Spring Web MVC提供FlashMapManager用于管理FlashMap,默认使用SessionFlashMapManager,即数据默认存储在session中。

SpringMVC常用注解:

@Controller
负责注册一个bean 到spring 上下文中
@Controller, @RestController都是用来表示spring某个类的是否可以接收HTTP请求
但@Controller标识一个Spring类是Spring MVC controller处理器,而@RestController:a convenience annotation that does nothing more than adding the @Controller and @ResponseBody annotations。 所以@RestController是@Controller和@ResponseBody的结合体。

@RequestMapping
注解为控制器指定可以处理哪些 URL 请求

@RequestBody
该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上 ,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上

@ResponseBody
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区

@ModelAttribute
在方法定义上使用 @ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法

在方法的入参前使用 @ModelAttribute 注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数 –绑定到对象中,再传入入参将方法入参对象添加到模型中

@RequestParam
在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法,如果参数名和变量名不一致,可以使用@RequestParam(name),告诉spring,使用指定名字入参。
@RequestParam(value = “name”, defaultValue = “https://my.oschina.net/gaussik/blog/World”)
Spring入门基础 @RequestParam必须要加上参数名 https://my.oschina.net/zhukp/blog/173042

@PathVariable
绑定 URL 占位符到入参

@ExceptionHandler
注解到方法上,出现异常时会执行该方法

@ControllerAdvice
使一个Contoller成为全局的异常处理类,类中用@ExceptionHandler方法注解的方法可以处理所有Controller发生的异常

配置tomcat
选下载安装tomcat,然后在eclipse偏好设置中找到”server“菜单下的”Runtime Environment“,之后在此页面下点击”add“,选择”tomcat6.0“之后,点击”Next“,点击”Browse“之后找到”Tomcat“的存储路径,点击”Finsh“即可完成。

spring注解

Spring2.5引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 在spring的bean配置中会按照byType或byName来自动装配,不必配置属性,不再需要 set ,get方法。
http://swiftlet.net/archives/734

spring-boot文档

http://docs.spring.io/spring-boot/docs/current/reference/html/