Java Web 服务性能优化案例
简介:本文介绍如何提升Java Web 服务性能,主要介绍了三种方法:一是采用 Web 服务的异步调用,二是引入Web 服务批处理模式,三是压缩SOAP 消息。重点介绍在编程过程中如何使用异步Web 服务以及异步调用和同步调用的差异点。本文还示范了如何在项目中使用以上三种方法,以及各种方法所适合的应用场景。
Java Web 服务简介
Web 服务是一种面向服务架构的技术,通过标准的 Web 协议提供服务,目的是保证不同平台的应用服务可以互操作。Web 服务(Web Service)是基于XML 和HTTP 通讯的一种服务,其通信协议主要基于SOAP,服务的描述通过WSDL、UDDI 来发现和获得服务的元数据。这种建立在XML 标准和Internet 协议基础上的Web 服务是分布式计算的下一步发展方向,Web 服务为那些由不同资源构建的商业应用程序之间的通信和协作带来了光明的前景,从而使它们可以彼此协作,而不受各自底层实现方案的影响。
JAX-RPC 1.0 是Java 方面的Web 服务的原始标准, 但是由于JAX-RPC 1.0
对Web 服务功能的认识有一定的局限,于是JAX-WS 2.0 应用而生。JAX-WS 2.0 开发工作的主要目标是对各项标准进行更新,成功实现了业界对JAX-RPC 1.X 的各种期望。此外,JAX-WS 2.0 直接支持XOP/MTOM,提高了系统附件传送能力以及系统之间的互操作性。
实例剖析Web 服务性能瓶颈
通过以上简述不难体会到,Web 服务以其XML + HTTP 的松耦合、平台无关的特性,集万般宠爱于一身,必将成为未来数据共享的基础。但与此同时我们也应当认识到世间完事万物均有其矛盾的两面性:有优点,必将存在缺点,Web 服务亦是如此。就像当初JAVA 大行其道的时候性能成为其致命诟病一样,Web 服务也同样面临性能问题,似乎“性能问题”天生就是“平台无关”挥之不去的冤家。但问题终归要解决,实践是检验和分析问题的唯一途径,让我们先来创建一个简单的Web 服务再来审视和分析隐含其中的性能问题。
创建服务
创建服务Java Bean: 首先我们创建一个尽可能简单的书店服务Bean,服务的内容只有一个qryBooksByAuthor,即根据作者(Author) 查询其名下的书籍
(List
图 1. 书店服务Bean(BookStoreSrvBean)
服务Input- 作者(Author) 的实体类:
图 2. 作者实体类(Author)
服务出参Output- 书籍(Book) 列表的实体类:
图 3. 书籍实体类(Book)
至此我们的服务代码已经完成,我们不在此讨论此服务的业务合理性,创建此服务的目的只是举一个尽可能简单的实例以分析web 服务的性能。
下面的任务就是开发Web 服务了,手工编写及发布符合规范的 Web 服务过程极为繁琐,在此使用IBM 的Rational Software Architect(后面简称RSA)来进行 Web 服务的服务器端以及客户端的开发。
发布Web 服务
创建动态Web 项目: 发布 Web 服务的前提当然需要一个J2EE 的 Web 项目,打开RSA->File->New->Dynamic Web Project, 项目名称为testWebService, 其余选项根据需要进行选择( 注意需要选择加入Web 项目到EAR)。创建好的 Web 项目和EAR 项目效果如下:
图 4. Web 项目以及应用项目的结构
创建Web 服务:选中导入的com.ibm.test.ws.srv.BookStoreSrvBean,右键New->Other->Web Service 来创建并发布Web 服务。创建的时候选择常用的
JAX-WS 标准, 并选择生成 WSDL 文件。由于 Web 服务的创建不是本文重点,此部分内容暂且省略。服务创建完成之后就可以发布到上一步建好的Web 项目中了。
创建客户端
使用RSA,客户端的创建工作将会非常简单:右键点击上面生成的 WSDL 文件->Web Services->Generate Client
图 5. 创建客户端界面
在此界面,根据实际情况选择server,JAX-WS 标准以及 Client 代码的目标项目,然后点击下一步。
图 6. 输入客户端信息
此界面暂时使用默认配置,某些特殊选项将在后面章节进行描述。
客户端调用
由于JAX-WS 规范大部分的stub 调用代码是实时生成的,我们只需要修改客户端WSDL 的port 就可以用以下代码进行 Web 服务的调用。这里修改 WSDL 端口的目的
是让客户端调用RSA 提供的TCP/IP Monitor 的虚拟端口,这样我们就可以很轻易地看到Web 服务实际的调用以及返回的SOAP 消息了。
客户端调用代码如下:
图7. 客户端调用代码
使用TCP/IP Monitor 看到的SOAP 消息如下:
图8. Web 服务调用产生的SOAP 消息
Java Web 服务性能分析
从以上实例我们可以看到,Web 服务的调用与传统的RPC 还是有较大差异的。最大的特点是调用双方使用XML 格式的SOAP 规范消息进行传输,这样以文本进行传输的好处是抛弃了私有协议,无论调用双方是何种平台,只要能够构造以及解析XML 文本,并且存在双方都支持的传输协议,那么调用就成为了可能。而XML 的日益规范以及HTTP 协议的普及更是给这两个必要条件提供了坚强的后盾,Web 服务成为未来通用的服务提供标准已是不争的事实。
但是相信使用过Web 服务的人都曾经经受过其性能不佳的窘境,原因为何我们结合刚才的实例可以分析出以下几点:
● SOAP 文本消息转化导致效率低下
从刚才的TCP/IP Monitor 监测到的request 以及response 的消息我们可以看到,在发送消息时,我们传入了Author 对象,在实际的调用发生时,这个Author 对象会被转化成XML 格式的SOAP 消息,此消息在到达Server 端会被解析并重新构造成Server 端的Author 对象。Response 也是同理,Books List 也会经历 XML 序列化和反序列化的过程。最糟糕的是,这种过程会在每一次调用的时候都会发生,这种构造以及解析的过程都会极大地消耗CPU,造成资源的消耗。
●SOAP 文本消息传输导致传输内容膨胀
以request 参数Author 为例,必要的信息仅仅是”Bruce Eckel”这几个字节,但转化成XML 消息后,可以从SOAP 消息看到,多了很多SOAP 规范的标签,这些信息会导致需要传输的内容急剧增大,几个字节很可能会变成几千字节。当调用频度和参数内容增多的时候,这种传输内容的膨胀将不是一个可以忽略的影响,它不但会吃掉网络的带宽,还会给Server 的数据吞吐能力造成负担,后果可想而知。
●同步阻塞调用在某些情况下导致性能低下
同步阻塞调用是指客户端在调用Web 服务发送request 后一直处于阻塞状态,客户端线程就会挂起,一直处于等待状态,不能进行其他任务的处理。这样就会造成线程的浪费,如果相应线程占用了一些资源,也不能够及时释放。
这个问题在纯客户端访问Server 端的情况下并不明显,但如果是两个Server 端之间进行Web 服务调用的话,阻塞模式就会成为调用Server 端的性能瓶颈。
Web 服务性能优化实践
使用异步方式调用 web 服务
先需要强调一点的是,这里的异步方式指的是客户端的异步,无论客户端是同步还是异步,都对服务端没有任何影响。我们期望的理想结果是:当客户端发送了调用请求后不必阻塞等待server 端的返回结果。最新的JAX-WS 标准中增加了这一异步调用的特性,更好的消息是,RSA 工具中也对JAX-WS 的这一特性进行了支持,这样就极大地方便了我们进行异步调用客户端的创建。
其实讲客户端配置为异步模式极其简单,只要在RSA 生成Client 端代码时将
… Enable asynchronous invocation for generated client ? 选中即可, 如下图:
图9. 异步客户端创建选项
这样在生成的客户端的BookStoreSrvBeanService 中就会多了qryBooksByAuthorAsync 的异步方法。既然是异步方法,回调(Call Back) 就是必不可少的,在下面的异步客户端测试代码中可以看到匿名内部类作为回调handler 的具体使用方法:
图10. 异步客户端调用示例代码
测试代码的输出结果如下:
图11. 异步调用控制台输出
可以看到,当Web 服务没有返回时,客户端仍然有机会做自己的输出:“not done yet, can do something else…”。有些人可能会认为作为客户端此处的输出并无实际意义,但试想如果一个server 作为客户端去访问一个Web 服务,如果在服务等待期间能够有
机会脱离阻塞状态执行自己需要的代码,甚至可以使用wait 等方法释放被当前线程占用
的资源,那么对于此server 来说这将是一个对性能提升起到本质作用的因素。
使web 服务支持批处理模式
● 批处理模式简介
批处理顾名思义是采用一次性处理多条事务的方式来取代一次一条事务的传统处理方式。Java Database Connectivty (JDBC) 中提供了大量的批处理API 用于优化数据库操作性能,例如Statement.executeBatch() 可以一次性接收并执行多条SQL 语句。
批处理思想可以方便的移植到Web 服务调用场景以达到优化Web 服务调用响应的目的。通过实际Web 服务调用时间戳分析不难看出网络通讯是 Web 服务性能的瓶颈之一,因此通过减少网络通讯开销来优化Web 服务性能,批处理模式是其中较为直接的一种实现
方式。
●批处理模式适应性
批处理模式虽然作用显著,但是也不适合所有场景。使用批处理模式处理Web 服务
请求时需要考虑一下几点:
1.不同Web 服务执行时间差异性
不同Web 服务执行时间不尽相同,因此在同时处理多 Web 服务请求时需要考虑这种时间差异性。一般情况下是等待最长处理时间的Web 服务执行完毕后汇总所有 Web
服务执行结果从而返回到客户端,因此存在批处理多Web 服务反而比顺序单次调用 Web 服务消耗更长时间可能性。需要在采用批处理模式前对Web 服务性能有清晰的了解,尽
可能将性能参数相似的Web 服务纳入批处理,而分别处理执行时间差异较大的 Web 服务。一般建议将性能差异在30% 以内的多Web 服务可以考虑纳入批处理。比方说AccountWebService 中有一个获取用户账户列表的Web 服务getUserAccounts,这个Web 服务执行需要15 秒,另外UserWebService 中有一个获取用户目前
pending 的待处理通知getUserPendingNotifications,这个 Web 服务执行需要2 秒时间,我们可以看到这两个Web 服务执行时间差异较大,因此在这种情况下我们不建议
将这两个Web 服务纳入批处理。而AccountWebService 中有一个增加第三方用户账
号的Web 服务addThirdPartyNonHostAccount,该 Web 服务执行需要3 秒,此时就就可以考虑能将getUserPendingNotificat ions Web 服务和addThirdPartyNonHostAccount 放在一个批处理中一次性调用处理。
2.不同Web 服务业务相关性
一般情况下建议考虑将存在业务相关性的多Web 服务放入批处理中,只有业务存在相关性的多Web 服务才会涉及到减少调用次数以提高应用系统性能的需求。比方说用户在增加第三方账号addThirdPartyNonHostAccount 以后会默认自动发送一条pending 的notification 给用户用以提示用户来激活增加的账号,因此这种场景下可以完美的将addThirdPartyNonHostAccount Web 服务和getUserPendingNotifications Web 服务放入一个批处理中,在用户增加完三方账号后系统自动刷新pending notification 区域以提示用户激活账号。UserWebService 中有一个获取用户主账号的Web 服务getUserHostAccounts 和获取用户三方账号的Web 服务getUserNonHostAccounts,MetaDataService 中有一个获取国家金融机构假期数据的Web 服务getFinacialAgencyHolidays,该Web 服务明显和getUserHostAccounts,getUserNonHostAccounts 不存在业务上相关性,因此不应该将它们纳入批处理。
3.尽量避免将存在依赖关系的多Web 服务放入同一个批处理中
将多个存在依赖关系的多Web 服务放入同一批处理中需要专门考虑、处理多 Web 服务彼此间的依赖关系,进而无法将方便的这些Web 服务并发执行而不得不串行执行有依赖关系的Web 服务,最悲观情况下批处理响应时间将是批处理中所有 Web 服务串行执行时间和。原则上即使批处理中Web 服务间存在依赖关系,通过动态指定依赖关系也可以实现多Web 服务的批处理调用。但是这样将大大增加批处理实现的技术复杂性,因此不建议如此操作。
4.多线程方式处理批处理Web 服务请求
批处理模式在服务实现端一般通过多线程处理方法来并发处理多个Web 服务调用请求。通过集中的解析器解析批处理模式请求,之后针对每一个Web 服务调用会启动一个单独的线程来处理此Web 请求,同时会有一个总的线程管理器来调度不同 Web 服务执行线程,监控线程执行进度等。在所有线程执行完成后汇总Web 服务执行结果返回客户端。
●批处理实现方式
批处理实现方式一般有两种:静态批处理模式,动态批处理模式:
静态批处理模式实现较为简单,但是相对缺乏灵活性。静态批处理的核心思想就是在已有Web 服务的基础上通过组合封装的方式来得到批处理的目的。举例来说将系统中已有的Web 服务请求结构组合成一个新的数据对象模型作为 Web 服务批处理请求结构,在客户端进行批处理调用时通过初始化批处理请求数据对象,并将特定的Web 服务请求对象赋值给批处理请求对象属性的方式。同理在服务实现端在生成批处理响应数据对象时也是通过将具体Web 服务的响应组合起来生成并返回客户端。
动态批处理模式实现较为复杂,但也能提供更大的操作灵活性。动态批处理模式一般需要应用采用Java 反射API 开发具有容器功能的批处理实现框架。客户端可以动态的向容
器中增加Web 服务调用请求,比方说客户端可以动态的将addThirdPartyNonHostAccount,getUserPendingNotifications 两个 Web 服务加
入到这个容器中然后发起一个框架提供的批处理Web 服务调用请求。该批处理 Web 服务在实现端将解析容器并将其中的各个Web 服务请求抽取解析并启动独立的线程来处理。
压缩SOAP
当Web Service SOAP 消息体比较大的时候,我们可以通过压缩soap 来提高网络传输性能。通过GZIP 压缩SOAP 消息,得到二进制数据,然后把二进制数据作为附件
传输。以前常规方法是把二进制数据Base64 编码,但是Base64 编码后的大小是二进制数据的1.33 倍。辛苦压缩的,被Base64 给抵消差不多了。是否可以直接传输二进制数据呢?JAX-WS 的MTOM 是可以的,通过HTTP 的MIME 规范,SOAP message 可以字符,二进制混合。我们在client 和server 端各注册一个handler 来处理压缩和解压。由于压缩后的SOAP 消息附件与消息体中的部分不是基于MTOM 自动关联的,
需要单独处理附件。在生成client 端和server 端代码的时候需要enable MTOM。Handler 具体代码在本文代码附件中,test.TestClientHanlder,
test.TestServerHanlder。写好了handler 了之后还要为service 注册handler。
客户端handler 样例代码如下:
客户端代码
1 2 3 4 5 6 7 8 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public boolean handleMessage(MessageContext arg0) {
SOAPMessageContext ct = (SOAPMessageContext) arg0;
boolean isRequestFlag = (Boolean) arg0
.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
SOAPMessage msg = ct.getMessage();
if (isRequestFlag) {
try {
SOAPBody body = msg.getSOAPBody();
Node port = body.getChildNodes().item(0);
String portContent = port.toString();
NodeList list = port.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
port.removeChild(list.item(i));
}
ByteArrayOutputStream outArr = new ByteArrayOutputStream(); GZIPOutputStream zip = new GZIPOutputStream(outArr);
zip.write(portContent.getBytes());
zip.flush();
zip.close();
byte[] arr = outArr.toByteArray();
TestDataSource ds = new TestDataSource(arr);
AttachmentPart attPart = msg.createAttachmentPart();
attPart.setDataHandler(new DataHandler(ds));
24
25
26
27
28
29
30
31
32
msg.addAttachmentPart(attPart); } catch (SOAPException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
Web 服务端handler 样例代码如下:
服务端代码
1 2 3 4 5 6 7 8 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 public boolean handleMessage(MessageContext arg0) {
SOAPMessageContext ct = (SOAPMessageContext) arg0;
boolean isRequestFlag = (Boolean) arg0
.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
SOAPMessage msg = ct.getMessage();
if (!isRequestFlag) {
try {
Object obj = ct.get("Attachments");
Attachments atts = (Attachments) obj;
List list = atts.getContentIDList();
for (int i = 1; i < list.size(); i++) {
String id = (String) list.get(i);
DataHandler d = atts.getDataHandler(id);
InputStream in = d.getInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream(); GZIPInputStream zip = new GZIPInputStream(in);
byte[] arr = new byte[1024];
int n = 0;
while ((n = zip.read(arr)) > 0) {
out.write(arr, 0, n);
}
Document doc = DocumentBuilderFactory.newInstance()
.newDocumentBuilder()
.parse(new ByteArrayInputStream(out.toByteArray())); SOAPBody body = msg.getSOAPBody();
Node port = body.getChildNodes().item(0);
port.appendChild(doc.getFirstChild().getFirstChild());
}
} catch (SOAPException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
33
34
35
36
37
38
39
40
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
}
return true;
}
在web.xml 中service-ref 部分添加handler. Server 端handler 也是同样添
加。
配置代码
1 2 3 4 5 6 7 8 9
结束语
以上三种解决方案是根据笔者的经验和分析,针对Web 服务当前所面临的性能瓶颈
进行提出的。并且,这几种解决方案在实际项目使用中都取得了比较好的效果。综上所述,在实际项目中,根据不同的需求采用上述方法中一个或者多个组合,可以使Web 服务性能更加优化。
《Java Web应用开发》项目设计参考方案(学时:84)项目一网上商城项目开发环境的搭建(学时:8) 一、教学目标 最终目标:学会Java Web 开发环境搭建,了解如何在集成开发环境中开发JSP、Servlet程序,能在Web服务器上进行运行测试。 促成目标: 1. 了解JSP、Servlet技术; 2. 了解Java Web 开发模式; 3. 了解Java Web服务器运行条件,掌握如何安装、配置Jdk、Tommcat和集成开。 二、工作任务 1.任务1 Java Web 环境搭建 2. 任务2 简单JSP、Servlet测试 三、活动设计 1.活动思路 首先介绍动态网页技术及相关开发模式,并将相关技术进行比较,从而引出本门课的重点。接着指出建立Web服务器的条件,引出如何搭建Java Web运行环境;最后学习集成开发环境的安装与设置,并学习如何写JSP程序、Servlet 程序,并掌握如何在客户端进行运行测试。 2.活动组织 3.活动评价 评价内容:根据学生具体任务完成情况、课后作业等情况进行评价。 评价标准: 实践部分评价:能基本完成相关软件的安装、环境配置为及格;独立完成相关软件的安装、环境配置,基本能进行代码编写及测试为良好;独立完成相关软件的安装、环境配置,并能进行正确的代码编写及测试为优秀。
模块一 Java Web 环境搭建(学时:4) 一、教学目标 最终目标:掌握浏览静态网页和动态网页的技能,掌握分析网页所采用的技术的技能,能独立完成JSP运行环境的安装及配置 促成目标: 1.了解静态网页中的静态的概念; 2.了解动态网页中的动态的概念; 3. 了解JSP、Servlet技术; 4. 了解Java Web 开发模式; 5.学会JDK、Tomcat的下载、安装及配置。 二、工作任务 1. JDK、Tomcat的安装及配置; 2.浏览各种类型的网页,分析出网页采用的技术; 三、活动设计 1.活动内容 通过浏览多种类型的网页、导出静态网站与动态网站的概念,继而引出对各种网页开发技术的分析,引入JSP动态网页开发技术、开发模式及运行环境;浏览电子商务网站,导出网上商城的项目;分析JSP的基本概念,导出Web服务器的概念,引出JSP常用的Web服务品Tomcat。构建JSP运行环境,为下一步开发工作做好准备。 子任务一:JDK安装与配置 子任务二:Tomcat的安装与配置,服务器运行测试。 2.活动组织
Java堆是指在程序运行时分配给对象生存的空间。通过-mx/-Xmx和-ms/-Xms来设置起始堆的大小和最大堆的大小。根据自己JDK的版本和厂家决定使用-mx和-ms或-Xmx和-Xms。Java堆大小决定了垃圾回收的频度和速度,Java堆越大,垃圾回收的频度越低,速度越慢。同理,Java堆越小,垃圾回收的频度越高,速度越快。要想设置比较理想的参数,还是需要了解一些基础知识的。Java堆的最大值不能太大,这样会造成系统内存被频繁的交换和分页。所以最大内存必须低于物理内存减去其他应用程序和进程需要的内存。而且堆设置的太大,造成垃圾回收的时间过长,这样将得不偿失,极大的影响程序的性能。以下是一些经常使用的参数设置: 1) 设置-Xms等于-XmX的值; 2) 估计内存中存活对象所占的空间的大小,设置-Xms等于此值,-Xmx四倍于此值; 3) 设置-Xms等于-Xmx的1/2大小; 4) 设置-Xms介于-Xmx的1/10到1/4之间; 5) 使用默认的设置。 大家需要根据自己的运行程序的具体使用场景,来确定最适合自己的参数设置。除了-Xms和-Xmx两个最重要的参数外,还有很多可能会用到的参数,这些参数通常强烈的依赖于垃圾收集的算法,所以可能因为JDK的版本和厂家而有所不同。但这些参数一般在Web 开发中用的比较少,我就不做详细介绍了。在实际的应用中注意设置-Xms和-Xmx使其尽可能的优化应用程序就行了。对于性能要求很高的程序,就需要自己再多研究研究Java虚拟机和垃圾收集算法的机制了。可以看看曹晓钢翻译的《深入Java虚拟机》一书。 Java程序性能调优的基本知识和JDK 调优 一基本知识 1.1 性能是什么 在性能调优之前,我们首先来了解一下性能是什么?关于性能,我想每个学习过Java的人都能列 出几点,甚至可以夸夸其谈。在《Java TM Platform Performance》一书中,定义了如下五个方面来作 为评判性能的标准: 1) 运算的性能——哪一个算法的执行性能最好? 2) 内存的分配——程序运行时需要耗费多少内存?
学习javaweb开发要学习的技术和框架总结: 前言:当初想学习javaweb开发的时候,希望能够全方面地学习(这样找工作时就胸有成足了)。但是对这个根本不理解,又不认识从事这方面的熟人,所以学习起来无从下手。经过了一年的‘死’学习,从网上,从书本,从视频里面深入了解了java。想从事java的朋友,只要把这些技术全学会了,哪就业肯定没有问题了。 前端技术: HTML, CSS, JA V ASCRIPT, JQUERY, AJAX HTML “超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。 超文本标记语言的结构包括“头”部分(外语:Head)、和“主体”部分(外语:Body),其中“头”部提供关于网页的信息,“主体”部分提供网页的具体内容。 CSS 级联样式表是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。 JavaScript JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。 jQuery jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多)。jQuery在2006年1月由美国人John Resig在纽约的barcamp发布,吸引了来自世界各地的众多JavaScript高手加入,由Dave Methvin率领团队进行开发。如今,jQuery已经成为最流行的javascript库,在世界前10000个访问最多的网站中,有超过55%在使用jQuery。
PINGDINGSHAN UNIVERSITY 《基于Web的Java开发设计》 项目实践 题目: 基于MVC的JSP博客系统分析 院 (系):软件学院 专业年级: 软件工程2010级 姓名: 苏振鹏 学号: 101530140 2012年6月10日
目录 1概述 (3) 1.1 开发背景 (3) 2 个人博客需求分析 (4) 2.1 功能要求 (4) 2.2开发环境 (5) 2.3 操作帮助 (5) 2.4 系统设计 (7) 3 数据库分析 (8) 4 个人博客MVC结构分析 (13) 4.1 Mdel1和model2 (13) 4.1.1 什么是Model 1 (13) 4.1.2 什么是Model 2 (14) 4.2 Model 2-MVC模式 (14) 5 核心功能实现 (15) 5.1文章模块控制器的实现 (15) 6 系统测试与实现界面 (15) 6.1博客程序主界面 (16) 6.2用户登录界面 (16) 6.3后台管理界面 (17) 7 结论 (17)
1概述 1.1 开发背景 “博客”(Blog或Weblog)一词源于“Web Log(网络日志)”的缩写,是一种十分简易的傻瓜化个人信息发布方式。任何人都可以像使用免费电子邮件一样,完成个人网页的创建、发布和更新。博客就是开放的私人空间,可以充分利用超文本链接、网络互动、动态更新等特点,在网络中,精选并链接全球互联网中最有价值的信息、知识与资源;也可以将个人工作过程、生活故事、思想历程、闪现的灵感等及时记录和发布,发挥个人无限的表达力;更可以以文会友,结识和汇聚朋友,进行深度交流沟通。 “博客”当然是个大家都陌生的名词,博客的英文名词就是“Blog或Weblog”(指人时对应于Blogger),是一个典型的网络新事物,查阅最新的英文词典也不可能查到。该词来源于“Web Log(网络日志)”的缩写,特指一种特别的网络个人出版形式,内容按照时间顺序排列,并且不断更新。 博客是一种零编辑、零技术、零成本、零形式的网上个人出版方式。 博客概念一般包含了三个要素(当然,也不需要局限这些定义):a)网页主体内容由不断更新的、个性化的众多日志组成。 b)按时间顺序排列,而且是倒序方式,也就是最新的放在最上面,最旧的放在最下面。 c)内容可以是各种主题、各种外观布局和各种写作风格,但是文章内容以“超链接”作为重要的表达方式。 因此,博客是个人性和公共性的结合体,其精髓不是主要表达个人思想,不是主要记录个人日常经历;而是以个人的视角,以整个互联网为视野,精选和记录自己在互联网上看到的精彩内容,为他人提供帮助,使其具有更高的共享价值。 博客精神的核心并不是自娱自乐,甚至不是个人表达自由,相反,是体现一种利他的共享精神,为他人提供帮助。个人日记和个人网站主要表现的还是“小我”,而博客表现的是“大我”。也许形式上很接近,但内在有着本质的差异。所有优秀博客网站中,真正表达作者个人的内容非常有限,最多只是点缀,而不像个人网站那样是核心。 博客的精神是:自由表达,开放宽容,个性张扬,专业精神。 在没有自己的博客之前,人们会经常进出于论坛发表贴子或者通过即时通信软件聊天,来表达自已的想法,可是这些都是零散的和杂乱的。博客的出现,让
1.7 习题 1. 单选题 (1)在HTML中超链接标记为() A.和 B.
BOS物流管理系统第一天搭建环境 内容安排: 1、运行项目,分析功能结构 Struts2 通配符映射,将所有页面放在WEB-INF下 2、项目改造为maven结构 项目使用STS 3、jQuery EasyUI 框架 常用各个布局插件、Ztree菜单技术 学习目标:maven 、svn 、eclipse 工具、掌握前端开发框架EasyUI 1.BOS项目概述 1.1.项目背景 什么是BOS? (Business Operation System) ,各个软件最核心业务系统 用友软件公司为宅急送公司开发ERP系统---- 核心系统 BOS一期工程C/S结构,二期工程B/S 结构 传统项目分类:OA 自动化办公系统、CRM 客户关系管理系统、ERP 综合管理平台
1.2.项目开发任务 项目完整开发流程: 需求分析(需求分析文档)----- 系统设计(页面原型设计jquery easyui 、数据库设计PowerDesigner )------ 编码----- 测试----- 集成部署和运维 BOS系统非常庞大,十几天学习哪些功能
涉及三大核心业务模块:基础设置模块、取派模块、中转模块 基础设置模块:管理物流信息基础元素信息(快递员、配送区域、配送时间、排班…)取派模块:客户要进行快递,系统进行业务受理、系统分单到快递员、快递员取件、打包、计费 中转模块:管理货物在配送路程中间数据 路由模块:管理车辆和线路 财务模块:计费 PDA模块:管理快递员无线电通信 报表模块:生成统计数据 用户权限管理:通用权限管理系统Apache Shiro
1.3.项目开发平台和技术 新建一个Maven工程mavenbos 1.4.导入原型页面 配置说明pom.xml 导入参照下发pom.xml 文档!
1、In Action (1)根据添加信息(insert)来考虑表中的字段,进行建表。使用PD画出ER图。要注意字段的数据类型的确定以及建表要满足三范式,减少数据冗余; (2)表建好后,根据表中各个字段来建pojo中的属性。要注意属性的数据类型和字段的数据类型要一致; (3)根据pojo中的属性确定bean的属性,直接拷贝即可,用于页面展示。在bean中,统一使用String类型变量接收前台页面传递的参数;每个HTML表单对应一个bean。HTML 表单中的字段和bean中的属性一一对应。 (4)自顶向下,依次定出action、manager、dao。先写出轮廓,跑通整个流程,再写具体实现,一点点累加,便于调试错误; (5)根据数据实体和具体业务逻辑,使用StarUML画类图,进行OOA和OOD,灵活运用设计模式。 (6)API命名: CRUD:add,get,update,delete,[list] 严格区分单复数形式,单数表示对象,复数表示对象集合。 对象、属性最好单个单词。 (7)前后台都要校验。 (8)按照资源方式组织数据接口,对前端开发帮助很大。即通过REST来实现资源的增、删、改、查。 (9)软件开发,思路最重要!代码开发多了,思路就有了。 a、一个版本一个版本递增的开发;每个版本增加一点内容; b、总结开发思路;第一步怎么做,下一步怎么做? c、用文档记录开发的思路,即第一个版本开发实现了什么功能以及开发步骤,下一个版本实现了什么功能等等?
d、程序员进行程序开发时,不要仅仅停留在代码,要深入到底层的运行机制,才可以对程序的运行机制有更准备的把握; (10)网页模板 request到template.jsp文件(此文件假设包括三个部分,即title、banner、body) web客户——> title banner———————>include:banner.jsp body————————>include:showcart.jsp (11)一步一步的定位。根据结果进行分析。 (12)分页控件 假分页: 基本思想是将所有的数据从数据库中取出,只显示有用的部分。靠的是程序的算法,实际上就是在ResultSet上进行操作。 真分页:(数据库中的一种实现) 任何数据库都会提供分页的函数操作:Oracle、MySQL(limit,即limit 开始的记录, 要查询的行数)、SQL Server(top) 基本思想是在数据库中编写特定的SQL语句。程序中只读取有用的部分,没用的部分不会加载到内存中。 (13) 2、TIPS
课程标准 所属系部:信息工程系 课程名称:Java Web应用开发 课程性质:专业必修课 课程学时:96 适用专业:云计算技术与应用()
《Java Web应用开发》课程标准 1、课程概述 课程定位 Java Web应用开发是云计算技术与应用专业的核心课程之一,是该专业的专业必修课。通过本课程的学习,使学生具备Java Web应用开发相关知识、良好的编程习惯和手机应用软件开发的能力,能胜任基于Java Web开发等工作任务。Java的J2EE体系中,J SP/Servlct/JavaBcan占据了非常重要的位置,不仅成为web项目开发的利器,而且也是人们接触和使用J2EE的一个基础。通过详实的内容和丰富的案例,引领学生学习JSP/S crvlet/JavaBcan的开发体系,以及这套技术在项目开发中的实际应用。同时,通过教学过程中的实际开发过程的规范要求,培养学生分析和解决实际问题的能力,强化学生的职业道德意识、职业素质养意识和创新意识,为学生以后从事更专业化的软件开发工作奠定基础。《Java Web程序开发入门》是面向计算机相关专业的一门专业Java Web入门课程,涉及XML基础、Tomcat服务器、HTTP协议、Servlet技术以及JSP技术等内容,通过本课程的学习,学生能够了解XML的语法及其约束的定义,能够掌握JSP和Servle t技术并开发简单的Java Web项目、使用Tomcat服务器发布和运行Java Web项目。前导课程有《Java程序设计》、《数据库技术基础》,后续课程有《J2EE项目开发》、《Java Web应用开发实训》、《毕业实习》等。 课程设计思路 本课程标准以“开发”、“应用”为原则,彻底打破原来学科课程链路模式,根据基于工作过程专业建设模式,以能力为本位,构建以实际工作情境为单位的课程体系。课程内容的选取按照软件开发市场、软件企业、行业对Web开发程序员的需求情况,确定了“初级Web程序员”的职业岗位培养目标。在教学实施过程中基于实际工作的教学模式、通过各种各样的教学方法和教学手段,培养Web程序员应具备的能力。 每个项目的学习都是围绕职业能力的形成组织课程内容,以真实项目为核心整合We b程序员的所需的知识、技能和态度。实践中创设职业情境,围绕着软件企业、软件行业中的实际项目而展开的,学生通过各个环节的技能训练,感受职业环境,实现编程技能的逐步提升。本课程课时为96学时。 本课程在教学过程中,倡导自主学习,启发学生对设定问题积极思考、分析,鼓励
第一章 java 性能调优概述 1.1.2 性能的参考指标 1.2.1 设计调优 比如说如果A组件通过循环不断监控时间E是否发生,其必然会占用部分系统资源。但是可以通过observer模式解决: 1.2.2 代码调优 比如linkedList比ArrayList 随机访问性能好。 1.2.3 JVM调优 一般在开发后期做,比如内存结构,GC种类。 1.2.4 数据库调优 比如大量的拥有相同结构的SQL查询,可以用preparedStatement代替statement;指定要查询的列名,避免用“*”。 比如设置oracle的共享池、缓存区。 1 .2.5 操作系统调优 比如调整unix的共享内存值。
第二章设计优化 2.1 设计模式 2.1.1 单例模式 对于频繁使用对象,因为new次数少,对内存使用不频繁,将减轻GC压力。 2.1.2 代理模式 可以实现比如延迟加载 2.1.3 享元模式 好处同单例模式 2.1.5 观察者模式 可以代替多线程。 2.1.6 Value Object 一次封装所有的属性值,省得一次次请求属性值。 2.1.7 Business Delegate 代理类中一组远程方法调用构成一个业务流程,客户端调用代理类。 2.2 常用优化组件 2.2.1 缓冲 缓冲是一块内存区域,目的是缓解应用程序上下层之间的性能差异。 2.2.2 缓存 也是一块内存区域,目的是暂存数据处理结构,并供下次访问使用。 也可用ehCache等框架 2.2.3 对象复用池 比如线程池和数据库连接池
2.2.4 多线程 2.2.5 负载均衡 2.2.6 时间换空间 比如少申请变量 2.2.7 空间换时间 比如用缓存 第三章 java 程序优化 3.3 使用NIO提升性能 NIO为所有的原始类型提供buffer,NIO是基于Block的,NIO最重要的组件是buffer和Channel。 buffer是一个连续的内存快,是NIO读写数据的中转池。通道表示缓冲数据的源头或者目的地,它是用于想缓存读取或写入数据,是访问缓冲的接口。 3.4 使用软引用和弱引用 3.5 有利于改善性能的技巧 3.5.1 慎用异常 3.5.2 使用局部变量,因为局部变量是在stack中,比较快。 3.5.3 位运算代替乘除法 3.5.12 静态方法代替实例方法 第四章并行程序优化 4.5 锁的优化 4.5.7 ReentrantLock 重入锁 4.5.9 自旋锁
案例--注册功能 1功能说明 没有人不知道什么叫注册功能吧! 我们这里的注册功能很简单,给用户提供一个页面,在页面中给出一个注册表单,用户输入自己的注册信息(用户名和密码)。然后提交表单,把请求发送到Servlet,Servlet会把用户的注册信息保存到XML文件中。完毕! 我们也不打算让Servlet做太多的事情,所以真正保存信息的工作还是交给DAO来做吧!所以在Servlet中只是获取DAO对象,然后调用DAO的方法来完成保存信息! DAO – Data Access Object(数据的存取工作,由这个对象来完成!) ●User :这是我们注册功能的唯一数据类! 不能用业务数据做主键(唯一标识!) username:用户名是唯一的! password email:唯一的! 2项目分析 用户通过注册页面的表单向Servlet发送请求,Servlet获取DAO对象,然后调用DAO 对象的方法save()方法完成向XML文档中保存注册信息。 ●reigst.jsp:包含注册表单的页面,提交表单会把请求交给RegistServlet来处理; ●RegistServlet:注册Servlet,包含doPost()方法。获取DAO对象,然后调用DAO对 象的save()方法传递User对象(注册信息领域对象)过去,由DAO完成保存注册信 息; ●RegistDao:只有一个save(User)方法,会使用DOM4J完成把User保存到XML文件 中; ●RegistDaoImpl:为了更好的处理耦合的问题,我们把RegistDao定义为接口,而 RegistDaoImpl为其实现类; ●User:领域对象,用来封装注册信息。最终还需要把它转换成XML数据持久化! ●user.xml:因为我们现在没学数据库,只能使用XML作为存储数据的工具。 总是从无依赖开始! 3从注册页面开始