利用Struts结合Jbuilder7、MySql建立Web站点(1)--连接数据库
来源:互联网 发布:建筑四杰 知乎 编辑:程序博客网 时间:2024/05/15 13:36
作者:Sailing(蓝色虾)
iamcyh@263.net
本程序全部源代码:vod.zip
介绍:
关于Struts的介绍请参考:http://jakarta.apache.org
关于Struts的中文版用户指南:下载(我们要特别大富翁论坛的感谢曹晓刚先生的无私奉献,文章是他翻译的)
本文主要讨论如何利用Jbuilder7结合Struts建立一个后台数据库为MySQL的Web站点。
站点功能分析:(1)本网站为一个VOD点播网站,要能够满足用户的在线收看,下载电影文件,进行站内搜索
(2)网站内的所有影片分为足球射门、电影、搞笑片段、MTV四类别,并且在数据库中分别建立数据表
(3)首页出现以上四大类别的最新加入的前十个影片的资料,点击每个类别旁的“更多”链接出现该类别所有影片,按加入顺序倒排
(4)由于访问量大,使用数据库连接池。
(5)首页出现搜索栏,可以对以上四个类别中以影片名字作为关键字搜索
(6)首页出现专题推荐, 点击相应专题的名称,出现该专题所有影片
本篇文章的第一部分仅完成功能的(1)-(4)
准备:
首先我们从网上下载建立此Web站点需要的“包”,MySql的JDBC驱动程序可以在www.mysql.com下载,JDBC2.0的可选包随本程序的源
代码提供,Struts可以从http://jakarta.apache.org得到,Servlet包由Jbuilder7提供。
(1)打开Jbuilder7,建立一个新的工程(vod.jpx),将工程的默认编码改为GB2312,如下图:
(2)将获得包加入Jbuilder的工程需要包中,如图:
(3)建立一个Servlet和Jsp的空文件,分别将其执行,接着删除。(这样是为了JB自动建立相关的目录,并且获得Servlet的包)
(4)用winrar或者winzip解开下载的Struts中的webapps目录下的struts-example.war和struts-documentation.war(Struts的文档),
在struts-example.war解压后的/WEB-INF目录下找到struts.tld、struts-bean.tld、struts-form.tld、struts-html.tld、
struts-logic.tld、struts-template.tld文件,将其拷贝到在JB中建立的工程文件夹下的/WEB-INF目录下,然后在JB中将其加入工程,
以免在Rebuild时JB将其删除。如图:
(5)建立数据库,在MySql中建立一个名为gdvod的数据库,建立数据表需要的sql位于源代码目录src中的mysql.sql。
数据表如下:
表名:football | ||
列名 | 类型 | 说明 |
id | varchar(10) | 唯一的ID |
footballName | varchar(50) | 影片的名称 |
viewURL | varchar(255) | 在线观看的网址 |
downURL | varchar(255) | 下载的网址 |
clicks | int(5) | 用户点击的次数 |
sort | varchar(20) | 类别(默认:足球片段) |
intro | text | 简介 |
commend | int(5) | 用户推荐次数 |
date | varchar(20) | 加入日期 |
bad | int(5) | 用户报告坏链接的次数 |
length | int(5) | 影片的长度 |
其余的数据表于此类同,不同点在于fun、movie、mtv中的影片名称字段分别为funName、movieName、mtvName。
建立Bean
(1)与此对应,我们分别建立数据表相对于bean的映射。建立一个bean名为football,位于vod.mode包中
代码如下:
package vod.model; import java.sql.SQLException; public class Football implements Serializable { //------------------------------- public static Football load(ResultSet rs) throws SQLException{ strValue=rs.getString("id"); strValue=rs.getString("footballName"); strValue=rs.getString("viewURL"); strValue=rs.getString("downURL"); intValue=rs.getInt("clicks"); strValue=rs.getString("sort"); /* intValue=rs.getInt("commend"); strValue=rs.getString("date"); intValue=rs.getInt("bad"); intValue=rs.getInt("length"); return football; |
public static Football load(ResultSet rs)方法作为一个该bean的静态方法,接受传来的一个ReseltSet对象,
并且在方法中生成了一个football的实例,将rs中的内容依次使用set方法赋给football,最后返回这个football实例
这样做的目的在下面的数据库连接段的代码将有说明,能够很好的将数据进行封装。
大家注意这里被注释掉的代码:
/*
try{
Reader reader=rs.getCharacterStream("intro");
BufferedReader bReader=new BufferedReader(reader);
String inLine;
strValue="";
while((inLine=bReader.readLine())!= null){
strValue=strValue+inLine;
}
}catch(Exception e){e.printStackTrace();}
*/
这段代码在程序运行的时候报错:说MySql的JDBC2没有实现rs.getCharacterStream("intro")这个方法,我感到很意外,
还是由于什么别的原因导致我不能使用这个方法,请朋友们指教。由于在数据库中使用了text类型,将有大量的文本使用
流读取将会提高程序的性能。
其它三个bean的代码如下:
package vod.model; import org.gjt.mm.mysql.jdbc2.ResultSet; public class Fun implements Serializable { //------------------------------- public static Fun load(ResultSet rs) throws SQLException{ strValue=rs.getString("id"); strValue=rs.getString("funName"); strValue=rs.getString("viewURL"); strValue=rs.getString("downURL"); intValue=rs.getInt("clicks"); strValue=rs.getString("sort"); /* intValue=rs.getInt("commend"); strValue=rs.getString("date"); intValue=rs.getInt("bad"); intValue=rs.getInt("length"); return fun; |
package vod.model; import org.gjt.mm.mysql.jdbc2.ResultSet; public class Movie implements Serializable { //------------------------------- public static Movie load(ResultSet rs) throws SQLException{ strValue=rs.getString("id"); strValue=rs.getString("movieName"); strValue=rs.getString("viewURL"); strValue=rs.getString("downURL"); intValue=rs.getInt("clicks"); strValue=rs.getString("sort"); /* intValue=rs.getInt("commend"); strValue=rs.getString("date"); intValue=rs.getInt("bad"); intValue=rs.getInt("length"); return movie; |
package vod.model; import org.gjt.mm.mysql.jdbc2.ResultSet; public class Mtv implements Serializable { //------------------------------- public static Mtv load(ResultSet rs) throws SQLException{ strValue=rs.getString("id"); strValue=rs.getString("mtvName"); strValue=rs.getString("viewURL"); strValue=rs.getString("downURL"); intValue=rs.getInt("clicks"); strValue=rs.getString("sort"); /* intValue=rs.getInt("commend"); strValue=rs.getString("date"); intValue=rs.getInt("bad"); intValue=rs.getInt("length"); return mtv; |
(2)建立一个名为DisplayWelcome的类,这个类的任务是基于所设置的Connection分别将四大类别中按照加入顺序倒排前十
的条目放入四个LinkedList,并且返回所加入的LinkedList,以便于在Struts中的相关action中将其加入Session,便于在Jsp
页面中显示。注意这里的所用到刚刚建立的bean的load方法,将利用这个bean的静态方法返回同一个bean的实例,并且将其
加入到对应的LinkedList中。这样在LinkedList中保存的就是一个个具有不同数据的bean的实例,在jsp页面中可以很方便的
利用其get方法将相关的数据内容取出。
代码如下:
package vod.model; import java.sql.Connection; public class DisplayWelcome { /** PreparedStatement pstmt = null; /** PreparedStatement pstmt = null; /** PreparedStatement pstmt = null; /** PreparedStatement pstmt = null; |
(3)建立Action,在Struts中的页面的定位都是通过action来完成,action控制着网站程序因该调用哪一个BuinessBean来处理
用户的请求。这里建立一个名为:DisplayWelcomeAction的Action的Action,这个action的任务是接受用户的请求,接着调用
Struts自带的数据库连接池取得一个Connection,然后将这个数据库连接通过setConn()设置DisplayWelcome的一个实例,做后
利用相应的getXXXList()方法取得对应的LinkedList,将其加入session,以方便内容载jsp页面的显示。
代码如下:
package vod.controller; import vod.model.DisplayWelcome; public class DisplayWelcomeAction extends Action { LinkedList footballList; /** footballList=new LinkedList();
HttpSession session = request.getSession(); //do what you wish with myConnection return (mapping.findForward("success")); |
配置Struts:
(1)此时bean和action都已经完成了,下面我们将配置Struts的相关xml文件了,首先在JB中打开web.xml文件,将以下内容
加入web.xml文件:
<!--指明action类所在的位置 --> |
(2)在工程目录的WEB-INF/目录中建立一个名为struts-config.xml的文件,内容如下:
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE struts-config PUBLIC <!-- ========== 数据库连接池的相关设置=============================== -->
<!-- Enter into Welcome Page --> </action-mappings> </struts-config> |
(3)在工程目录的WEB-INF/目录中建立一个名为action.xml的文件,内容如下:
<!-- Action Mappings for the STRUTS Example Application --> <action-mappings> <!-- Process a user logon --> </action-mappings> |
action.xml任务是指明在action内部的跳转,关于这方面我一直觉得这和struts-config.xml中的内容产生重复,不怎么
理解这个action.xml文件存在的意义,我的领悟能力有限,请大家指教。
建立Jsp页面
(1)建立首页:由于这个页面第一个出现在用户面前的页面就含有数据库的读取,但是由于在Struts中所有的数据库的
读取必须通过action调用相关的bean中的功能实现,所以这里的首页起的作用就是中转一下用户的请求,将其跳转到
welcome.jsp,并且调转是由一个action负责,在跳转的同时在这个action中调用相关的bean读取数据库。
代码如下:
<%@ page contentType="text/html; charset=GB2312" %> <%@ page language="java" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <logic:forward name="welcome"/> |
这里的<logic:forward name="welcome"/>标签其实调用了<forward name="welcome" path="/welcome.do"/>,并且
所有*.do结尾的请求映射到了action上,同时由于设置了
<action path="/welcome"
type="vod.controller.DisplayWelcomeAction">
<forward name="success" path="/welcome.jsp"/>
</action>
DisplayWelcomeAction接受了这个请求,在数据库中将相关的内容读取,放入对应的LinkedList中,并且放入了session。
(2)建立welcome.jsp,这个页面就是将放入session的LinkedList读出,进行iterate,将其呈现在网页上,注意这里标签
的使用,代码如下:
<%@ page contentType="text/html; charset=GB2312" %> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <html> <head> <title> welcome </title> </head> <body> <table width="694" border="1" cellspacing="0" cellpadding="0"> <tr> <td width="70"><div align="center">id</div></td> <td width="110"><div align="center">footname</div></td> <td width="82"><div align="center">viewURL</div></td> <td width="92"><div align="center">downURL</div></td> <td width="48"><div align="center">clicks</div></td> <td width="41"><div align="center">sort</div></td> <td width="40"><div align="center">intro</div></td> <td width="66"><div align="center">commend</div></td> <td width="61"><div align="center">date</div></td> <td width="33"><div align="center">bad</div></td> <td width="51"><div align="center">length</div></td> </tr> <%/* java.util.LinkedList link=new java.util.LinkedList(); link=(java.util.LinkedList)session.getAttribute("footballTop"); if(link!=null) out.print("true"); else out.print("false"); */%> <logic:iterate id="football" name="footballTop"> <tr> <td><div align="center"><bean:write name="football" property="id"/></div></td> <td><div align="center"><bean:write name="football" property="footballName"/></div></td> <td><div align="center"><bean:write name="football" property="viewURL"/></div></td> <td><div align="center"><bean:write name="football" property="downURL"/></div></td> <td><div align="center"><bean:write name="football" property="clicks"/></div></td> <td><div align="center"><bean:write name="football" property="sort"/></div></td> <td><div align="center"><bean:write name="football" property="intro"/></div></td> <td><div align="center"><bean:write name="football" property="commend"/></div></td> <td><div align="center"><bean:write name="football" property="date"/></div></td> <td><div align="center"><bean:write name="football" property="bad"/></div></td> <td><div align="center"><bean:write name="football" property="length"/></div></td> </tr> </logic:iterate> </table> <br> <table width="694" border="1" cellspacing="0" cellpadding="0"> <tr> <td width="70"><div align="center">id</div></td> <td width="110"><div align="center">funname</div></td> <td width="82"><div align="center">viewURL</div></td> <td width="92"><div align="center">downURL</div></td> <td width="48"><div align="center">clicks</div></td> <td width="41"><div align="center">sort</div></td> <td width="40"><div align="center">intro</div></td> <td width="66"><div align="center">commend</div></td> <td width="61"><div align="center">date</div></td> <td width="33"><div align="center">bad</div></td> <td width="51"><div align="center">length</div></td> </tr> <logic:iterate id="fun" name="funTop"> <tr> <td><div align="center"><bean:write name="fun" property="id"/></div></td> <td><div align="center"><bean:write name="fun" property="funName"/></div></td> <td><div align="center"><bean:write name="fun" property="viewURL"/></div></td> <td><div align="center"><bean:write name="fun" property="downURL"/></div></td> <td><div align="center"><bean:write name="fun" property="clicks"/></div></td> <td><div align="center"><bean:write name="fun" property="sort"/></div></td> <td><div align="center"><bean:write name="fun" property="intro"/></div></td> <td><div align="center"><bean:write name="fun" property="commend"/></div></td> <td><div align="center"><bean:write name="fun" property="date"/></div></td> <td><div align="center"><bean:write name="fun" property="bad"/></div></td> <td><div align="center"><bean:write name="fun" property="length"/></div></td> </tr> </logic:iterate> </table> <br> <table width="694" border="1" cellspacing="0" cellpadding="0"> <tr> <td width="70"><div align="center">id</div></td> <td width="110"><div align="center">moviename</div></td> <td width="82"><div align="center">viewURL</div></td> <td width="92"><div align="center">downURL</div></td> <td width="48"><div align="center">clicks</div></td> <td width="41"><div align="center">sort</div></td> <td width="40"><div align="center">intro</div></td> <td width="66"><div align="center">commend</div></td> <td width="61"><div align="center">date</div></td> <td width="33"><div align="center">bad</div></td> <td width="51"><div align="center">length</div></td> </tr> <logic:iterate id="movie" name="movieTop"> <tr> <td><div align="center"><bean:write name="movie" property="id"/></div></td> <td><div align="center"><bean:write name="movie" property="movieName"/></div></td> <td><div align="center"><bean:write name="movie" property="viewURL"/></div></td> <td><div align="center"><bean:write name="movie" property="downURL"/></div></td> <td><div align="center"><bean:write name="movie" property="clicks"/></div></td> <td><div align="center"><bean:write name="movie" property="sort"/></div></td> <td><div align="center"><bean:write name="movie" property="intro"/></div></td> <td><div align="center"><bean:write name="movie" property="commend"/></div></td> <td><div align="center"><bean:write name="movie" property="date"/></div></td> <td><div align="center"><bean:write name="movie" property="bad"/></div></td> <td><div align="center"><bean:write name="movie" property="length"/></div></td> </tr> </logic:iterate> </table> <br> <table width="694" border="1" cellspacing="0" cellpadding="0"> <tr> <td width="70"><div align="center">id</div></td> <td width="110"><div align="center">mtvname</div></td> <td width="82"><div align="center">viewURL</div></td> <td width="92"><div align="center">downURL</div></td> <td width="48"><div align="center">clicks</div></td> <td width="41"><div align="center">sort</div></td> <td width="40"><div align="center">intro</div></td> <td width="66"><div align="center">commend</div></td> <td width="61"><div align="center">date</div></td> <td width="33"><div align="center">bad</div></td> <td width="51"><div align="center">length</div></td> </tr> <logic:iterate id="mtv" name="mtvTop"> <tr> <td><div align="center"><bean:write name="mtv" property="id"/></div></td> <td><div align="center"><bean:write name="mtv" property="mtvName"/></div></td> <td><div align="center"><bean:write name="mtv" property="viewURL"/></div></td> <td><div align="center"><bean:write name="mtv" property="downURL"/></div></td> <td><div align="center"><bean:write name="mtv" property="clicks"/></div></td> <td><div align="center"><bean:write name="mtv" property="sort"/></div></td> <td><div align="center"><bean:write name="mtv" property="intro"/></div></td> <td><div align="center"><bean:write name="mtv" property="commend"/></div></td> <td><div align="center"><bean:write name="mtv" property="date"/></div></td> <td><div align="center"><bean:write name="mtv" property="bad"/></div></td> <td><div align="center"><bean:write name="mtv" property="length"/></div></td> </tr> </logic:iterate> </table> </body> </html> |
现在以footballTop进行iterate标签的说明,iterate标签的语法如下:
<logic:iterate id="element" name="myhashtable">
Next element is <bean:write name="element" property="value"/>
</logic:iterate>
网页中使用的标签:
<logic:iterate id="football" name="footballTop">
<tr>
<td><div align="center"><bean:write name="football" property="id"/></div></td>
</tr>
</logic:iterate>
这里的footballTop是我在DisplayWelcomeAction中放入session的footballList的属性名字。
相关代码--DisplayWelcomeAction:session.setAttribute("footballTop",footballList);
id="football",是指放入这个LinkedList中的bean的名字。
相关代码--DisplayWelcome:footballList.add(Football.load(rs));
Football:return football;
<bean:write name="football" property="id"/>
property:是放了LinkedList中的football中的id的内容,但是必须要在football中有相应的getId()方法才能如此
调用。
此时在中Run index.jsp便可以看见结果了。
结尾:
本程序全部源代码:vod.zip
我写着篇文章的目的只由于当时在网上只能找到很少的关于Struts的中文资料,特别来火,干脆自己就写了一篇。
真心希望网上关于Java方面的中文资料能够越来越多。
在使用Tomacat是产生了 在JB7中配合tomact+mysql使用连接池的问题,请大家帮忙解答,多谢了。
关于作者:
Sailing,就读于南京工业大学工商管理专业,爱好Java编程,熟悉网站制作,真诚希望与大家进行交流。
工作室:Mars Studio
- 利用Struts结合Jbuilder7、MySql建立Web站点(1)--连接数据库
- 利用Struts结合Jbuilder7、MySql建立Web站点(1)--连
- 利用Struts结合Jbuilder7、MySql建立Web站点(2)--分页显示
- 利用JSP建立Web站点
- web站点递归绑定数据库的站点地图(SiteMapPath控件与Web.sitemap结合)
- Struts中利用连接池访问MySQL数据库
- 利用MySQL建立本地数据库
- struts 2 连接mysql数据库
- 1、利用jdbc,连接mysql数据库
- Spark web Framework 结合sql2o连接MySQL
- 利用JDBC连接MySql数据库
- 利用JDBC连接MySQL数据库
- 最简单的Struts程序(2)------连接MYSQL数据库
- 最简单的Struts程序(2)------连接MYSQL数据库
- Web程序连接mysql数据库
- java web 连接mysql数据库
- 建立PHP与MySQL数据库的连接
- 如何利用MySQL设置远程数据库以优化站点性能
- VBScript编码模板(2003-11-14修改版)
- 破解和盗版组织大揭密
- 32位代码优化常识
- 浮点运算简介
- 提问的智慧---如何在论坛上提问?
- 利用Struts结合Jbuilder7、MySql建立Web站点(1)--连接数据库
- 利用Struts结合Jbuilder7、MySql建立Web站点(2)--分页显示
- 使用Eclipse开发CMP2.0
- 取得图片的透明区域
- 搜索字符串在流中的位置
- 流的压缩和解压
- 剪贴板的流存储
- 获取其他进程中ListView的文本
- 设置ListView的页眉图标