1. 第一章java web开发概述
  2. 胖客户端CS,瘦客户端BSBrowser
  3. 网址请求---服务器处理响应-----返回结果-----浏览器显示
  4. CGI可以动态生成页面,但是每个进程都要启动一个CGI程序的系统进程,并在系统进程中启动一个jvm,开销大,执行效率低;java servlet只需要启动一次服务器进程,加载一次JVM,之后再加载另外的类,这样降低了开销,加载类可以处理多个相同请求,servlet能直接与web服务器交互。但是servlet嵌入了HTML标签和表达式,修改文件,就需要重新编译源文件。JSPjava server pageservlet结合了动静态的HTML技术,jsp先被jsp引擎转换成java源代码,在编译成可执行的二进制字节码,接收到客户请求后,执行上面的二进制字节码的jsp文件。
  5. 第二章 搭建javaweb开发环境
  6. JDK包括JREMyeclipse 包括eclipse,还增加了一些封装好的插件,更好用。
  7. 环境搭建步骤:安装jdk,设置环境变量JAVA_HOME为安装目录,添加到Path环境变量 jdkbin路径----安装eclipse+myeclipse插件,或者直接安装myeclipse程序,下载tomcat服务器,解压设置环境变量CATALINE_HOME为安装路径,添加bin目录路径到Path环境变量。---新建工程,在myeclipse上新建web工程-----部署到tomcat,手动复制到tomcatwebapp文件夹下,或者在myeclipsewindow|preferences添加tomcat,将工程addtomcat-----运行tomcat服务器,输入网址访问网页。
  8. 也可以导出为war文件复制到webapp文件夹,tomcat自动完成解包部署工作。
  9. myeclipsewindow|perference中设置tomcatdebug模式,在myeclipse中启动tomcat,可以调试程序。
  10. 第三章 深入servlet技术
  11. GET方式常用于查询信息,查询内容显示在地址栏中,信息不安全,且提交内容不能超过256个字节。Post方式常用于提交数据,需要提供数据类型和长度,无长度限制,不显示在地址栏,安全。
  12. Web.xml配置:servle-name(创建的servlet类的名称HelloServlet,文件中唯一),servle-class(带包名称的类路径:com.bclfirst.HelloServlet),在servlet-mapping中配置url-pattern(/servlet/HelloServlet)设置servlet的访问方式,http://ip:port/webapp下文件夹名称/url-pattern (http://127.0.0.1/FirstWeb//servlet/HelloServlet.jsp)即为url访问路径。HelloServlet.jsp的后缀可以用通配符*表示任意的后缀。
  13. 请求和响应:HttpServletRequest中包含了发出请求的客户端的ip端口、系统、tomcat服务器、servlet路径、类名等信息。HttpServletresponse响应用户请求,PrintWrite out=response.getWtiter(); out.println()打印输出html显示输出结果。
  14. 生成图片验证码的关键步骤:Random对象生成随机数和随机颜色RGB值,BufferImage创建一个彩色图片,Graphic2D对象绘制图片颜色和验证码字符串。JPEGImageEncoder对象转换格式,ServletOutputStream对象的flush()函数打印输出。
  15. 获取web文件参数:getInitParameter(Stirng param)获取web.xml中通过<init-param><init-param>配置的指定名称的参数,getInitParameters()获取所有的<init-param名称;getServletCofig().getServletContext()来获取一个ServletContext对象sc,用getInitParameters()和getInitParameter(Stirng param)函数获取所有的参数名称和单个参数值。
  16. 资源注射(@Resourse):private @Resoursename =”addas”) String message;自动获取web.xml文件中的变量,配置方式是<env-entry><env-entry-name><env-entry-type><env-entry-value>.
  17. 搜索引擎:采用雅虎的yahoo_search-2.0..jar加入到lib文件夹下,import com.search.SearchClient ,调用SearchClient.imageSearch(ImageSearchRequest )检索。
  18. 上传文件:FORM默认的数据类型enctypeapplication/x-www-form-urlencoded 表示ASCII码,上传文件时应该设置为multipart/form-data二进制文件格式。使用Apache Commons Upload类库。
  19.  
  20. 上传进度读取:
  21.  
  22. Servlet生命周期:在服务器启动(load-on-startup1)或第一次请求(load-on-startup0)初始化一个servlet对象,执行init()函数;在服务器关闭时销毁对象,执行destory() 函数。中间每个请求启动一个线程执行service方法。
  23. 注解@PostConstructservlet构造函数和init之间运行,注解函数@PreDestorydestory()函数之后执行。Web.xml中设置metadata-complete=“true”表示启动服务器时要去检测工程class文件和jar是否使用了注解。
  24. 转向(ForwardRequestDispatcher rd = request.getRequestDispatcher(String to)可以跳转到文件、jsp、其他servletrd.forward(request,response)转向指定的;
  25. 重定向(Redirect):responsesendRedirectString loacation)集合了setStatus()(设置重定向状态为302临时重定向,301永久重定向。)和setHeader()(设置重定向的地址)。客户端请求两次,第一次返回状态和地址,第二次访问访问真实地址。
  26. 自动刷新:Response.setHeader(“Refresh”,”;URL=http://localhost:8080/servlet”);
  27. Servlet线程不安全问题:因为servlet只有一个实例,多线程时调用相同的doGet方法,如果多个线程同时写一个公共的私有变量,获取变量值时会出现不同步的问题。只读没问题。
  28. 第四章深入JSP技术
  29. .1JSP概述
  30. JSPjava server page)也是一种servlet,是HTML代码和java代码的混合,无需使用out.println函数。直接复制到tomcat文件夹下,通过路径名称访问,无需web.xml文件。第一次请求jsp文件时,先被转换为java源代码,然后被编译为class类文件,运行class文件响应请求。以后不再重新编译。除了initdestroy外还有自己的_jspInit()和_jspDestory()方法。
  31. .2JSP语法
  32. Jsp分为模板数据,指HTML输出样式;元素指java部分,包括脚本scriptlet、指令derective、标签tag
  33. Jap脚本:脚本用<% %>括起来,中间是java代码。使用out.println输出。
  34. <%@ page language=”java contentType=”text/html,charset=utf-”%>
  35. <html>
  36. <body>
  37. <%
  38. int num=;
  39. out.println(“数字”+num+“阶乘为:”+resault);
  40. %>
  41. </body>
  42. </html>
  43.  
  44. jsp输出:或者用<% =%>输出,例如:数字<% = num%>的阶乘为:<% = resault %>
  45. jsp注释:用//或者/**/或者<% -- --%>
  46. jsp声明方法和全局变量:在<%! %>内声明一个或多个方法和变量。
  47. Jsp if for while return break语句:这些语句可以和HTML语句混合,但必须被<% %>包括在内,才能穿插其中。Return 之后的代码不会执行,包括</html>。
  48. Jsp访问:将jspx项目部署到tomcat下,浏览器输入httplocalhost:/jsp/greeting.jsp?param=, param表示参数,可以通过request.getParameter(“param”)获取。
  49. .3jsp指令
  50. 4.3.1Page指令
  51. <%@ page language=”java contentType=”text/html, charset=utf-”%>,一个或者多个属性。
  52. Page常见属性:
  53. language 采用的语言;
  54. extends 指明继承于那个类,继承普通类时需要实现sevletinitdestory方法;
  55. import 引入jsp中用到的类、包,唯一可以声明多次的属性;
  56. session 是否内置session对象,默认true
  57. autoFlush是否运行缓存,超出缓冲区大小或者执行out.flush()后输出到客户端显示,默认为true
  58. buffer指定缓存大小;
  59. isThreadSafe 是否线程安全,true表示可以多个线程同时运行jsp,默认为false
  60. isErrorPage 是否为错误处理界面,如果truejsp内置一个Exception对象exception,默认false
  61. errorPage 指明出现错误后转向的错误显示页面。
  62. contentType 有效的文档类型,HTML格式为text/html,纯文本text/plain,jpg图像为image/jpegGIF图像为image/gifword文档为application/msword
  63. info 传入jsp的任意字符串,用Servlet.getServletInfo()得到;
  64. 4.3.2include指令
  65. 格式为<%@ include file=”relative jspurl”%> ,可以引入其他的jsp文件,路径为相对路径,便于jsp页面的区块化,例如将导航块放入head.jsp,将版权放在foot.jsp中。在jsp首尾include这两个文件;
  66. JSP包含文件行为与Jsp包含指令不同,<jsp:incude page= relative url ”/></jsp:incude>,指令是先包含在编译,行为是先运行,再包含;
  67. 4.3.3taglib指令
  68. 标签技术支持视图代码重用,<%@ taglib uri=”http://java.sun.com/jsp/core “ prefix=”c”%>,uri指定类库地址,prefix指定标签的前缀;
  69. .4JSP行为
  70. 4.4.1jsp:incude行为
  71. <jsp:incude flush=”true page= “/head.jsp ”/></jsp:incude>, page指定本程序内的文件,flushtrue表示读入文件前先清空缓存;
  72. 4.4.2jspjava bean 行为
  73. ()在useBean.Html文件用表单<form action="useBean.jsp" method="post">,用户输入person的信息后,提交表单,传给useBean.jsp
  74. ()在jsp文件中用jsp:useBean声明普通类对象
  75. <%-- 声明 Person 类对象 person --%>
  76. <jsp:useBean id="person" class="com.helloweenvsfei.jspweb.bean.Person" scope="page"></jsp:useBean> id对象名称,calss类名称, scope对象范围(page在当前jsp内,request本次请求中有效,session当前用户有效,application当前web程序内有效)。
  77. ()在jsp文件中用jsp:setProperty设置值,提交后request中含有提交的值,根据输入的名称对应值,保存到person对象中。
  78. <%-- 设置 person 的所有属性,所有的属性值从 request 中自动取得 --%>
  79. <jsp:setProperty name="person" property="*" />
  80. ()通过<jsp:getProperty name="person" property="name" />获取属性值
  81. 4.4.3scope可以用于网页访问次数计数
  82. session当前用户访问次数,application总的访问次数)。
  83. 4.4.<jsp:plugin/>嵌入Applet
  84. 4.4.<jsp:forward/>跳转行为
  85. <%
  86. out.clear();
  87. if("".equals(request.getParameter("param"))){
  88. %>
  89. <jsp:forward page="/somepage.jsp">
  90. <jsp:param name="param1" value="value1"/>
  91. <jsp:param name="param2" value="value2"/>
  92. </jsp:forward>
  93. <%
  94. }
  95. %>
  96. 4.4. <jsp:directive/>行为
  97. Jsp行为和指令之间可以相互改写,实现相同的功能。
  98.  
  99. .5jsp中隐藏对象
  100. Jsp中内置的隐藏对象有out,request,reponse,config,session, application,page, pageContext, exception.
  101. .6jsp配置
  102. Jsp文件可以直接访问,也可以通过web.xml配置文件来映射访问路径。标签采用<jsp-file>,其他一致。也可以添加初始化参数<init-param>,采用隐藏对象configgetInitParamter(String name)获取。
  103. .7ELExpression language)表达式
  104. ${}括起来的脚本在HTML中,不可再<%%>中,可以方便的读取对象的属性。例如${person.age}。EL可以方便的读取隐藏对象的属性。EL支持运算符,逻辑运算符,比较运算符。
  105. 第五章会话跟踪
  106. 因为HTTP协议是无状态的协议,请求响应结束后,连接关闭,再次请求响应时建立新的连接,服务器无法从连接上判断是哪个用户,即无法进行会话跟踪。会话跟踪用于记录客户的登陆信息,Cookie是在客户端记录信息,session是在服务器端记录信息。
  107. .1Cookie机制
  108. 客户端向服务器发出第一次请求,服务器向客户端颁发一个cookie,用于确认用户的身份,再次请求时浏览器将请求的网址连同颁发的cookie一起发给服务器,服务器可以修改cookie的内容在返回给浏览器。
  109. Cookie通过request.getCookie()获取,通过response.addCookie()设置。Cookie是一个key-value的键-值对。
  110. 可以包含多个cookieCookie可以保存用户的访问次数。Cookie不能跨越域名去访问,浏览器判断一个网站是否可以操纵另一个网站的Cookie的判断依据是Cookie的属性域名,百度和谷歌不能相互访问。
  111. Cookie在保存中文时,需要用java.net.URLEncoderjava.net.URLDecoder进行获取的解码和写入时的编码。
  112. Cookie还可以保存图片数据,先用InputStream读取文件数据到内存,然后用BASE64Encoder进行编码,添加到Cookie中,客户端得到、Cookie后用response.getOutputStream().write(binary)输出到界面显示;但是每次请求都会携带Cookie,所以内容不宜过多,否则影响速度。
  113. Cookie除了name(名称)和value(值)外,还有maxAge(失效时间,负数表示关闭浏览器时删除,0表示立即删除,可以添加maxAge=0同名的Cookie来删除该名称的Cookie,整数表示超过秒数后删除),secure(是否按安全协议传输,默认false),path(设置cookie的允许访问的程序路径),domain(可以访问cookie的域名,必须以.开头,例如.goole.com),还有comment(描述)和version(版本)属性。
  114. document.cookie返回cookie,每个载入浏览器的 HTML 文档都会成为 Document 对象。Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。
  115.  
  116. 5.2 Session机制
  117. Session是在服务器端保存用户信息,访问时通过查询客户明细表来确认身份。也是一个键值对加属性,jsp含隐藏的session对象,或者用requestresponse对象的方法获取。Seeion可以直接保存person对象与data对象。比cookie方便。
  118. 访问jspservlet时才会创建Session,只访问HTML等静态资源不会创建session
  119. Session的有效期通过设置MaxInactiveInterval活跃超时时间。
  120. Session需要依赖于cookie来辨识客户,服务器向客户端发送一个名称为JSESSIONIDcookie,依据此Session来识别是否是同一用户。
  121. 地址重写,Response.encodeURL()方法自动判断浏览器是否支持cookie,支持则原样输出,不支持则将jsessionid重写到url地址中。
  122. 如果是页面重定向,用 response.sendRedirect(response.encodeRedirectURL (admini strator.jsp))重定向,支持cookie时,返回原url,如果不支持,加上jsessionid后返回。
  123. 第一次请求不会携带cookie,通过地址重写携带jsessionid,第二次请求时,如果携带了值为jsessionidcookie,则url地址不会带有jsessionid了;可以在conntext.xml中设置是否禁用自动维护jsessionidcookie
  124. .3Sessioncookie的比较
  125. Session可以保存任何类型的数据,cookie只能保存ASCII字符串,不能直接存储java对象。
  126. Sessioncookie安全性更好;
  127. Cookie可以实现登陆消息长期有效,session依赖于cookie,不能实现长期登陆有效的效果。
  128. 服务器访问数量多的采用cookie比较合适。否则服务器的负担太重。
  129.  
  130. 第七章监听器listener
  131. 监听器listener用于监听sessioncontextrequest的创建和删除,属性的变化。先在配置文件中配置<listener><listener-class>com.helloweenvsfei.listener.listenertest </listener></listener-class>,映射listener指向的文件,当session等创建销毁使会自动调用listenertest类里的方法,listenertest实现方法继承于httpsessionlistener的接口,接口固定。
  132. 监听sessioncontextrequest属性变化,接口名称为XxxAttributeListener,当监听到对象添加、更新、移除会调用函数XxxAddedXxxreplacedXxxRemove方法。
  133. 除了上述六个listener外,还有两个listener,无需在web.xml中配置,新建类时,实现listener的接口;分别为HttpSessionBindingListenerHttpSessionActivationListener,当对象放入Session中时,执行valueBound方法,删除时执行valueUNBound方法;服务器关闭时,Session内容保存到硬盘中,执行sessionWillPassivate方法,服务器重启时,重新加载Session,执行sessionDidActive方法。
  134. 第八章jstl标签库
  135. .1JSTL概述
  136. JSTLjava standard tag library)为标准标签库。Java采用分层结构MVCmodel-view-controlmodel用于处理业务逻辑,view用来显示,control用于连接这两个;标签就是用于显示数据的;JSTL采用xml格式,与HTML代码类似,可读性强;
  137. 标签包括前缀、标签名称、标签属性以及标签体;
  138. .2JSTLcore标签库
  139. 文件头包含<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c”>
  140. c:outEL表达式一起使用输出<c:out value=”&{para.action}”></c:out>
  141. 实现if的功能
  142. <c:if test=”${param.action==’add’}”></c:if> test可以是boolean类型的true,也可以是字符串的trueingore case);
  143. 实现if else的功能
  144. <c:choose>
  145. <c:when test=”true”>
  146. When 标签的输出
  147. </c:when>
  148. <c:otherwise>
  149. Otherwise 标签的输出
  150. </c:otherwise>
  151. </c:choose>
  152. <c:forEach>实现循环
  153. <c:forEach var=”num begin=”” end =”” step=””>
  154. <div>${num}</div>
  155. </c:forEach>
  156. Var定义变量名称,begin初始值,end结束值,step步长;向对于forint num=;num<=;num+=);
  157. <c:forEach items=”${personlist}” var=”person”></c:forEach>遍历list或者map
  158. <c:forEach>有一个varStatus属性。
  159.  
  160. 16 struts2. 概述
  161. .1structs实例
  162. 添加类库
  163. Struts2需要下载类库,即jar包,放在lib文件中。如果没有plaxusSitergraphSpring,需要将对应的插件删掉,否则会出错;
  164. 创建文件
  165. 创建loginaction.java,继承于com.opensymphony.xwork2.ActionSupport类,在类中创建setget方法获取类的成员变量值;最重要的是execute()方法,为action的主方法,提交数据会调用该方法,返回值代表显示页面的名称,在struts2配置文件中配置action的结果的名称与显示页面的名称对应,调用对应jsp文件显示名称对应的界面。
  166. 配置文件
  167. Struts配置文件如下所示,每个action都有一个配置结点,result name即为上述中action返回界面的名称,后面的jsp文件即为显示的界面,package name用于继承特性,子package里的action能够使用父package里的资源;struts-default包含拦截器;global-results是全局的结构,任何action都可以调用;
  168. <!DOCTYPE struts PUBLIC
  169. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  170. "http://struts.apache.org/dtds/struts-2.0.dtd">
  171. <struts>
  172. <!-- 声明 Struts2 的属性 例如将 Struts2 后缀改为 .helloween -->
  173. <!--
  174. <constant name="struts.action.extension" value="helloween"></constant>
  175. -->
  176. <!—package name-->
  177. <package name="main" extends="struts-default">
  178. <global-results>
  179. <result name="login">/login.jsp</result>
  180. </global-results>
  181. <action name="login"
  182. class="com.helloweenvsfei.struts2.action.LoginAction">
  183. <result name="success">/welcome.jsp</result>
  184. </action>
  185. <action name="logout"
  186. class="com.helloweenvsfei.struts2.action.LoginAction"
  187. method="logout">
  188. <result name="success">/welcome.jsp</result>
  189. </action>
  190. </package>
  191. </struts>
  192.  
  193. struts2标签的jsp页面文件
  194. 使用标签先加入<%@ taglib uri="/struts-tags" prefix="struts"%>标签库,然后用struts:headstruts:form等标签,theme="ajax"是主题,ajax主题会加载struts2dojo库;/struts-tags位于struts2-core-2.0..jar包中,不需要复制到WEB_INF下面,直接使用即可,使用主题,页面会根据主题自动布局,无需html布局标签;
  195. <%@ page language="java" contentType="text/html; charset=UTF-8" %>
  196. <%@ taglib uri="/struts-tags" prefix="struts"%>
  197. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  198. <html>
  199. <head>
  200. <title>My JSP 'index.jsp' starting page</title>
  201. <meta http-equiv="pragma" content="no-cache">
  202. <meta http-equiv="cache-control" content="no-cache">
  203. <meta http-equiv="expires" content="">
  204. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  205. <meta http-equiv="description" content="This is my page">
  206. <!--
  207. <link rel="stylesheet" type="text/css" href="styles.css">
  208. -->
  209. <struts:head theme="ajax" />
  210. </head>
  211.  
  212. <body>
  213.  
  214. <struts:fielderror />
  215.  
  216. <struts:form action="loginPerson">
  217. <struts:label value="登录系统"></struts:label>
  218. <struts:textfield name="account" label="帐号"></struts:textfield>
  219. <struts:password name="password" label="密码"></struts:password>
  220. <struts:submit value="登录"></struts:submit>
  221. </struts:form>
  222.  
  223. helloween,
  224.  
  225. </body>
  226. </html>
  227.  
  228. 配置web.xml文件
  229. Struts1使用ActionServlet作为分发器,struts2使用filter作为分发器,需在web.xml的最后面配置strutsfilter;修改action后缀可在web.xml或者struts.properties内配置struts.action.extension为其他值;
  230. <!-- Struts2FilterURI配置 -->
  231. <filter-mapping>
  232. <filter-name>struts</filter-name>
  233. <url-pattern>/*</url-pattern>
  234. </filter-mapping>
  235.  
  236. <filter>
  237. <filter-name>struts</filter-name>
  238. <filter-class>
  239. org.apache.struts2.dispatcher.FilterDispatcher
  240. </filter-class>
  241. <!--
  242. <init-param>
  243. <param-name>actionPackages</param-name>
  244. <param-value>com.helloweenvsfei.struts2.action</param-value>
  245. </init-param>
  246. <init-param>
  247. <param-name>struts.action.extension</param-name>
  248. <param-value>helloween</param-value>
  249. </init-param>
  250. -->
  251. </filter>
  252. Struts2工作流程
  253. 新建loginaction.java------在struts.xml配置该action名称为loginperson------登陆界面提交表单给名称为“loginperson”的action-----struts截获请求-----查找struts.xml中名称为loginperson的action,创建名称为loginperson的action实例-----将提交的数据通过set方法设置到实例中----调用action的主方法execute()------根据结果跳转到配置的对应的welcome.jsp显示界面。
  254. Struts线程安全
  255. 每次请求都会创建一个action实例,实例间彼此独立,处理完后销毁,所以线程安全;
  256. 16.2struts配置文件
  257. Web.xml配置struts2的分发器filter,struts.properties配置struts2的默认属性,可不添加该文件,struts.xml配置struts2的action;
  258. Package有继承的特性,子package可以引用父package内的所有资源;package内可以配置命名空间,访问时需要加上命名空间;
  259. 16.3action详解
  260. Actionsupport类中实现了一些基本方法,例如数据校验可直接被继承的action的使用;action接口只定义了execute方法,和几个常用的结果名称(success,error等),action类可以通过继承action接口来实现,Actionsupport类也继承与action接口;也可以不继承任何类和接口,只要实现execute方法即可;
  261. 自定义的action可执行方法
  262. Action的可执行方法可以是其他方法,但必须是无参数返回值为string的方法;
  263. 用login!loginout.action的url访问;
  264. 或者需要在struts.xml中配置class后面加上method=“logout”, login为配置文件中的action的名称,loginout为方法名称;
  265. 还可以通过通配符*来配置,避免配置login和logout两种action输出;
  266. <action name =”*Person” class=”” method=”{1}”>
  267. <result name=”success”>/welcome.jsp</result >
  268. <result name=”{1}”>/{1}.jsp</result >
  269. </action>
  270.  
  271. 16.4用注解@代替struts.xml的配置
  272. 直接在定义action的文件中通过注解的方式来实现action的配置,如下
  273. @namespace (value=”/test”) //命名空间
  274. @Results({ //结果集
  275. @result(name=”success”, value =”/success.jsp”),
  276. @result(name=”redirect”, value =”/redirect.jsp”,type=ServletRedirectResult.class)
  277. })
  278.  
  279. 注解方式配置的action的访问方式
  280. ,因为没有访问路径的配置,需要去掉类名中的action,并且首字母小写,例如Annotated Action的访问方式为annotated.action.annotated!login.action;
  281. 零配置需要在web.xml中配置action包的位置,指定了actionPackage后,只会加载注解action,struts.xml配置文件中配置将失效;注解配置和strutsxml文件配置只能二选一;
  282. <init-param>
  283. <param-name>actionPackages</param-name>
  284. <param-value>com.helloweenvsfei.struts2.action</param-value>
  285. </init-param>
  286.  
  287. 16.5 action中的pojo(简单普通java对象,plain ordinary java object)
  288. Action中的定义的pojo类需要定义get和set方法,struts2会自动完成pojo属性的赋值;使用struts:url标签来标示,action的方法,调用时会自动添加.action的后缀,无需主动添加;如下所示;
  289. <a href="<struts:url action="initAddBook" />">添加书籍</a>
  290. <a href="<struts:url action="listBook" />">书籍列表</a>
  291. <a href="<struts:url action="clearBook" />">清空书籍列表</a>
  292. 禁用自动添加,可以如下
  293. <a href="<struts:url action="initAddBook" includeParams=”none”/>">
  294. 或者直接在struts.properties中禁用所有的自动追加特性
  295. Struts.url.includeParams=none
  296.  
  297. 第16章 struts2.x高级应用
  298. 17.1日期时间转换器
  299. 继承与DefaultTypeConverter类,实现convertValue接口,三种日期格式和两种时间格式放入数组内,然后根据输入数据的类型,循环调用每种格式转换,正确的返回值;
  300. 在配置文件xwork-conversion.properties中配置数据类型对应的转换器(或者在struts的action中配置convertor=“com.helloweenvsfei.struts2.convertor.DatatimeConvertor”,这样只能被该action使用)------输入界面输入提交信息给action-----struts截获请求查找配置文件中action将提交的数据(是string类型,通过配置的转换器转化为对应的时间日期类型)注入到action的属性中,-----根据提交时的方法名称convert调用方法convert()-------返回success------action根据返回结果跳转到对应的jsp显示界面。
  301. 17.2ServletActionContext类
  302. 需包含import org.apache.struts2.SeveletActionContext;该类中包含request、Response、ServletContext等对象;
  303. 或者实现*Aware(ServletContextAware、ServletRequestAware、ServletResponseAware、SessionAware)接口来,并实现set*方法(session的方法是setSession(Map sessionValues),map表示内部存储的各种数据,),将数据注入action的属性中;
  304. 17.3validator校验数据
  305. 支持校验必须继承Validateable接口,actionsupport类就继承该接口;在package内添加校验配置文件,名称按照格式Action类名-validation.xml或者Action类名-Action别名-validation.xml;例如下:
  306. !DOCTYPE validators PUBLIC
  307. "-//OpenSymphony Group//XWork Validator 1.0//EN"
  308. "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
  309. <validators>
  310. <!-- 检查书名,必须非空 -->
  311. <field name="book.name">
  312. <field-validator type="requiredstring">
  313. <param name="trim">true</param>
  314. <message>请输入书籍名称</message>
  315. </field-validator>
  316. </field>
  317. <!-- 检查作者,必须非空 -->
  318. <field name="book.author">
  319. <field-validator type="requiredstring">
  320. <message>请输入书籍作者</message>
  321. </field-validator>
  322. </field>
  323. <!-- 检查出版日期。 -->
  324. <field name="book.publishedDate">
  325. <field-validator type="date">
  326. <param name="min">1900-01-01</param>
  327. <param name="max">2200-01-01</param>
  328. <message><![CDATA[ 日期格式必须位于 1900-01-01 与 2200-01-01 之间 ]]></message>
  329. </field-validator>
  330. </field>
  331. </validators>
  332.  
  333. 客户端validator校验配置,<struts:form>标签添加validate=“true”属性;
  334. 或者通过注解来添加校验;
  335.  

  336. 第18章 struts 标签
  337. 18.1struts2标签
  338. 统一包含在struts-tags-tld文件中,位于Struts-core-2.0.11.1.jar的META-INF中;
  339. 18.2ognl语言
  340. (object-graph navigation language)是操作对象属性的语言,可以用#获取上下文的资源;
  341. #parameters表示request提交的所有参数,#request表示request的所有属性;
  342. 流程
  343. 先action继承ServletContextAware、ServletRequestAware、SessionAware接口,定义对象属性,和set方法,execute()方法设置对象的一些属性值;在ognlSUCCESS.jsp中直接通过<struts:property value=”#request.account”>显示值;
  344. 18.3控制标签
  345. <struts:if test=”name= ‘ kuto’ ”> hello kuto </struts:if>
  346. <struts:elseif test=”name= ‘ fvssd’ ”> hello fvssd </ struts:elseif >
  347. <struts:else> hello other </ struts:elseif >
  348.  
  349. 第19章 struts2拦截器和文件上传
  350. 19.1 使用拦截器
  351. 面向切面的开发思想,把相对独立的代码抽象出来,如数据转换和数据校验,action在struts.xml中配置的时候,package中需要继承struts-default才能使用struts的拦截器,如下
  352. <package name="main" extends="struts-default">
  353. Struts有很多现成的拦截器
  354. Timer计时拦截器计算action执行的时间
  355. <action name="timer"
  356. class="com.helloweenvsfei.struts2.action.TimerAction">
  357. <interceptor-ref name="timer"></interceptor-ref>
  358. <result>/timerSuccess.jsp</result>
  359. </action>
  360. Token防重复提交拦截器
  361. <action name="token"
  362. class="com.helloweenvsfei.struts2.action.TokenAction">
  363. <interceptor-ref name="token"></interceptor-ref>
  364. <interceptor-ref name="basicStack" />//必须的,自动赋值拦截器集合
  365. <result>/tokenSuccess.jsp</result>
  366. <result name="input">/tokenInput.jsp</result>
  367. <result name="invalid.token">/tokenInvalid.jsp</result>//失败跳转界面,必须
  368. </action>
  369. 表单中要加一个<struts:token />标记,才会触发token拦截器;这个标记在Session中生成表单的唯一标示,提交一次后失效;
  370. execAndWait执行等待拦截器显示等待页面
  371. <action name="wait"
  372. class="com.helloweenvsfei.struts2.action.WaitAction">
  373. <interceptor-ref name="completeStack" />//完成后触发
  374. <interceptor-ref name="execAndWait" />等待触发
  375. <result>/waitSuccess.jsp</result>
  376. <result name="wait">/waiting.jsp</result>
  377. </action>
  378.  
  379. 自定义权限验证拦截器
  380. 自定义拦截器要继承interceptor接口或者abstractInterceptor抽象类,是一个java文件,需要实现intercept(ActionInvocation invocation)return invocation.invoke();表示继续调用action,否则权限不通过返回登陆界面return action.LOGIIN;定义好intercept类后需要在struts.xml中配置该拦截器,如下
  381. <interceptors>
  382. <interceptor name="authentication"
  383. class="com.helloweenvsfei.struts2.interceptor.AuthenticationInterceptor">
  384. </interceptor>
  385. </interceptors>
  386. 然后在需要使用该拦截器的action中配置该拦截器,与struts2的默认拦截器配置相同;
  387. <action name="authentication"
  388. class="com.helloweenvsfei.struts2.action.AuthenticationAction">
  389. <interceptor-ref name="authentication"></interceptor-ref>
  390. <result>/authenticationSuccess.jsp</result>
  391. </action>
  392.  
  393. 19.2上传文件
  394. Struts2文件封装在java.io.File中,需要定义一个对象用于接收表单上传的文件,struts2会将文件复制到一个临时文件夹中,以时间戳为名,后缀为|.tmp,避免重复,File属性保存的就是这个临时文件的路径加名字;要获取该文件的原始名称和原始属性,需要定义string类型的属性,命名格式为XXFileName和XXContentType,struts2会将原文件名和类型输入到这两个属性上;需要用循环写入的方式复制文件数据;
  395. package com.helloweenvsfei.struts2.action;
  396.  
  397. import java.io.File;
  398. import java.io.FileInputStream;
  399. import java.io.FileOutputStream;
  400. import java.io.InputStream;
  401. import java.io.OutputStream;
  402.  
  403. import org.apache.struts2.ServletActionContext;
  404.  
  405. import com.opensymphony.xwork2.ActionSupport;
  406.  
  407. public class UploadAction extends ActionSupport {
  408.  
  409. private static final long serialVersionUID = -60950803930068947L;
  410.  
  411. private File picture;//定义file属性保存临时文件名
  412.  
  413. private String pictureContentType; //保存数据类型File对象名字+ContentType
  414.  
  415. private String pictureFileName;//保存文件的真实名字File对象名字+FileName
  416. public String execute() {
  417. return "input";
  418. }
  419.  
  420. public String upload() throws Exception {
  421.  
  422. System.out.println("Context: "
  423. + ServletActionContext.getServletContext()
  424. .getRealPath("upload"));
  425.  
  426. System.out.println("File: " + picture);
  427.  
  428. System.out.println("FileName: " + pictureFileName);
  429.  
  430. File saved = new File(ServletActionContext.getServletContext()
  431. .getRealPath("upload"), pictureFileName);//创建保存的文件
  432.  
  433. InputStream ins = null;
  434. OutputStream ous = null;
  435.  
  436. try {
  437. saved.getParentFile().mkdirs();
  438.  
  439. ins = new FileInputStream(picture);
  440. ous = new FileOutputStream(saved);
  441.  
  442. byte[] b = new byte[1024];
  443. int len = 0;
  444.  
  445. while ((len = ins.read(b)) != -1) {//循环读取临时文件数据保存到服务器的文件中
  446. ous.write(b, 0, len);
  447. }
  448. } catch (Exception e) {
  449. e.printStackTrace();
  450. } finally {
  451. if (ous != null)
  452. ous.close();
  453. if (ins != null)
  454. ins.close();
  455. }
  456.  
  457. return "list";
  458. }
  459.  
  460. public File getPicture() {
  461. return picture;
  462. }
  463.  
  464. public void setPicture(File file) {
  465. this.picture = file;
  466. }
  467.  
  468. public String getPictureContentType() {
  469. return pictureContentType;
  470. }
  471.  
  472. public void setPictureContentType(String fileContentType) {
  473. this.pictureContentType = fileContentType;
  474. }
  475.  
  476. public String getPictureFileName() {
  477. return pictureFileName;
  478. }
  479.  
  480. public void setPictureFileName(String fileFileName) {
  481. this.pictureFileName = fileFileName;
  482. }
  483.  
  484. }
  485.  
  486. 上传文件的设置
  487. 默认使用javax.servlet.context.tempdir作为工作目录,可以通过设置struts.multipart.saveDir属性修改目录,struts.multipart.maxSize来修改最大上传文件大小,默认2097152byte;自带的拦截器可以设置
  488. <interceptor-ref name="fileUpload">
  489. <param name="allowedTypes">
  490. image/bmp,image/x-png,image/gif,image/jpeg
  491. </param>
  492. <param name="maximumSize">20480</param>
  493. </interceptor-ref>

  494. 第20章 hibernate入门
  495. 20.1hibernate简介
  496. Hibernate是一种对象-关系数据库-映射(ORM,object-relative database-mapping),将pojo拆分成各种属性自动组织sql语句,保存到数据库;或者将数据中数据抽取出来,拼装成pojo对象返回;
  497. 20.2使用hibernate步骤
  498. 新建webproject------右键addhibernateCapabilities------添加hibernate包------配置实体类----在hibernate.cfg.xml中配置数据库连接信息,还有注解实体类信息或者无注解的实体类+类配置文件信息;-----创建CatTest.java文件,severlet的main函数中创建Session相当于数据库连接------创建Transaction相当于任务-------然后用Session的函数去实现对象与数据库记录之间的映射;
  499. 可以将Hibernate的的数据库操作封装成一个类,将Session和transaction的创建和销毁封装起来;创建BaseDAO.java文件内部参数采用object,可以接收任意的实体类,hibernate实现实体类和数据库之间的数据交互;在severlet的doPost函数中根据不同的参数来调用不同的函数,函数中调用BaseDAO中封装的数据库操作函数;
  500. package com.helloweenvsfei.hibernate.bean;
  501. import java.util.ArrayList;
  502. import java.util.Date;
  503. import java.util.List;
  504. import javax.persistence.Column;
  505. import javax.persistence.Entity;
  506. import javax.persistence.GeneratedValue;
  507. import javax.persistence.GenerationType;
  508. import javax.persistence.Id;
  509. import javax.persistence.JoinColumn;
  510. import javax.persistence.ManyToOne;
  511. import javax.persistence.NamedQueries;
  512. import javax.persistence.NamedQuery;
  513. import javax.persistence.OneToMany;
  514. import javax.persistence.QueryHint;
  515. import javax.persistence.Table;
  516. import javax.persistence.Temporal;
  517. import javax.persistence.TemporalType;
  518.  
  519. //@NamedQuery(name = "all cat", query = " select c from Cat c ")
  520. //@NamedNativeQuery(name = "all cat", query = "select * from tb_cat")
  521. @NamedQueries(value = {
  522. @NamedQuery(name = "all cat", query = " select c from Cat c "),
  523. @NamedQuery(name = "cat by name", query = " select c from Cat c where c.name = :name ", hints = { @QueryHint(name = "org.hibernate.callable", value = "true") }),
  524. @NamedQuery(name = "cat by mother", query = " select c from Cat c ") })
  525. //@NamedNativeQueries(value = {
  526. // @NamedNativeQuery(name = "all cat", query = "select * from tb_cat"),
  527. // @NamedNativeQuery(name = "all cat", query = "select * from tb_cat"),
  528. // @NamedNativeQuery(name = "all cat", query = "select * from tb_cat") })
  529. @Entity
  530. // 注解Entity表示该类能被Hibernate持久化
  531. @Table(name = "tb_cat")
  532. // 指定该Entity对应的数据表名
  533. public class Cat {
  534.  
  535. @Id
  536. @Column(name = "id")
  537. // 指定该列为主键
  538. @GeneratedValue(strategy = GenerationType.AUTO)
  539. // 主键类型, auto为数据库自增长类型
  540. private Integer id;
  541.  
  542. @Column(name = "name")
  543. // 指定属性对应的数据库表的列为“name”
  544. private String name;
  545.  
  546. @Column(name = "description")
  547. // 同上。@Column与name均可省略
  548. private String description;
  549.  
  550. @ManyToOne
  551. // 指定POJO之间的关系,本例为多对一关系
  552. @JoinColumn(name = "mother_id")
  553. // 该属性对应的列
  554. private Cat mother;
  555.  
  556. @Temporal(TemporalType.TIMESTAMP)
  557. // 日期类型(DATE, TIME还是TIMESTEMP)
  558. @Column(name = "createDate")
  559. private Date createDate;
  560.  
  561. @OneToMany(mappedBy = "cat")
  562. // @JoinColumns(value = { @JoinColumn(name = "cat_id", referencedColumnName
  563. // = "id") })
  564. private List<Event> events = new ArrayList<Event>();
  565. public Integer getId() {
  566. return id;
  567. }
  568. public void setId(Integer id) {
  569. this.id = id;
  570. }
  571. public String getName() {
  572. return name;
  573. }
  574. public void setName(String name) {
  575. this.name = name;
  576. }
  577. public Cat getMother() {
  578. return mother;
  579. }
  580. public void setMother(Cat mother) {
  581. this.mother = mother;
  582. }
  583. public Date getCreateDate() {
  584. return createDate;
  585. }
  586. public void setCreateDate(Date createDate) {
  587. this.createDate = createDate;
  588. }
  589. public String getDescription() {
  590. return description;
  591. }
  592. public void setDescription(String description) {
  593. this.description = description;
  594. }
  595. public List<Event> getEvents() {
  596. return events;
  597. }
  598. public void setEvents(List<Event> events) {
  599. this.events = events;
  600. }
  601. }
  602. Hibernate操作数据库
  603. // 开启一个 Hibernate 对话
  604. Session session = HibernateSessionFactory.getSessionFactory()
  605. .openSession();
  606. // 开启一个事务
  607. Transaction trans = session.beginTransaction();
  608.  
  609. // 将三只猫的资料保存到数据库
  610. session.persist(mother);
  611. session.persist(kitty);
  612. session.persist(mimmy);
  613.  
  614. // 查询数据中的所有的猫
  615. @SuppressWarnings("all")
  616. List<Cat> catList = session.createQuery(" from Cat ").list();
  617.  
  618. StringBuffer result = new StringBuffer();
  619. result.append("数据库里的所有的猫:\r\n\r\n");
  620.  
  621. // 遍历 输出猫与猫妈妈
  622. for (Cat cc : catList) {
  623. result.append("猫: " + cc.getName() + ", ");
  624. result.append("猫妈妈: "
  625. + (cc.getMother() == null ? "没有记录" : cc.getMother()
  626. .getName()));
  627. result.append("\r\n");
  628. }
  629. trans.commit();//结束事物
  630. session.close();//关闭Session
  631.  
  632. 第21章 从宏观上把握hibernate
  633. SessionFactory是一个线程安全的Session工厂类,为不同的线程提供Session,维护这Session的相关德尔资源,包括数据库连接池等、缓存信息;
  634. Transaction代表一次事物,事物提交后,修改的数据操作才会生效。
  635. 在hibernate.properties中配置数据库的类型和连接信息,在hibernate.cfg.xml中配置注解实体类或者实体类的配置文件;
  636. 第22章hibernate实体映射
  637. 主键配置(用@id申明主键,用@cloumn申明该列的名称,@GeneratedValue指定生成策略,可以是自增长、源于其他表格、sequence等);主键生成规则(GenerationType.AUTO、GenerationType.TABLE、GenerationType.SEQUENCE、 GenerationType.INDENTITY)、
  638. 普通属性配置,使用@Cloumn配置,属性nullable(是否允许为null)、unique(是否唯一)、insertable(是否允许插入)updateable(是否允许更新)、length(列长度)、cloumnDefinition(列类型)、scale(整数长度)、precision(小数点精度);
  639. @Cloumn(name=“salry”,nullable=true,cloumnDefinition=“number”,insertable=true)
  640. 用@Basic为普通属性配置加载方式,默认及时加载,如果数据比较大,可设置为延时加载,optional配置该列是否可以为null;
  641. @Basic(fetch=FetchType.LAZY,optional=true)// FetchType.EAGER
  642. 配置日期属性配置;如果日期类型是java.util.Date类型,必须用@temporal配置日期类型。如果是java.sql.Date、 java.sql. Time、java.sql.TimeStamp,则无需申明;
  643. @Temporal(TemporalType.TIMESTAMP)
  644. @Cloumn(name=”createDate”)
  645. Private java.util.Date createDate;
  646. 临时属性;@Transient标注,表示临时为了方便计算而创建的属性,不会写入数据库;对应的getset方法也要配置;而对于所有没有配置到配置文件中都是临时属性;
  647. 版本属性;乐观锁和悲观锁@Version;悲观锁操作时锁住,完成后释放;乐观锁采用Version属性来判断是否被修改,是否要重新读取;允许多条线程同时访问数据;
  648. @version
  649. Private int version;//注解配置
  650. <version name =”version”></version>//要配置在主键后,普通属性前
  651. <version type“timestamp” column=”version”></version>//配置文件配置可以是int、long、Timestamp;
  652. 第24章 Hibernate查询语言HQL
  653. HQL是面向对象的语言,直接将对象用于数据库查询语句,大小写不敏感,同名时用package区分;
  654. 查询数量计数
  655. Number num=(Number)Session.createQuery(“select count(c) from Cat c”).uniqueResult();
  656. 返回集合属性
  657. List<stirng[]> namelist =session.createQuery(“select c.name,c.mother.name from Cat c”).list();
  658. List<Cat> catlist=session.createQuery(select c.mother from Cat c).list();
  659. 返回不同的多个对象,对象数组
  660. List<Object[]> olist=session.createQuery(“select c.name,c.mother ,c.createDate from Cat c”).list();
  661. 返回list类型
  662. List<List> list2=session.createQuery(“Select new list(c.name,c.mother,c.createDate)from Cat c”).list();
  663. 返回map类型
  664. List listmap=Session.createQuery(“select new map(c.name as name,c.mother as mother, c.createDate as createDate ) from Cat c)”).list();
  665. 返回java实体对象
  666. List<Cat> catlist=session.createQuery(“select new Cat(cat.name,cat.createDate) from Cat c”).list();
  667. 条件语句
  668. Session.createQuery(“select c from Cat c where c.mother=null and c.createDate <:createDate”).setParameter(“createDate”,new Date()).list();
  669. 统计函数
  670. 语句中Count()、sum()min()、max(),avg()、count();返回 uniqueResault()类型与主键类型相同;
  671. 分页查询数据,获取查到的数据
  672. List<Cat> cslist =session.createQuery(“from Cat”).setFirstResult(0).setMaxResault(10).list();
  673. 跨表查询
  674. Select e From event e where e.cat.name=’ketty’ 查询Event和cat表;
  675. 级联查询
  676. List<Cat> blist=session.createQuery(“Select c from Cat c left join c.events e where e.description like :description”).setParameter(“description”,”%吃早饭%”).List();
  677. SQL查询
  678. Session.createSQLQuery(“select * from tb_cat”);
  679. @配置命名查询
  680. 将常用的查询用一个字符串来代替,相当于宏定义,在实体类的定义的前面配置
  681. @NameQuery(name=”all cat”,query=”select c from Cat c”)//配置HQL查询
  682. @NameNativeQuery(name=“all cat”,query=“select * from tb_cat”)
  683. 在xml配置文件中配置命名查询,name配置查询的名称,<return/>配置返回数据类型;
  684. <sql_query name=”cat all”><![CDATA[]]><return alias=””,class=com.helloweenvsfei. hibernate.bean.Cat/></sql_query>;
  685.  
  686. 第26章 Spring概述
  687. 26.1Spring 框架
  688. Spring是一种轻量级的框架或容器,一般的程序是从外到内的过程,即程序应用层(main函数实例化服务对象,调用服务的接口函数)、service层(实现服务接口函数,实例化DAO对象,并调用其方法)、DAO层(实现真正的业务逻辑);而Spring则是从内到外的一个过程;
  689. Spring使用流程,定义IDao的接口和实现类DaoImpl,定义IService接口和ServiceImpl实现类,在ServiceImpl定义IDao变量和set、get方法;而不是调用DAOimpl对象;通过配置文件将serviceImpl与DaoImpl类关联起来,建立依赖关系,相当于service.setDao(DaoImpl);Spring在运行时,根据配置注入依赖的对象,Spring实例化对象并维护对象,在编码阶段没有实例化,而是在运行阶段注入对象,并实例化、组装对象、维护对象,与传统的写代码,实例化、组装对象,执行方法方向相反;
  690. <bean id="serviceImpl"
  691. class="com.helloweenvsfei.spring.example.ServiceImpl">
  692. <property name="dao">
  693. <bean class="com.helloweenvsfei.spring.example.DaoImpl"></bean>
  694. </property>
  695. </bean>
  696. 或者按照下面的配置
  697. <!-- dao 实例 -->
  698. <bean id="daoimpl" class="com.helloweenvsfei.spring.example.DaoImpl">
  699. </bean>
  700. <bean id="serviceImpl"
  701. class="com.helloweenvsfei.spring.example.ServiceImpl">
  702. <property name="dao" ref=” daoimpl”></property>
  703. </bean>
  704. 26.3面向切面的编程
  705. 面向切面编程(Aspect oriented programming)将程序分成独立的几段,可以按不同顺序执行,方便添加删除功能;Spring实现了特定的AOP即可的类称为拦截器;
  706. package com.helloweenvsfei.spring.aop;
  707. import java.lang.reflect.Method;
  708. import org.springframework.aop.MethodBeforeAdvice;
  709. public class MethodBeforeInterceptor implements MethodBeforeAdvice {
  710. public void before(Method method, Object[] args, Object instance)方法、参数、实例;
  711. throws Throwable {
  712. System.out.println("即将要执行方法:" + method.getName());
  713. if (instance instanceof AopServiceImpl) {
  714. String name = ((AopServiceImpl) instance).getName();
  715. if (name == null)
  716. throw new NullPointerException("name属性不能为null");
  717. }
  718. }
  719. }
  720. 第27章 Spring的core模块
  721. Core的主要功能是实现反向控制、依赖注入、beans配置和加载;有Beans、BeanFactory(加载beans)、BeanDefinition(beans的定义)ApplicationContext(配置文件);
  722. 27.1BeanFactory工厂
  723. BeanFactory根据配置实例化beans对象,并设置相互依赖性,将beans注入sevelet、struts的Action中、Hibernate资源中;web程序无需实例化BeanFactory,自动实例化;java桌面程序中需要根据配置文件加载实例化,用ClassPathResourse加载ClassPath下的文件,或者用FileInputStream加载任意路径的配置文件,或者用ClassPathXmlApplicationContext加载多个配置文件;
  724. 27.2 配置java bean
  725. 配置文件中用id配置名称,class配置类名,必须两个参数;如果为工厂类(无类名构造函数),需要用factory-bean配置类名,factory-method配置构造函数名称;如果构造函数有参数,需要用<constroctor-arg><ref bean =”yetBean”/></constroctor-arg>配置参数;
  726. 单态模式singleton,默认为单态模式,非单态模式需要设置bean属性singleton=“false”;
  727. 属性设置,通过<property name=””, value=””></property>配置,Spring根据set方法设置;
  728. <bean id="dataSource"//id和class必须
  729. class="org.apache.commons.dbcp.BasicDataSource"
  730. <constroctor-arg><ref bean =”yetBean”/><constroctor-arg>//配置构造函数的两个参数,一个bean参数,一个数值参数, ref表示引用配置文件中其他的bean;yetBean为id
  731. <constroctor-arg><value>1</value></constroctor-arg>
  732. destroy-method="close" (关闭方法,析构函数)singleton=”true”>//单态模式
  733. <property name="driverClassName" value="com.mysql.jdbc.Driver" />//配置属性
  734. <property name="url"
  735. value="jdbc:mysql://localhost:3306/spring?characterEncoding=UTF-8" />
  736. <property name="username" value="root" />
  737. <property name="password" value="admin" />
  738. </bean>
  739. 配置list、set、map属性
  740. <property name="interceptorNames">//list属性配置
  741. <list>
  742. <value>aopMethodBeforeInterceptor</value>
  743. <value>aopMethodAfterInterceptor</value>
  744. <value>aopThrowsInterceptor</value>
  745. </list>
  746. </property>
  747. <property name="interceptorNames">
  748. <set>//set属性配置
  749. <value>aopMethodBeforeInterceptor</value>
  750. </set>
  751. </property>
  752.  
  753. <property name="someMap">
  754. <map>//map属性配置
  755. <entry key="yup an entry">//map键值对的键
  756. <value>just some string</value>//map键值对的值
  757. </entry>
  758. <entry key-ref="myDataSource">//bean map
  759. <ref bean="myDataSource" />
  760. </entry>
  761. </map>
  762. </property>
  763. depend-on设置依赖关系,加载之前先加载依赖的对象;
  764. <bean id="personDao"
  765. class="com.helloweenvsfei.spring.dao.PersonDaoImpl"
  766. depends-on="dataSource" init-method="initDatabase">//依赖关系和初始化方法
  767. <property name="dataSource" ref="dataSource"></property>
  768. </bean>
  769. 27.3属性自动装填autowire
  770. <bean id="d" class="examples.D" autowire="byType"></bean>设置bean为自动装填后,会根据设置的规则去自动设置,不用<property name=”” value=””>设置;
  771. 27.4依赖检查dependency
  772. 检查bean的属性是否被设置,还可以设置为no、simple、object、all;
  773. <bean id="bean" class="examples.Bean" dependency-check="all"></bean>,
  774. 27.5Bean的高级特性
  775. 继承Spring的一些接口BeanNameAware和BeanFactoryAware,设置或获取bean的id、BeanFactory和初始化和销毁函数,但是会使程序与Spring耦合,依赖Spring的类库;
  776. 27.6BeanFactory高级特性
  777. 如果实现了BeanFactoryAware接口,可以获取BeanFactory对象,可以调用他的方法判断是否包含Bean,获取指定名称的bean,是否配置为singleton等;
  778. 第28章 Spring的AOP模块
  779. 28.1拦截器的使用
  780. AOP是面向切面的编程方法,将一个业务流程分成几部分实现,再组装成一个完整的流程;
  781. 先定义IAopServiceAop.java接口,定义两个函数withaop和withoutaop;创建IAopServiceAopImpl.java实现类,实现两个方法;创建文件*interceptor.java实现MethodBeforeAdvice、AfterReturningAdvice、ThrowsAdvice接口,实现三种拦截器;在配置文件ApplicationContext.xml中配置三种拦截器和拦截的方法,配置service对象,并采用list配置三种拦截器;在main函数中执行方法;
  782. Spring无法将service实现类和拦截器直接组装,需要把拦截器安装到代理类NameMatchMethodPointcutAdvisor,把自定义的Service安装到ProxyFactoryBean中,
  783. <!-- 拦截器 在 withAop() 方法前运行 -->
  784. <bean id="aopMethodBeforeInterceptor"
  785. class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
  786. <property name="advice">
  787. <bean
  788. class="com.helloweenvsfei.spring.aop.MethodBeforeInterceptor" />
  789. </property>
  790. <property name="mappedName" value="withAop"></property>
  791. </bean>
  792.  
  793. <!-- 拦截器 在 withAop() 返回后运行 -->
  794. <bean id="aopMethodAfterInterceptor"
  795. class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
  796. <property name="advice">
  797. <bean
  798. class="com.helloweenvsfei.spring.aop.MethodAfterInterceptor" />
  799. </property>
  800. <property name="mappedName" value="withAop"></property>
  801. </bean>
  802.  
  803. <!-- 拦截器 在异常抛出后运行 -->
  804. <bean id="aopThrowsInterceptor"
  805. class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
  806. <property name="advice">
  807. <bean
  808. class="com.helloweenvsfei.spring.aop.ThrowsInterceptor" />
  809. </property>
  810. <property name="mappedName" value="withAop"></property>
  811. </bean>
  812. <bean id="aopService"
  813. class="org.springframework.aop.framework.ProxyFactoryBean">
  814. <!-- 拦截器 -->
  815. <property name="interceptorNames">
  816. <list>//用list配置三种拦截器
  817. <value>aopMethodBeforeInterceptor</value>
  818. <value>aopMethodAfterInterceptor</value>
  819. <value>aopThrowsInterceptor</value>
  820. </list>
  821. </property>
  822. <!-- 被拦截的对象 -->
  823. <property name="target">
  824. <bean
  825. class="com.helloweenvsfei.spring.aop.AopServiceImpl">
  826. <!--
  827. <property name="name"><null /></property>
  828. <property name="name" value="Helloween"></property>
  829. -->
  830. </bean>
  831. </property>
  832. </bean>
  833. 在main函数中执行函数
  834. package com.helloweenvsfei.spring.aop;
  835. import org.springframework.beans.factory.xml.XmlBeanFactory;
  836. import org.springframework.core.io.ClassPathResource;
  837. public class AopRun {
  838. public static void main(String[] args) throws Exception {
  839. XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource(
  840. "applicationContext.xml"));
  841. IAopService hello = (IAopService) factory.getBean("aopService");
  842. hello.withAop();
  843. hello.withoutAop();
  844. factory.destroySingletons();
  845. }
  846. }
  847.  
  848. 28.2拦截器和Filter区别
  849. 两者都是基于AOP的编程思想;在程序应用范围、使用容器、使用资源、使用深度上有所区别;Filter只能用于web程序,拦截器还可以用于Application和swing;filter适用Servlet容器,拦截器适用于Spring容器;拦截器可以使用的资源更多;filter只能在servlet前后使用,Spring更深入,能在方法前后使用;
  850.  
  851. 第29章 Spring的DAO模块
  852. 29.1数据库操作封装
  853. Spring对jdbc进行了封装,不需要进行数据库连接和事物提交等工作;直接用jdbcTemplate执行SQL语句;
  854. 实现步骤 定义Person.java文件实现Person类,定义属性和set、get方法;创建IPersonDao.java文件,定义操作接口;创建PersonDaoImpl.java文件,实现IPersonDao接口并继承与JdbcDaoSupport类,实现接口函数是对象与数据库的映射关系,并定义初始化initDateBase()函数用于创建数据库表格,JdbcDaoSupport类封装了数据库连接和任务,通过jdbcTemplate执行sql语句,getJdbcTemplate()获取对象,调用方法queryForList(sql),update(sql,new object[]{});在ApplicationContext.xml配置文件中配置数据源,即数据库的类型、名称、url、登陆用户名和密码等信息;在配置文件的DAO中配置数据源和初始化函数;运行程序,创建DaoRun.java文件,在main函数中创建BeanFactory对象,加载
  855. 29.2实体对象与数据库映射
  856. 继承MappingSqlQurry抽象类,实现mapRow接口,接口内将查询结果赋值给对象,需要调用setDateSource()、setsql()函数设置数据源和sql语句,调用compile()执行编译,调用declareParameter()设置参数,调用execute()返回结果;
  857. ApplicationContext.xml文件,获取IPersonDao对象,调用对象的函数实现对象到数据库的操作;
  858. package com.helloweenvsfei.spring.dao;
  859. import java.sql.ResultSet;
  860. import java.sql.SQLException;
  861. import org.springframework.jdbc.object.MappingSqlQuery;
  862. public class PersonMappingQuery extends MappingSqlQuery {
  863. @Override
  864. protected Object mapRow(ResultSet rs, int columnIndex) throws SQLException {
  865. Person person = new Person();
  866. person.setId(rs.getInt("id"));
  867. person.setName(rs.getString("name"));
  868. person.setSex(rs.getString("sex"));
  869. person.setAge(rs.getInt("age"));
  870. person.setBirthday(rs.getTimestamp("birthday"));
  871. return person;
  872. }
  873. }
  874.  
  875. 继承SqlUpdate类,执行SQL更新语句。继承SqlDunction返回单一结果;
  876. 29.3Spring的事物管理
  877. Spring默认在DAO的方法上加事物,一个方法算一个事物;但是一个方法执行失败不会让上一个方法回滚;
  878. 先配置一个事物管理者jdbcTransactionManager,传入数据源信息,在ApplicationContext.xml按照bean配置;为事物管理者配置事物属性transactionAttributeSource;为IPersonDao类配置管理者和管理属性;run方法中某个调用函数失败,整个run方法会回滚;
  879. <!-- JDBC 事务管理 -->
  880. <bean id="jdbcTransactionManager"
  881. class="org.springframework.jdbc.datasource.DataSourceTransactionManager">//事物管理者
  882. <property name="dataSource" ref="dataSource"></property>
  883. </bean>
  884. <!-- 为所有的方法配置事务 -->
  885. <bean id="transactionAttributeSource"
  886. class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
  887. <property name="properties">
  888. <props>
  889. <prop key="*">PROPAGATION_REQUIRED</prop>
  890. </props>
  891. </property>
  892. </bean>
  893.  
  894. <!--
  895. <bean id="transactionRun"
  896. class="com.helloweenvsfei.spring.dao.TransactionRun">
  897. <property name="personDao" ref="personDao"></property>
  898. </bean>
  899. -->
  900.  
  901. <!-- TransactionRun ,被管理的对象-->
  902. <bean id="transactionRun"
  903. class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  904. <property name="transactionManager"
  905. ref="jdbcTransactionManager" />
  906. <property name="target">
  907. <bean
  908. class="com.helloweenvsfei.spring.dao.TransactionRun">
  909. <property name="personDao" ref="personDao"></property>
  910. </bean>
  911. </property>
  912. <property name="transactionAttributeSource"
  913. ref="transactionAttributeSource" />
  914. </bean>
  915. 第30章 Spring的ORM模块
  916. 30.1Spring保存实体类
  917. Spring封装了hibernate的Session和transation,内部管理这些资源;让用户只需关心对象与数据库之间的关系映射(Object-Relational Mapping);
  918. 使用步骤
  919. 创建Cat.java文件,定义Cat实体类,加注解;创建ICatDao.java文件定义ICatDao接口;创建CatDaoImpl.java文件实现ICatDao接口并继承HibernateDaoSupport类,该类提供HibernateTemplate对象对实体类进行操作;
  920. package com.helloweenvsfei.spring.orm;
  921. import java.util.List;
  922. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
  923. public class CatDaoImpl extends HibernateDaoSupport implements ICatDao {
  924. public void createCat(Cat cat) {
  925. this.getHibernateTemplate().persist(cat);
  926. }
  927. public Cat findCatByName(String name) {
  928. List<Cat> catList = this.getHibernateTemplate().find(
  929. " select c from Cat c where c.name = ? ", name);
  930. if (catList.size() > 0)
  931. return catList.get(0);
  932. return null;
  933. }
  934. public int getCatsCount() {
  935. return (Integer) this.getSession(true).createQuery(
  936. " select count(c) from Cat c ").uniqueResult();
  937. }
  938. public List<Cat> listCats() {
  939. return this.getHibernateTemplate().find(" select c from Cat c ");
  940. }
  941. }
  942. 30.2Spring中配置Hibernate
  943. 需要在ApplicationContext.xml中配置数据源、SessionFactory及CatDaoImpl、实体类;先配置数据源,然后配置SessionFactory,在SessionFactory中配置数据源,和加载的实体类路径和实体类名称,最后配置实体类操作类DAOImpl,设置SessionFactory属性;也可以加载配置文件配置的实体类;
  944. <bean id="dataSource"配置数据源
  945. class="org.apache.commons.dbcp.BasicDataSource"
  946. destroy-method="close">
  947. <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  948. <property name="url"
  949. value="jdbc:mysql://localhost:3306/spring?characterEncoding=UTF-8" />
  950. <property name="username" value="root" />
  951. <property name="password" value="admin" />
  952. </bean>
  953. <!-- Spring SessionFactory -->配置SessionFactory
  954. <bean id="sessionFactory"
  955. class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
  956. destroy-method="destroy">
  957. <property name="dataSource" ref="dataSource" />
  958. <property name="annotatedPackages"配置实体类的加载路径
  959. value="classpath:/com/helloweenvsfei/spring/orm">
  960. </property>
  961. <property name="annotatedClasses">配置实体类
  962. <list>
  963. <value>com.helloweenvsfei.spring.orm.Cat</value>
  964. </list>
  965. </property>
  966. <property name="hibernateProperties">配置Hibernate属性
  967. <props>
  968. <prop key="hibernate.dialect">
  969. org.hibernate.dialect.MySQLDialect
  970. </prop>
  971. <prop key="hibernate.show_sql">true</prop>
  972. <prop key="hibernate.format_sql">false</prop>
  973. <prop key="hibernate.hbm2ddl.auto">create</prop>
  974. </props>
  975. </property>
  976. </bean>
  977.  
  978. <bean id="catDao"
  979. class="com.helloweenvsfei.spring.orm.CatDaoImpl">
  980. <property name="sessionFactory" ref="sessionFactory"></property>设置SessionFactory
  981. </bean>
  982. 30.3管理Hibernate事物
  983. Spring默认在DAO层添加事物,每个方法一个事物。在DAO层添加service,在service层添加事物;
  984. 先定义一个HibernateTransactionManager管理器,在管理器中添加SessionFactory;然后添加事物管理规则,为所有的方法添加事物;借助Spring的代理类TransactionProxyFactoryBean,为DAOimpl配置事物管理器和管理规则
  985. <bean id="hibernateTransactionManager"配置事物管理器
  986. class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  987. <property name="sessionFactory" ref="sessionFactory" />配置SessionFactory
  988. </bean>
  989. <bean id="hibernateTransactionAttributeSource"//配置事物管理规则
  990. class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">//使用代理类
  991. <property name="properties">
  992. <props>
  993. <prop key="*">PROPAGATION_REQUIRED</prop>//所有方法加上事物
  994. </props>
  995. </property>
  996. </bean>
  997.  
  998. <bean id="catService"
  999. class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  1000. <property name="transactionManager"
  1001. ref="hibernateTransactionManager">
  1002. </property>
  1003. <property name="target">
  1004. <bean
  1005. class="com.helloweenvsfei.spring.orm.CatServiceImpl"> CatServiceImpl不能直接加事物,需要借助TransactionProxyFactoryBean代理类
  1006. <property name="catDao" ref="catDao"></property>//设置DAO依赖关系catDao是.CatServiceImpl的一个属性
  1007. </bean>
  1008. </property>
  1009. <property name="transactionAttributeSource"
  1010. ref="hibernateTransactionAttributeSource">
  1011. </property>
  1012. </bean>
  1013.  
  1014. 第31章 Spring的web模块
  1015. 31.1整合strut1.x:继承方式
  1016. CatAction直接继承ActionSupport类,GetWebApplicationContext().getBean(“iCatService”)先获取beanFactory,然后再获取各种资源;在CatAction中添加execute方法,作为action的主方法,根据action的动作执行方法;然后在struts配置文件中配置action对应的文件名称。
  1017. Spring和struts需要配置到web.xml文件中,Spring要配置ApplicationContext.xml的位置,以及加载配置文件的ContextLoadLisener
  1018.  

自己编了一个股票监控软件,有如下功能,有兴趣的朋友可以下载;


(1)   个股监测。监测个股实时变化,可以监测个股大单交易、急速拉升和下降、主力入场和出场、股票最高点和最低点提醒。检测到最高点、最低点、主力进场点、主力退场点、急速拉升点、急速下跌点,给出语音或者声音提醒,不用再时刻看着大盘了,给你更多自由的时间;


(2)   大盘监测。监测大盘的走势,采用上证、深证、创业三大指数的综合指数作为大盘走势。并实时监测大盘的最高点和最低点、中间的转折点。


(3)   股票推荐。还能根据历史数据长期或短期走势进行分析,对股市3千多个股票进行分析对比,选出涨势良好的股票,按照增长速度从大到小排序,推荐给你涨势良好的股票;


下载地址:


1.0.3版本(修复大盘指数崩溃缺陷)下载地址:


链接:https://pan.baidu.com/s/1BJcTp-kdniM7VE9K5Kd3vg 提取码:003h


更新链接:


https://www.cnblogs.com/bclshuai/p/10621613.html

 

java web 整合开发王者归来学习总结的更多相关文章

  1. [Java Web整合开发王者归来·刘京华] 1、 Java Web开发

      目录: 1.Web技术简介 2.动态网站与静态网站 3.Java Web开发模式 4.JavaScript简介 1.Web技术简介 PS: 最近还有更凶残的技术,即整个操作系统都是基于Web的,如 ...

  2. Java Web整合开发王者归来(JSP + Servlet + Struts + Hibernate + Spring) - 读书笔记

    第1章 状态码表示响应类型: 保留 表示请求成功地接收 完成请求客户需进一步细化请求 客户错误 服务器错误 Web服务器: Apache服务器,特长是处理静态页面,效率非常高. Tomcat提供对JS ...

  3. [Java Web整合开发王者归来·刘京华] 2、 Java Web开发概述

    1.Web相关概念 1-1.胖客户与瘦客户 >_<" RCP的定义及优缺点:       >_<"TCP的定义及优缺点:             1-2.B ...

  4. 《轻量级Java Web整合开发入门SSH》 - 快速理解Java框架的又一积木

           学习JAVA不难,难的是没有多余的时间给你仔细学习.       伴随着项目的不断跟进,责任重于泰山,必须快速提升.       我不能期望把一本书或者一个项目完全吃透,只希望能用数量去 ...

  5. Java Web整合开发实战:基于Struts 2+Hibernate+Spring 目录

    第1篇 Java Web开发基础第1章 Web的工作机制( 教学视频:31分钟) 1.1 理解Web的概念 1.1.1 Web的定义 1.1.2 Web的三个核心标准 1.2 C/S与B/S两种软件体 ...

  6. Java Web整合开发(79) -- Struts 2

    一. Struts 2.x 概述 不继承任何类的Action Struts 2的Action并不一定要实现Action接口或者继承ActionSupport,任何POJO都可以做Action,只要这个 ...

  7. Java Web整合开发(3) -- Servlet

    Servlert基本程序架构: (FirstServlet.java + web.xml) FirstServlet.java package com.helloben.servlet; import ...

  8. Java Web整合开发(14) -- Struts 1.x 概述

    整合Spring与Struts1的三种方法总结 无论用那种方法来整合,第一步就是要装载spring的应用环境,有三种方式: #1. struts-config.xml <?xml version ...

  9. Java Web整合开发(78) -- Struts 1

    在Struts1.3中已经取消了<data-sources>标签,也就是说只能在1.2版中配置,因为Apache不推荐在 struts-config.xml中配置数据源.所以建议不要在st ...

随机推荐

  1. Linux批量处理文件脚本

    Linux shell字符串截取与拼接 一 Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.linuxidc.com/123.htm 1  # 号截取,删除左边 ...

  2. hihocoder-1079题解(线段树+离散化)

    一.题目链接 http://hihocoder.com/problemset/problem/1079 二.题意 给定一个长度为L的区间,给你n个子区间,没一个区间涂成一种颜色,问最后这个区间内有几种 ...

  3. 【JavaScript for循环实例】

    1.大马驮2石粮食,中马驮1石粮食,两头小马驮一石粮食,要用100匹马,驮100石粮食,该如何调配? //驮100石粮食,大马需要50匹 for(var a=0;a<=50;a++){ //驮1 ...

  4. set使用实例1+lower_bound(val)(个人模版)

    set使用实例1+lower_bound(val): #include<stdio.h> #include<set> #include<iostream> #inc ...

  5. [bzoj1806] [ioi2007]Miners 矿工配餐

    相当于noip前两题难度的ioi题........ 还是挺好想的...算是状压一下?...两个二进制位可以表示三种食物或者没有,所以用四个二进制位表示某个煤矿最近两餐的情况... 先把各种情况加上各种 ...

  6. Apache Shiro 核心概念

    转自:http://blog.csdn.net/peterwanghao/article/details/8015571 Shiro框架中有三个核心概念:Subject ,SecurityManage ...

  7. for语句,你真正搞懂了吗?

    今天看书时,无意间看到了这个知识点,啥知识点?也许在各位大神看来,那是再简单不过的东西了. 说来惭愧.原来直到今天我才真正搞懂for语句. for语句的结构如下所示: for(语句A;语句B;语句C) ...

  8. eclipse配置虚拟路径后,每次启动tomcat都会虚拟路径失效的问题解决

    由于,eclipse启动tomcat部署项目并不是直接把项目放到tomcat的webapps目录下的,而是从我们在eclipse配置的外部tomcat中取出二进制文件,在eclipse内部插件中作为t ...

  9. WdatePicker时间插件

    next_door_boy CnBlogs Home New Post Contact Admin Rss Posts - 14  Articles - 5  Comments - 0  WdateP ...

  10. Python3 的函数

    1.编写power(x,y)函数返回x的y次幂值 def power(x,y): return x**y 2.求最大公约数 def gcd(x,y): r=x%y x=y y=r if r==0: p ...