JAVA和JSP之间的关系

我现在给你一个JAVA和JSP之间的关系,以及JAVA的完整认识

JAVA分为J2EE,J2SE.J2ME,下面分别介绍:

一.J2EE:Java 2 Platform Enterprise Edition 企业版,用于企业应用,支持分布式部署。

J2EE平台由一整套服务(Services)、应用程序接口(APIs)和协议构成,
它对开发基于Web的多层应用提供了功能上的支持。它包含13种核心技术规范:
(1)Java Database Connectivity (JDBC)
以一种统一的方式来对各种各样的数据库进行存取
(2)Java Naming and Directory Interface (JNDI)
用于名字和目录服务,它提供了一致的模型来存取和操作企业级的资源如DNS和LDAP,本地文件系统等
(3)Enterprise Java Beans (EJB)
提供了一个框架来开发和实施分布式商务逻辑,显著地简化了具有可伸缩性和高度复杂的企业级应用的开发
(4)JavaServer Pages (JSPs) 这里就是你所说的JSP!!!!!!用以创建动态网页
(5)Java servlets
提供的功能大多与JSP类似,不过实现的方式不同
(6)Remote Method Invocation (RMI)
在远程对象上调用一些方法,使用了连续序列方式在客户端和服务器端传递数据
(7)Interface Description Language (IDL)
将Java和CORBA集成在一起
(8)Java Transaction Architecture (JTA)
可以存取各种事务
(9)Java Transaction Service (JTS)
规定了事务管理器的实现方式
(10)JavaMail
用于存取邮件服务器的API,它提供了一套邮件服务器的抽象类
(11)JavaBeans Activation Framework(JAF)
JavaMmail利用JAF来处理MIME-编码的邮件附件,MIME的字节流可以被转换成JAVA对象,或者转换自JAVA对象
(12)Java Messaging Service (JMS)
是用于和面向消息的中间件相互通信的应用程序接口(API)
(13)Extensible Markup Language (XML)
XML是一种可以用来定义其它标记语言的语言
上面的JSP是主流,基于MVC的实现,最流行使用,也最安全(比较其他语言做的网站)
其中EJB是java最难学的东西
但是现在的sun公司出来一种新的技术:java FX,
可以像FLASH一样在浏览器中执行,但是也要安装插件,具体可以参见www.sun.com
二.J2SE:Java 2 Platform Standard Edition 标准版,用于桌面应用,也是J2EE的基础。

包括JAVA基础,IO,Swing,AWT,线程,集合等知识.也是学习JAVA的必经之路(基础)!
三.J2ME:Java 2 Platform Micro Edition 移动版用于小型设备,是J2SE的一个子集。

主要的技术如下:

Connected Limited Device Configuration【CLDC】:是组成资源有限的移动信息设备的 Java 运行时环境的两种配置之一。CLDC 描述最基本的库和虚拟机特性,所有包含 K 虚拟机(K virtual machine,KVM)的 J2ME 环境实现中都必须提供这些库和特性。
Mobile Information Device Profile【MIDP】:是组成资源有限的移动信息设备的 Java 运行时环境的两种配置之一。MIDP 提供核心应用程序功能,包括用户界面、网络连接、本地数据存储和应用程序生命周期管理。
Connected Device Configuration【CDC】:是一个基于标准的框架,用来构建和交付可以跨许多连接网络的消费类设备和嵌入式设备共享的应用程序。
Mobile 3D Graphics API for J2ME【M3G】:是一种轻量的交互式 3D 图形 API,它作为可选的包与 J2ME 和 MIDP 结合使用。

所以你所说的JAVA和JSP的关系就这样豁然开朗!

JAVA是一种编程语言,可以编写应用程序,主要应用在网络编程上。 
JSP是建立在JAVA基础上的一种网络编程语言,只能在网页上应用。 
JavaScript是一种Web脚本语言,可以嵌入在HTML中,可以由浏览器解释执行。

可以把jsp理解为脚本

java为面向对象语言

jsp作用主要是负责页面展现,java负责逻辑,业务处理

jsp 本质 是servlet,servlet本质是 java类,就是这么个关系。

ajax中获得处理接口传过来的xml

$.ajax({
   type: "POST",
   url:"http://127.0.0.1/jk/xml.php",
 
   data: "",
   success: function(xml){
			obj=$(xml).find("teacher");
			alert(obj.text());//弹出内容 xuduowei
			


   }
});

xml.php 接口 code:

<?php
$xmlstring=<<<XML

 
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<student>xue</student>
<teacher>xuduowei</teacher>
</persons>
 
XML;

echo $xmlstring;
?>

 

ajax中 json字符串或者json对象的处理。

若对应的json传递过来的是json对象【php中json_encode($arr) 就是json对象】。

