7.1 解释一下什么是BPEL?
BPEL:全称为Business Process Execution Language,即业务处理执行语言,是一种使用XML编写的编程语言。用于自动化业务流程,也曾经被称作WSBPEL和 BPEL4WS。广泛使用于Web服务相关的项目开发中,优点为具有可移植性和有效保护了投资。
BPEL是一门用于自动化业务流程的形式规约语言。 用XML文档写入BPEL中的流程能在Web 服务之间以标准化的交互方式得到精心组织。这些流程能够在任何一个符合BPEL规范的平台或产品上执行。 所以,通过允许顾客们在各种各样的创作工具和执行平台之间移动这些流程,BPEL使得他们保护了他们在流程自动化上的投资。尽管以前想使业务流程定义标准化,但BPEL已经引起了史无前例的兴趣,而且它最早在软件供应商中获得大量认可。 7.2 如何得到Java应用程序的可用内存?
答:如下代码实现取得总的内存大小和可用内存大小,并打印到控制台上 public class MemoryExp {
public static void main(String[] args) { System.out.println("Total Memory"+Runtime.getRuntime().totalMemory()); System.out.println("Free Memory"+Runtime.getRuntime().freeMemory()); } } 7.3 如何查找数据库重复记录
法一: 用Group by语句 此查找很快的
select count(num), max(name) from student –查找表中num列重复的,列出重复的记录数,并列出他的name属性 group by num
having count(num) >;1 –按num分组后找出表中num列重复,即出现次数大于一次
法二:当表比较大(例如10万条以上)时,这个方法的效率之差令人无法忍受,需要另想办法:
执行下面SQL语句后就可以显示所有DRAWING和DSNO相同且重复的记录 SELECT * FROM EM5_PIPE_PREFAB
WHERE ROWID!=(SELECT MAX(ROWID) FROM EM5_PIPE_PREFAB D –D相当于First,Second
WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND
EM5_PIPE_PREFAB.DSNO=D.DSNO);
7.4 简述你对IoC(Inversion of Control)的理解
一个类需要用到某个接口的方法,我们需要将类A和接口B的实现关联起来,最简单的方法是类A中创建一个对于接口B的实现C的实例,但这种方法显然两者的依赖(Dependency)太大了。而IoC的方法是只在类A中定义好用于关联接口B的实现的方法,将类A,接口B和接口B的实现C放入IoC的 容器(Container)中,通过一定的配置由容器(Container)来实现类A与接口B的实现C的关联。
7.5 Hibernate中的update()和saveOrUpdate()的区别
saveOrUpdate()方法可以实现update()的功能,但会多些步骤,具体如下:
如果对象在该session中已经被持久化,不进行操作;对象的标识符属性(identifier property)在数据库中不存在或者是个暂时的值,调用save()方法保存它;如果session中的另一个对象有相同的标识符抛出一个异常;以上皆不符合则调用update()更新之。 7.6 获取Oracle中年月日
不推荐用substr方法获取,推荐用 to_char方法
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期转化为字符串
select to_char(sysdate,'yyyy') as nowYear from dual; //获取时间的年
select to_char(sysdate,'mm') as nowMonth from dual; //获取时间的月
其他的类似
7.7 如何写一个不需要main方法的应用程序?
可以使用静态代码块来实现一个可以执行但并没有main方法的Java应用程序。如下面的代码是所示:
class MainMethodNot 上面的代码可以运行是因为static代码块会在java类被加载的时候被执行,而且是在main方法被调用之前。在运行时,JVM会在执行静态代码块以后搜索main方法,如果不能找到main方法,就会抛出一个异常,为了避免这个异常,可以使用System.exit(0)来结束应用程序。
7.12 session的load()和get()的区别
Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于:
如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException;load方法可返回实体的代理类实例,而get方法永远直接返回实体类;load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。 7.13 pageEncoding和contentType的区别
在JSP标准的语法中,如果pageEncoding属性存在,那么JSP页面的字符编码方式就由pageEncoding决定,否则就由contentType属性中的charset决定,如果charset也不存在,JSP页面的字符编码方式就采用默认的ISO-8859-1。
JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat出来的网页, 用的是contentType。
第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。 第二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。
JAVAC用UTF-8的encoding读取java源码,编译成UTF-8 encoding的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。
第三阶段是Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效
7.14 退出系统后如何防止点击ie后退按钮返回系统
我们先分析为什么通过浏览器返回访问的原因:
1.浏览器缓存 我们有时候会发现是退出系统了可是通过历史记录或者直接访问地址,最后一次操作的数据或显示的列表还在那里,一堆人在冒汗,说你系统不安全! 其实这时候并没有访问到系统,是本地的浏览器缓存在做怪。 2.没有做权限拦截 很多人在做程序的时候可能会忘记去注意权限分配了,有些功能是要求用户在登录状态下使用的,甚至是某个角色的用户才可以操作的。如果没有做这些限制,很容 易被人利用,最简单的就是通过地址直接访问
这两个方面内容是造成问题出现的绝大部分原因. 解决方案: 1.禁止缓存 如:jsp <% response.setHeader("Pragma","No-Cache"); response.setHeader("Cache-Control","No-Cache"); response.setDateHeader("Expires", 0); %> 2.利用session在页面进行拦截 如:jsp原码 String userid= (String)session.getValue("userid"); if(userid==""||userid==null)//判断指定session值的存在与否,来检查是否已经登录 { 跳转到提示页面 } else { 其他主体程序代码 } 利用以上两个方法同时使用,能够解决大部分问题,包括浏览器返回的问题。 3.利用struts配置拦截器 7.15 域名和ip地址关系
一个域名只能是对应一个IP,但是一个IP地址却可以对应多个域名。
一台机器上面就一个ip地址,但可以有很多的网站放在上面,每个网站都有自己的域名。这就是一个ip对应多个域名的例子。
7.16 cellpadding与cellspacing的属性
上图说明了表格的几个属性,其中黑色部分就是单元格(cell),白色的区域是单元格边距(表格填充),灰色的区域是单元格间距(表格间距)。
7.21 线程的简单例子
class secThread extends Thread
{ void run() { //...... } } public class exThread { public static void main(String args[]) { secThread st= new secThread(); st.start(); } } 7.22 JavaScript indexOf() 方法
定义和用法
indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
语法
stringObject.indexOf(searchvalue,fromindex)
说明
该方法将从头到尾地检索字符串 stringObject,看它是否含有子串 searchvalue。开始检索的位置在字符串的 fromindex 处或字符串的开头(没有指定 fromindex 时)。如果找到一个 searchvalue,则返回 searchvalue 的第一次出现的位置。stringObject 中的字符位置是从 0 开始的。
7.23 数据库并发产生的五个问题:
1、脏读:一个事务读到另一事务未提交的更新数据。
在A事务内,由于B事务对A记录进行了修改但未提交,而A事务马上读取了这个提交的值,在这个值的基础上进了一系列的操作,但另一个事务突然出回滚,导致数据值不一致的问题。 2、虚读:一个事务读到另一事务已提交的新插入的数据。
在A事务内,由于B事务对A表的插入操作并提交,导致在A事务中前后查询得到关于整张表相关的值不一致的问题 3、不可重复读:一个事务读到另一事务已提交的更新数据。 在A事务内,由于B事务对A记录的修改并提交,导致在A事务中前后查询得到同一记录的值不一样的问题。 4、第一类丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖。
在A事务内,读取得到某一记录的值,同时在B事务把同一记录的值进行了修改并提交,A事务基于原来读取到的值进行修改后回滚,在数据库中得到丢失了B事务更新的结果。(这种问题在数据库中基本不会出现)。 5、第二类丢失更新:这是不可重复读中的特例,一个事务覆盖另一事务已提交的更新数据。 在A事务内,读取得到某一记录的值,同时在B事务把同一记录的值进行了修改并提交,A事务基于原来读取到的值进行修改后提交,在数据库中得到丢失了B事务更新的结果。 7.26 什么是servlet链
与UNIX和DOS命令中的管道类似,你也可以将多个servlet以特定顺序链接起来。在servlet链中,一个servlet的输出被当作下一个servlet的输入,而链中最后一个servlet的输出被返回到浏览器。
servlet链接提供了将一个servlet的输出重定向为另一个servlet的输入的能力。这样,你就可以划分工作,从而使用一系列servlet来实现它。另外,你还可以将servlet组织在一起以提供新的功能。 7.27 配置SSH时常用Filter?
Spring对hibernate事物管理的filter(OpenSessionInViewFilter),Spring对struts编码管理的filter(CharacterEncodingFilter)
7.28 如何让你的一个系统能支持异构数据库.你会怎么样设计?
答:异构数据库系统是相关的多个数据库系统的集合,可以实现数据的共享和透明访问,每个数据库系统在加入异构数据库系统之前本身就已经存在,拥有自己的DMBS。异构数据库的各个组成部分具有自身的自治性,实现数据共享的同时,每个数据库系统仍保有自己的应用特性、完整性控制和安全性控制。异构数据库系统的异构性主要体现在以下几个方面: 1.计算机体系结构的异构
各个参与的数据库可以分别运行在大型机、小型机、工作站、PC或嵌入式系统中。
2.基础操作系统的异构
各个数据库系统的基础操作系统可以是Unix、Windows NT、 Linux等。
3.DMBS本身的异构
可以是同为关系型数据库系统的Oracle、 SQL Server等,也可以是不同数据模型的数据库,如关系、模式、层次、网络、面向对象,函数型数据库共同组成一个异构数据库系统。
必须提供一个独立于特定数据库管理系统的统一编程界面和一个基于 SQL的通用的数据库访问方法
7.29 给一个任意字符组成的字符串统计每个字符出现的次数,例如:String str = “java@list#有中文啊,jiu zhemechangle”,要求只用一个for循环或while循环
package com.lsp.charlenth;
import java.util.HashMap; import java.util.Map.Entry; public class FindCharCount { public static void func(String str) { HashMap<Character, Integer> map = new HashMap<Character, Integer>(); for (int i = 0; i < str.length(); i++) { char ch = str.charAt(i); if (map.get(ch) == null) { map.put(ch, 1); } else { int cnt = map.get(ch); map.put(ch, ++cnt); } } for (Entry<Character, Integer> entry : map.entrySet()) { System.out.println(entry.getKey() + ":" + entry.getValue()); } } public static void main(String[] args) { String str = "java@list#有中文啊,jiu zhemechangle"; func(str); } } |
|