2014-7-3
System.getProperty("user.dir") 用户的当前工作目录
QPS每秒查询率(Query Per Second)
每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。
对应fetches/sec,即每秒的响应请求数,也即是最大吞吐能力。
般来说 java file.delete失败 有以下几个原因
1.看看是否被别的进程引用,手工删除试试
2.file是文件夹 并且不为空,有别的文件夹或文件,
注意: 3.极有可能有可能自己前面没有关闭此文件的流
W3C 指 World Wide Web Consortium,万维网联盟。
WHATWG 指 Web Hypertext Application Technology Working Group。
2014-7-7
我在学习Java的过程中主要围绕以下几个方面来学习:
1.时刻提醒自己Java是一种OOP语言工具,而不仅仅是编码,只有这样才能总体把握和运用Java。
2.在学习的过程中,最好能够了解Java的底层机制,而不是仅仅停留在表层,不是抄书上的例子运行出结果就可以。要注意,即便对一个简单的例子也要有耐心去琢磨、调试、改动。
3.在学习的过程中一定要动手做、写代码,而不是抱一本书看看就行。很多东西和体会必须自己动手才能真正属于自己,最好能参与一些实际的项目。
4.在学到一定阶段后,你开始希望用学过的东西做些什么。这时的你应该开始学习一些更多、更复杂的知识,比如J2EE平台的构建、EJB的开发等。对于这一部分,我建议最好找一本较薄的书先了解一个大概,心里有个总体的认识,对更多的技术术语做个初步掌握。我认为这个阶段看看《J2EE技术实践》很不错,它可以让你了解J2EE包含的各种技术和框架,同时提供很多实际的例子来加深对J2EE的整体了解。
在有一定基础、能够写一些简单的程序后,可以开始看《Thinking in Java》这本书。它比较完整地介绍了Java的语法、面向对象的特性、核心类库等。通过这一层次的学习能够加深对Java的理解和底层原理的运用,同时又可以完整地了解Java的整个体系。在这一阶段,应该重点学习Java的面向对象编程语言的特性,比如继承、构造器、抽象类、接口、方法的多态、重载、覆盖、Java的异常处理机制等,要对上述概念有非常清楚的了解。这样做的目的,是要让自己把这些技术应用到实践中进行合理的程序设计(比如,你会考虑一个类是用抽象还是接口来设计等)。
JAVAWEB开发所需
那么,建立一个比较完整的WEB工程,并且跑起来(完成从前台到数据库的完整处理流程,哪怕只是插入一个整数),需要一个什么样的知识集合呢?
1、首先是环境准备。
通常,我们需要开发工具:Eclipse,或者MyEclipse。但我从来没有用过,我选Eclipse。
然后,选择WEB容器,最常用的Tomcat,或者Jetty,JBoss亦可。我选Tomcat。
2、选择数据库。
没有数据库,很难做出有价值的应用,所以,我们需要选择一个数据库,
自己研究,用的最多的是MySql,当然,Oracle,Postgres也很常见,
喜欢Sql Server的也不少,不过我已经N年没有玩过了。
我选MySql。
3、建立工程。
我相信很多人根本没有自己手工创建过WEB工程的目录结构,都是使用工具自动生成,我坚信,了解工具帮助我们干的事情非常必要,而且非常有好处的。这里主要是建立WEB-INF目录,WEB-INF/classes,WEB-INF/lib,创建初始的 web.xml。
4、写代码前的准备工作
在真正开始写第一行代码之前,我们还需要做的准备工作有:
> 配置日志系统,java领域最常用的 Log4J
> 选择连接池,我用了C3P0
> 选择持久化技术。当然,直接使用JDBC也可以,不过现在多数项目还是用持久化层的,Hibernate 和 Ibatis,处于简单性考虑,选择 Ibatis。
当然,这些准备工作,除了技术选型的决策,还都涉及到寻找相应的 jar 包、 jar 包所依赖的 jar,以及写编写初始的配置文件,包括:log4j.properties,c3p0.properties 和 ibatis 的一系列配置。据我所知,不了解 log4j.properties 配置项含义,只会拿来例子就用的绝不在少数,还有很多人,在将 web 工程发布到 tomat 以后,无法把 log4j.properties 配置与实际的日志文件所在的位置对应起来。
5、写代码测试配置,并验证不熟悉的技术(比如 ibatis,我第 0.2 次用,N 年前了解过)
这个过程耗时较长,尤其是 ibatis ,官方的文档并不丰富,使用它做到对数据库表的增、删、改、查,调了一个下午的时间,最后发现,ibatis 出到了 3.0,但其配套工具ibator (用于自动从数据库生成表对应的 javabean 和 sql 映射文件)生成的配置文件语法完全不对,仔细一看,ibator 的最后更新时间 2008年,faint!
6、开始写工作代码
这时候就更体现了 Java 大家庭的繁荣,以及程序员的兼容并蓄了。
首先,会 Java,Jsp 那是肯定的。
而框架方面呢,我一直不待见 SSH,因此还是准备只用 Struts,这样可以不学强大的有点过于强大的Spring。
还有些技术点,要么是必然用到的,要么是很好用的,包括:
> XML处理,或者 JSON 二选一,现在 JSON 大有取代 XML 的趋势。
> Apache commons 系列的类库,尤其BeanUtils,StringUtils,API 多少了解一点还是很有好处的。
> JSTL,我一直很想为这项技术鸣不平,我觉得挺好的东西,但我周围的人都很冷落它。
然后,因为项目需要,我还要使用一些特定的技术:
> WEB Service技术,我用 Restful 模式,在Restlet 和 Jersey 之间选择,最后用了 Restlet。
> 需要做一些图表,选用 JFreeChart
> … 其实还有很多,不一一列举了
7、工程打包、发布
日常工作中,工程的集成、打包和发布,通常不是程序员需要关心的问题。但如果是你一个人在战斗,除了会在 MyEclipse 的帮助下集成 Tomcat 进行测试,最好掌握一种手段,把工程打包发布到独立的 Tomcat 下,从而避免繁琐的手工操作。
常见的方式有:
> ant
> maven
原来我用 ant,不过现在转投 maven 了,用熟了以后,感觉 maven 比 ant 要好很多,不过,ant 的价值在于灵活,有时候用于完成一些非标工作挺实用的,比如:增量拷贝文件等等。
如果再提稍微高一点的需求,那就是最好掌握 windows 下批处理文件和 linux 下 shell 脚本的编写。
8、版本控制
为了协作、分享或者是安全起见,保存代码的历史版本很重要,
因此需要选择版本管理工具,SubVersion 和 CVS 都很好,
不过我用 CVS 更熟练一些。
---
因此,做一个合格的 JAVA WEB 开发人员,真的是不大容易。
知识面要宽,学习能力要强,要善于触类旁通。
对了,我还忘了说前台相关的技术,那就是 javascript,CSS,ajax,有时候,还得搭上Flash,及JQuery等一系列的框架。
2014-7-8
DAO(Data Access Object)数据访问对象,每个DAO组件都提供Domain Object对象基本的创建,查询,删除,更新等操作,这些操作对应于数据表的CRUD等原子操作。
DTO(Data Transfer Object)数据传输对象,也叫JavaBean集
表现层技术:JSP FreeMarker Velocity
ORM(Object relation mapping)
Spring更像是以后总中间容器,向上可以与MVC框架无缝整合,向下可以与各种持久层框架无缝整合,具有强大的生命力。
企业应用开发的两个关注点:可维护性和复用
JNDI(JAVA Naming Directory Interface)Java命名和目录接口,就是为某个Java对象起一个名字,从而让其他程序可以通过这个名字访问数据源对象
JSP的基本原理:JSP本质上是Servlet,当用户向指定Servlet发送请求时,Servlet利用输出流动态生成HTML页面。
JSP页面包括两部分:
1.静态部分:标准的HTML标签,静态页面内容
2.动态部分:受Java程序控制的内容,由Java程序动态生成
JSP注释<%-- 注释内容 --%>
HTML注释
JSP声明<%! 声明部分 %>
例:<%!
public int count;
public String info(){
return "hello";
}
%>
可以使用public static private修饰,但不能用abstract,因为抽象方法会将JSP对应的Servlet变成抽象类,从而导致对象无法例化。
JSP输出表达式:<%= 表达式%> 代替了原来的out.println语句
例:<%= count++%> <%=info()%>
注意表达式语法后不能有分号。
JSP三个编译指令,是通知Servlet引擎的处理消息,在将JSP编译成Servlet时起作用
page:针对当前页面的指令
include:用于指定包含另一个页面
taglib:用于定义和访问自定义标签
JSP的7个动作指令,只是运行时的动作,通常可以替换成JSP脚本,只是JSP脚本的标准化写法
1.jsp:forward:执行页面转向,将请求的处理转发到下一个页面
2.jsp:param:用语参数传递,必须与其他支持参数的标签一起使用
3.jsp:include:用语动态引入一个JSP页面
4.jsp:plugin:用于下载JavaBean或Applet到客户端执行(略过)
5.jsp:useBean:创建一个JavaBean的实例
6.jsp:setProperty:设置javaBean实例的属性值
7.jsp:getProperty:输出javaBean实例的属性值
静态导入与动态导入(include)的三点区别:
1.静态导入是将被导入页面的代码完全融入,两个页面融合成一个整体Servlet,而动态导入则在Servlet中使用include方法来引入被导入的页面内容
2.静态导入时被导入页面的编译指令会失去作用,而动态导入时被导入页面的编译指令会失去作用,只是插入被导入页面的body内容
3.动态包含还可以增加额外的参数
forward指令使用_jspx_page_context的forward()方法来引入目标页面
include指令是使用JspRuntimeLibrary的include()方法来引入目标页面,区别在于执行forward时,被forward的页面将完全代替原有页面,而执行include时,被include的页面只是插入原有页面。
JSP脚本中的9个内置对象,都是Servlet API接口的实例,已经是对象,可直接使用。
1.application
每个web应用只有一个ServletContext实例,在JSP页面中可以通过application内置对象访问该实例,而Servlet中需要通过如下代码获取:
ServletContext sc = getServletConfig().getServletContext();
通常只把web应用的状态数据放入application中
还可以获取web应用配置参数,必须先在web.xml内配置
再通过application.getInitParameter(String paramName)获取,这样的方式将一些配置信息放在web.xml中,避免硬编码方式写在代码中,从而提高程序的移植性。
2.config
config.getInitParameter(String paramName)获取web.xml中servlet的配置信息
3.exception
JSP无需处理异常,因为脚本已经在try,catch块中
处理:如果页面的page指令指定了errorPage属性,则将请求forward到errorPage属性指定的页面,否则使用系统页面输出异常信息。
4.out
out是JspWriter的实例,JspWriter是Writer的子类,是字符流,无法输出非字符内容,如位图,PDF文档等,可以使用response作为响应输出
<%= ...%>的本质就是out.write()
5.page
6.pageContent
代表页面上下文,主要用于访问jsp之间的共享数据,可访问page,request,session,application范围的变量(1,2,3,4表示对应生存范围)
7.request
每一个request对象都封装着一次用户请求,并且用户请求参数都被封装在request对象中,request对象是获取请求参数的重要途径
forward用户请求时,请求参数和request范围的属性都不会丢失,即forward动作还是原来的请求,并未再次向服务器发送请求。
request还可以执行forward和include,HttpServletRequest提供了一个getRequestDispatcher(String path)方法,path必须以“/”开头
如下代码:
getRequestDispatcher("/a.jsp").include(request,response);将a.jsp页面include到本页面中
getRequestDispatcher("/a.jsp").include(request,response);将请求forward到a.jsp页面
8.response
代表服务器对客户端的响应,1.可以输出非字符内容,response.getOutputStream()
2.重定向请求,与forward不同的是,重定向会丢失所有的请求参数和request的范围属性,因为重定向将生成第二次请求,与前一次请求不在同一个request范围内,所以发送一份请求的请求参数和request范围的属性全部丢失。
response.sendRedirect(String path),用于重定向到path资源,即重新向path资源发送请求。相当于在地址栏重新输入新地址按回车键,即发送第二次请求。
3.用语向客户端增加Cookie
步骤:
1.创建Cookie实例,Cookie的构造器为Cookie(String name, String value)
2.设置Cookie的生命期限
3.向客户端写Cookie
代码:
String name = request.getParameter("name");
Cookie c = new Cookie("username",name);
c.setMaxAge(24*3600);//24小时
response.addCookie(c);
出现中文的时候借助于java.net.URLEncoder先对中文字符进行编码,然后设为Cookie的值,读取Cookie时,先读取,在使用java.net.URLDecoder进行解码。
9.session
非常常用的对象,代表一次用户会话,从客户端浏览器链接服务器开始到客户端浏览器与服务器断开为止,这么个过程。
用途:通常用语跟踪用户的会话信息,如判断用户是否登录系统,或者在购物车应用中用语跟踪用户购买的商品。
session范围内的属性可以在多个页面的跳转之间共享,一旦关闭浏览器,即session结束,session范围内的属性将全部丢失。
两个常用的方法:setAttribute(String attName, Object attValue)
getAttribute(String attName)
JSP内置对象的实质:要么是_jspService()方法的形参,要么是它的局部变量,所以在JSP脚本中直接调用这些对象,无须创建他们。
name相同时,获取代码:
String[] buys = request.getParameterValues("item');
2014-7-9
Servlet通常被称为服务器端的小程序,用于处理及响应客户端的请求。
Servlet与JSP的区别:
Servlet没有内置对象,原来JSP中的内置对象必须由程序显示创建。
对于静态的HTML标签,Servlet都必须使用页面输出流逐行输出。
创建Servlet的两个时机:
1.客户端第一次请求,系统创建该Servlet实例
2.Web应用启动时立即创建Servlet实例,即load-on-startup Servlet
配置方法:在
ServletConfig获取配置参数的方法:
ServletConfig config = getServletConfig();
config.getInitParameter("")
ServletConfig是获取当前Servlet的配置参数,而ServletContext是获取整个Web应用的配置参数
在标准的MVC模式中,Servlet仅作为控制器(Controller)使用,JSP作为表现层技术(负责手机用户请求参数,将应用的处理结果、状态数据呈现给用户),Model由JavaBean充当,所有业务逻辑,数据访问逻辑在Model中实现。
TLD(tag library definition)标签库定义,文件后缀是tld
Filter的使用流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
创建Filter步骤:
1.创建Filter处理类
2.web.xml文件中配置Filter
使用URL Rewrite实现网站伪静态--> html
实现HttpSessionListener接口的监听器可以监听系统的在线用户
关于Map的keySet与entrySet
01 据说keyset 比 entrySet 效率低.
02
03 Map
04 for(String valName :valueMap.keySet())
05 {
06 String key =valName;
07 Object value = valueMap.get(valName);
08 }
09
10 Set
11 for(Map.Entry
12 {
13 String key = entry.getKey();
14 Object value = entry.getValue();
15
16 }
17 Map
18 Iterator
19 while (questions.hasNext()) {
20 Entry
21 question.getValue()
22 question.getKey()
23
24 }
表达式(Expression Language)--EL
语法格式:${ expression }
支持算术与逻辑运算符,在页面上正常输出$,需要用“\”转义
逻辑运算符(> < 等)
11个内置对象
pageContext,pageScope,requestScope,sessionScope,application
param,paramValues(数组),header,headerValues(数组),initParam,cookie
implicit
adj.不言明[含蓄]的; 无疑问的,绝对的; 成为一部份的; 内含的;
如果需要在EL中进行更复杂的 处理就可以通过函数来完成,函数的本质:提供一种语法允许在EL中调用某个类的静态方法
对字符串进行反转
public String reverse(String text){
return new StringBuffer(text).reverse().toString();
}
Servlet3.0提供异步处理,通过AsyncContext类
提供Annotation,无需配置web.xml,使用@WebServlet等配置
Servlet3.0支持使用注解配置Servlet。我们只需在Servlet对应的类上使用@WebServlet进行标注,我们就可以访问到该Servlet了,而不需要再在web.xml文件中进行配置。@WebServlet的urlPatterns 和value属性都可以用来表示Servlet的部署路径,它们都是对应的一个数组。
对于Servlet上传时保存文件名,实际开发中可能多个用户填写相同name,导致上传的内容会覆盖之前的,实际项目中可以借助java.util.UUID工具类生成文件名
UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。 Struts2
OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言,使页面更简洁;
支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能;
Struts 2默认的表达式语言是OGNL
Struts2框架按如下搜索顺序加载Struts2的常量:
struts-default.xml
struts-plugin.xml
struts.xml(整个Struts2框架的核心)
struts.properties
web.xml
如果多个文件中配置了同一个常量,后一个会覆盖前面的。
在默认情况下,Struts2 只自动加载类加载路径下的struts.xml,default-struts.xml,和struts-plugin.xml三个类文件。但随着应用规模增大,系统中的Action数量也大大增加,导致struts.xml配置文件变得臃肿,所以可将其分解成多个配置文件,然后在struts.xml文件中包含其他配置文件,使用include标签,这样能以模块化的方式管理struts.xml配置文件。
POJO(Plain Old Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。
使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter setter方法的类,没有业务逻辑,有时可以作为VO(value -object)或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。
Action类默认处理用户请求的逻辑控制方法:execute方法
2014-7-10
配置Action
Struts2框架中的核心组件就是Action,拦截器等,Struts2使用包来管理Action和拦截器等,每个包就是多个Action,,多个拦截器,多个拦截器引用的集合。
配置
Struts2以命名空间(namespace)的方式来管理Action,同一个命名空间里不能有同名的Action,不同的命名空间里可以有同名的Action
当某个包指定了命名空间后,该包下所有的Action处理的URL应该是命名空间+Action名
DMI(Dynamic Method Invocation)动态方法调用
action="ActionName!methodName",其中,ActionName指定提交到哪个Action,而methodName指定提交到指定方法