BloveSaga

在希腊帕尔纳斯山南坡上,有一个驰名世界的戴尔波伊神托所,在它的入口处的巨石上赫然锈刻着这样几个大字: 认识你自己!

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  34 随笔 :: 12 文章 :: 122 评论 :: 0 Trackbacks

2006年6月15日 #

大家可以浏览我新的博客 dyin.cn

posted @ 2007-05-11 16:57 蓝色Saga 阅读(162) | 评论 (0)编辑 收藏

今天与大家分享的资源如下:
==================================================================================
JSP动态网页制作
PHP动态网页制作
ASP动态网页制作
Perl动态网页制作
winxp优化大全
JSP程序设计
以上皆是视频教程
如果你需要请你留下email我将会在晚上统一把种子发送到你的邮箱里,如果需要请抓紧,3天后将不再提供!

 

posted @ 2006-06-21 12:23 蓝色Saga 阅读(326) | 评论 (5)编辑 收藏

要考虑一个真正意义的全球资源,Web浏览器的内容对每个接收到的用户来说都是易读的,现在大多数的全球资源的网站都是英文的.当然,现在也在发生变化,有的网站为一些特定的国家定制一些非英文版本,比如,说英文的通过http://www.ibm.com/en/index.html来访问,说中文的通过http://www.imb.com/cn/index.html来访问,这些很多都是静态的文本.怎么构件一个动态生成的国际化内容的网站就不是一个简单的问题了.

国际化又称Il8N,因为英文国家的国家化是Internationalization,它以I开始,以N结束,共18个字母.本地化又称L18N,即是Localization.国际化的问题主要包含以下的一些内容:
.日期,时间
.数字
.货币
.其它的一些特殊字符
也就是说不同的Locale,显示日期,时间格式是不一样的.当然,不同的语言有自己不同的字符集.

HTML中的字符实体
HTML中的字符实体和XML的语言保持一致.它定义了用特定的字符序列显示单字符的功能,这种字符序列称为字符实体,它以" &"开头,以";"结束.例如: © 表示字符"©";
看一例子显示西班牙语的" Hello World":
<%@page contentType="text/html;charset=ISO-8859-1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<%
   response.setHeader("Content-Language","es");
   out.println("<html><head><title>En Espa&ntilde;ol</title></head>");
   out.println("<body>");
   out.println("<h3>En espa%ntilde;ol</h3>");
   out.println("&iexcl;Hola Mundo!");
   out.println("</body></html>");
%>

运行结果:

En espa%ntilde;ol

¡Hola Mundo!

在HTML字符实体表示中,&ntilde代表了" ñ "字符,使用response.setHeader("Content-Language","es");来设置HTML显示时要使用的语言.

Unicode
Unicode字符标准是一个字符编码系统,它支持互相转换,处理和显示现在世界上不同语言的文本.在Java语言中,字符,字符串和标始符在内部使用16位的Unicode 2.0字符集表示.Unicode使用 " \uxxxx" 来表示一个字符,前256个Unicode字符和ISO-8859-1标准(Latin-1)的前256个字符一致.在Unicode世界中, "  ñ  " 用 " \u00f1 " 表示.看怎么用Unicode来编写西班牙语的Hello World:
<%@page contentType="text/html;charset=ISO-8859-1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<%
   response.setHeader("Content-Language","es");
   out.println("<html><head><title>En Espa\u00f1ol</title></head>");
   out.println("<body>");
   out.println("<h3>En espa\u00f1ol</h3>");
   out.println("\u00f1Hola Mundo!");
   out.println("</body></html>");
%>

支持多国语言的Hello World

用语选择语言的页面:


语言处理页面代码:
<%@page contentType="text/plain;charset=UTF-8"
import="java.io.*,java.text.*,java.util.*,javax.servlet.jsp.*" %>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
<%!
   Locale locale;
   DateFormat format;
   JspWriter writer;
%>
<%!
   //英语