ajax,js中,可以用 var json=JSON.parse(msg);处理转成数组。注意:JSON.parse兼容性不好,还是推荐用:eval(“(“+msg+”)”);转成对象。

 

但是若接口文件php中直接输出的是json字符串,则我们需要使用:

//我们需要将eval()方法将这个字符串包一下,就可以转成JSON对象了

var json = eval(‘(‘ + msg + ‘)’);

如果用错了,会报错的!

SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON

一定要区分开!

 

模拟JS代码如下:

<script src="jquery.min.js"></script>
<script>
	$.ajax({
   type: "POST",
   url:"http://127.0.0.1/jk/json.php",
  //url: "https://api.miaodiyun.com/20150822/industrySMS/sendSMS",
 //  data: "accountSid=c754405c64bd493188b56a5b781dc5ff&smsContent=【秒嘀科技】您的验证码是345678,30分钟输入有效。    &to=13896543210&timestamp=20150821100312&sig=96d3adac3d2f43b8a85b0aeb201ab2be&respDataType=JSON",
   success: function(msg){
    // alert( "Data Saved: " + msg );
			//var json=JSON.parse(msg);//这个不行,用下面的
		
			var json = eval('(' + msg + ')');
			// alert(json.respDesc);
			 var respDesc=json.respDesc;
				alert(respDesc);
			// if(respDesc=="成功"){
				//alert('接收成功');
			// }

			//alert(11);

   }
});
</script>

模拟接口文件代码:

<?php
$str=<<<xdw
{
"respCode":"00000",
"respDesc":"成功",
"failCount":"1",
"failList":
[
    {
        "phone":"13896543210",
        "respCode":"00111",
        "respDesc":"匹配到黑名单",
    }
],
"smsId":"913945fec0204b1e94baa75a5c013f59"
}
xdw;


echo $str;//这里输出的是json字符串,不是对象。


?>

 

xml中的<![CDATA[]]>和转义字符

<![CDATA[]]>这个标记所包含的内容将表示为纯文本,比如<![CDATA[<]]>表示文本内容“<”
此标记用于xml文档中,我们先来看看使用转义符的情况。我们知道,在xml中,”<””>””&”等字符是不能直接存入的,否则xml语法检查时会报错,如果想在xml中使用这些符号,必须将其转义为实体,如”&lt;””&gt;””&amp;”,这样才能保存进xml文档。
在使用程序读取的时候,解析器会自动将这些实体转换回”<””>””&”。举个例子:
<age> age < 30 </age>
上面这种写法会报错,应该这样写:
<age> age &lt; 30 </age>
值得注意的是:
(1)转义序列字符之间不能有空格;
(2) 转义序列必须以”;”结束;
(3) 单独出现的”&”不会被认为是转义的开始;
(4) 区分大小写。在XML中,需要转义的字符有:
(1)&   &amp; 
  (2)<   &lt; 
(3)>   &gt;
(4)"   &quot;
(5)'   &apos;
但是严格来说,在XML中只有”<”和”&”是非法的,其它三个都是可以合法存在的,但是,把它们都进行转义是一个好的习惯。
不管怎么样,转义前的字符也好,转义后的字符也好,都会被xml解析器解析,为了方便起见,使用<![CDATA[]]>来包含不被xml解析器解析的内容。但要注意的是:
(1) 此部分不能再包含”]]>”
(2) 不允许嵌套使用;
(3)”]]>”这部分不能包含空格或者换行。
最后,说说<![CDATA[]]>和xml转移字符的关系,它们两个看起来是不是感觉功能重复了?
是的,它们的功能就是一样的,只是应用场景和需求有些不同:
(1)<![CDATA[]]>不能适用所有情况,转义字符可以;
(2) 对于短字符串<![CDATA[]]>写起来啰嗦,对于长字符串转义字符写起来可读性差;
(3) <![CDATA[]]>表示xml解析器忽略解析,所以更快。

用PHP5的SimpleXML解析XML文档

www.xuduowei.com/archives/91

 

为什么要使用PHP单例模式及应用实例

首先我们要知道明确单例模式这个概念,那么什么是单例模式呢?

单例模式顾名思义,就是只有一个实例。

作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,

这个类我们称之为单例类。

单例模式的要点有三个:

一是某个类只能有一个实例;

二是它必须自行创建这个实例;

三是它必须自行向整个系统提供这个实例。

下面我们讨论下为什么要使用PHP单例模式?

多数人都是从单例模式的字面上的意思来理解它的用途, 认为这是对系统资源的节省, 可以避免重复实例化, 是一种”计划生育”。而PHP每次执行完页面都是会从内存中清理掉所有的资源. 因而PHP中的单例实际每次运行都是需要重新实例化的, 这样就失去了单例重复实例化的意义了. 单单从这个方面来说, PHP的单例的确有点让各位失望. 但是单例仅仅只有这个功能和应用吗? 答案是否定的,我们一起来看看。

