• 2006-05-13

    编写JSP/PHP+MySQL留言本

    Views: 21175 | No Comments

    前几天想好基本框架,今天“形势与政治”课上把类的结构写好了。相信几天之内就可以做出。我先写JSP版本的,然后再写PHP版本。因为JSP代码相对PHP代码更好控制。

    我将尽量把该留言本做得结构简单,开放,容易复用。然后别人通过使用CSS生成不同的版本。我希望它成为最流行的留言本,无论是用来学习JSP/PHP还是实际应用。

    一条留言的结构是这样:

    Message:
    int id;
    int status;//我定义status越大,权限越开放。
    String time;
    String ip;
    String name;
    String address;
    String msg;
    String reply;
    

    留言本的使用者有游客(Visitor)和管理员(Admin),游客的方法有:

    Visitor:
    Message read(int id);
    Message[] read(int from, int size);
    int write(Message msg);
    

    管理员的方法有:

    Admin:
    Message read(int id);
    Message[] read(int from, int size);
    int write(Message msg);
    int delete(int id);
    int delete(int[] ids);
    int reply(int id, String reply);
    

    虽然Visitor和Admin的方法有重复,不过我还是将它们分得很清晰。如果Admin想管理,那么他就应该到后台。只要在前台,所有人都是Visitor,而不是生成Visitor的前台和Admin的前台。

    Visitor和Admin不直接运行SQL语句,而是调用一个DatabaseManager的方法。

    DatabaseManager:
    Message getMsg(int id);
    Message[] getMsgArray(int from, int size, int minstatus);//这里的status是一个下界
    int getMsgCount(int minstatus);
    boolean saveMsg(Message msg);
    boolean addReply(String reply);
    boolean deleteMsg(int id);
    int deleteMsgOf(int[] ids);
    void close();
    

    每使用DatabaseManager一次,用户必须手动运行close()。这样做而不是在getMsgArray()中关闭数据库的连接是因为创建连接的花销非常大。

    还将建立一个Authority类进行权限管理,目前所知,这个类的功能将很简单,就是基于IP的anti spam。

    Authority:
    int getReadMod(String ip);
    int getWriteMod(String ip);
    

    到这里,一个留言本已经能工作了。为了处理格式化文本和防止恶意留言,增加两个类MsgFilter和MsgFormater。

    MsgFilter:
    String filterName(String name);
    String filterAddress(String addr)
    String filterMsg(String msg);
    String filterReply(String reply);
    String filter(String text);//如果是恶意内容,返回null
    
    MsgFormater:
    String formatMsg(String msg);
    String formatReply(String reply);
    

    因为留言的保存是间歇性的,所以即使我们把MsgFilter和MsgFormater写得复杂也不会影响速度。保存在数据库中的内容都是格式化好的HTML代码,所以浏览留言的速度应该非常快。

    2006-05-13,以后将补充。

    2006-05-15,已经写好,剩下的只有排版了。

    2006-05-17,已经在 http://www.ideawu.net/person/ideabook/ 测试!

    Posted by ideawu at 2006-05-13 21:21:16
  • 2006-04-27

    Linux下整合Apache和Tomcat

    Views: 14686 | No Comments

    我期望你使用Debian Linux,不过如果你使用其它的发行版本,这篇文章也同样能帮助你。

    当然,我听说安装Apache和Tomcat的最简单的方法是运行apt-get install apache2 tomcat5 libapache2-mod-jk,不管怎么样,都只是为了得到下面提到的文件。它们的目录可能和我说的不一样,不过,你应该知道使用搜索找到它们,并且能够把我下面提到的路径换为正确的。否则,你应该请人现场帮你弄好,你在一边看着学习。

    说句题外话:你应该学会从一篇文章里找到变量,例如路径,并将它们设为实际的值。作者不可以总是使用和你的机器一样的变量值。

    1. 安装Apache

    以root身份运行apt-get install apache2 就可以安装上Apache了。一般安装在或者/usr/local/apache2/目录下,/usr/lib/apache2目录下。通过这种方法安装的Apache可以自动开机启动。Apache的设置文件是/usr/lib/apache2/conf/httpd.conf。

    然后通过搜索更改设置httpd.conf,使得有 DirectoryIndex index.html index.jsp

    设置虚拟主机

    在/usr/lib/apache2/conf/httpd.conf文件末尾加上
    NameVirtualHost *:80
    <VirtualHost *:80>
        ServerName  www.yourdomain.com
        DocumentRoot /var/webserver
        <Directory /var/webserver>
            Options FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            allow from all
        </Directory>
        LogLevel warn
        CustomLog /usr/lib/apache2/logs/access.log common
        ErrorLog  /usr/lib/apache2/logs/error.log
    </VirtualHost>
    

    在/usr/lib/apache2/conf/httpd.conf文件末尾加上

    这表示你的网站目录在/var/webserver,你必须有这个目录。运行

    /etc/init.d/apache stop  或者 /etc/init.d/apache2 stop
    /etc/init.d/apache start 或者 /etc/init.d/apache2 start
    

    重启Apache。在浏览器里输入localhost,你应该能看到你的/var/webserver目录下的index文件了。

    2. 安装Tomcat

    参看http://www.ideawu.net/tomcatinstall.html 安装Tomcat。注意不要设置Tomcat的监听端口为80,那是留给Apache的。

    3. 整合Apache和Tomcat

    下载mod_jk 复制到/usr/local/apache2/modules/目录下并改名为mod_jk.so。

    建立一个文件/usr/local/apache2/conf/workers.properties,内容为

    workers.tomcat_home=/usr/tomcat5
    workers.java_home=/usr/lib/j2sdk1.4-sun
    ps=/
    worker.list=ajp13
    
    worker.ajp13.type=ajp13
    worker.ajp13.host=localhost
    worker.ajp13.port=8009
    worker.ajp13.cachesize=10
    

    在httpd.conf文件中的“NameVirtualHost *:80”前面加上

    LoadModule jk_module /usr/local/apache2/modules/mod_jk.so
    <IfModule mod_jk.c>
        JkWorkersFile /usr/local/apache2/conf/workers.properties
        JkLogFile /usr/local/apache2/logs/mod_jk.log
        JkLogLevel error
    </IfModule>
    

    在httpd.conf文件中的“</VirtualHost>”前面加上

    JkMount /*.jsp ajp13
    <Location "/WEB-INF/">
        Order allow,deny
        deny from all
    </Location>
    

    好了,重启Tomcat再重启Apache

    Posted by ideawu at 2006-04-27 19:52:53
  • 2006-01-22

    Linux下安装和设置Tomcat,解决JSP中文乱码

    Views: 20218 | No Comments

    我假设你使用Debian3,如果你使用其他的Linux版,可能会有安装方法和设置路径上的区别。

    1,安装J2SDK

    1.1 使用Debian源里的安装包

    以root 身份运行apt-get install sun-j2sdk1.4,这样将安装sun的j2sdk1.4。然后输入java如果你看到的不是command not found,就表示你已经安装正确了。否则搜索是否有java和javac两个文件,我的在/usr/lib/j2sdk1.4-sun/bin下,如果有就创建链接到/usr/bin下,连接名与原文件名一样。

    1.2 使用sun网站上的安装包

    具体方法参考sun网站上的安装说明。也可以参考我的做法(图形界面操作):

    下载正确的压缩包后解压,一般得到类似名为jdk1.x.x的文件夹。将整个文件夹移动到/usr/lib目录下,然后进入jdk.1.x.x/bin下的java, javac, javadoc, jar四个可执行文件创建链接,然后复制到/usr/bin文件夹下,并且改名为与原文件相同。这样做的原因是一般/usr/bin是$PATH环境变量的一部分,以后你想运行javac命令编绎一个.java源文件时,只需要输入javac filename就行了,而不需要输入javac文件所在的完整路径。

    JAVA_HOME环境变量可以不设置,因为据我的使用经验,java,javac等jdk的程序知道在哪里找到自己的家。当某个程序需要JAVA_HOME环境变量,我们再在它的启动脚本中设置。因为使用JAVA_HOME环境变量的程序很少。

    2,安装Tomcat

    从http://tomcat.apache.org/网站上下载tomcat for Linux。网站上有不同版本的源码包和二进制包等,而二进制包又有core,deployer,embedded三种。我使用tomcat5.28二进制包中的core。

    下载jakarta-tomcat-5.0.28.tar.gz解压,将得到jakarta-tomcat-5.0.28文件夹,我把它改名为tomcat5,把它拷贝到你喜欢的地方。我放在/usr/share/下。

    2.1 试运行tomcat

    在终端中输入/usr/share/tomcat5/bin/startup.sh,将启动tomcat。然后你在浏览器中输入http://localhost:8080或者http://127.0.0.1:8080你就看到tomcat产生的页面了。

    运行/usr/share/tomcat5/bin/startup.sh出错?试运行:

    JAVA_HOME=/usr/lib/j2sdk1.4_sun #这里的路径是你的j2sdk的安装路径
    export JAVA_HOME
    /usr/share/tomcat5/bin/startup.sh
    

    2.2 将tomcat设置为开机启动

    有两个方法,1是使用tomcat自带的启动脚本启动,2是使用jsvc将tomcat启动为Linux的一个进程。

    2.2.1 使用Tomcat自带的启动脚本

    建立一个脚本命名为tomcat5.sh,内容为:

    #!/bin/sh
    #file:tomcat5.sh
    #设置环境变量,如果无法启动就将注释去掉
    #JAVA_HOME=/usr/lib/j2sdk1.4-sun
    #CATALINA_HOME=/usr/share/tomcat5
    #CLASSPATH=\
    #$JAVA_HOME/lib/tools.jar:\
    #$CATALINA_HOME/bin/commons-daemon.jar:\
    #$CATALINA_HOME/bin/bootstrap.jar
    case "$1" in
     start)
       echo "Starting tomcat5..."
       /usr/tomcat5/bin/startup.sh
       ;;
     stop)
       echo "Stopping tomcat5..."
       /usr/tomcat5/bin/shutdown.sh
       ;;
     *)
       echo "Usage tomcat.sh start/stop"
       exit 1;;
    esac
    #tomcat5.sh end
    

    将tomcat5.sh 拷贝到/etc/init.d下面。然后运行/usr/bin/ksysv运行图形界面的开机启动设置工具。将Available Services栏里的tomcat5.sh拖到Runlever 2 Start,Runlever 3 Start,Runlever 4 Start,Runlever 5 Start,Runlever 6 Start,Runlever 0 Stop,Runlever 1 Stop,Runlever 6 Stop,你可能需要注意图标的位置,我将图标拖到每一栏的启动项目标号是90的位置。

    或者你在终端里运行:

    ln -s /etc/init.d/tomcat5.sh /etc/rc0.d/K90tomcat5.sh
    ln -s /etc/init.d/tomcat5.sh /etc/rc1.d/K90tomcat5.sh
    ln -s /etc/init.d/tomcat5.sh /etc/rc2.d/S90tomcat5.sh
    ln -s /etc/init.d/tomcat5.sh /etc/rc3.d/S90tomcat5.sh
    ln -s /etc/init.d/tomcat5.sh /etc/rc4.d/S90tomcat5.sh
    ln -s /etc/init.d/tomcat5.sh /etc/rc5.d/S90tomcat5.sh
    ln -s /etc/init.d/tomcat5.sh /etc/rc6.d/K95tomcat5.sh
    

    重启机器看tomcat是否可以自动启动了。

    2.2.2 使用jsvc,增加安全性

    方法2.2.1有一个严重的问题,那就是tomcat具有root权限。我意味着你的任何一个jsp脚本都具有root权限,所以可以轻易地用jsp脚本删除你整个硬盘里的东西!所以我们最好不要使用2.2.1方法。

    我们下载的jakarta-tomcat-5.0.28.tar.gz带有jsvc工具,在压缩包里的jakarta-tomcat-5.0.28/bin/jsvc.tar.gz,如果你按上面的步骤做了,它就在/usr/share/tomcat5/bin/jsvc.tar.gz,将其解压,得到/usr/share/tomcat5/bin/jsvc-src文件夹。在终端运行:

    /usr/share/tomcat5/bin/jsvc-src/configure --with-java=/usr/lib/j2sdk1.4-sun

    make

    得到/usr/share/tomcat5/bin/jsvc-src/jsvc文件。将/usr/share/tomcat5/bin/jsvc-src/native/tomcat5.sh脚本文件拷贝到/etc/init.d下,再使用2.2.1中的的半部分方法将tomcat设置为自启动。

    /etc/init.d/tomcat5.sh还需要修改,使其看起来像:

    JAVA_HOME=/usr/lib/j2sdk1.4-sun
    CATALINA_HOME=/usr/share/tomcat5
    DAEMON_HOME=/usr/share/tomcat5
    TOMCAT_USER=tomcat5 #这里改为一个普通身份的用户名
    TMP_DIR=/var/tmp
    CATALINA_OPTS=
    CLASSPATH=\
    $JAVA_HOME/lib/tools.jar:\
    $CATALINA_HOME/bin/commons-daemon.jar:\
    $CATALINA_HOME/bin/bootstrap.jar
    case "$1" in
     start)
       #
       # Start Tomcat
       #
       $DAEMON_HOME/bin/jsvc-src/jsvc \
    ......
    

    先不要重启试验,请手动运行/etc/init.d/tomcat5.sh start,然后在浏览器中输入http://localhost:8080或者http://127.0.0.1:8080看tomcat是否能够启动,再运行/etc/init.d/tomcat5.sh stop看是否能停止。

    问题:无法用jsvc启动tomcat?

    在http://jakarta.apache.org/commons/daemon/faq.html有说明。如果你使用Debian,运行modconf然后将/kernel/security下的capability模块安装上。如果你使用其它的版本,并且把capability编绎为模块,请在/etc/init.d/tomcat5.sh的合适位置(你想使用第2行?)加上modprobe capability。

    3,设置tomcat的server.xml布署网站

    如果你想让别人在浏览器中输入你的IP而不需要在IP后面加上“:端口号”就能访问你的网站的话,请将

    <Connector port="8080"
    	maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
    	enableLookups="false" redirectPort="8443" acceptCount="100"
    	debug="0" connectionTimeout="20000"
    	disableUploadTimeout="true" />
    

    中的port="8080"改为port="80",因为80是浏览器请求的默认端口。找到

    <Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true" 
    	xmlValidation="false" xmlNamespaceAware="false">
    </Host>
    

    修改为使appBase="/home/tomcatweb"。并在其后面加上:

    <Context path="" docBase="/home/tomcatweb" reloadable="true"></Context>
    

    把你自己的index.jsp放在/home/tomcatweb目录下,然后在浏览器中输入http://127.0.0.1,你应该就能看到index.jsp的运行结果了。

    4,中文问题

    tomcat并没有特殊的中文问题。而且大部分情况下的中文问题是因为用户根本就不会写JSP代码,甚至不会写HTML代码。

    4.1 简单HTML文件的乱码问题

    一个HTML文件,里面包含有中文文字,如:

    <html>
    <head>
    	<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    </head>
    你好。
    </html>
    
    

    上面的标签告诉浏览器你的HTML文件使用的是UTF-8编码格式。请将UTF-8正确地设置为你的文本编辑器保存时的编码,否则,只有全英文HTML源码文件才能保证不出现乱码。

    4.2 简单的JSP文件的乱码问题

    一个JSP文件,里面包含有中文文字,如:

    <%@ page contentType="text/html; charset=UTF-8" %>
    <html>
    
    <head>
    	<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    </head>
    <%
    	out.println("你好。");
    %>
    </html>
    

    <%@ page contentType="text/html; charset=UTF-8" %>标签告诉tomcat和java编绎器你的文件的编码是UTF-8格式的。

    4.3 被包含的文件的内容是乱码

    如果你的parent.jsp文件中使用<jsp:include page="child.jsp" >文件包含了child.jsp,请在parent.jsp和child.jsp文件中都指定了正确的<%@ page contentType="text/html; charset=UTF-8" %>(改UTF-8为正确的编码),两者可以不一样。

    如果你的parent.jsp文件中使用<%@ include file="child.jsp" %>文件包含了child.jsp,请保证parent.jsp和child.jsp是相同的编码,并且在parent.jsp中设置了正确的<%@ page contentType="text/html; charset=UTF-8" %>(改UTF-8为正确的编码)。不要在child.jsp中设置<%@ page contentType="text/html; charset=UTF-8" %>,否则,tomcat会出错(不总是)。

    更新, 在Tomcat5.5中测试, 在child.jsp中必须设置<%@ page contentType="text/html; charset=UTF-8" %>, 两者的编码必须相同.

     

    4.4 POST方法的乱码

    在request.getParameter();之前运行request.setCharacterEncoding("UTF-8");,其中UTF-8是你的提交页面的文件编码。

    4.5 使用javaIO读取的文件是乱码

    请重写你的函数,而不是试图更改tomcat的设置。

    原标题为:建造Linux开发环境----Tomcat,JSP

    Posted by ideawu at 2006-01-22 16:20:16
  • 2005-11-28

    JSP中文乱码解决之道

    Views: 18143 | 3 Comments

    对于Linux+Tomcat+JSP+Mysql,我的Mysql是character set latin1(连接值)latin1(全局值),我没改my.ini(my.cnf),这些都是默认的。Tomcat也是默认的。对于Linux来说,我用zh_CN.UTF-8的locale,不过用gb2312或者gbk都可以。

    注意了,你保存的源代码建议你保存为UTF-8编码格式(在Linux下的gedit,kedit在保存时有选项)。在Windows下,你试用Editplus或者UltraEdit试一下,应该也有这个选项。

    连接数据库时,jdbc:mysql://localhost:3306/admin?useUnicode=true&characterEncoding=utf8或者把utf8换为gb2312也行,不过不要再改变了!

    在JSP源码中,第一行写上:

    <%@ page contentType="text/html; charset=UTF-8" %>(告诉Tomcat你的源代码是UTF-8编码保存的)

    注意UTF-8的大小写,不确定的话查手册。如果你保存时编辑器选用gb2312,就把UTF-8改为gb2312。然后在与 </head>之间的第一行(其他行未试)写上

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">(告诉浏览器你的代码是UTF-8格式的)UTF-8与上面的对应,若上面为gb2312,这里也为gb2312,后面假设你用UTF-8;

    在读取表单之前,写上一句:

    request.setCharacterEncoding("UTF-8");(告诉JVM?/Tomcat?你要读取的信息的UTF-8格式的,与你的源代码存储格式一样。)

    就可以这样读取表单了:

    String member_name = request.getParameter("name");

    我这样做,没问题。你不妨试一试。如果有问题,请留言。

    希望对你有帮助。

    Posted by ideawu at 2005-11-28 14:13:00
|<<<123>>>| 3/3 Pages, 16 Results.