void processEnglish()throws Exception
{
    locale=new Locale("en","US");
    format=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG,locale);
    writer.println("in english");
    writer.println("<br>");
    writer.println("HelloWorld");
    writer.println(format.format(new Date()));
    writer.flush();
}

   //中文
void processChinese()throws Exception
{
    locale=new Locale("zh","");
    format=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG,locale);
    writer.println("in Chinese");
    writer.println("<br>");
    writer.println("\u4f60\u597d\u4e16\u754c");
    writer.println(format.format(new Date()));
    writer.flush();
}

   //韩国语
void processKorean()throws Exception
{
    locale=new Locale("ko","");
    format=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG,locale);
    writer.println("in Korean");
    writer.println("<br>");
    writer.println("\uc548\ud558\uc138\uacc4");
    writer.println(format.format(new Date()));
    writer.flush();
}
//.........................其他的语言省略
%>
<%
    //获得请求的语种
     String language=(String)request.getParameter("language");
     int lan=Integer.parseInt(language);  
%>
<%
   writer=out;
   switch(lan)
   {
       case 1:processEnglish();break;
       case 2:processChinese();break;
       case 3:processKorean();break;
       //case 4:processRussian();break;
       //case 5:processSpanish();break;
      // case 6:processJapanese();break;
   }
%>
    </body>
</html>
处理的思路很简单,首先获得请求的语种,然后根据不同的语言来做不同的处理.

posted @ 2006-06-20 14:00 蓝色Saga 阅读(223) | 评论 (0)编辑 收藏

在JSP开发中我们常常会碰到以下的一些问题,其实都很有代表性.

在不同的页面或者用户之间共享数据

在JSP中共享数据,大体上可以分为两种情况,第一种是在同一个用户的不同也面之间共享数据,另一种是在不同用户之间共享数据.
对于同一个用户的会话,要想在不同的页面之间共享数据,可以有以下几种选择:
.把数据保存在Session中(最常见的方法)
.通过Cookie
.通过隐含表单提交到下一个页面
.通过ServletContext对象
.通过Application对象
.通过文件系统或者数据库
要在不同的用户之间共享数据,通常的方法是:
.通过ServletContext对象
.通过Application对象
.通过文件系统或者数据库
可见,对于不同用户之间共享数据的实现方法在同一个用户的不同也面之间也能实现数据共享.
a.在同一个用户的不同也面之间共享数据
1.使用session共享数据
用户在浏览网页时,由于HTTP协议是一种无状态协议,往往在不同的页面之间存在数据交换的问题,这就需要在这些不同的页面之间共享数据.在编程实现中我们常看到的方法是把共享数据保存在session中.这些共享数据可以是字符串或者与Java的原始数据类型相关的对象,也可以是一个Java对象.
exampl: 用户登录时,如果验证成功,就把信息保存到一个userSession的类中,在其他的页面可以读取这个值.
userSession.java
package dory;
import java.util.Date;
/**
 *
 * @author Dory Doo
 */
public class userSession {
    private boolean isLogin=false;
    private String userId;
    private Date lastLoginTime;
    private int logCount;
    /** Creates a new instance of userSession */
    public userSession() {
    }
    public void setIsLogin(boolean l)
    {
        this.isLogin=l;
    }
    public void setUserId(String userId)
    {
        this.userId=userId;
    }
    public void setLastLoginTime(Date l)
    {
        this.lastLoginTime=l;
    }
    public void setLogCount(int logCount)
    {
        this.logCount=logCount;
    }
    public boolean isLogin()
    {
        return this.isLogin;
    }
    public String getUserId()
    {
        return this.userId;
    }
    public Date getLastLoginTime()
    {
        return this.lastLoginTime;
    }
    public int getLogCount()
    {
        return this.logCount;
    }
}
当然这个就比较简单的了,要的是整个思路.我们怎么来使用这个类,我们需要一个验证登陆的页login.jsp
<%@page contentType="text/html;charset=gb2312" language="java"
 import="java.sql.*,dory.*" errorPage=""%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
        <title>JSP Page</title>
    </head>
    <body>

    <h1>Login Checking Page</h1>
