简述JEE
JEE : JAVA PLATFORM ENTERPRISE EDITION
JEE是一个规范集;
JEE是一个框架集;
JEE是一个技术集或API集;
适用于创建服务器端的大型的软件服务系统
C/S B/S 模式
C/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)
B/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算
企业级应用(大规模的应用)的特点
1.生命周期长、稳定、可靠
2.组件往往分布在异构的环境中,能够跨平台
3.维护性、扩展性、重用性
4.有事务、安全、线程
什么是业务逻辑?
依照业务逻辑划分模块,
所谓判定业务 就是具有以下特征:
1.业务流程
2.业务判断
3.功能组合
平台(角色)的划分
1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)
2.组件供应商
3.组件装配人员
4.部署人员
5.系统管理人员
6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)
java技术分布(设计架构 模块内部设计)
1.表现层 Servlet、 Jsp、 JavaBean、 Taglib
2.逻辑层 EJB(SessionBean)
3.数据层 ( JDBC EJB(EntityBean))
4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)
5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)
JAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))
JEE的体系结构: 是一种组件的体系结构
1.组件 : 能够完成一定功能的封状体(独立的功能的集合)
不能单独运行,必须运行在容器上
分为两类:web组件、ejb组件
2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)
管理组件的生命周期
不能单独运行,必须运行在服务器上
程序(组件)通过上下文来调用容器(context)
组件通过web.xml向容器描述自己,使容器能够认识组件
容器通过回调方法来调用组件
分为两类:web容器、ejb容器
3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务
web服务器(只提供web服务)
jee服务器(提供web、jee服务)
什么是回调方法
由容器自动调用的方法,就叫回调方法。
RMI远程方法的调用机制
例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法
学习方法
1.规范(熟记) 2.熟悉API 3.多练 4.多想 Servlet
[*] 描述war包、jar包、ear包的结构
war- web文档压缩包—WEB-INF—-web.xml web应用部署文件—-lib 本web应用需要的jar包(可选)—-classes 本web应用需要的类文件(可选)
jar- java文件压缩包—META-INF—-*.MF java包的启动和描述文件
ear- 企业资源包/企业应用包–META-INF—Application.xml 配置文件–*.war–*.jar
[*]什么是servlet?servlet主要做什么?
Servlet是运行在服务器端的小应用程序,是接收网络服务的请求和产生响应的一种方式。servlet的功能:接受http请求,产生动态http响应。
[*]servlet 与cgi相比的优点?servlet的缺点
优点:性能(线程比进程更快)可伸缩Java强健且面向对象Java平台独立缺点:处理代码(业务逻辑)与HTML(表现逻辑)混合在一起
[*]常用的servlet包的名称是?
javax.servletjavax.servlet.http
[*]描述servlet接口的层次结构?
Servlet–GenericServlet–HttpServlet–自己的servletServletRequest–HttpServletRequestServletResponse–HttpServletResponse
[*]对比get方法和post方法?
get方法: 请求对服务器没有负面影响,Form数据量小,提交的数据在url中可见;明文传输,安全度低,不可以传输中文。post方法:请求的数据过程改变服务器的状态,Form数据量大,提交的数据在url中不可见,安全度高。可以传输中文;
[*]归类描述HttpServletRequest接口都完成那些功能
[*]读取HTTP头标
[*]读取cookie
[*]读取路径信息
[*]标识HTTP会话。
[*]归类描述HttpServletResponse接口都完成那些功能
[*]设置HTTP头标
[*]设置cookie
[*]设定响应的content类型
[*]输出返回数据
[*]描述service方法所完成的基本功能?默认是在那里实现的?
基本功能:service方法是在servlet生命周期中的服务期,根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法实现:默认在HttpServlet类中实现
[*]如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作
1.引jar包1)构建开发环境: 新建工程,把tomcat下lib文件夹下的servlet-api.jar引入到Eclipse的工程中2.开发servlet类1)首先继承HttpServlet2)重写 doGet( ) doPost( )3.部署安装web服务器,例如Tomcat在Tomcat的webapps目录下新建一个文件夹作为web应用的根 在根下新建一个名为WEB-INF的文件夹,里面建立一个web.xml的文件、一个classes的文件夹、一个lib文件夹 按照servlet的DTD配置web.xml文件把编译好的servlet的class文件复制到classes目录下lib文件存放程序所需要的jar包4.启动服务器
[*]为何servlet需要部署描述?
servlet需要配置web.xml文件来使容器认识servlet程序(web组件)
[*]Servlet基本的描述应该是?请写出来
<servlet><servlet-name>Hello</servlet-name><servlet-class>com.javakc.web.action.MyServlet</servlet-class></servlet><servlet-mapping><servlet-name>Hello</servlet-name><url-pattern>/greeting</url-pattern></servlet-mapping>
[*]如何在html中使用servlet
FORM标记ACTION– 指定form信息的目的地(相关的URL)METHOD – 指定HTTP方法(GET或POST)语法:<FORM ACTION=’servlet-URL’ METHOD=’{GET|POST}’>{HTML form tags and other HTML content}</FORM>
[*]如何接受request中的参数
String userName = request.getParameter(“userName”)方法
[*]如何接受request中header的值
request.getHeader(name);request.getIntHeader(name);request.getDateHeader(name);request.getHeaderNames();
[*]如何输出html
PrintWriter pw = response.getWriter();pw.write(“<html>”);pw.write(“Hello”);pw.write(“</html>”);
[*]如何设置输出的contentType
response.setContentType(“text/html”)
[*]描述servlet的生命周期?
生命周期是指servlet实例在web容器中从:首次创建调用init方法开始初始化期,经过service方法运行期,一直到destory方法销毁期 结束。servlet实例的生命周期由web容器来管理。
[*]描述init,service,destroy方法的功能和特点
init方法: 是在servlet实例创建时调用的方法,用于创建或打开任何与servlet相的资源和初始化servlet的状态,Servlet规范保证调用init方法前不会处理任何请求 service方法:是servlet真正处理客户端传过来的请求的方法,由web容器调用,根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法destory方法:是在servlet实例被销毁时由web容器调用。Servlet规范确保在destroy方法调用之前所有请求的处理均完成,需要覆盖destroy方法的情况:释放任何在init方法中打开的与servlet相关的资源存储servlet的状态
[*]什么是回调方法?有什么特点?
由容器来调用程序的方法由容器来决定什么时候来调
[*]如何设置初始化servlet的参数?
在<servlet>中添加如下配置
<init-param><param-name>greetingText</param-name><param-value>Hello</param-value></init-param>
[*]如何获取servlet初始化的参数
public void init() {greetingText = getInitParameter(“greetingText”);System.out.println(“>> greetingText = ‘” + greetingText + “‘”);}
[*]ServletConfig接口默认实在那里实现的
GenericServlet类实现ServletConfig接口
[*]什么是ServletContext?有什么作用?
Servlet上下文ServletContext对象是Web应用的运行时表示,约等于整个web应用;可通过其实现Web应用中的资源共享
[*]如何访问ServletContext接口?是在那里实现的?
在Servlet的实现类中通过this.getServletContext()方法访问。GenericServlet类实现了ServletContext接口。
[*]ServletContext接口的功能包括?分别用代码示例
只读初始化参数: getInitParameter(name:String) : StringgetInitParameterNames() : Enumeration读写访问应用级属性:getAttribute(name:String) : ObjectsetAttribute(name:String, value:Object)getAttributeNames() : Enumeration只读访问文件资源: getResource(path) : URLgetResourceAsStream(path) : InputStream写web应用日志文件:log(message:String)log(message:String, Throwable:excp)
[*]如何设置ServletContext的参数?
<context-param><param-name>catalogFileName</param-name><param-value>/WEB-INF/catalog.txt</param-value></context-param>
[*]如何获取ServletContext设置的参数值?
ServletContext context = this.getServletContext();String catalogFileName = context.getInitParameter(“catalogFileName”);
[*]描述Web应用的生命周期?
Web容器启动时,初始化每个Web应用Web容器关闭时,销毁每个Web应用可以创建”监听器”对象触发这些事件;
[*]如何用代码实现监控Web应用的生命周期?
public class Test implements ServletContextListener{public void contextDestroyed(ServletContextEvent arg0) {System.out.println(“web 容器销毁了+++++”);}public void contextInitialized(ServletContextEvent arg0) {System.out.println(“web 容器启动了+++++”);}}
web.xml文件中的配置:<listener><listener-class>com.csy.Test</listener-class></listener>
[*]web应用中如下错误码示什么意思:400,401,404,500
400 Bad Request//错误请求401 Unauthorized//未被认可404 Not Found//没有创建500 Internal Server Error//服务器内部错误
[*]描述Web应用中用声明方式来进行错误处理的两种方法
使用error-page元素声明一个给定HTTP状态码的处理器<error-page><error-code>404</error-code><location>/error/404.html</location></error-page>可以声明任意数量的错误页面,但一个给定的状态码只能对应一个页面使用exception-type元素声明给定Java异常的处理器<error-page><exception-type>java.lang.ArithmeticException</exception-type><location>/error/ExceptionPage</location></error-page>可以声明任意数量的错误页面,但一个给定的异常类型只对应一个页面不能使用父类捕获多种异常
[*]描述记录异常日志的方法,都位于那些接口?
GenericServlet:log(message:String)log(message:String, Throwable:excp)ServletContext:log(message:String) log(message:String, excp:Throwable)
[*]什么是会话?
Web容器可为每个用户保存一个”会话对象”,用来存储特定用户的会话信息。
[*]如何获得会话?
HttpSession session = request.getSesseion( );
[*]会话Api的基本功能?
getID() :String
isNew() :boolean
getAttribute(name):Object
setAttribute(name,value)
removeAttribute(name)
[*]如何销毁会话?
1、可使用部署描述符控制所有会话的生命周期<session-config>
<session-timeout>10</session-timeout>
</session-config>
2、可使用控制特定会话对象的生命周期HttpSession接口invalidate()
getCreationTime() :long
getLastAccessedTime() :long
getMaxInactiveInterval() :int
setMaxInactiveInterval(int)
[*]描述会话保持状态的基本原理
client server
http://www.mianwww.com/wp-content/uploads/2014/05/051314_1254_Java8.pngrequest
http://www.mianwww.com/wp-content/uploads/2014/05/051314_1254_Java9.pnghttp://www.mianwww.com/wp-content/uploads/2014/05/051314_1254_Java10.pnghttp://www.mianwww.com/wp-content/uploads/2014/05/051314_1254_Java11.pnghttp://www.mianwww.com/wp-content/uploads/2014/05/051314_1254_Java12.pnghttp://www.mianwww.com/wp-content/uploads/2014/05/051314_1254_Java13.pngresponse (sessionid)
http://www.mianwww.com/wp-content/uploads/2014/05/051314_1254_Java14.pnghttp://www.mianwww.com/wp-content/uploads/2014/05/051314_1254_Java15.pnghttp://www.mianwww.com/wp-content/uploads/2014/05/051314_1254_Java16.pnghttp://www.mianwww.com/wp-content/uploads/2014/05/051314_1254_Java17.pnghttp://www.mianwww.com/wp-content/uploads/2014/05/051314_1254_Java18.png request (cookies)
当客户端第一次请求时,服务器创建一个session与request绑定,用响应对象response来返回sessionid 放到客户端的cookies中存储下来,下次在发送请求时,直接根据sessionid来检索服务器的会话(每次请求都会将所有的cookies带到服务器端)
[*]请描述session和cookie的异同之处
[*]如何读写cookie,代码示例
写: Cookie c = new Cookie(“yourname”, name);response.addCookie(c);读:Cookie[] cookies = request.getCookies();
for ( int i=0; i < cookies.length; i++ ) {
String key =cookies.getName();
String value = cookies.getValue();
System.out.println(“cook”+i+“:key=”+key+“,value=”+value);
}
[*]什么是URL重写,如何实现,代码示例
Cookie不能使用时,可使用URL重写 request.encodeURL();客户在每个URL的后面追加额外的数据服务器将此标识符与其存储的有关会话数据相关联http://host/path/file;jsessionid=123
[*]描述web应用的4种认证技术
BASIC – Web浏览器接收用户名和口令,将其以明码方式发送给Web服务器DIGEST – Web浏览器接收用户名和口令,使用加密算法将此数据发送给Web服务器FORM – Web应用提供发送给Web浏览器的HTML formCLIENT-CERT – Web容器使用SSL验证用户,服务端和客户端的链路保护
[*]什么是授权,什么是验证?
授权是根据用户角色划分web资源的过程,其标识web应用中的安全域 分配权限web容器使用厂商指定的机制验证用户的角色 匹配权限
[*]什么是HTTPS
HTTPS (Secure Hypertext Transfer Protocol) 是使用SSL协议的HTTP
[*]什么是审计?
也就是访问跟踪,是为web应用的每次访问保留记录的过程
[*]如何实现声明性授权
1、标识web资源集2、标识角色3、将web资源集影射到角色4、标识每个角色中的用户在 web.xml里配
[*]描述servlet并发问题?
多个同类线程运行,可以共享同一个Servlet实例,共享的数据和资源未合理同步,可能会引起数据的冲突
[*]描述Web应用中的六种属性范围
局部变量(页面范围)实例变量类变量请求属性(请求范围)会话属性(会话范围)上下文属性(应用范围)
[*]指出上述六种哪些是线程安全的
局部变量和请求属性
[*]什么是STM?如何实现?
SingleThreadModel接口可以实现SingleThreadModel接口保证某一时刻只有一个请求执行service方法
[*]如何实现并发管理?
尽可能使用局部和请求属性使用synchronized语法控制并发尽可能减少同步块和同步方法的使用使用正确设置了线程安全的资源类
Jsp
什么是Jsp?
Java Server Page 结合java和html在服务端动态生成web页面的技术
描述Jsp页面的运行过程?
第一步:
请求进入Web容器,将JSP页面翻译成Servlet代码
第二步:
编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境
第三步:
Web容器为JSP页面创建一个Servlet类实例,并执行jspInit方法
第四步:
Web容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户
描述Jsp页面的五类脚本元素的功能、写法、并示例
注释 <%– –%>
<HTML>
<%– scripting element –%>
</HTML>
指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段
<%@ page session=”false” %>
声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明
<%! public static final String DEFAULT_NAME = “World”; %>
脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码
<% int i = 0; %>
表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>
描述Jsp页面中的注释种类和写法
HTML注释
<!– HTML注释显示在响应中 –>
JSP页面注释
<%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>
Java注释
<%
/* Java注释显示在servlet代码中,不显示在响应中
*/
%>
描述Jsp页面的指令标记的功能、写法、并示例
指令标记影响JSP页面的翻译阶段
<%@ page session=”false” %>
<%@ include file=”incl/copyright.html” %>
<%@ taglib %>
描述Jsp页面的声明标记的功能、写法、并示例
声明标记允许JSP页面开发人员包含类级声明
写法:
<%! JavaClassDeclaration %>
例:
<%! public static final String DEFAULT_NAME = “World”; %>
<%! public String getName(HttpServletRequest request) {
return request.getParameter(“name”);
}
%>
<%! int counter = 0; %>
描述Jsp页面翻译成Servlet的规则
jsp中的注释标记被翻译成Servlet类中的注释
jsp中的指令标记被翻译成Servlet类中的import语句等
jsp中的声明标记被翻译成Servlet类中的属性
jsp中的脚本标记被转移到Servlet类中service方法中的代码
jsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码
描述Jsp页面的九个预定义变量的功能、用法、并示例
request 与请求相关的HttpServletRequest对象
response 与送回浏览器的响应相关的HttpServletResponse对象
out 与响应的输出流相关的JspWriter对象
session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参
与一个HTTP会话时有意义
application 用于Web应用的ServletContext对象
config 与该JSP页面的servlet相关的ServletConfig对象
pageContext 该对象封装了一个JSP页面请求的环境
page 该变量与Java编程语言中的this变量等价
exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用
page指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding
import import 定义了一组servlet类定义必须导入的类和包,值是一个由
逗号分隔的完全类名或包的列表。
session session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)
或false。
buffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为
none或Nkb,缺省为8KB或更大。
errorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常
isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或
false(缺省)。
ContentType 定义输出流的MIME类型,缺省为text/html。
pageEncoding 定义输出流的字符编码,缺省为ISO-8859-1
描述MVC各部分的功能?MVC的优点?MVC的缺点?
MVC各部分的功能:
Model(模型表示企业数据和业务逻辑)
封装应用状态
响应状态查询
暴露应用的功能
Controller(控制器接受用户的输入并调用模型和视图去完成用户的需求)
验证HTTP请求的数据
将用户数据与模型的更新相映射
选择用于响应的视图
View(视图是用户看到并与之交互的界面)
产生HTML响应
请求模型的更新
提供HTML form用于用户请求
MVC的优点:
低耦合性:视图层和业务层分离
高重用性和可适用性
较低的生命周期成本
快速的部署
可维护性
有利于软件工程化管理
提高软件的健壮性
MVC的缺点:
工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序
什么是Model 1结构,以及结构中各部分的功能
结构:jsp+javabean
Model1中使用jsp来处理web应用中的视图控制部分
Javabean收集参数
什么是JavaBean?
用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。
JavaBean的规则?
使用get和set方法定义属性
一个无参构造方法
无public实例变量( 所有属性私有化)
什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?
JSP页面中使用类似于XML的标记表示运行时的动作
jsp:useBean
jsp:setProperty
jsp:getProperty
jsp:param
jsp:include
jsp:forward
用代码示例如下标准动作的使用:useBean、getProperty、setProperty
<jsp:useBean
id=”myForms”
class=”com.base.mystruts.forms.MyActionForm” scope=”session” />
<jsp:setProperty name=”myForms” property=”name” />
<jsp:getProperty name=”myForms” property=”id” />
描述说明Bean的四种scope
page
request
session
application
描述说明页面上的字段和Bean中属性的对应规则
id 指javabean的变量名
class指javabean类的全路径
scope指javabean的应用范围
name指所用到的javabean的变量名
property指javabean中的属性
描述useBean动作的处理过程
使用id声明变量
试图在指定的范围内查找对象
如果没找到
创建一个类的实例
执行useBean标记体初始化对象
如果找到
将对象转换为类指定的类型
描述forward动作的功能
使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,
使用同一个request:
什么是Model 2结构,以及结构中各部分的功能
jsp+model+servlet
Model 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器
Servlet控制器:
验证HTML form数据
调用模型中的业务服务
存储请求(或会话)范围内的域对象
选择下一个用户的视图
JSP页面视图:
使用用户界面(在HTML中)
访问域对象
如何获得分发器?分发器的功能?
上下文对象中的分发器:
ServletContext context = this.getServletContext();
RequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);
servlet.forward(request, response);
请求对象中的分发器:
RequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);
view.forward(request, response);
可以将请求转发到另一个jsp页面,并保持请求的传递性
Jsp中页面跳转的两种方式?
使用分发器跳转页面
RequestDispatcher dispatcher = request.getRequestDispatcher(“url”);
dispatcher.forword(request);
特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);
转发的页面只能是同一个Web应用程序的其他Web组件
使用重定向跳转页面
response.sendRedirect(“url”);
特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);
重新定向的页面可以是任意的URL
描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?
<%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面
在这里可以共享变量
<jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个
页面,不可以共享变量
什么是自定义标记
自定义标记库是一个Web组件,
包括:
一个标记库描述符文件(*.tld)
所有相关的标记处理器类(*.jar)
描述使用自定义标记的步骤,以及每步详细的工作
使用自定义标记前,要拿到.tld和.jar两类文件
把.jar文件放到WEB-INF的lib里面。
把.tld文件放到WEB-INF根目录下。
在web.xml中配置。
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
在页面中引用。
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>
uri必须与web.xml中的uri对应
prefix是前缀,用来区分是哪一个taglib
使用标记
格式:<prefix:tag名称 属性>
<s:forEach > 在tomcat下配置数据源
1、服务器与数据库的连接
配置server.xml文件
1.oracle
<Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
url=”jdbc:oracle:thin:@127.0.0.1:1521:orcl”
driverClassName=”oracle.jdbc.driver.OracleDriver”
username=”aa”
password=”aa”
maxActive=”50″
maxIdle=”10″
maxWait=”-1″
/>
2.sqlserver
<Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
url=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;
DatabaseName=webpagetest”
driverClassName=”net.sourceforge.jtds.jdbc.Driver”
username=”aa”
password=”aa”
maxActive=”50″
maxIdle=”10″
maxWait=”-1″
/>
2、配置自己的web应用的xml文件
<Context path=”/eb03web” docBase=”F:/workweb/eb03web”
privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>
<ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>
</Context>
3、配置web.xml文件
与服务器建立连接
<resource-ref>
<res-ref-name>jdbc/company</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接
//1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,
System.setProperty(Context.PROVIDER_URL,””);
System.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);
//2.创建一个上下文对象
InitialContext context = new InitialContext();
//3.通过上下文对象在连接池中查找DataSource
DataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);
//4.通过数据源建立连接
ds.getConnection(); ORM对象关系型数据库映射
(Object Relation Mapping)
一、映射的特点
1.一个对象可以对应多个表
2.一个表可以对应多个对象
3.对象和表的关系不用完全对应
4.对象的属性的名称和表字段的名称可以不同
5.类型可以不同,但数据类型之间可以转换
6.对象中必须有主键,数据库的表对主键无所谓
7.数据库中有主外键关系时,对象中可以有,也可以没有
二 、有一个映射的描述文件————>xml
三 、怎样实现描述文件————>一段程序
对象 映射(mapping) 数据库
user
id=11
name=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)
age=25 <————(2) <————
(1)从对象映射到数据库
1.JDBC
2.根据描述文件来动态拼接sql
3.执行,添加到数据库中
(2)从数据库中映射到对象
1.JDBC
2.拼接查询sql
3.ResultSet
4.Model
hibernate
开发流程:
是什么?
hibernate是一种基于orm 的轻量级的框架
有什么?
1. session 保持连接状态(依赖事务和连接池)
2. Transaction事务
3.
Connection Provider 连接池
能干什么?
1.orm
2.提供操作数据库的接口,简化数据持久化的编程任务
怎么做?
1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下
2.O(vo)
3.R (关系型数据库中的表)
4.配置文件
4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml
a.与数据库的连接
b.可选配置
c.映射资源的注册
4.2 hbm.xml文件 名字与类名相同 并且与类放在一起
a. 对象与数据库表之间的映射
b. 对象的属性与数据库表的字段之间的映射
c.组件之间的映射
d.对象与对象之间的关系映射
5、客户端
1.得到SessionFactory
2.通过SessionFactory 工厂来创建Session实例
3.打开事务
4.操作数据库
5.事务提交
6.关闭连接
运行流程:
整体流程
1.通过configuration来读cfg.xml文件
2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)
3.通过SessionFactory 工厂来创建Session实例
4.打开事务
5.通过session的api操作数据库
6.事务提交
7.关闭连接
save
1.to—>po
2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件
3.根据hbm.xml文件和model来动态的拼sql
4.客户端提交或者刷新内存
5.执行sql,值放到数据库
update、delete
1.根据model 的id在内存hibernate的缓存中查找该对象
如果内存中没有就到数据库中查找来保证对象的存在
2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件
3.根据model和hbm.xml 文件来动态拼sql
4.客户端提交或者刷新内存
5.执行sql
Query
load
1.根据model的类型来找到hbm.xml文件
2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。
3.用id做为查询条件来动态拼sql
4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)
5.返回一个model类型的对象
get
1.根据model的类型来找到hbm.xml文件
2.用id做为查询条件来动态拼sql
3.执行sql 直接在数据库中查找,如果没有查到就会返回null
query
1.分析hql语句,得到model的类型
2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件
3.根据model和hbm.xml文件来动态拼sql
4.执行sql查询数据库
5.返回一个resultset
6.循环resultset的值,放到model中在放到集合(List)中
谈谈hibernate缓存机制
缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。
hibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。
对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。
| 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|
| | | |
| | | |
—————————————————————————————————
sessionFactroy级别的二级缓存
——————————————————————————————————————-
|
|
|
——————————————————————————————————————
DB
—————————————————————————————————————–
Spring
[*]是什么?
Spring是基于JEE的轻量级的应用框架
[*]有什么?
每个包的功能:Spring MVC:spring 本身提供的web 框架WEB:集成其他的web 应用的框架,或者说是对其他web应用框架的支持。如struts,webworkJEE :集成一系列的jee的技术(对JEE技术的支持)DAO:封装了JDBC;(对JDBC的支持)ORM:提供了对ORM工具的集成(支持)AOP :面向切面编成CORE:spring的核心包,提供bean的工厂和IOC容器
[*]能干什么?
把一系列的jee的技术有效的组合在一起形成以良好的系统
[*]怎么用?
[*]搭建web工程,引入spring的jar包
[*]在web.xml中添加如下配置
contextConfigLocation
classpath*:applicationContext*.xml
struts2
org.apache.struts2.dispatcher.FilterDispatcher
struts2
/*
org.springframework.web.context.ContextLoaderListener
[*]部署
[*]容器和bean
Bean :是指受spring的ioc管理的对象称为bean容器 :(与jee的容器类比)Jee :提供组件的运行环境和管理组件的生命周期(不能单独存在)Spring :提供bean的运行环境和管理bean的生命周期(可以单独存在)
[*]IOC控制反转
从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象
[*]IOC的优点
1.可以通过IOC来获得实例2.可以通过DI来获取注入的资源
[*]配置IOC的原则
[*]一定是可变的资源才采用依赖注入
[*]一定是层间的接口或者是模块之间的相互调用才采用依赖注入
[*]DI依赖注入
1. 应用程序依赖spring注入所需要的对象IOC和DI是对同一种事情的不同描述2.setter注入: 在配置文件中将接口的实现配置为bean在应用程序中注入bean例如:在配置文件中
在应用程序中Public DBDAO dao ;Public void setDao(DBDAO dao){This.dao = dao;}3.构造器注入
4.ref 表示参照其它的bean在参照的过程中一定要注意死循环5.自动装配———–〉no自动装配根据名字来匹配相应的bean 尽量不要去自动装配6.lookup注入7.singleton1.单例模式是整个的jvm中只有一个实例2.spring的singleton是指在spring的容器中只有一个实例一个生命周期中只有一个实例8.DI的优点:1.程序被动等待,强化面向接口编成2.切断了对象或组件之间的联系,使程序的结构更加松散,运行和维护更加简单
[*]Aop面向切面编程
1.AOP面向切面编程 一些较好的模式或者是示例—-范式
切面:一个切面代表我们所关注的一系列的共同的功能点(模块之间的共同的功能点)2.AOP的思想: 主动—->被动(追加功能)
3.AOP 的概念
1.切面 :我们所关注的功能点2.连接点 :事件的触发点(方法的执行)3.通知 :连接点触发时执行的动作(方法)4.切入点 :一系列的连接点的集合 (连接点的模块化)5.引入 :扩展的功能6.目标对象 :包含连接点的对象7.aop代理 :实现机制8.织入 :把advice和目标对象连接起来4.AOP的事件机制
1.通过切面找出一系列共同的功能点2.找到目标对象(在标准的spring 中 接口的实现类为target)3.找到切入点4.确定连接点5.通知spring AOP,查询xml文件,通过代理找到advice。6.由aop代理来实现动态织入
5. AspectJ
5.1.在xml中配置比较烦琐
所有的入口必须从一个代理(ProxyFactoryBean)开始
expression=“execution(* com.javakc.aop.MyTarget.t*())”/>
5.3.使用注解的方法相对简单
@AspectJ的基本语法
1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面
直接在类上定义@Aspect
2.@Pointcut声明切入点
2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字
2.2、可以使用匿名的pointcut
2.3、执行切点的几种方法
2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法
2.3.2 within 指定到包,不能指定到类
within(”com.javakc.spring..*”)
2.3.3 this 指定到实现接口的所有的实现类
2.3.4 target 指定具体的实现类
5.4.advice的五种类型的示例
客户端必须从接口走才能得到监控,实现想要追加的功能
5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)
追加的方法的参数名字一定要与retrning的名字相同
在注解@AfterReturning中必须加上pointcut和returning两个参数
pointcut指所要监控的目标对象的方法
得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配
完成追加的功能
1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
(1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)
(2).
2.直接引用匿名的pointcut
(1).@AfterReturning(“execution(
* com.javakc.spring.schemaaop.Api.test4())”)
(2).@AfterReturning(pointcut=
“com.javakc.spring.schemaaop.TestPointcut.t4() &&
args(str)”, returning=”retVal”)
@AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)
public void testAfterReturning(String str,Object retVal){
System.out.println(“afterReturning1=>”+retVal+”=>”+str);
}
5.4.2.@Aronud
注解@Around环绕追加功能;
在执行目标对象的方法的前、后追加功能;
必须有参数;第一个参数的类型必须为ProceedingJoinPoint;
通过ProceedingJoinPoint的实例的proceed来调用所监控的
目标对象的方法
1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
(1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
(2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()
&& args(str)”)
2.直接引用匿名的pointcut
(1).@Around(“execution(
* com.javakc.spring.schemaaop.Api.test1())”)
(2).@Around(“execution(
* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
// @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
@Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{
System.out.println(“around1==========before1pointcut==>”+str)
Object obj = prj.proceed();
System.out.println(“around1==========after1pointcut==>”+str);
}
5.4.3.@Before
注解@Before在执行目标对象的方法前追加相应的功能
1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
(1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
(2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
注意args后的名称与参数名相同
2.直接引用匿名的pointcut
(1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
(2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
注意args后的名称与参数名相同
// @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
public void testBeforeParam(String str){
System.out.println(“before1=param=>”+str);
}
5.4.4.@After
注解@After在执行目标对象的方法后追加相应的功能
1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
(1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
2.直接引用匿名的pointcut
(1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
public void testAfter(){
System.out.println(“after1== >pointcut”);
}
5.4.5.@AfterThorwing
[*]描述一下spring中BeanFactory和ApplicationContext的差别
BeanFactory是一个Interface,这是Spring的核心。它仅仅只是提供的一些基本功能。ApplicaionContext 也是一个interface,这是从BeanFactory继承过来的所以它具备了BeanFactory的所有功能。但它也从其它的类或interface得到了一些特性。比如提供国际化的消息访问,资源访问,事件传播。但其主要区别在于BeanFactory是延迟加载,如果Bean的某一个属性没有注入,BeanFactory加载后,直至第一次使用getBean方法调用此Bean时才会抛出异常;而ApplicationContext则在初始化自身时检验,这样有利于检查所依赖属性是否注入;所以通常情况下我们选择使用ApplicationContext.代码示例:BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource(“beans.xml”));ApplicationContext cxt = new ClassPathXmlApplicationContext(“beans.xml”);
[*]谈谈spring对DAO的支持
Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
简化 DAO 组件的开发。
Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。
IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。
面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。
方便的事务管理: Spring的声明式事务管理力度是方法级。
异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。
[*]谈谈spring对hibernate的支持
在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。
一旦 Hibernate 处于 Spring 的管理下, Hibernate 所需要的基础资源,都由 Spring 提供注入。Hibernate 创建 SessionFactory 必需的 DataSource ,执行持久化必需的 Session 及持久层访问必需的事务控制等,这些原本必须通过代码控制的逻辑,都将由Spring 接管:DataSource, SessionFactory, TransactionManager等,都将作为 Spring 容器中的 bean。将这些bean 放在配置文件中管理。
1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:
class=“org.apache.commons.dbcp.BasicDataSource”>
oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:@localhost:1521:orcl
javakc2
javakc2
class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>
com/javakc/spring/h3/UserModel.hbm.xml
hibernate.dialect=org.hibernate.dialect.OracleDialect
如果需要使用容器管理的数据源,则无须提供数据驱动等信息,只需要提供数据源的JNDI 即可。对上文的SessionFactory只需将dataSource的配置替换成 JNDI 数据源,并将原有的 myDataSource Bean 替换成如下所示: class=“org.springframework.jndi.JndiObjectFactoryBean”>
java:comp/env/jdbc/myds
2、有效的 Session 管理: Dao类继承HibernateDaoSurport后,Spring 提供了 HibernateTemplate,用于持久层访问,该模板类无须显示打开 Session及关闭 Session。它只要获得 SessionFactory 的引用,将可以智能打开 Session,并在持久化访问结束后关闭 Session ,程序开发只需完成持久层逻辑,通用的操作则由HibernateTemplate 完成。3、统一的事务管理。无论是编程式事务,还是声明式事务, Spring 都提供一致的编程模型,无须烦琐的开始事务、显式提交及回滚。建议使用声明式事务管理,Spring 的声明式事务以 Spring 的 AOP 为基础。可将事务管理逻辑与代码分离。代码中无须实现任何事务逻辑,程序开发者可以更专注于业务逻辑的实现。声明式事务不与任何事务策略藕合,采用声明式事务可以方便地在全局事务和局部事务之间切换。Spring声明性事务有两种配置方法,一种是xml配置:
另一种是通过注解,在需要添加事务的类上注明 @Transactional
Spring2.0之前事务的写法
class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”
abstract=”true”>
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED
[*]谈谈Spring对事务的支持
1、声明式事务管理:1.流程:由客户端访问—-aop监控—-调用advice来追加事务2.做法:2.1 在配置文件的头中引入xmlns:tx 和schema的文件2.2 2.3 注入数据源
2.4 由spring实现的事务管理,但需要注入数据源
2.5 事务监控所有的方法(事务加强)
2.6 定义切入点
2、使用注解实现事务管理:1.注解@Transcational(可以在类上,也可以在方法上)2.在配置文件中同样需要注入dataSource和spring的事务管理3.使用注解的方法来追加事务 注解驱动
如何在Spring中使用Hibernate的事务:
如何在Spring中使用JTA的事务:
事务
ACID
(1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败
(2)一致性 :操作的前后满足同样的规则,保持平衡。
(3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)
(4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的
事务模型
(1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套
(2)嵌套事务模型
事务的两种方式
(1)声明式
在配置文件中设置以下6项
(1).required
如果客户端没有事务 在bean中新起一个事务
如果客户端有事务bean 中就加进去
(2)、 requiresNew
不管客户端有没有事务服务器段都新起一个事务
如果客户端有事务就将事务挂起
(3)、supports
如果客户端没有事务服务端也没有事务
如果客户端有事务服务端就加一个事务
(4)、mandatcry
如果客户端没有事务服务端就会报错
如果客户端有事务服务端就加事务
(5)、notSupported
不管客户端有没有事务服务端都没有事务
如果客户端有事务服务端就挂起
(6)、never
不管客户端有没有事务服务端都没有事务
如果客户端有事务就报错
(2)编程式事务
Javax.transaction.UserTranscation
JTA 事务可以精确到事务的开始和结束
事务的隔离性
Read-uncommited
读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。
Read-commited
读取已提交的数据(行级锁)
无法读取已经写入,但没有被提交的数据。
Repeatable_read
读取的数据不允许修改或删除
不可重复读(行级锁+不允许修改/删除)
Serializable
幻影读(表级锁)
struts
开发流程
1、创建表单
2、从表单中获得输入
3、处理输入(业务逻辑)
4、根据动态输入改变输入流
要完成上述四步,我们需要创建
1、一个ActionForm
2、一个action
3、一个配置文件struts-config.xml
4、创建页面
创建ActionForm
1、写一个类继承ActionForm
2、私有的属性
3、相应的get、set方法
4、重写tostring、equals、hashcode三个方法
创建action
1、写一个类继承Action
2、实现一个公有的方法(回调方法)
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
{
//1.收集参数
MyActionForm myForm = (MyActionForm)form;
//2.组织参数
//3.调用逻辑层
boolean flag = true;
//4.根据返回值来跳转到相应的页面
ActionForward af = new ActionForward();
if(flag){
af = mapping.findForward(“1″);
}else{
af = mapping.findForward(“2″);
}
return af;
}
配置struts-config.xml文件
1.<form-beans>
<form-bean name=”myActionForm” type=”全路径.MyActionForm”/>
<form-bean />
</form-beans>
2.<action-mappings>
<action path=”/sll”
name=”myActionForm”
type=”全路径.MyAction”
scope=”session”
input=”错误返回的页面”>
<forward name=”1″ path=”/1.jsp”>
<forward name=”2″ path=”/2.jsp”>
</action>
</action-mappings>
步骤:
1.创建一个空的web应用
2.将struts的包放到lib文件夹下
3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下
4.配置struts-config.xml文件和web.xml文件
5.在页面引入tag文件uri
STRUTS运行机制
1、界面点击产生请求
2、容器接到请求
3、匹配web.xml文件中的*.do来调用ActionServlet
4、ActionServlet的处理
4.1 读struts-congfig.xml文件形成ActionMapping
4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类
4.3 通过反射机制来给Form添数据
4.4 由ActionServlet转调Action的execute方法
4.5 得到execute方法的返回值,跳转页面
4.5.1 RequestDispatcher
4.5.2 response.sendRedirect(“list.jsp”);
进入execute方法
1 收集参数
2 组织参数
3 调用,逻辑层
4 返回值
4.1 选择下一个页面 (ActionForward)
4.2 把值传给下一个页面
比较struts和struts2的不同
Struts
Struts2
组成 五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action 十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib
url .do .action
分发控制 AtcionServlet FilterDispatcher
收集参数 利用JavaBean技术,将数据封装到ActionForm的子类中;
一个Action对应一个ActionForm的子类
使用拦截器将数据封装到值栈中。
使用域模型,一个Action对应多个值栈中的Model
读取配置文件 ActionMapping Configuration Manager
拦截器 无拦截器 执行Action前后有拦截器
返回页面 将字符串封装到AtcionForward,进行跳转页面 Action中直接返回字符串,通过Result跳转页面
页面跳转方式 两种:dispatch,redirect 三种:dispatch,redirect,chain
值栈 无值栈,Action通过在request范围内设置属性,向jsp页面传递数据 有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据
配置文件 struts-config.xml struts.xml
中文问题 不能解决(需要使用filter) 可以解决中文问题:
1、在jsp页面添加Meta;
2、修改struts.properties中的设置。 其他开发工具和技术
Ant
Ant是基于java的批处理工具
一、配置ant的运行环境
1.将ant的bin目录添加到path中
2.配置JAVA_HOME
3.配置ANT_HOME
二、配制build.xml文件,该文件放在应用程序的根目录下
编译java文件
执行java文件
copy
删除
打jar包
根据注解生成配置文件
Xdoclet
通过注释生成一系列文件的工具(txt、xml、java、html等)
xdoclet本质是摸板技术+字符串的替换
1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)
1.1 在类的上面 写与表的对应
1.2 将每一个属性的注释都写到get方法的上面
2.在ant中引入相应的task来驱动xdoclet
log4j日志管理
1、是什么?
在开发期间用来测试、对整个日志信息进行管理的工具
2、功能
1.控制输出的目的地
2. 控制输出的格式
3. 控制输出的级别
3、日志的级别
1. debug 调试
2. info 给用户的提示信息
3. warn 给用户的警告信息
4.error 给程序员用来调试
Debug—-〉info—-〉warn——–〉error
4、配置
1.配置级别
2.输入源 (控制台和文件)
3.可以进行分包控制
Log4f.logger.包结构 = 级别
5、使用
Logger log=Logger.getLogger(Test.class);
public
void t3(){
log.debug(“this is debug”);
log.info(“this is info”);
log.warn(“this is warn “);
log.error(“this is error”);
}
Junit
1.是什么?
单元测试的框架
2.怎么做?
写一个类继承TestCase
测试的方法一般都以test开头并且没有参数
在测试方法前执行的方法public void setUp( )
在测试方法后执行的方法public void tearDown( )
error和故障的区别
error :代码有问题
故障 :逻辑有问题与祈望的值不相符合
生命周期
测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;
TestCase套件
public class MyTest{
Public static Test suite(){
TestSuite suite = new TestSuite();
suite.addTestCase(Test1.class);
suite.addTestCase(Test2.class);
}
}
Ajax
是什么?
AJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。
无刷新页面。
有什么?
AJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。
能干什么?
使用XHTML+CSS标准化呈现;
使用DOM进行动态显示及交互;
使用 XML 和 XSLT 进行数据交换及相关操作;
使用 XMLHttpRequest 进行异步数据查询、检索;
使用JavaScript绑定和处理有所得数据;
传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。
与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。
使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。
对应用Ajax最主要的批评就是:
1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;
2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;
3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;
4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;
怎么做?
<script language=”javascript”>
var req;
function add(){
//1:创建用于传输的对象
req=new ActiveXObject(“Microsoft.XMLHTTP”);
// 声明返回后,处理数据的方法
req.onreadystatechange=manage;
//2:准备传输的内容
var str=”test1111″;
//3:发出请求
req.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);
req.send(null);
}
//4:接受返回并处理
function manage(){
if(req.readyState==4){
alert(“r==”+req.responseText);
}
}
</script>
readyState的取值如下:
0 (未初始化)
1 (正在装载)
2 (装载完毕)
3 (交互中)
4 (完成)
原理
Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。
Dwr
是什么?
DWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。
有什么?
它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。
能干什么?
动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。
怎么做?
① 编写配置文件
web.xml
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
dwr.xml
<allow>
<create creator=”new” javascript=”kc2″>
<param name=”class” value=”dwr.Service” />
</create>
</allow>
②编写service
public class Service {
public String sayHello(String yourName) {
//可以是访问数据库的复杂代码
return “Hello World ” + yourName;
}
}
③测试DWR
将代码放入应用服务器(比如Tomcat),启动。
然后在地址栏输入http://localhost:8080/你的工程/dwr
④编写jsp页面
1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js
2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样
3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
页:
1
[2]