博客首页|TW首页| 同事录|业界社区
2011-02-20

JSP页面从形式上就是在传统的网页HTML文件中加入Java程序片段(Scriptlet)和JSP标签。Servlet/JSP容器收到客户端发出的请求时,首先执行其中的程序片段,然后将执行结果以HTML格式响应给客户端。

基本语法:

注释:

1、客户端可以看到的注释:<!– comment [] –> (可以在批注中加上动态的表达式)

2、开发程序员专用的注释: 或者

声明:
查看源码
打印
1

该声明的变量为类变量。意味着:若同时有n个用户在执行此JSP网页时,他们将会共享此变量。会引起线程同步上的麻烦。(不建议使用)

小脚本:

此类定义的变量为局部变量,不存在多线程同步问题,是线程安全的。

表达式:

不能使用“;”作为表达式的结束符号。

JSP指令元素:

只是告诉JSP引擎对JSP页面如何编译。

page指令:设定整个JSP网页的属性和相关功能。

查看源码
打印
1
2
例如:

查看源码
打印
1
include指令:用于指示JSP容器在JSP编译时插入一个包含文本或代码的文件,这个包含的过程是静态的。注意包含文件中要避免使用,可能会导致错误。

查看源码
打印
1
2
3 例如:
4
5 taglib指令:
6
7

JSP操作元素:

查看源码
打印
1
2
3
4
5
6

request对象与网络信息的提交:

JSP中提供了request对象来接收客户端发送回来的数据。

◆URL一般语法:protocol://host:port/virtualPath?queryString

◆protocol:表示协议,用于声明在远程机器之间传送信息的低层机制(http ftp https等)。

◆host:表示请求要发送到的远程机器的名称或者ip地址。

◆port:声明服务器要监听请求的机器端口号。

◆virtualPath:包含一个以斜线为分隔符的一组标识符,服务器把它映射到一个物理路径和JSP的位置。

◆querString:是查询字符串,它是一个成对的名称和值的列表,作为JSP的参数被传递到处理它的JSP页面。如果有多个参数需要传递,将以“&”号分隔开成对的名称和值。

request对象所提供的方法:

获取路径和协议信息:

查看源码
打印
1 String getProtocol() 获取通信所使用的协议和版本号(如:HTTP /1.1)
2 String getScheme() 获取请求中的协议名称(如:HTTP)
3 String getPathInfo() 获取请求中处于JSP路径和查询字符串之间的额外信息
4 String getContextPath()
5 String getRequestURI()
6 String getServletPath()
7 String getRealPath(String path)
获取主机和端口信息:

查看源码
打印
1 String getServerName() 获取响应请求的服务器名称。
2 int getServerPort() 获取响应请求的服务器端主机端口号。
3 String getLocalName() 获取响应请求的服务器端主机名。
4 String getLocalAddr() 获取响应请求的服务器端地址。
5 int getLocalPort() 获取响应请求的服务器端端口。
6 String getRemoteAddr() 获取发出请求的客户端IP地址。
7 String getRemoteHost() 获取发出请求的客户端主机名。
8 int getRemotePort() 获取发出请求的客户端主机端口。

获取查询字符串:

String getQueryString() 获取get()方法传递的参数字符串,即URL中?后面的部分。

获取查询字符串中的变量值:

查看源码
打印
1 String getParameter(String name) 获取客户端发送给服务器端的参数值。
2 Enumeration getParameterNames() 返回请求中所有参数的集合。
3 String[] getParameterValues(String name) 获得请求中指定参数的所有值。
4
5 例如:
6
7 http://localhost:8080/liuxl/jsp/querystring.jsp?str=JSP
8 String s=request.getParameter(”str”); 获取变量str的值,执行后s的值为“JSP”。
注意:getParameter()方法的返回值只能是字符串。若传递val=100,则需要进行类型转换。

查看源码
打印
01 if(request.getParameter(”val”)!=null) //判断字符串是否为空
02 { num=Integer.parseInt(request.getParameter(”val”)); //将字符串转化为整数
03 } else {
04 num=0;
05 }
06
07 if(request.getParameter(”val”)!=null) //判断字符串是否为空
08 {
09 num=Integer.parseInt(request.getParameter(”val”)); //将字符串转化为整数
10 }
11 else
12 {
13 num=0;
14 }

表单及其在信息传递中的应用:

表单:

是一个能够包含表单元素的区域,HTML为表单提供了多种图形用户界面组件元素 (如文本框,密码框,下拉菜单等),这些表单元素能够让用户在表单输入信息,可以用它们来构成表单内容,作为用户可以输入的域,并可以将其提交给一个JSP进行处理。

格式:

查看源码
打印
1

2 …
3

其中: name用于指定表单的名称。action用于指定表单被提交时所要执行的动作。method指定传递请求给JSP所用的方法(GET、POST、PUT,常用POST)。

1、标签 常用于输入信息或提交信息

语法:

说明:type允许指定输入类型(text(文本框)、password(密码框)、checkbox(复选框)、radio(单选按钮)、 image(图像域)、reset(重置按钮)、submit(提交按钮))。 name为表单元素的名称。value为表单元素的初始值。

例如:

查看源码
打印
01 文本框:
02 密码框:
03 提交按钮:
04 重置按钮:
05 单选按钮:
06
07 (用于从一组选项中选择其中一个选项,checked是可选属性,如果有该属性,则表示该按钮显示时为被选中,否则为未选中。)
08
09 e.g:选项1
10 选项2
11
12 在选中按钮1的情况下提交URL如下:…?radiobutton=1…
13 复选框:
(用于从一组选项中选择多个选项,checked同上。与单选按钮相似,复选框常成组使用,与单选按钮不同的是,被选中的多个复选框都会被提交,因此其name可以相同(按数组处理),也可以不同(按不同变量进行处理))

查看源码
打印
1 e.g:swim
2 run

如果在提交时两个都选中,则URL形式如下:…?checkbox=swim&checkbox=run…

2、

说明:cols为文本域宽度(字符数),rows为文本域的高度(行数)

3、标签 声明了一个可选项的列表,用户可以选择一个或多个选项

查看源码
打印
1
2 option
3 …
4 option
5

说明:name是名称,size是列表区域高度(即可显示的选项数),multiple是可选属性,若有表示可选择多项。selected是一个可选属性,有表示该选项设置为已选中。

2011-02-18

最近在写一个首页返回顶部的效果,因为IE6不兼容position:fixed的原因,一直找不到好的解决办法。在Google了一下,有了点眉目,加上一点自己的开发,总算误打误撞的把问题解决了。

最近也在学jquery,就顺便记录一下了。

HTML

查看源码
打印
1

2
3
CSS

查看源码
打印
01 .scroll{
02 background:url(../image/scroll.gif) no-repeat center top transparent;
03 bottom:100px;
04 cursor:pointer;
05 height:67px;
06 width:18px;
07 position:fixed;
08 _position:absolute; /*兼容IE6*/
09 _top: [removed]eval(document.documentElement.scrollTop)+700); /*700为图片距离顶部的设定距离,可以修改。不加700则图片紧贴在顶部滚动*/
10 }
11 html{_text-overflow:ellipsis;} /*解决IE6下图片抖动*/
top.js