<%
   String name=request.getParameter("name");
   String password=request.getParameter("password");
   //Connection the Database,loading
   //int logCount=resultSet.getInt("count");
   //java.util.Date lastLoginTime=resultSet.getDate("LastLoginTime");
   //这里简单设置logCount和lastLoginTime的值
   UserSession user=new UserSeesion();
   user.setUserId(name);
   user.setIsLogin(true);
   user.setLastLoginTime(new java.util.Date());
   user.setLogCount(10);
   session.setAttribute("userSession",user)
   response.sendRedirect("welcome.jsp");
%>
    </body>
</html>
整个登陆页面的过程是这样的:
(1)获得用户的登陆信息
(2)连接数据库进行权限验证
(3)如果通过验证,那么读取用户的注册信息
(4)把用户的注册信息保存到一个userSession对象中
(5)把userSession对象保存到Session内建对象中
(6)把视图派发到下一个显示页面
注意:session.setAttribute("userSession",user)把userSession的一个对象设置到Session中,Session只能保存对象,不能保存原始的数据类型,比如:
session.setAttribute("count",10)
是非法的语句,如果要把值为10的整数保存到Session中,需要使用以下的方法:
session.setAttribute("count",new Integer(10));
然后在另一个页面使用
(Integer)session.getAttribute("count");
把这个整数读出来.
我们用如下方法在另一个页面中把userSesseion对象读取出来:
<%@page contentType="text/html;charset=gb2312" language="java"
 import="java.sql.*,dory.*" errorPage=""%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>  
<%
   UserSession user=(UserSession)session.getAttribute("userSession");
   try
   {
       if(user.isLogin())
       {
           out.print("welcome,your login id is:"+user.getUserId());
           out.print("your last login time is:"+user.getLastLoginTime());
           out.print("now you are the:"+user.getLogCount()+"times logging this website");
       }
       else
       {
           response.sendRedirect("login.html");
       }
   }
   catch(Exception e)
   {
       response.sendRedirect("login.html");
   }
%>
    </body>
</html>
可以看出,通过UserSession user=(UserSession)session.getAttribute("userSession");代码来读取在前一个页面中设置的对象,然后再从这个对象读取一些相关值.当然我们也可以用JavaBean的形式来读取.

2.使用隐含菜单
这种方式通过隐含菜单的形式把数据传递到下一个页面,它有两个局限性:
.只能在相邻的两个页面之间传递数据
.客户端可以使用查看网页源代码的方式获得表单中的数据,安全性不好
它的实现很简单:
<form action="target.jsp">
<input type="hidden" name="test" value="abc">
<input type="hidden" name="test2" value="def">
</form>
在另外一个页面中,通过这样来获得数据:
String test=request.getParameter("test");
String test2=request.getParameter("test2");

3.使用Cookie
和Session不同,Cookie是放在客户端的,由于客户考虑到安全应素可能会禁用cookie,这样在使用cookie就会遇到麻烦了.

b.在不同的用户之间共享数据
在不同的在不同的用户之间共享数据最常见的方法是使用ServletContext和application对象,通过在一个用户那里设置属性在另一个用户那里获得这个属性.

1.使用ServletContext
在JSP页面中可以通过getServletContext()方法获得ServletContext对象.在这种情况下不同的用户通过它来工享数据,看下面的实现代码:
<%@page contentType="text/html;charset=gb2312" language="java"
import="java.sql.*,javax.servlet.*,javax.servlet.http.*,dory.*" errorPage="" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<%
   request.setCharacterEncoding("gb2312");
%>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
        <title>JSP Page</title>
    </head>
    <body>
    a simple chatting room
    <br><hr><font color="red">