1. php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时(废话), 如果使用单例模式, 则可以避免大量的new 操作消耗的资源。

2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看zend framework的FrontController部分。

3. 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。

* 单例模式举例,其要点如下:
*
* 1. $_instance 必须声明为静态的私有变量
* 2. 构造函数和克隆函数必须声明为私有的,这是为了防止外部程序new 类从而失去单例模式的意义
* 3. getInstance()方法必须声明为公有的,必须调用此方法以返回唯一实例的一个引用
* 4. ::操作符只能访问静态变量或静态函数
* 5. PHP的单例模式是相对而言的,因为PHP的解释运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。
* 也就是说,PHP在语言级别上没有办法让某个对象常驻内存。在PHP中,所有的变量都是页面级的,无论是全局变量, 还是类的静态成员,都会在页面执行完毕后被清空,结果会重新建立新的对象,这样也就完全失去了Singleton的意义。
* 不过,在实际应用中同一个页面中可能会存在多个业务逻辑,这时单例模式就起到了很重要的作用,有效的避免了重复  new 对象(注: new 对象会消耗内存资源)这么一个行为,所以我们说PHP的单例模式是相对而言的。

数组排序问题:

js:

<script>
var a=Array(1,2,3,100,200,60,50); 

a.sort(function(a,b){
	if(a<b){return 1 //a<b return 1从大到小的排序
	} else{
	return 0
	}
})

alert(a);
</script>

PHP:方法一:

<?php
 $a=array(1,2,3,100,200,60,50);

 usort($a,function($a,$b){
	if($a<$b){
		return 1; //a<b return 1从大到小的排序
	} else{
	return 0;
	}
});
  print_r($a);

?>

PHP方法二:

<?php
 $a=array(1,2,3,100,200,60,50);
rsort($a);//rsort从大到小排序  ;sort是从小到大
 
  print_r($a);

?>

 

 

 

2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题

大家可能都用过in_array来判断一个数据是否在一个数组中,一般我们的数组可能数据都比较小,对性能没什么影响,所以也就不会太在意。

但是如果数组比较大的时候,性能就会下降,运行的就会久一点,那如果针对在大数组情况下做优化呢,下面说两种方法(都是通过自定义函数来实现):

1.数组key与value翻转,通过isset判断key是否存在于数组中

/**
 * in_array is too slow when array is large
 */
function inArray($item, $array) {
    $flipArray = array_flip($array);
    return isset($flipArray[$item]);
}

大家可能也会问为什么不用 array_key_exists 来做判断二用isset呢? 下面看下array_key_exists() 与 isset() 的对比:
isset()对于数组中为NULL的值不会返回TRUE,而array_key_exists()会。

<?php
$search_array = array('first' => null, 'second' => 4);
// returns false
isset($search_array['first']);
// returns true
array_key_exists('first', $search_array);
?>

2.用implode连接,直接用strpos判断

用implode函数+逗号连起来,直接用strpos判断。php里面字符串取位置速度非常快,尤其是在大数据量的情况下。不过需要注意的是首尾都要加”,” ,这样比较严谨。如: ,user1,user2,user3, 查找的时候,查,user1,。还有strpos要用!== false,因为第一个会返回0。示例如下:

return strpos($str,(string)$item)==false?false:true;**
 * in_array is too slow when array is large
 */
function inArray($item, $array) {
    $str = implode(',', $array);    
    return strpos($str,(string)$item)==false?false:true;
}

提示:以上2个函数均有bug!方法一数组翻转中,若原始数组值有null的,是会出问题的;方法二的只能验证字符串类型的。无法验证整形数字。总结:还是in_array($str,$arr,true) 验证方式最安全可靠。虽然性能相对底一点。

 

 

 

php自带的sort排序和用php实现排序算法的性能比较?

我今天特地试验了一下两者的性能
php自带的排序函数 100000的数据 排序 平均耗时0.068s
microtime() //php自带排序sort()耗时:0.12000608444214 
返回当前 Unix 时间戳的微秒数。
 for ($i = 0; $i<100000;$i++){

    $arr[] = rand(0,10000);
}

 $t1 = microtime(true);

sort($arr);

$t2 = microtime(true);
echo "php自带排序sort()耗时:".($t2-$t1); 

自己写的快速排序 平均耗时1.0s

//快速排序耗时:1.7631008625031

 for ($i = 0; $i<100000;$i++){

    $arr[] = rand(0,100000);
}

 $t1 = microtime(true);

$returnAr = quickSort($arr);