查看源码
打印
01 $(document).ready(function(){
02 var show_delay;
03 var scroll_left=parseInt((document.body.offsetWidth-960)/2)+961; //960为页面宽度
04 $(”.scroll”).click(function (){
05 document.documentElement.scrollTop=0;
06 document.body.scrollTop=0;
07 });
08 $(window).resize(function (){
09 scroll_left=parseInt((document.body.offsetWidth-960)/2)+961;
10 $(”.scroll”).css(”left”,scroll_left);
11 });
12 reshow(scroll_left,show_delay);
13 });
14 function reshow(marign_l,show_d) {
15 $(”.scroll”).css(”left”,marign_l);
16 if((document.documentElement.scrollTop+document.body.scrollTop)!=0)
17 {
18 $(”.scroll”).css(”display”,”block”);
19 }
20 else
21 {
22 $(”.scroll”).css(”display”,”none”);}
23 if(show_d) window.clearTimeout(show_d);
24 show_d=setTimeout(”reshow()”,500);

2011-02-15

很多登录功能上都有个“记住密码”的功能,其实无非就是对cookie的读取。

下面展示这个功能的代码,原作者已无法考究。。。。

测试方法:直接输入账号密码,提交后,刷新页面,再输入同样的账号,就可以显示

查看源码
打印
001
002
003
004
005
006 window.onload=function onLoginLoaded() {
007 if (isPostBack == “False”) {
008 GetLastUser();
009 }
010 }
011
012 function GetLastUser() {
013 var id = “49BAC005-7D5B-4231-8CEA-16939BEACD67″;//GUID标识符
014 var usr = GetCookie(id);
015 if (usr != null) {
016 document.getElementById(’txtUserName’).value = usr;
017 } else {
018 document.getElementById(’txtUserName’).value = “001″;
019 }
020 GetPwdAndChk();
021 }
022 //点击登录时触发客户端事件
023
024 function SetPwdAndChk() {
025 //取用户名
026 var usr = document.getElementById(’txtUserName’).value;
027 alert(usr);
028 //将最后一个用户信息写入到Cookie
029 SetLastUser(usr);
030 //如果记住密码选项被选中
031 if (document.getElementById(’chkRememberPwd’).checked == true) {
032 //取密码值
033 var pwd = document.getElementById(’txtPassword’).value;
034 alert(pwd);
035 var expdate = new Date();
036 expdate.setTime(expdate.getTime() + 14 * (24 * 60 * 60 * 1000));
037 //将用户名和密码写入到Cookie
038 SetCookie(usr, pwd, expdate);
039 } else {
040 //如果没有选中记住密码,则立即过期
041 ResetCookie();
042 }
043 }
044
045 function SetLastUser(usr) {
046 var id = “49BAC005-7D5B-4231-8CEA-16939BEACD67″;
047 var expdate = new Date();
048 //当前时间加上两周的时间
049 expdate.setTime(expdate.getTime() + 14 * (24 * 60 * 60 * 1000));
050 SetCookie(id, usr, expdate);
051 }
052 //用户名失去焦点时调用该方法
053
054 function GetPwdAndChk() {
055 var usr = document.getElementById(’txtUserName’).value;
056 var pwd = GetCookie(usr);
057 if (pwd != null) {
058 document.getElementById(’chkRememberPwd’).checked = true;
059 document.getElementById(’txtPassword’).value = pwd;
060 } else {
061 document.getElementById(’chkRememberPwd’).checked = false;
062 document.getElementById(’txtPassword’).value = “”;
063 }
064 }
065 //取Cookie的值
066
067 function GetCookie(name) {
068 var arg = name + “=”;
069 var alen = arg.length;
070 var clen = [removed].length;
071 var i = 0;
072 while (i < clen) {
073 var j = i + alen;
074 //alert(j);
075 if ([removed].substring(i, j) == arg) return getCookieVal(j);
076 i = [removed].indexOf(” “, i) + 1;
077 if (i == 0) break;
078 }
079 return null;
080 }
081 var isPostBack = “”;
082
083 function getCookieVal(offset) {
084 var endstr = [removed].indexOf(”;”, offset);
085 if (endstr == -1) endstr = [removed].length;
086 return unescape([removed].substring(offset, endstr));
087 }
088 //写入到Cookie
089
090 function SetCookie(name, value, expires) {
091 var argv = SetCookie.arguments;
092 //本例中length = 3
093 var argc = SetCookie.arguments.length;
094 var expires = (argc > 2) ? argv[2] : null;
095 var path = (argc > 3) ? argv[3] : null;
096 var domain = (argc > 4) ? argv[4] : null;
097 var secure = (argc > 5) ? argv[5] : false;
098 [removed] = name + “=” + escape(value) + ((expires == null) ? “” : (”; expires=” + expires.toGMTString())) + ((path == null) ? “” : (”; path=” + path)) + ((domain == null) ? “” : (”; domain=” + domain)) + ((secure == true) ? “; secure” : “”);
099 }
100
101 function ResetCookie() {
102 var usr = document.getElementById(’txtUserName’).value;
103 var expdate = new Date();
104 SetCookie(usr, null, expdate);
105 }
106
107
108
109

110
用户名:
111
112
113 密码:
114
115 记住密码
116
117

118

119
120

Cookie cookies[]=request.getCookies(); //读出用户硬盘上的Cookie,并将所有的Cookie放到一个cookie对象数组里面
2 Cookie sCookie=null;
3 for(int i=0;i

2011-02-08

02   
03 255) fc = 255;
10 if (bc > 255) bc = 255;
11 int r = fc + random.nextInt(bc - fc);
12 int g = fc + random.nextInt(bc - fc);
13 int b = fc + random.nextInt(bc - fc);
14 return new Color(r, g, b);
15 }
16 %>
17   
18 <%
19 //设置页面不缓存
20 response.setHeader(”PRagma”, “No-cache”);
21 response.setHeader(”Cache-Control”, “no-cache”);
22 response.setDateHeader(”Expires”, 0);
23 // 设置图片的长宽
24 int width = 176, height = 30;
25 //设置备选汉字,剔除一些不雅的汉字
26 String base = “\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6″;
27 //备选汉字的长度
28 int length = base.length();
29 //创建内存图像
30 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
31 // 获取图形上下文
32 Graphics g = image.getGraphics();
33 //创建随机类的实例
34 Random random = new Random();
35 // 设定图像背景色(因为是做背景,所以偏淡)
36 g.setColor(getRandColor(random, 200, 250));
37 g.fillRect(0, 0, width, height);
38 //备选字体
39 String[] fontTypes = {
40 “\u5b8b\u4f53″, “\u65b0\u5b8b\u4f53″, “\u9ed1\u4f53″, “\u6977\u4f53″, “\u96b6\u4e66″};
41 int fontTypesLength = fontTypes.length;
42 //在图片背景上增加噪点
43 g.setColor(getRandColor(random, 160, 200));
44 g.setFont(new Font(”Times New Roman”, Font.PLAIN, 14));
45 for (int i = 0; i < 6; i++) {
46 g.drawString(”*********************************************”, 0, 5 * (i + 2));
47 }
48 //取随机产生的认证码(6个汉字)
49 //保存生成的汉字字符串
50 String sRand = “”;
51 for (int i = 0; i

2011-02-05

调用方法
<img src=”http://…../getImg”>

原理,在servlet中随机生成一个4位数字1000-9999
然后把这数字写入session
输出一个图片,上面写有这四个数字
在服务器端根据用户输入的数字和

session中的值比较。

查看源码
打印
01 package com.schoolwx.util;
02 import java.io.*;
03 import java.util.*;
04 import com.sun.image.codec.jpeg.*;
05 import javax.servlet.*;
06 import javax.servlet.http.*;
07 import java.awt.*;
08 import java.awt.image.*;
09
10
11 /**
12 * Title: getImg.java
13 * Description: 这个class主要实现随机生成一个4位数的验证码,并写入session,
14 * Copyright: Copyright (c) 2003
15 * Company: 蓝星软件
16 * @author falcon
17 * @version 1.1
18 */
19
20
21 public class getImg extends HttpServlet {
22
23 PRivate Font mFont=new Font(”宋体”, Font.PLAIN,12);//设置字体
24 //处理post
25 public void doPost(HttpServletRequest request,HttpServletResponse response)
26 throws ServletException,IOException {
27
28 doGet(request,response);
29 }
30 public void doGet(HttpServletRequest request,HttpServletResponse response)
31 throws ServletException,IOException {
32 //取得一个1000-9999的随机数
33 String s=”";
34
35 int intCount=0;
36
37 intCount=(new Random()).nextInt(9999);//
38
39 if(intCount<1000)intCount+=1000;
40
41 s=intCount+”";
42
43
44 //对session付值。
45
46 HttpSession session=request.getSession (true);
47
48 session.setAttribute(”getImg”,s);
49
50 response.setContentType(”image/gif”);
51
52 ServletOutputStream out=response.getOutputStream();
53
54 BufferedImage image=new BufferedImage(35,14,BufferedImage.TYPE_INT_RGB);
55
56 Graphics gra=image.getGraphics();
57 //设置背景色
58 gra.setColor(Color.yellow);
59
60 gra.fillRect(1,1,33,12);
61 //设置字体色
62 gra.setColor(Color.black);
63
64 gra.setFont(mFont);
65 //输出数字
66 char c;
67
68 for(int i=0;i<4;i++) {
69
70 c=s.charAt(i);
71
72 gra.drawString(c+”",i*7+4,11); //7为宽度,11为上下高度位置
73
74 }
75
76 JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out);
77
78 encoder.encode(image);
79
80 out.close();
81
82 }
83
84 }

2011-01-28

可以试试看看,不过在实验之前,一定呀备份下你的注册表

2011-01-16

JSP页面从形式上就是在传统的网页HTML文件中加入Java程序片段(Scriptlet)和JSP标签。Servlet/JSP容器收到客户端发出的请求时,首先执行其中的程序片段,然后将执行结果以HTML格式响应给客户端。

基本语法:

注释:

1、客户端可以看到的注释:<!– comment [] –> (可以在批注中加上动态的表达式)

2、开发程序员专用的注释: 或者

声明:
1

该声明的变量为类变量。意味着:若同时有n个用户在执行此JSP网页时,他们将会共享此变量。会引起线程同步上的麻烦。(不建议使用)

小脚本:

此类定义的变量为局部变量,不存在多线程同步问题,是线程安全的。

表达式:

不能使用“;”作为表达式的结束符号。

JSP指令元素:

只是告诉JSP引擎对JSP页面如何编译。

page指令:设定整个JSP网页的属性和相关功能。

1
2
例如:

1
include指令:用于指示JSP容器在JSP编译时插入一个包含文本或代码的文件,这个包含的过程是静态的。注意包含文件中要避免使用,可能会导致错误。

1
2
3 例如:
4
5 taglib指令:
6
7

JSP操作元素:

1
2
3
4
5
6

request对象与网络信息的提交:

JSP中提供了request对象来接收客户端发送回来的数据。

◆URL一般语法:protocol://host:port/virtualPath?queryString

◆protocol:表示协议,用于声明在远程机器之间传送信息的低层机制(http ftp https等)。

◆host:表示请求要发送到的远程机器的名称或者ip地址。

◆port:声明服务器要监听请求的机器端口号。

◆virtualPath:包含一个以斜线为分隔符的一组标识符,服务器把它映射到一个物理路径和JSP的位置。

◆querString:是查询字符串,它是一个成对的名称和值的列表,作为JSP的参数被传递到处理它的JSP页面。如果有多个参数需要传递,将以“&”号分隔开成对的名称和值。

request对象所提供的方法:

获取路径和协议信息:

1 String getProtocol() 获取通信所使用的协议和版本号(如:HTTP /1.1)
2 String getScheme() 获取请求中的协议名称(如:HTTP)
3 String getPathInfo() 获取请求中处于JSP路径和查询字符串之间的额外信息
4 String getContextPath()
5 String getRequestURI()
6 String getServletPath()
7 String getRealPath(String path)
获取主机和端口信息:

1 String getServerName() 获取响应请求的服务器名称。
2 int getServerPort() 获取响应请求的服务器端主机端口号。
3 String getLocalName() 获取响应请求的服务器端主机名。
4 String getLocalAddr() 获取响应请求的服务器端地址。
5 int getLocalPort() 获取响应请求的服务器端端口。
6 String getRemoteAddr() 获取发出请求的客户端IP地址。
7 String getRemoteHost() 获取发出请求的客户端主机名。
8 int getRemotePort() 获取发出请求的客户端主机端口。

获取查询字符串:

String getQueryString() 获取get()方法传递的参数字符串,即URL中?后面的部分。

获取查询字符串中的变量值:

1 String getParameter(String name) 获取客户端发送给服务器端的参数值。
2 Enumeration getParameterNames() 返回请求中所有参数的集合。
3 String[] getParameterValues(String name) 获得请求中指定参数的所有值。
4
5 例如:
6
7 http://localhost:8080/liuxl/jsp/querystring.jsp?str=JSP
8 String s=request.getParameter(”str”); 获取变量str的值,执行后s的值为“JSP”。
注意:getParameter()方法的返回值只能是字符串。若传递val=100,则需要进行类型转换。

01 if(request.getParameter(”val”)!=null) //判断字符串是否为空
02 { num=Integer.parseInt(request.getParameter(”val”)); //将字符串转化为整数
03 } else {
04 num=0;
05 }
06
07 if(request.getParameter(”val”)!=null) //判断字符串是否为空
08 {
09 num=Integer.parseInt(request.getParameter(”val”)); //将字符串转化为整数
10 }
11 else
12 {
13 num=0;
14 }

表单及其在信息传递中的应用:

表单:

是一个能够包含表单元素的区域,HTML为表单提供了多种图形用户界面组件元素 (如文本框,密码框,下拉菜单等),这些表单元素能够让用户在表单输入信息,可以用它们来构成表单内容,作为用户可以输入的域,并可以将其提交给一个JSP进行处理。

格式:

1

2 …
3

其中: name用于指定表单的名称。action用于指定表单被提交时所要执行的动作。method指定传递请求给JSP所用的方法(GET、POST、PUT,常用POST)。

1、标签 常用于输入信息或提交信息

语法:

说明:type允许指定输入类型(text(文本框)、password(密码框)、checkbox(复选框)、radio(单选按钮)、 image(图像域)、reset(重置按钮)、submit(提交按钮))。 name为表单元素的名称。value为表单元素的初始值。

例如:

01 文本框:
02 密码框:
03 提交按钮:
04 重置按钮:
05 单选按钮:
06
07 (用于从一组选项中选择其中一个选项,checked是可选属性,如果有该属性,则表示该按钮显示时为被选中,否则为未选中。)
08
09 e.g:选项1
10 选项2
11
12 在选中按钮1的情况下提交URL如下:…?radiobutton=1…
13 复选框:
(用于从一组选项中选择多个选项,checked同上。与单选按钮相似,复选框常成组使用,与单选按钮不同的是,被选中的多个复选框都会被提交,因此其name可以相同(按数组处理),也可以不同(按不同变量进行处理))

1 e.g:swim
2 run

如果在提交时两个都选中,则URL形式如下:…?checkbox=swim&checkbox=run…

2、

说明:cols为文本域宽度(字符数),rows为文本域的高度(行数)

3、标签 声明了一个可选项的列表,用户可以选择一个或多个选项

1
2 option
3 …
4 option
5

说明:name是名称,size是列表区域高度(即可显示的选项数),multiple是可选属性,若有表示可选择多项。selected是一个可选属性,有表示该选项设置为已选中。

Memcache函数库是在PECL(PHP Extension Community Library)中,主要作用是搭建大容量的内存数据的临时存放区域,在分布式的时候作用体现的非常明显,否则不建议使用。

在《phper》电子杂志的第一期中,有黑夜路人写的关于Memcache的详细安装教程,本人在ubuntu上安装完运行的时候报错:
/usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory

按照:《libeven、memcached、libmemcache安装》中的方法,使用:

sudo ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2
可以修正这个BUG

通过新得立安装php的memcached模块,注销/etc/php5/conf.d/memcached.ini里面的“;”,重启apache,调用phpinfo()出现memcached的信息

执行:

/usr/local/bin/memcached -d -m 10 -u root -l 127.0.0.1 -p 11211 -c 256 -P /tmp/memcached.pid
memcached的服务正式启动

Memcache::add — 添加一个值,如果已经存在,则返回false
Memcache::addServer — 添加一个可供使用的服务器地址
Memcache::close — 关闭一个Memcache对象
Memcache::connect — 创建一个Memcache对象
memcache_debug — 控制调试功能
Memcache::decrement — 对保存的某个key中的值进行减法操作
Memcache::delete — 删除一个key值
Memcache::flush — 清除所有缓存的数据
Memcache::get — 获取一个key值
Memcache::getExtendedStats — 获取进程池中所有进程的运行系统统计
Memcache::getServerStatus — 获取运行服务器的参数
Memcache::getStats — 返回服务器的一些运行统计信息
Memcache::getVersion — 返回运行的Memcache的版本信息
Memcache::increment — 对保存的某个key中的值进行加法操作
Memcache::pconnect — 创建一个Memcache的持久连接对象
Memcache::replace — R对一个已有的key进行覆写操作
Memcache::set — 添加一个值,如果已经存在,则覆写
Memcache::setCompressThreshold — 对大于某一大小的数据进行压缩
Memcache::setServerParams — 在运行时修改服务器的参数

建议用面向对象的方式来测试这个库:

1 connect(’localhost’, 11211) or die (”Could not connect”);
4 $version = $memcache->getVersion();
5 echo “Server’s version: “.$version.”
6 \n”;
7 ?>
Memcache::getVersion方法的作用是返回运行的Memcache的版本信息。

Memcache::getStats 方法的作用是返回服务器的一些运行统计信息。Memcache::getStats方法有三个参数,第一个参数表示要求返回的类型:reset, malloc, maps, cachedump, slabs, items, sizes;第二个参数和第三个参数是在第一个参数设置为“cachedump”时使用的。Memcache::getExtendedStats方法的作用是获取进程池中所有进程的运行系统统计。

01 connect(’localhost’, 11211) or die (”Could not connect”);
04 print_r($memcache->getStats());
05 /**
06 * Array
07 * (
08 * [pid] => 8052
09 * [uptime] => 9205
10 * [time] => 1205898428
11 * [version] => 1.2.5
12 * [pointer_size] => 32
13 * [rusage_user] => 0.008000
14 * [rusage_system] => 0.000000
15 * [curr_items] => 1
16 * [total_items] => 17
17 * [bytes] => 57
18 * [curr_connections] => 2
19 * [total_connections] => 15
20 * [connection_structures] => 3
21 * [cmd_get] => 9
22 * [cmd_set] => 23
23 * [get_hits] => 5
24 * [get_misses] => 4
25 * [evictions] => 0
26 * [bytes_read] => 671
27 * [bytes_written] => 850
28 * [limit_maxbytes] => 10485760
29 * [threads] => 1
30 * )
31 */
32 ?>
Memcache::connect方法的作用是创建一个Memcache对象。Memcache::pconnect方法的作用是创建一个Memcache的持久连接对象。Memcache::close方法的作用是关闭一个Memcache对象。

Memcache::set 方法的作用是添加一个值,Memcache::set方法有四个参数,第一个参数是key,第二个参数是value,第三个参数可选,表示是否压缩保存,第四个参数可选,用来设置一个过期自动销毁的时间。Memcache::add方法的作用和Memcache::set方法类似,区别是如果 Memcache::add方法的返回值为false,表示这个key已经存在,而Memcache::set方法则会直接覆写。 Memcache::get方法的作用是获取一个key值,Memcache::get方法有一个参数,表示key。Memcache::replace 方法的作用是对一个已有的key进行覆写操作,Memcache::replace方法有四个参数,作用和Memcache::set方法的相同。 Memcache::delete方法的作用是删除一个key值,Memcache::delete方法有两个参数,第一个参数表示key,第二个参数可选,表示删除延迟的时间。

01 connect(’localhost’, 11211) or die (”Could not connect”);
04 $memcache->set( ‘name’, ‘leo’, 0, 30);
05 if(!$memcache->add( ‘name’, ’susan’, 0, 30))
06 {
07 echo ’susan is exist’;
08 };
09 $memcache->replace( ‘name’, ‘lion’, 0, 300);
10 echo $memcache->get( ‘name’);
11 $memcache->delete( ‘name’, 5);
12 ?>
memcache_debug()函数的作用是控制调试功能,前提是php在编译的时候使用了–enable-debug选项,否则这个函数不会有作用。

Memcache::addServer 方法的作用是添加一个可供使用的服务器地址,Memcache::addServer方法有8个参数,除了第一个参数意外,其他都是可选的,第一个参数表示服务器的地址,第二个参数表示端口,第三个参数表示是否是一个持久连接,第四个参数表示这台服务器在所有服务器中所占的权重,第五个参数表示连接的持续时间,第六个参数表示连接重试的间隔时间,默认为15,设置为-1表示不进行重试,第七个参数用来控制服务器的在线状态,第8个参数允许设置一个回掉函数来处理错误信息。
Memcache::setServerParams方法的作用是在运行时修改服务器的参数,Memcache::setServerParams方法有六个参数,Memcache::addServer方法少了第三和第四个参数。 Memcache::getServerStatus方法的作用是获取运行服务器的参数,两个参数分别表示的地址和端口。

1 addServer(’192.168.1.116′, 11211);
7 $memcache->setServerParams(’192.168.1.116′, 11211, 1, 15, true, ‘_callback_memcache_failure’);
8 echo $memcache->getServerStatus(’192.168.1.116′, 11211);
9 ?>
Memcache::flush方法的作用是清除所有缓存的数据,但是不会削去使用的内存空间。

Memcache::increment方法的作用是对保存的某个key中的值进行加法操作,Memcache::decremen方法的作用是对保存的某个key中的值进行减法操作。

1 connect(’localhost’, 11211);
4 $memcache->set(’test_item’, 8);
5 $memcache->increment(’test_item’, 4);
6 echo $memcache->decrement(’test_item’, 7);
7 // 显示 5
8 ?>
setCompressThreshold方法的作用是对大于某一大小的数据进行压缩。setCompressThreshold方法有两个参数,第一个参数表示处理数据大小的临界点,第二个参数表示压缩的比例,默认为0.2。

1 addServer(’memcache_host’, 11211);
4 $memcache->setCompressThreshold(20000, 0.2);
5 ?>

001 fpath=$fpath;
018 $this->root=$root;
019 $this->enter=chr(13).chr(10);
020 $this->checkFile();
021 }
022 /*
023 *函数名:insert
024 *说明:插入一条记录
025 */
026 public function insert($fields)
027 {
028 $content=$this->getFileContent();
029 preg_match_all(’|(\d+?)|’,$content,$matches);
030 rsort($matches[1]);
031 $newkey=$matches[1][0]+1;
032
033 $record=”.$this->enter;
034 $record.=”.$newkey.”.$this->enter;
035 foreach($fields as $k=>$v)
036 {
037 $record.=”$v”.$this->enter;
038 }
039 $record.=”.$this->enter.$this->enter;
040 $this->save(preg_replace(’/(?=root.’>)/’,$record,$content));
041 return true;
042 }
043 /*
044 *函数名:insertM
045 *说明:插入多条记录,参数类型必须是二维数组
046 */
047 public function insertM($arr)
048 {
049 $content=$this->getFileContent();
050 preg_match_all(’|(\d+?)|’,$content,$matches);
051 rsort($matches[1]);
052 $newkey=$matches[1][0]+1;
053
054 $record=”;
055 for($i=0;$i<count($arr);$i++)
056 {
057 $record.=”.$this->enter;
058 $record.=”.$newkey.”.$this->enter;
059 foreach($arr[$i] as $k=>$v)
060 {
061 $record.=”$v”.$this->enter;
062 }
063 $record.=”.$this->enter.$this->enter;
064 $newkey++;
065 }
066 $this->save(preg_replace(’/(?=root.’>)/’,$record,$content));
067 return true;
068 }
069 /*
070 *函数名:checkFile
071 *说明:如果文件不存在,则创建之,并初始化
072 * 否则检查文件规则是否被破坏
073 */
074 private function checkFile()
075 {
076 if(!file_exists($this->fpath))
077 {
078 $xmlstr=”;
079 $xmlstr=”.$this->enter;
080 $xmlstr.=’root.’>’.$this->enter.$this->enter;
081 $xmlstr.=’root.’>’;
082 $this->save($xmlstr);
083 }
084 else
085 {
086 $content=$this->getFileContent();
087 $bool_statement=preg_match(’//’,$content)==0 ? false : true;
088 $bool_root=preg_match(’/root.’>.*root.’>/s’,$content)==0 ? false : true;
089 preg_match_all(’|((?:.+?))|s’,$content,$matches);
090 for($i=0;$i<count($matches[1]);$i++)
091 {
092 $re=’/^\\s*(\\d+)\\s*[\\s\\S]*\\s*$/’;
093 $bool_record=preg_match($re,$matches[1][$i],$arr)==0 ? false : true;
094 $keys[]=$arr[1];
095 if(!$bool_record) break;
096 }
097 rsort($keys);
098 $bool_repeat=preg_match(’/(\d),\1/’,join(’,',$keys),$wb)==0 ? true : false;
099 if(!($bool_statement && $bool_root && $bool_record && $bool_repeat))
100 {
101 echo ‘文件规则已被破坏’;
102 exit;
103 }
104 }
105 }
106 /*
107 *函数名:getRecordById
108 *说明:根据主键ID,获取字段信息
109 */
110 public function getRecordById($id)
111 {
112 $content=$this->getFileContent();
113 preg_match(’/(\s*’.$id.’.+?)/s’,$content,$matches);
114 preg_match_all(’|(<.+)|’,$matches[1],$arr);
115 $arrstr=”;
116 for($i=0;$i(.+)/’,$arr[1][$i],$farr);
119 $arrstr.=”‘$farr[2]‘=>’$farr[1]‘”;
120 if($igetFileContent();
132 foreach($form_arr as $k=>$v)
133 {
134 $re=’/(’.$id.’[\s\S]*?).+?()/s’;
135 $content=preg_replace($re,’$’.$v.’$2′,$content);
136 }
137 $this->save($content);
138 return true;
139 }
140 public function deleteRecordById($id)
141 {
142 $content=$this->getFileContent();
143 $content=preg_replace(’/\s*’.$id.’+.+?(\s)?/s’,”,$content);
144 $this->save($content);
145 }
146 /*
147 *函数名:getList
148 *说明:获取所有记录,返回一个二维数组
149 * 先获取所有record记录,再获取字段名和值
150 */
151 public function getList()
152 {
153 $content=$this->getFileContent();
154 $rs=array();
155 preg_match_all(’|(.+?)|s’,$content,$matches);
156 for($i=0;$i<count($matches[1]);$i++)
157 {
158 preg_match_all(’|(<.+)|’,$matches[1][$i],$tmparr);
159 $arrstr=”;
160 for($j=0;$j(.+)/’,$tmparr[1][$j],$farr);
163 $arrstr.=”‘$farr[2]‘=>’$farr[1]‘”;
164 if($jfpath,’r');
173 $content=fread($hd,filesize($this->fpath));
174 fclose($hd);
175 return $content;
176 }
177 private function save($content)
178 {
179 $hd=fopen($this->fpath,’w');
180 fwrite($hd,$content);
181 fclose($hd);
182 }
183 }
184 ?>