<%
   String content=(String)getServletContext().getAttribute(new String("chatTopic_1"));
   out.print(content);
   getServletContext().setAttribute("chatTopic_1",content+(String)request.getParameter("content")
   +"<br>");
%>
    </font>
    <hr>
    <form accept="Servelt Context_chat.jsp">
        <input type="text" name="content">
        <input type="submit" value="speak">
    </form>
    </body>
</html>

2.application对象
application对象对应于每个web应用来说只有一个,它使用和ServletContext差不多.如下:
<%@page contentType="text/html;charset=gb2312" language="java"
import="java.sql.*,javax.servlet.*,javax.servlet.http.*,dory.*" errorPage="" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<%
   request.setCharacterEncoding("gb2312");
%>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
        <title>JSP Page</title>
    </head>
    <body>
    a simple chatting room
    <br><hr><font color="red">
<%
   String content=(String)application.getAttribute(new String("chatTopic_1"));
   out.print(content);
   application.setAttribute("chatTopic_1",content+(String)request.getParameter("content")
   +"<br>");
%>
    </font>
    <hr>
    <form accept="Servelt Context_chat.jsp">
        <input type="text" name="content">
        <input type="submit" value="speak">
    </form>
    </body>
</html>
可以得到ServletContext和application的实现机制基本上一致.

posted @ 2006-06-20 13:05 蓝色Saga 阅读(286) | 评论 (0)编辑 收藏

多学习别人才能进步,多交流才能收获,这里分享给大家一些网络资源.

=====================================================================================
国内外JSP/Java/Servlet技术著名网站

http://www-900.ibm.com/developerWorks/cn
http://java.sun.com
http://www.jchq.net
http://jquest.webjump.com/
http://www.chinaasp.com/ (国内)
http://www.cnjsp.com/  (国内)
http://www.javaunion.org/ (国内)
http://www.jspchina.com/ (国内)


国内外介绍JSP/Servlet应用程序服务器的网站

 http://www.allaire.com/
 http://jakarta.apache.org/
 http://java.apache.org/
 http://www.atg.com/
 http://www.bea.com/
 http://www.beasys.com/
 
http://www.bluestone.com/
 http://caucho.com/
 http://easythings.iwarp.com/
 http://www.fefionsoftware.com
 
http://www.gemstone.com/
 http://www.software.ibm.com/
 
http://www.inprise.com/
 http://sun.com/software/
 http://www.tagtraum.com/
 http://www.enhydra.com/
 http://www.mortbay.com/
 http://www.novocode.com/
 http://www.oracle.com/
 http://www.orionserver.com/
 http://www.paralogic.com/
 http://www.pramati.com/
 http://www.secant.com/
 http://www.servertec.com/
 http://www.silverstream.com/
 http://www.siteforum.com/
 http://www.unify.com/
 http://www.vqsoft.com/
 http://www.w3.org/

国内外介绍 JSP/Java/Servlet开发工具的网站

 http://www.adobe.com/
 http://www.bea.com/
 http://www.software.ibm.com/
 http://www.inprise.com/
 http://www.macromedia.com/
 http://www.netbeans.org/
 http://www.netobjects.com/
 http://www.oracle.com/
 http://www.sun.com/
 
http://www.eclipse.com/

FAQ网站

 http://www.jguru.com/
 http://java.sun.com/products/jsp/faq.html
 http://www.esperanto.org.nz/
 
http://www.jchq.net/

繁体资源