$t2 = microtime(true);
echo "快速排序耗时:".($t2-$t1); 
//快速排序
function quickSort($arr) {
    //先判断是否需要继续进行
    $length = count($arr);
    if($length <= 1) {
        return $arr;
    }
    //选择第一个元素作为基准
    $base_num = $arr[0];
    //遍历除了标尺外的所有元素,按照大小关系放入两个数组内
    //初始化两个数组
    $left_array = array();  //小于基准的
    $right_array = array();  //大于基准的
    for($i=1; $i<$length; $i++) {
        if($base_num > $arr[$i]) {
            //放入左边数组
            $left_array[] = $arr[$i];
        } else {
            //放入右边
            $right_array[] = $arr[$i];
        }
    }
    //再分别对左边和右边的数组进行相同的排序处理方式递归调用这个函数
    $left_array = quickSort($left_array);
    $right_array = quickSort($right_array);
    //合并
    return array_merge($left_array, array($base_num), $right_array);
}

明显是php自带的函数排序速度快很多。
但重点是,为什么还有那么多问题是问 如何用php实现快速排序等算法?

php四排序-冒泡排序

算法和数据结构是一个编程工作人员的内功,技术牛不牛,一般都会看这两点。作为php程序员, 提升技能当然也得学习算法。

下面介绍四种入门级排序算法: 冒泡排序、选择排序、插入排序、快速排序。

一、冒泡排序

原理:对一组数据,比较相邻数据的大小,将值小数据在前面,值大的数据放在后面。   (以下都是升序排列,即从小到大排列)

举例说明: $arr = array(6, 3, 8, 2, 9, 1);

$arr 有6个数据,按照两两比较大小如下,注意  比较轮数 和 每轮比较次数

 第一轮排序:

第一次比较  6和3比较 结果:3    6   8   2   9   1

第二次比较  6和8比较 结果:3    6   8   2   9   1

第三次比较  8和2比较 结果:3    6   2   8   9   1

第四次比较  8和9比较 结果:3    6   2   8   9   1

第五次比较  9和1比较 结果:3    6   2   8   1   9

第一轮比较总结:1.排序第1轮、比较5次,没有获得从小到大的排序   2.因为每次比较都是大数往后靠,所以比较完成后,可以确定大数排在最后(9 已经冒泡冒出来了,下轮比较可以不用比较了 )

第二轮排序:

第一次比较  3和6比较 结果:3    6   2   8   1   9

第二次比较  6和2比较 结果:3    2   6   8   1   9

第三次比较  6和8比较 结果:3    2   6   8   1   9

第四次比较  8和1比较 结果:3    2   6   1   8   9

第二轮比较总结:1.排序第2轮、比较4次,没有获得从小到大的排序   2.冒泡出了 8,下轮不用比较8 了

第三轮排序:

第一次比较  3和2比较 结果:2    3   6   1   8   9

第二次比较  3和6比较 结果:2    3   6   1   8   9

第三次比较  6和1比较 结果:2    3   1   6   8   9

第三轮比较总结:1.排序第3轮、比较3次,没有获得从小到大的排序   2.冒泡出了 6,下轮不用比较6 了

  第四轮排序:

第一次比较  2和3比较 结果:2    3   1   6   8   9

第二次比较  3和1比较 结果:2    1   3   6   8   9

第四轮比较总结:1.排序第4轮、比较2次,没有获得从小到大的排序   2.冒泡出了 3,下轮不用比较3 了

  第五轮排序:

第一次比较  2和1比较 结果:1   2   3   6   8   9

第五轮比较总结:1.排序第5轮、比较1次,没有获得从小到大的排序   2.冒泡出了 2,由于还剩一个1,不用再比较了,至此通过5轮排序,完成整个排序。

  通过以上五轮排序,若干次比较,我们有理由推断出一个结论:

  对于一个长度为N的数组,我们需要排序 N-1 轮,每 i 轮 要比较 N-i 次。对此我们可以用双重循环语句,外层循环控制循环轮次,内层循环控制每轮的比较次数。

<?php 

function getpao($arr)
{ 
 $len=count($arr);
 //设置一个空数组 用来接收冒出来的泡
 //该层循环控制 需要冒泡的轮数
 for($i=1;$i<$len;$i++)
 { //该层循环用来控制每轮 冒出一个数 需要比较的次数
 for($k=0;$k<$len-$i;$k++)
 {
 if($arr[$k]>$arr[$k+1])
 {
 $tmp=$arr[$k+1];
 $arr[$k+1]=$arr[$k];
 $arr[$k]=$tmp;
 }
 }
 }
 return $arr;
}


 $arr= array(6,3,8,2,9,1);
$res =  getpao($arr);
print_r($res);