http://www.javaworld.com.tw/jute或http://www.jsptw.com/jute
http://www.jsp.mlc.edu.tw
posted @ 2006-06-19 14:49 蓝色Saga 阅读(294) | 评论 (0)编辑 收藏

   正则表达式

 .正则表达式及其作用
 .RegExp对象
 .String对象中与正则表达式有关的方法
 .正则表达式的语法参考
 .实用程序举例

 什么是正则表达式?
 .文件路径通配符
 "?"通配符匹配文件名中的单个字符,而"'"通配符匹配零个或多个字符。data?.dat就是一中文
 本模式,它能匹配data1.dat,data2.dat,datax.dat,dataN.dat等文件名。data*.dat是另一种文
 本模式,它匹配data.dat,data1.dat,data2.dat,data12.dat,datax.dat等文件名。

 

 .正则表达式
 是由英文词语regular expression翻译过来的,英文比中文更能实现其含义,就是符合某种规则
 的表达式。可以将正则表达式理解为一种对文件进行模糊匹配的语言,它用一些特殊的符号(称
 为元字符)来代表某种特征(例如,全都是数字)的一组字符以及指定匹配的次数,含有元字符
 的文本不再表示某一具体的文本内容,而是形成了一种文本模式,它可以匹配符合这种模式的所
 有文本串。
 
 元字符与子匹配
 .元字符
 如果一个图书的编号格式是:要么是5个数字字符,例如,10101;要么是5个数字后加上一个连字号
 (-),再加上4个数字组成的10个字符,例如,11111-1234。那么,要在一个大的文本串中查找这
 两种格式的图书编号时,就可以用\d{5}(-\d{4})?做为匹配模式。
 如果要让abc?中的bc同时受到?的作用,必须使用圆括号将他们括起来,使它们成为一个紧密结合
 的组合项,这样后面的?就表示圆括号中的内容可有可无,例如,a(bc)?能匹配a和abc。

 .字匹配
 圆口号所括起来的部分为一个子匹配(也叫子表达式),除了可以得到整个正则表达式的匹配
 结果外,还可以单独得到每个子表达式部分所匹配的结果。
 多个子表达式所匹配的原始内容按照它们正则表达式模式中从左到右出现的顺序存储在缓冲区中
 ,这种过程称为捕获。圆括号中的子匹配所捕获的内容可在整个表达式中位于这个括号之后的
 地方被反引用,第一括号(即第一个子匹配)捕获的内容用\1表示,第二个圆括号(即第二个子
 匹配)捕获的内容\2表示,依次类推。例如,要匹配2个相同的连续字符的正则表达式为(\d)\1.
 要匹配连续5个相同的数字字符的正则表达式为(\d)\1{4}.要匹配1221.3553.6776等数字。可以
 使用正则表达式为(\d)(\d)\2\1。

  正则表达式的作用
 .测试字符串是否匹配某个模式,从而实现数据格式的有效性验证。
 .将一段文本中满足某一正则表达式模式的文本内容替换为别的内容或删除(即替换为空字符串)
  例如,将一大段文本中的所有的19xx年的内容替换为20xx年,其中xx部分是两个任意的数字,
  不会被替换,但不能简单地用20替换19,否则1919就被替换为2020。
 .在一段文本中搜索具有某一类型特征的文本内容。精确搜索和正则表达式的模式搜索最大的区
  别就是:精确搜索是搜索一个具体的文本,而模式搜索是模式搜索具有某一类型特征的文本。

 
  RegExp对象
 JavaScript中提供了一个名为RegExp的对象来完成有关正则表达式的操作和功能,每一条正则
 表达式模式对应一个RegExp对象实例。

 创建RegExp对象实例
 (1)使用RegExp对象的显示构造函数,语法为:new RegExp("pattern"[,"flags"]);
 (2)使用RegExp对象的隐式构造函数,采用纯粹的文本格式:/pattern/[flags]
 
 flags标志字符:
     -g 用做全局标志
     -i 用做忽略大小写标志
     -m 用做多行标志
     如果没有设置这个标志,那么元字符"^"只与整个被搜索字符串的开始位置相匹配,而元字符
     "$"只与整个被搜索字符串的结束位置相匹配。如果设置了这个标志,那么"^"还可以与被
     搜索字符串中的"\n"或"\r"之后的位置相匹配。
  注意:
  当使用构造函数的方式创建RegExp实例对象的时候,应将原始的正则表达式模式文本中的每个
  "\"都使用"\\"来替换,例如,下面的语句等价:
   var re=new RegExp("\\d{5}");
   var re=^d{5}/

 RegExp对象-属性
 .所有RegExp对象实例共享静态属性
 .单个对象实例的属性
 静态属性:
 .index
 .input
 .lastIndex
 .lastMatch
 .lastParen
 .lastContext
 .leftContext
 .rightContext
 .$1...$9

 对象实例属性:
 .global
 .ignoreCase
 .multiline
 .source

 RegExp对象-方法
 .test方法
 语法格式为:test(str)。检查一个字符串中是否存在创建RegExp对象实例所指定的正则表达式模式
 .exec方法
 语法格式为:exec(str)。使用创建RegExp对象实例时所指定的正则表达式模式对一个字符串执行
 搜索,并返回一个包含搜索结果的数组。
 .compile方法
 语法格式为:compile("pattern"[,"flags"])。更换RegExp对象实例所使用的正则表达式模式,并
 将新的正则表达式模式编译为内部格式,从而使以后的匹配过程执行更快。

 RegExp对象-综合举例
 code:
<script language="javascript">
    var strSrc="xxa1b01c001yya2b02c002zz";
    var re="/a(\d)b(\d{2})c(\d{3})/gi";
    var arr,count=0;
    while((arr = re.exec(strSrc))!=null)
    {
       displayResult();
    }
    function displayResult()
    {
      document.write(<p>这是用正则表达式/"+re.source+"/gi对字符串<br>\""
                 +RegExp.input+ "\"进行第" +(++count)+ "次搜索的结果:<br>");
      document.write("RegExp.index为"+RegExp.index+"<br>");
      document.write("RegExp.lastindex为"+RegExp.lastindex+"<br>");
      document.write("RegExp.lastMatch为"+RegExp.lastMatch+"<br>");
      document.write("RegExp.lastParen为"+RegExp.lastParen+"<br>");
      document.write("RegExp.lastContext为"+RegExp.lastContext+"<br>");
      document.write("RegExp.$1为"+RegExp.$1+"<br>");
      document.write("RegExp.$1为"+RegExp.$2+"<br>");
      document.write("RegExp.$1为"+RegExp.$3+"<br>");
      document.write("RegExp.$1为"+RegExp.$4+"<br>");
      document.write("arr.index为"+arr.index+"<br>");
      document.write("arr.input为"+arr.input+"<br>");
      document.write("arr.lastindex为"+arr.lastindex+"<br>");
      document.write("返回的元素个数为"+arr.length+"<br>");
      document.write("返回数组的类容为[");
      for(var i=0;i<arr.length;i++)
      {
         if(arr.length-1)
            document.write("\""+arr[i]+"\",");
         else
            document.write("\""+arr[i]+"\"]</p>");
      }
     
    }
 </script>
 


 String对象中与正则表达式有关的方法
 .match方法
 语法格式为:match(Exp)。与RegExp对象的exec方法类似,它使用正则表达式模式对字符串执行
 搜索,并返回一个包含搜索结果的数组。
 <script language="javascript">
   var strSrc="xxa1b01c001yya2b02c002zz";
   var re=/a(\d)b(\d(2))c(\d{3})/gi;
   var arr;
   arr=strSrc.match(re);
   for(var i=0;i<arr.length;i++)
   {
      if(i<arr.length-1)
         document.write("[\""+arr[i]+"\",");
      else
         document.write("\""+arr[i]+"\"]");
   }
 </script>
 
 .search方法
 语法格式为:serach(rgExp)。返回使用正则表达式搜索时,第一个匹配的字符串在整个被搜索
 的字符串中的位置。
 .replace方法
 语法格式为: replace(rgExp,replaceText)。使用正则表达式模式对字符串执行搜索,并对搜索
 到的内容用指定的字符串替换,返回值包含替换后的内容的字符串对象。

posted @ 2006-06-15 18:06 蓝色Saga 阅读(212) | 评论 (0)编辑 收藏