??xml version="1.0" encoding="utf-8" standalone="yes"?> 实现论坛树型l构的算法很多,q里是一个不用递归实现树型l构的算?/FONT> 1.演示表的l构Q?nbsp; Q?Q脚本中Q?BR> Q?Q文本中Q?BR> <?xml version="1.0" encoding="gb2312" ?> Q?Q脚本中Q?BR> Q?Q文本中Q?BR> <?xml version="1.0" encoding="gb2312" ?> 1、google 2、baidu 3、ODP(开攑ּ目录) 4、yahoo中国 5、sohu 6、yisou 7、天|搜?BR> 北大的搜索引擎,高校学生用得比较多?BR> d地址Q?A class=bb-url target=_blank rel=nofollow>http://www.infomall.cn/url_submit.html 8、孙悟空搜烦 9、搜?BR> 臭名昭著的搜索引?BR> 地址Q?A class=bb-url target=_blank rel=nofollow>http://www.soogou.com/add.htm 10、易?BR> 没用q,不知道怎么P看名字跟yahoo的yisou很相q?BR> 地址Q?A class=bb-url target=_blank rel=nofollow>http://www.ysou.com/site/reg.asp 甌免费l计alexa头像Q?BR> http://www.alexa.com/site/site_stats/signup 更新ALEXA的羃略图Q?BR> http://thumbnails.alexa.com/update_thumbnail ALEXA的统计: 站点l计 量历史囄
***** 在VC6和Dev-C下调试通过 ****/
#include
#include
#include
#include
#include
#define EXP_LEN 100 //定义输入字符~冲区的长度
/*------------出错代码的宏定义--------------*/
#define INVALID_CHAR_TAIL 0 //表达式后跟有非法字符
#define CHAR_AFTER_RIGHT 1 //x号后q接非法字符
#define LEFT_AFTER_NUM 2 //数字后非法直接连接左括号
#define INVALID_CHAR_IN 3 //表达式中含有非法字符
#define NO_RIGHT 4 //~少x?
#define EMPTY_BRACKET 5 //括号内无表达?
#define UNEXPECTED_END 6 //预期外的术表达式结?
using namespace std;
const string ErrCodeStr[]= //表达式出错信?
{
"表达式后跟有非法字符Q?,
"x号后q接非法字符Q?,
"数字后非法直接连接左括号Q?,
"表达式中含有非法字符Q?,
"~少xP",
"括号内无表达式或表达式不完整Q?,
"表达式非法结束或表达式不完整Q?
};
static char expr[EXP_LEN]; //术表达式输入字W缓冲区
static int pos; //字符指示器标志:用来保存正在分析的字W的位置
static jmp_buf errjb; //出错跌{~冲?
//********以下是函数声?********
//产生式“E -> T+E | T-E | T”的函数Q用来分析加减算术表辑ּ?
int E_AddSub();
//产生式“T -> F*T | F/T | F”的函数Q用来分析乘除算术表辑ּ?
int T_MulDiv();
//产生式“F -> i | (E)”的函数Q用来分析数字和括号内的表达式?
int F_Number();
//出错处理函数Q可以指出错误位|,出错信息?
void Error(int ErrCode);
int main()
{
int ans; //保存术表达式的计算l果
bool quit=false; //是否退?
do
{
//在此讑֮一个蟩转目标,如果本程序的其他函数调用longjmpQ?
//执行指op转到q里Q从q里l箋执行?
if(setjmp(errjb)==0) //如果没有错误
{
pos=0; //初始化字W指C器?Q即指向输入字符串的W一个字W?
cout<<"误入一个算术表辑ּQ输入“Q”或“q”退出)Q?<
if(expr[0]=='q'||expr[0]=='Q')
//查第一个字W,是否退出?
quit=true;
else
{
//调用推导式“E -> T+E | T-E | T”的函数Q?
//从v始符号“E”开始推对{?
ans=E_AddSub();
//此时Q程序认为对表达式的语法分析已经完毕Q下面判断出错的原因Q?
//如果表达式中的某个右括号后直接跟着数字或其他字W,
//则报错,因ؓ数字i不属于FOLLOW(Q?集?
if(expr[pos-1]==')'&&expr[pos]!='\0')
Error(CHAR_AFTER_RIGHT);
//如果表达式中的某个数字或x号后直接跟着左括P
//则报错,因ؓ左括号不属于FOLLOW(E)集?
if(expr[pos]=='(')
Error(LEFT_AFTER_NUM);
//如果l尾有其他非法字W?
if(expr[pos]!='\0')
Error(INVALID_CHAR_TAIL);
cout<<"计算得出表达式的gؓQ?<
}
else
{
//setjmp(errjb)!=0的情况:
cout<<"请重新输?"<
}
while(!quit);
return 0;
}
//产生式“E -> T+E | T-E | T”的函数Q用来分析加减算术表辑ּ?
//q回计算l果
int E_AddSub()
{
int rtn=T_MulDiv(); //计算加减术表达式的左元
while(expr[pos]=='+'||expr[pos]=='-')
{
int op=expr[pos++]; //取字W缓冲区中当前位|的W号到op
int opr2=T_MulDiv();//计算加减术表达式的叛_
//计算求?
if(op=='+') //如果?+"?
rtn+=opr2; //则用加法计算
else //否则Q是"-"P
rtn-=opr2; //用减法计?
}
return rtn;
}
//推导式“T -> F*T | F/T | F”的函数Q用来分析乘除算术表辑ּ?
//q回计算l果
int T_MulDiv()
{
int rtn=F_Number(); //计算乘除术表达式的左元
while(expr[pos]=='*'||expr[pos]=='/')
{
int op=expr[pos++]; //取字W缓冲区中当前位|的W号到op
int opr2=F_Number();//计算乘除术表达式的叛_
//计算求?
if(op=='*') //如果?*"?
rtn*=opr2; //则用乘法计算
else //否则Q是"\"P
rtn/=opr2; //用除法计?
}
return rtn;
}
//产生式“F -> i | (E)”的函数Q用来分析数字和括号内的表达式?
int F_Number()
{
int rtn; //声明存储q回值的变量
//用生式F->(E)推导Q?
if(expr[pos]=='(') //如果字符~冲区当前位|的W号?("
{
pos++; //则指C器加一指向下一个符?
rtn=E_AddSub(); //调用产生式“E -> T+E | T-E | T”的分析函数
if(expr[pos++]!=')')//如果没有?("匚w?)"
Error(NO_RIGHT);//则生错?
return rtn;
}
if(isdigit(expr[pos]))//如果字符~冲Z当前位置的字Wؓ数字
{
//则用产生式F -> i推导
//把字W缓冲区中当前位|的字符串{换ؓ整数
rtn=atoi(expr+pos);
//改变指示器的|跌字符~冲区的数字部分Q找C一个输入字W?
while(isdigit(expr[pos]))
pos++;
}
else //如果不是数字则生相应的错误
{
if(expr[pos]==')') //如果发现一?)"
Error(EMPTY_BRACKET); //则是括号是空的,x号内无算术表辑ּ?
else if(expr[pos]=='\0') //如果此时输入串结?
Error(UNEXPECTED_END); //则算术表辑ּ非法l束
else
Error(INVALID_CHAR_IN); //否则输入字符串中含有非法字符
}
return rtn;
}
//出错处理函数Q输入错误代码,可以指出错误位置Q出错信息?
void Error(int ErrCode)
{
cout<<'\r'; //换行
while(pos--)
cout<<' '; //打印I格Q把指示错误?^"Ud输入字符串的出错位置
cout<<"^ 语法错误 Q!Q?"
<
}
研究ingQ这D|间重新复习数据结构了…?/FONT>
]]>
例子本n是在TOMCAT4.01 q_下运行的B/Sl构的程式。有关TOMCAT 的配|,q里不做说明。只讲解一下相x件及文g夹的目录l构?
目录l构说明Q?
/tomcat/webapps/canyin/ -----ȝ?
/tomcat/webapps/canyin/jsp/ -----JSP 文g目录
/tomcat/webapps/canyin/jsp/admin/ -----实现后台理的JSP 文g的存攄?
/tomcat/webapps/canyin/WEB-INF/classes/canyin/ ------javabean 文g的存攄?
/tomcat/webapps/canyin/data/ -----xml 文g存放目录
/tomcat/webapps/ROOT/ -----tomcat 启动文g存放文g夹,只存放了index.html 文g
文g单说明:
/tomcat/webapps/canyin/data/users.xml -----记录用户信息
/tomcat/webapps/canyin/data/restaurants.xml -----记录馆的基信息
/tomcat/webapps/ROOT/index.html -----首页Q页面出现输入框Q要求用戯入用户名Q密?
/tomcat/webapps/canyin/jsp/loginjudge.jsp -----用户w䆾判断面Q根据用户名U和密码军_面是{入后台管理端Q还是前台客L。本例子中,用户w䆾一旦确认ؓ有管理权限,可以q入后台理端,q接蟩到餐馆基本信息管理页面,化说明的程?
/tomcat/webapps/canyin/jsp/admin/admin_rest.jsp -----馆基本信息理面Q管理餐馆的名称Q电话,地址{信?
/tomcat/webapps/canyin/WEB-INF/classes/canyin/checkSessionBean.class ----- 后台理端检标志用戯n份的session 的|如果不是理员的话,跛_登陆面?
/tomcat/webapps/canyin/WEB-INF/classes/canyin/connXmlBean.class -----q接xml 文g
/tomcat/webapps/canyin/WEB-INF/classes/canyin/writeXmlBean.class -----写入xml文g
文g详细介绍及附带代码说明?
/tomcat/webapps/canyin/data/users.xml
代码Q?
<?xml version="1.0" encoding="UTF-8" ?>
- <users>
<user name="joard" password="joard" roles="admin" />
<user name="joard01" password="joard01" roles="user" />
<user name="joard02" password="joard02" roles="user" />
</users>
说明Q字D含义是用户名,密码以及用户的n?
/tomcat/webapps/canyin/data/restaurants.xml
代码Q?
<?xml version="1.0" encoding="UTF-8" ?>
- <restaurants num="10">
- <restaurant id="1">
<name>上v亭快店</name>
<phone>021-76546726</phone>
<address>百老汇q场B?lt;/address>
</restaurant>
- <restaurant id="8">
<name>香格里拉大饭?lt;/name>
<phone>021-2312134</phone>
<address>南京?023?lt;/address>
</restaurant>
</restaurants>
说明Q?lt;num>属性是记录在restaurants.xml 文g中d有过多少条记录,每新增一条,无论以后删除是否Q该值都会增?Q就好象数据库中习惯使用的自动增?的id V用来给新增?<restaurant>的属?lt;id>赋一个唯一的倹{其它的字段意思比较明显?
/tomcat/webapps/ROOT/index.html Q单U的HTML代码Q?
代码Q?
<html>
<head>
<title>oddWorld 饮pȝ</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body onload="javascript:dataform.username.focus()">
<div align="center">
<table width="100%" border="0" cellspacing="0" cellpadding="0" height="22">
<tr>
<td width="1"><img src="images/top_r1.GIF" width="62" height="22"></td>
<td width=150 align="center"> 饮pȝd </td>
<td><img src="images/top_r2.GIF" width="294" height="22"></td>
</tr>
</table>
<br>
<br>
<table width="300" border="0" cellspacing="1" cellpadding="0" >
<tr>
<td height="200" valign="top" align="center">
<p align="center">
<table width="100%" border="0" cellspacing="1" cellpadding="5" bgcolor=#999999 class=a9px>
<tr>
<td bgcolor="#efefef">饮pȝd</td>
</tr>
<tr>
<td bgcolor="#FFFFFF" valign="top" align="center">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<form name=dataform method=post action=''canyin/jsp/loginjudge.jsp''>
<tr>
<td width="100"><b>d名:</b></td>
<td>
<input maxlength=16
name="username" class=stedit value="joard">
</td>
</tr>
<tr>
<td width="100"><b>密码Q?lt;/b></td>
<td>
<input class=stedit maxlength=16
name="userpass" type=password value="oddworld">
</td>
</tr>
</form>
</table>
<br>
<table border=0 cellpadding=0 cellspacing=0>
<tbody>
<tr>
<td>
<input class=stbtm name=update onClick="javascript:if (checkform()==false);" type=button value="??>
</td>
<td> </td>
<td>
<input class=stbtm name=Submit onClick="javascript:window.location.href=''index.asp?myjoke=1'';" type=button value="修改密码">
</td>
<td> </td>
</tr>
</tbody>
</table>
<br>
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
</body>
</html>
<SCRIPT language=javascript>
<!--
function checkform()
{
var Checkblank = /^(\s*|(\ )|(\.))*$/;
if (Checkblank.test(dataform.username.value))
{
alert("d名不能ؓI?");
return false;
}
if (Checkblank.test(dataform.userpass.value))
{
alert("密码不能为空!");
return false;
}
window.dataform.submit();
}
-->
</SCRIPT>
说明Q把用户名称和用户密码提交到/tomcat/webapps/canyin/jsp/loginjudge.jsp
/tomcat/webapps/canyin/WEB-INF/classes/canyin/checkSessionBean.class Q代码是相应的java 文gQ?
package canyin;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
public class checkSessionBean {
private boolean bolCheckPass=false;
private HttpServletRequest request = null;
public boolean checkSessionBean(HttpServletRequest request,String strSessionName,String strCheckValue){
public boolean checkSessionBean(HttpServletRequest request){
HttpSession session = request.getSession(false);
return(bolCheckPass);
if (strSessionName==null || strCheckValue==null){
return(bolCheckPass);
}else{
if (session!=null && session.getValue(strSessionName)!=null){
bolCheckPass=session.getValue(strSessionName).equals(strCheckValue);
}
return(bolCheckPass);
}
}
}
说明Q检验参C入的session 名称的数值和参数传入的字D늚数值是否相{?
/tomcat/webapps/canyin/WEB-INF/classes/canyin/connXmlBean.class
代码Q?
package canyin;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
public class connXmlBean {
private DocumentBuilderFactory factory=null;
private DocumentBuilder builder=null;
private Document doc=null;
public connXmlBean(){}
public String connXml(String xmlFileName){
String strExc="";
try{
factory = DocumentBuilderFactory.newInstance();
builder=factory.newDocumentBuilder();
doc=builder.parse(xmlFileName);
doc.normalize();
}catch(Exception e){
strExc=e.toString();
}
return(strExc);
}
public Document getXmlDoc(){
return(doc);
}
}
说明Q打开一个指定xml 文g
/tomcat/webapps/canyin/WEB-INF/classes/canyin/writeXmlBean.class
代码Q?
package canyin;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import org.w3c.dom.*;
public class writeXmlBean {
public writeXmlBean(){}
public String writeXml(Document doc,String xmlFileName){
String strExc="";
try{
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer transformer = tfactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(xmlFileName));
transformer.transform(source,result);
}catch(Exception e){
strExc=e.toString();
}
return(strExc);
}
}
说明Q写入dom 的内容到一个指定的xml 文g?
/tomcat/webapps/canyin/jsp/loginjudge.jsp
代码Q?
<%-- oddWorld 饮理pȝ(体中文版) 2002q?2??
copy right by joard ast
loginjudge.jsp 功能Q用戯n份校验,Ҏ /data/user.xml 文g内标C的用户不同的n?
军_转入后台理面Q还是客L菜页面?
--%>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page language="java" import="javax.xml.parsers.*" %>
<%@ page import="org.w3c.dom.*" %>
<%@ page import="canyin.*" %>
<jsp:useBean id="xmlBean" class="canyin.connXmlBean" scope="page" />
<%
session.setMaxInactiveInterval(1800);
Document doc;
NodeList users;
String strExc="";
String strUsername,strPassword;
strUsername=(String)request.getParameter("username");
strPassword=(String)request.getParameter("userpass");
//校验数据是否为空
if (strUsername=="" || strPassword=="" ){
out.println("<script language=''javascript''>");
out.println("alert(''用户名或密码有空?'');");
out.println("window.location.href=''/index.html'';");
out.println("</script>");
return;
}
xmlBean.connXml("webapps/canyin/data/users.xml");
doc=xmlBean.getXmlDoc();
try{
users =doc.getElementsByTagName("user");
for (int i=0;i<users.getLength();i++){
Element user=(Element) users.item(i);
String strAtrNameValue=user.getAttributeNode("name").getNodeValue();
String strAtrPassWordValue=user.getAttributeNode("password").getNodeValue();
String strAtrRoleValue=user.getAttributeNode("roles").getNodeValue();
if (strAtrNameValue.equals(strUsername) && strAtrPassWordValue.equals(strPassword)){
if (strAtrRoleValue.equals("admin")){
out.println("<script language=''javascript''>");
out.println("alert(''Ƣ迎理员登陆系l?'');");
out.println("</script>");
//讄标示用户w䆾?sessionQsesUserRoleQ?Q管理员w䆾?admin
session.setAttribute("sesUserRole","admin");
//跌{到管理页?
response.sendRedirect("admin/admin_rest.jsp");
return;
}else{
//讄标示用户w䆾?sessionQsesUserRoleQ?Q管理员w䆾?user
session.setAttribute("sesUserRole","user");
//跌{到普通用户页?
response.sendRedirect("index.jsp");
return;
}
}else{
out.println("<script language=''javascript''>");
out.println("alert(''用户名或密码错误!'');");
out.println("history.go(-1);");
out.println("</script>");
return;
}
}
}catch(Exception e){
strExc=e.toString();
}
%>
说明Q?......
/tomcat/webapps/canyin/jsp/admin/admin_rest.jsp
代码Q?
<%-- oddWorld 饮理pȝ(体中文版) 2002q?2??
copy right by joard ast
admin_rest.jsp 功能Q后台管理页面,馆理面?
--%>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page language="java" import="javax.xml.parsers.*" %>
<%@ page import="javax.xml.transform.*" %>
<%@ page import="org.w3c.dom.*" %>
<%@ page import="canyin.*" %>
<%@ include file="../../include/sys_dialog.jsp" %>
<jsp:useBean id="checkSessionBean" class="canyin.checkSessionBean" scope="page" />
<jsp:useBean id="xmlBean" class="canyin.connXmlBean" scope="page" />
<jsp:useBean id="writeXmlBean" class="canyin.writeXmlBean" scope="page" />
<%//校验可户w䆾Q判断是不是理?
if(!checkSessionBean.checkSessionBean(request,"sesUserRole","admin")){
out.print(showDialog("您没有管理的权限!","/index.html"));
return;
}
//从餐馆资料文?rest.xml 中得到相x?
Document doc;
NodeList restaurants;
String strAct;
int intId=0;
String strOperation="show";
//接受外部传入的参?
strAct=(String)request.getParameter("act");
xmlBean.connXml("webapps/canyin/data/restaurants.xml");
doc=xmlBean.getXmlDoc();
restaurants =doc.getElementsByTagName("restaurant");
//Ҏ外部传入的参数来军_?restaurant.xml 文g的操?
if (strAct!=null){
if(strAct.equals("addnewDo")){
String strName;
String strPhone;
String strAddress;
Text textseg;
strName=(String)request.getParameter("name").trim();
strPhone=(String)request.getParameter("phone").trim();
strAddress=(String)request.getParameter("address").trim();
//数据校验
if(strName==null){
out.print(showDialog("馆名称不能为空!"));
return;
}
if(strPhone==null){
out.print(showDialog("馆电话不能为空!"));
return;
}
/*if(strAddress==null){
out.print(showDialog("馆地址不能为空!"));
return;
}*/
//校验数据的唯一?
for(int i=0;i<restaurants.getLength();i++){
Element restaurant=(Element) restaurants.item(i);
if(((String)restaurant.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()).equals(strName)){
out.print(showDialog("馆名称重复!"));
return;
}else{
if(((String)restaurant.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()).equals(strPhone)){
out.print(showDialog("馆电话重复!"));
return;
}
}
}
//得到已有的记录数Q给新增的餐馆记录设定唯一的递增的id 属?
int intNum=0;
Element restNum=(Element)doc.getElementsByTagName("restaurants").item(0);
intNum=Integer.parseInt(restNum.getAttributeNode("num").getNodeValue());
intNum+=1;
//为restaurants的属性num 的数值加1
restNum.getAttributeNode("num").setNodeValue(String.valueOf(intNum));
//新增节点
Element newRestaurant=doc.createElement("restaurant");
Attr newArrId=doc.createAttribute("id");
//Attribute newArrId = new Attribute("id",String.valueOf(intNum));
textseg=doc.createTextNode(String.valueOf(intNum));
newArrId.setValue(String.valueOf(intNum));
newRestaurant.setAttributeNode(newArrId);
Element newName=doc.createElement("name");
textseg=doc.createTextNode(strName);
newName.appendChild(textseg);
newRestaurant.appendChild(newName);
Element newPhone=doc.createElement("phone");
textseg=doc.createTextNode(strPhone);
newPhone.appendChild(textseg);
newRestaurant.appendChild(newPhone);
Element newAddress=doc.createElement("address");
textseg=doc.createTextNode(strAddress);
newAddress.appendChild(textseg);
newRestaurant.appendChild(newAddress);
doc.getDocumentElement().appendChild(newRestaurant);
//调用bean 写入相应的xml文g
writeXmlBean.writeXml(doc,"webapps/canyin/data/restaurants.xml");
response.sendRedirect(request.getRequestURI());
return;
}
if(strAct.equals("modiDo")){
String strName;
String strPhone;
String strAddress;
Text textseg;
int modiId;
//记录要修改的记录是item(i)的哪一?
int intI=0;
strName=(String)request.getParameter("name").trim();
strPhone=(String)request.getParameter("phone").trim();
strAddress=(String)request.getParameter("address").trim();
modiId=Integer.parseInt(request.getParameter("recordId").trim());
//数据校验
if(strName==null){
out.print(showDialog("馆名称不能为空!"));
return;
}
if(strPhone==null){
out.print(showDialog("馆电话不能为空!"));
return;
}
if(modiId==0){
out.print(showDialog("你要修改馆的记录不存在!"));
return;
}
/*if(strAddress==null){
out.print(showDialog("馆地址不能为空!"));
return;
}*/
//标志昄记录存在
boolean recordExist=false;
//校验数据的唯一?
for(int i=0;i<restaurants.getLength();i++){
Element restaurant=(Element) restaurants.item(i);
if(Integer.parseInt(restaurant.getAttributeNode("id").getNodeValue())==modiId){
recordExist=true;
intI=i;
}
if(((String)restaurant.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()).equals(strName) && Integer.parseInt(restaurant.getAttributeNode("id").getNodeValue())!=modiId ){
out.print(showDialog("馆名称重复!"));
return;
}else{
if(((String)restaurant.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()).equals(strPhone) && Integer.parseInt(restaurant.getAttributeNode("id").getNodeValue())!=modiId ){
out.print(showDialog("馆电话重复!"));
return;
}
}
}
if(!recordExist){
out.print(showDialog("你要修改馆的记录不存在!"));
return;
}else{
//q行记录更改的操?
try{
Element modiRestaurant=(Element) restaurants.item(intI);
modiRestaurant.getElementsByTagName("name").item(0).getFirstChild().setNodeValue(strName);
modiRestaurant.getElementsByTagName("phone").item(0).getFirstChild().setNodeValue(strPhone);
modiRestaurant.getElementsByTagName("address").item(0).getFirstChild().setNodeValue(strAddress);
//调用bean 写入相应的xml文g
writeXmlBean.writeXml(doc,"webapps/canyin/data/restaurants.xml");
response.sendRedirect(request.getRequestURI());
return;
}catch(Exception e){}
}
}
//q行删除操作
if(strAct.equals("del")){
int delId;
//记录要修改的记录是item(i)的哪一?
int intI=0;
delId=Integer.parseInt(request.getParameter("recordId").trim());
if(delId==0){
out.print(showDialog("你要修改馆的记录不存在!"));
return;
}
file://标志昄记录存在
boolean recordExist=false;
//校验数据的唯一?
for(int i=0;i<restaurants.getLength();i++){
Element restaurant=(Element) restaurants.item(i);
if(Integer.parseInt(restaurant.getAttributeNode("id").getNodeValue())==delId){
recordExist=true;
intI=i;
}
}
if(!recordExist){
out.print(showDialog("你要删除馆的记录不存在!"));
return;
}else{
//q行记录删除的操?
try{
Node delNode=(Node)restaurants.item(intI);
doc.getElementsByTagName("restaurants").item(0).removeChild(delNode);
//调用bean 写入相应的xml文g
writeXmlBean.writeXml(doc,"webapps/canyin/data/restaurants.xml");
response.sendRedirect(request.getRequestURI());
return;
}catch(Exception e){}
}
}
}
//由外部传入参数决定页面相应的处理状?
if (strAct==null){
strOperation="show";
}else{
if (strAct.equals("modi")){
strOperation="modi";
intId=Integer.parseInt(request.getParameter("recordId"));
}else{
if(strAct.equals("addnew")){
strOperation="addnew";
}else{
strOperation="show";
}
}
}
//如果为空记录Q则变更面状态ؓ“新增?
if (restaurants.getLength()==0){
strOperation="addnew";
}
%>
<html>
<head>
<title>oddWorld 饮pȝ</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta http-equiv="expires" content="0">
<link rel="stylesheet" href="../../include/itsp.css" type="text/css">
</head>
<body >
<div align="center">
<table width="100%" border="0" cellspacing="0" cellpadding="0" height="22">
<tr>
<td width="1"><img src="../../images/top_r1.GIF" width="62" height="22"></td>
<td width=150 align="center"> 饮pȝ理--馆理</td>
<td><img src="../../images/top_r2.GIF" width="294" height="22"></td>
<td width=100 align="center"><a href="/index.html">[ 退出系l?]</a></td>
</tr>
</table>
<br>
<br>
<table bgcolor="#999999" align=center border=0 cellpadding=1 cellspacing=1
width="90%">
<tbody>
<tr bgcolor="#efefef" align="center" valign="middle">
<td class=ttTable height=30 width="20"> </td>
<td class=ttTable height=30 width="0">馆名称</td>
<td class=ttTable height=30 width="0">馆电话</td>
<td class=ttTable height=30 width="0">
<div align="center">馆地址</div>
</td>
<td class=ttTable height=30 width="30">
<div align="center">修改</div>
</td>
<td class=ttTable height=30 width="30">
<div align="center">删除</div>
</td>
</tr>
<%
for(int i=0;i<restaurants.getLength();i++)
{
Element restaurant=(Element) restaurants.item(i);
if (strOperation=="modi" && Integer.parseInt(restaurant.getAttributeNode("id").getNodeValue())==intId){
%>
<%//昄修改的格?>
<tr align="center" bgcolor="#ffffff" valign="middle">
<form name=dataform action="<%=request.getRequestURI()%>?act=modiDo" method="post" onSubmit=''return checkform(this);'' >
<td class=tdsmall height=25 width="20">
<input type="hidden" name="recordId" value="<%=restaurant.getAttributeNode("id").getNodeValue()%>">
<%=(i+1)%></td>
<td class=tdsmall height=25>
<input name="name" class=stedit
style="HEIGHT: 22px; WIDTH: 150px" value="<%if(restaurant.getElementsByTagName("name").item(0).hasChildNodes()){
out.print(restaurant.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
}%>
" maxlength="40" >
</td>
<td class=tdsmall height=25>
<input name="phone" class=stedit
style="HEIGHT: 22px; WIDTH: 100px" value="<%if(restaurant.getElementsByTagName("phone").item(0).hasChildNodes()){
out.print(restaurant.getElementsByTagName("phone").item(0).getFirstChild().getNodeValue());
}%>" maxlength="20" >
</td>
<td class=tdsmall height=25>
<input name="address" class=stedit
style="HEIGHT: 22px; WIDTH: 200px" value="<%
if(restaurant.getElementsByTagName("address").item(0).hasChildNodes()){
out.print(restaurant.getElementsByTagName("address").item(0).getFirstChild().getNodeValue());
}%>" maxlength="100" >
</td>
<td class=tdsmall height=25 width="25"><a href="javascript:if (checkform()==false);"><img border=0
height=15 src="../../images/editok.gif" width=15></a></td>
<td class=tdsmall height=25 width="25"> </td>
</form>
</tr>
<% }else{
//昄正常的格?%>
<tr align="center" bgcolor="#ffffff" valign="middle">
<td class=tdsmall height=25 width="20"><%=(i+1)%></td>
<td class=tdsmall height=25 width="0"><%if(restaurant.getElementsByTagName("name").item(0).hasChildNodes()){
out.print(restaurant.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
}%>
</td>
<td class=tdsmall height=25 width="0"><%if(restaurant.getElementsByTagName("phone").item(0).hasChildNodes()){
out.print(restaurant.getElementsByTagName("phone").item(0).getFirstChild().getNodeValue());
}%></td>
<td class=tdsmall height=25 width="0">
<%
if(restaurant.getElementsByTagName("address").item(0).hasChildNodes()){
out.print(restaurant.getElementsByTagName("address").item(0).getFirstChild().getNodeValue());
}%>
</td>
<td class=tdsmall height=25 width="30"><a href="<%=request.getRequestURI()%>?act=modi&recordId=<%=restaurant.getAttributeNode("id").getNodeValue()%>"><img border=0
height=15 src="../../images/edit.gif" width=15></a></td>
<td class=tdsmall height=25 width="30"><img border=0
height=15
onClick="javascript:if(confirm(''您是否确定删除本记录Q删除后导臌录无法用?'')){window.location.href=''<%=request.getRequestURI()%>?act=del&recordId=<%=restaurant.getAttributeNode("id").getNodeValue()%>'';}"
src="../../images/delete.gif" style="CURSOR: hand" width=15> </td>
</tr>
<% }
}%>
<% if (strOperation=="addnew"){
//昄新增的格?>
<tr align="center" bgcolor="#ffffff" valign="middle">
<form name=dataform2 action="<%=request.getRequestURI()%>?act=addnewDo" method="post" onSubmit=''return checkform2(this);'' >
<td class=tdsmall height=25 width="20"></td>
<td class=tdsmall height=25>
<input name="name" class=stedit
style="HEIGHT: 22px; WIDTH: 150px" value="" maxlength="40" >
</td>
<td class=tdsmall height=25>
<input name="phone" class=stedit
style="HEIGHT: 22px; WIDTH: 100px" value="" maxlength="20" >
</td>
<td class=tdsmall height=25>
<input name="address" class=stedit
style="HEIGHT: 22px; WIDTH: 200px" value="" maxlength="100" >
</td>
<td class=tdsmall height=25 width="25"><a href="javascript:if (checkform2()==false);"><img border=0
height=15 src="../../images/editok.gif" width=15></a></td>
<td class=tdsmall height=25 width="25"> </td>
</form>
</tr>
<% } %>
</tbody>
</table>
<br>
<table align=center border=0 cellpadding=0 cellspacing=2 width="95%">
<tbody>
<tr valign=center>
<td align=middle> <br>
<table border=0 cellpadding=0 cellspacing=0>
<tr>
<td>
<% if (strOperation=="addnew"){
%>
<input class=stbtm name=update onClick="javascript:if (checkform2()==false);" type=button value="更新记录">
<% }else{
if(strOperation=="modi"){
%>
<input class=stbtm name=update onClick="javascript:if (checkform()==false);" type=button value="更新记录">
<%
}else{
%>
<input class=stbtm type="button" name="Button" value="?? onClick="javascript:window.location.href=''<%=request.getRequestURI()%>?act=addnew'';"><%
}
} %>
</td>
<td>
<input class=stbtm type="button" name="Button" value="q?? onClick="javascript:window.location.href=''index.jsp'';">
</td>
</tr>
</table>
</td>
</tr>
</table>
<p> </p>
</div>
</body>
</html>
<SCRIPT LANGUAGE=javascript>
<!--
function checkform2()
{
var Checkblank = /^(\s*|(\ )|(\.))*$/;
if (Checkblank.test(dataform2.name.value))
{
alert("馆名称不能为空Q?);
dataform2.name.focus();
return false;
}
if (Checkblank.test(dataform2.phone.value))
{
alert("馆电话不能为空Q?);
dataform2.phone.focus();
return false;
}
window.dataform2.submit();
}
function checkform()
{
var Checkblank = /^(\s*|(\ )|(\.))*$/;
if (Checkblank.test(dataform.name.value))
{
alert("馆名称不能为空Q?);
dataform.name.focus();
return false;
}
if (Checkblank.test(dataform.phone.value))
{
alert("馆电话不能为空Q?);
dataform.phone.focus();
return false;
}
window.dataform.submit();
}
-->
</SCRIPT>
说明Q本文g的书写有很多地方q不l,因ؓ在程式的开发过E中Q过分简l的E序往往会带来后期维护的困难?
开发心得:
doc.getElementsByTagName("restaurants").item(int i)的返回值是node 型,如果不是要调用它的属性|没有必要强制转型?Element型。可以直接操作。本pȝ因ؓ开发的参考资料的错误Q所以全都采用了强制转型。可以在以后的开发中考虑使用node 直接q行操作?
trim() ?Interger.parseInt() 函数都不可以接受null 型的数?
在tomcat 下左右的文g都是目录从TOMCAT vQ具体情况请参见\webapps\canyin\jsp\userjudge.jsp 里关于xml 路径的写法?
]]>
表名Qmybbslist
字段 数据cd 说明
BBSID 自动~号
RootID Int 根帖IDQ本wؓ根帖则RootID = BBSID
FID Int 父帖IDQ上一层帖子的IDQ如是根帖则FID = 0
DEPTH Int 根帖Level=0Q其他依据回复的深度递增
BBSSubject Char 主题
2.创徏表(可根据此表的l构在ACCESS中创Q:
create table mybbslist (
forumID int(20) not null,
bbsID int auto_increment primary key,
rootid int(20) not null,
fid int(20) not null,
depth int(20) not null,
userID int(20) not null,
bbsUser varchar(24) not null,
bbsSubject varchar(100) not null,
bbsContent text,
bbsTime varchar(30),
bbsRead int(20),
bbsReply int(20),
INDEX forumID (forumID))
3.演示论坛树型l构的JSPE序Q注意此E序只对一个根贴进行了演示Q数据库用ACCESSQ?
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.io.*" %>
<%@ page import="java.sql.*" %>
<%
String driverName = "sun.jdbc.odbc.JdbcOdbcDriver";
String connURL= "jdbc:odbc:cwb";
Connection conn = null;
Statement stmt = null;
int intRowCount;
out.print("昄论坛树Şl构");
out.print("<br><br>");
try {
Class.forName(driverName);
conn = DriverManager.getConnection(connURL);
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
String sql="select * from mybbslist order by rootid desc,depth,fid,bbsid";
ResultSet rs = stmt.executeQuery(sql);
if (rs.next()){
rs.last();
intRowCount=rs.getRow();
out.print("论坛树中?);
out.print(intRowCount);
out.print("个叶子节?);
rs.first();
int j=0;
int Depth = 0;
out.print("<ul>");
while(j<intRowCount){
int rsDepth=rs.getInt("depth");
if (rsDepth>Depth){
out.print("<ul>");
}
out.print("<li>");
String bbssubject=rs.getString("bbsSubject");
out.print(bbssubject);
out.print("</li>");
Depth=rsDepth;
j=j+1;
rs.next();
}
for(int i=0;i<Depth+1;i=i+1) {
out.print("</ul>");
}
}else{
out.print("数据库中无记?);
}
}catch (SQLException E) {
out.println("SQLException: " + E.getMessage());
out.println("SQLState: " + E.getSQLState());
out.println("VendorError: " + E.getErrorCode());
}
%>
<% //关闭mysqlq接
try {
if(conn!=null) conn.close();
} catch (Exception ex) {
System.err.println("closeConn: " + ex.getMessage());
}
%>
]]>
paixu.xml
<?xml version="1.0" encoding="gb2312" ?>
<?xml-stylesheet type="text/xsl" href="paixu.xsl" ?>
<BlueIdea>
<team>
<blue_ID>1</blue_ID>
<blue_name>Sailflying</blue_name>
<blue_text>一个简单的排序</blue_text>
<blue_time>2002-1-11 17:35:33</blue_time>
<blue_class>XML专题</blue_class>
</team>
<team>
<blue_ID>2</blue_ID>
<blue_name>flyingbird</blue_name>
<blue_text>嫁给你,是要你疼?lt;/blue_text>
<blue_time>2001-09-06 12:45:51</blue_time>
<blue_class>灌水_֍</blue_class>
</team>
<team>
<blue_ID>3</blue_ID>
<blue_name>苛子</blue_name>
<blue_text>正则表达式在QQ论坛中的应?lt;/blue_text>
<blue_time>2001-11-23 21:02:16</blue_time>
<blue_class>Web ~程_֍</blue_class>
</team>
<team>
<blue_ID>4</blue_ID>
<blue_name>太乙?lt;/blue_name>
<blue_text>q末l典分舵聚会完全手册 v0.1</blue_text>
<blue_time>2000-12-08 10:22:48</blue_time>
<blue_class>论坛灌水?lt;/blue_class>
</team>
<team>
<blue_ID>5</blue_ID>
<blue_name>mmkk</blue_name>
<blue_text>Asp错误信息L</blue_text>
<blue_time>2001-10-13 16:39:05</blue_time>
<blue_class>javascript脚本</blue_class>
</team>
</BlueIdea>
paixu.xsl
<?xml version="1.0" encoding="gb2312" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<head>
<title> XML卷之实战锦囊Q?Q:动态排?lt;/title>
<style>body,BlueIdea,team,blue_ID,blue_name,blue_text,blue_time,
blue_class{ font: 12px "宋体", "Arial", "Times New Roman"; }
table { font-size: 12px; border: 0px double; border-color: #99CC99 #99CC99 #CCCCCC #CCCCCC; cellpadding:3;cellspacing:3; bgcolor:#eeeeee; text-decoration: blink}
span { font-size: 12px; color: red; }
</style>
<script>
function taxis(x)
{
stylesheet=document.XSLDocument;
source=document.XMLDocument;
sortField=document.XSLDocument.selectSingleNode("http://@order-by");
sortField.value=x;
Layer1.innerHTML=source.documentElement.transformNode(stylesheet);
}
</script>
</head>
<body>
<p align="center"><span>XML卷之实战锦囊Q?Q:动态排?lt;/span></p>
<div id="Layer1" name="Layer1">
<xsl:apply-templates select="BlueIdea" />
</div>
</body>
</html>
</xsl:template>
<xsl:template match="BlueIdea">
<table width="500" border="1" align="center" cellpadding="1" cellspacing="1" bordercolordark="#ffffff" bordercolorlight="#ADAAAD">
<tr bgcolor="#FFCC99" align="center">
<td style="cursor:s-resize" onClick="taxis('blue_ID')">~号</td>
<td style="cursor:s-resize" onClick="taxis('blue_name')">姓名</td>
<td style="cursor:s-resize" onClick="taxis('blue_text')">主题</td>
<td style="cursor:s-resize" onClick="taxis('blue_time')">发表旉</td>
<td style="cursor:s-resize" onClick="taxis('blue_class')">归类</td>
</tr>
<xsl:apply-templates select="team" order-by="blue_ID"/>
</table>
</xsl:template>
<xsl:template match="team">
<tr align="center">
<xsl:apply-templates select="blue_ID" />
<xsl:apply-templates select="blue_name" />
<xsl:apply-templates select="blue_text" />
<xsl:apply-templates select="blue_time" />
<xsl:apply-templates select="blue_class" />
</tr>
</xsl:template>
<xsl:template match="blue_ID">
<td bgcolor="#eeeeee">
<xsl:value-of />
</td>
</xsl:template>
<xsl:template match="blue_name">
<td>
<xsl:value-of />
</td>
</xsl:template>
<xsl:template match="blue_text">
<td>
<xsl:value-of />
</td>
</xsl:template>
<xsl:template match="blue_time">
<td>
<xsl:value-of />
</td>
</xsl:template>
<xsl:template match="blue_class">
<td>
<xsl:value-of />
</td>
</xsl:template>
</xsl:stylesheet>
1Qpaixu.xml 是数据文Ӟ怿大家都不会有问题?BR>2Qpaixu.xsl 是格式文Ӟ有几个地方要注意?
sortField=document.XSLDocument.selectSingleNode("http://@order-by");
作用是:扑ֈ有属性ؓorder-by的第一个节点,因此它对应的节点是
<xsl:apply-templates select="team" order-by="blue_ID"/>
因此在初ơonLoad的时候order-by的value值是blue_ID?BR>而我们就是通过重新定义order-by的value值来辑ֈ排序的目的?
Layer1.innerHTML=source.documentElement.transformNode(stylesheet);
作用是:转化XML数据后更改Layer1Q因此在传出参数'blue_name'后,
<td style="cursor:s-resize" onClick="taxis('blue_name)">姓名</td>
我们order-by的valueg改ؓ?blue_name'Q即?blue_name'为排序方式?BR>l而通过重新昄Layer1的innerHTML值来昄新的排序内容?BR>
order-by
q个可不能少哦,不然找不到了,效果嘛,你瞧瞧看吧!Q?
另外说一点:
在大多的XML教科书中所昄的代码中很少会加上encoding="gb2312" Q?BR>因此我们在XML中用C文的时候会报错Q原因就是没有写q个x?BR>
]]>
paixu.xml
<?xml version="1.0" encoding="gb2312" ?>
<?xml-stylesheet type="text/xsl" href="paixu.xsl" ?>
<BlueIdea>
<team>
<blue_ID>1</blue_ID>
<blue_name>Sailflying</blue_name>
<blue_text>一个简单的排序</blue_text>
<blue_time>2002-1-11 17:35:33</blue_time>
<blue_class>XML专题</blue_class>
</team>
<team>
<blue_ID>2</blue_ID>
<blue_name>flyingbird</blue_name>
<blue_text>嫁给你,是要你疼?lt;/blue_text>
<blue_time>2001-09-06 12:45:51</blue_time>
<blue_class>灌水_֍</blue_class>
</team>
<team>
<blue_ID>3</blue_ID>
<blue_name>苛子</blue_name>
<blue_text>正则表达式在QQ论坛中的应?lt;/blue_text>
<blue_time>2001-11-23 21:02:16</blue_time>
<blue_class>Web ~程_֍</blue_class>
</team>
<team>
<blue_ID>4</blue_ID>
<blue_name>太乙?lt;/blue_name>
<blue_text>q末l典分舵聚会完全手册 v0.1</blue_text>
<blue_time>2000-12-08 10:22:48</blue_time>
<blue_class>论坛灌水?lt;/blue_class>
</team>
<team>
<blue_ID>5</blue_ID>
<blue_name>mmkk</blue_name>
<blue_text>Asp错误信息L</blue_text>
<blue_time>2001-10-13 16:39:05</blue_time>
<blue_class>javascript脚本</blue_class>
</team>
</BlueIdea>
paixu.xsl
<?xml version="1.0" encoding="gb2312" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<head>
<title> XML卷之实战锦囊Q?Q:动态排?lt;/title>
<style>body,BlueIdea,team,blue_ID,blue_name,blue_text,blue_time,
blue_class{ font: 12px "宋体", "Arial", "Times New Roman"; }
table { font-size: 12px; border: 0px double; border-color: #99CC99 #99CC99 #CCCCCC #CCCCCC; cellpadding:3;cellspacing:3; bgcolor:#eeeeee; text-decoration: blink}
span { font-size: 12px; color: red; }
</style>
<script>
function taxis(x)
{
stylesheet=document.XSLDocument;
source=document.XMLDocument;
sortField=document.XSLDocument.selectSingleNode("http://@order-by");
sortField.value=x;
Layer1.innerHTML=source.documentElement.transformNode(stylesheet);
}
</script>
</head>
<body>
<p align="center"><span>XML卷之实战锦囊Q?Q:动态排?lt;/span></p>
<div id="Layer1" name="Layer1">
<xsl:apply-templates select="BlueIdea" />
</div>
</body>
</html>
</xsl:template>
<xsl:template match="BlueIdea">
<table width="500" border="1" align="center" cellpadding="1" cellspacing="1" bordercolordark="#ffffff" bordercolorlight="#ADAAAD">
<tr bgcolor="#FFCC99" align="center">
<td style="cursor:s-resize" onClick="taxis('blue_ID')">~号</td>
<td style="cursor:s-resize" onClick="taxis('blue_name')">姓名</td>
<td style="cursor:s-resize" onClick="taxis('blue_text')">主题</td>
<td style="cursor:s-resize" onClick="taxis('blue_time')">发表旉</td>
<td style="cursor:s-resize" onClick="taxis('blue_class')">归类</td>
</tr>
<xsl:apply-templates select="team" order-by="blue_ID"/>
</table>
</xsl:template>
<xsl:template match="team">
<tr align="center">
<xsl:apply-templates select="blue_ID" />
<xsl:apply-templates select="blue_name" />
<xsl:apply-templates select="blue_text" />
<xsl:apply-templates select="blue_time" />
<xsl:apply-templates select="blue_class" />
</tr>
</xsl:template>
<xsl:template match="blue_ID">
<td bgcolor="#eeeeee">
<xsl:value-of />
</td>
</xsl:template>
<xsl:template match="blue_name">
<td>
<xsl:value-of />
</td>
</xsl:template>
<xsl:template match="blue_text">
<td>
<xsl:value-of />
</td>
</xsl:template>
<xsl:template match="blue_time">
<td>
<xsl:value-of />
</td>
</xsl:template>
<xsl:template match="blue_class">
<td>
<xsl:value-of />
</td>
</xsl:template>
</xsl:stylesheet>
1Qpaixu.xml 是数据文Ӟ怿大家都不会有问题?BR>2Qpaixu.xsl 是格式文Ӟ有几个地方要注意?
sortField=document.XSLDocument.selectSingleNode("http://@order-by");
作用是:扑ֈ有属性ؓorder-by的第一个节点,因此它对应的节点是
<xsl:apply-templates select="team" order-by="blue_ID"/>
因此在初ơonLoad的时候order-by的value值是blue_ID?BR>而我们就是通过重新定义order-by的value值来辑ֈ排序的目的?
Layer1.innerHTML=source.documentElement.transformNode(stylesheet);
作用是:转化XML数据后更改Layer1Q因此在传出参数'blue_name'后,
<td style="cursor:s-resize" onClick="taxis('blue_name)">姓名</td>
我们order-by的valueg改ؓ?blue_name'Q即?blue_name'为排序方式?BR>l而通过重新昄Layer1的innerHTML值来昄新的排序内容?BR>
order-by
q个可不能少哦,不然找不到了,效果嘛,你瞧瞧看吧!Q?
另外说一点:
在大多的XML教科书中所昄的代码中很少会加上encoding="gb2312" Q?BR>因此我们在XML中用C文的时候会报错Q原因就是没有写q个x?BR>
]]>
如果你的|站是新发布的,或是讉K量较低的|站在内Ҏ新时Q很有必要主动提交到GoogleQ这样会使网站资料迅速更新倒Google搜烦资料库,让用戯及时搜烦C的最新资料?BR> d地址Q?A class=bb-url target=_blank rel=nofollow>http://www.google.com/add_url.html
baidu基本跟google差不?BR> d地址Q?A class=bb-url target=_blank rel=nofollow>http://www.baidu.com/search/url_submit.html
Open Directory Project (ODP) 是仅ơ于Yahoo的h工操作目录烦引类搜烦引擎。与Yahoo不同的是QOpen Directory Project (ODP)的编辑h员均为志愿者,而非光员。目前其志愿~辑人数已达C人?BR>体中文登录地址Q?A class=bb-url target=_blank rel=nofollow>http://www.dmoz.com/World/Chinese_Simplified/
在雅虎主站登录网站是要收费的Q不q目前在雅虎中国d|站是免费的Q要d的话得赶紧?BR>d步骤Q?BR> 1?q入雅虎中国Q?A class=bb-url target=_blank rel=nofollow>http://www.yahoo.com.cn/
2?在其左下角的"|站分类"模块中选择适合你网站的目录?BR> 3?点击"d|站"Q按照提C填写信息即可?/P>
搜狐只对非商业型|站Q如政府机构Q慈善机构,学校{,提供免费|站d服务。如果你的网站属于非商业型网站,那么赶快到搜狐免费登录。商业网站(如:商场、公司、电子商务等Q就要花钱来d了?BR> d地址Q?A class=bb-url target=_blank rel=nofollow>http://db.sohu.com/regurl/regform.asp?Step=REGFORM
一搜是雅虎新推出的挑战google的搜索服务?BR> d地址Q?A class=bb-url target=_blank rel=nofollow>http://www.yisou.com/search_submit.html
用得很少?BR> 地址Q?A class=bb-url target=_blank rel=nofollow>http://www.sunwukong.cn/add.php
量排名
http://www.alexa.com/site/site_stats/signup
http://www.alexa.com/site/site_stats/signup?mode=stats
http://www.alexa.com/site/site_stats/signup?mode=graph
]]>
而许多搞不清指针是咋回事的BBS站友眉飞色舞的讨论C#里面可以不用指针{等则让我觉得好W。C++p当年的ASP一P"忽如一夜春风来Q千树万树梨花开"Q结果许多学校的信息学院成了"Web 学院"?
96,97U的不少大学生都dWeb了。当然我没有M歧视某一行业的意识。我只是觉得?果他们把q赶q些旉技术的旉多花一点在基础的课E上应该是可以走得更q的?
几个误区
初学者对C++风潮的追赶其实也只是学习q程中经帔R到的几个误区之一。我用一些实际的例子来说明这 些现象,你可以按部就班的看看自己是不是属于其中的一U或者几U:
认ؓ计算机技术等于编E技?
有些人即使没有这个想法,在潜意识中也有这L冲动。让我奇怪的是,许多信息学院的学生也有这L念头。认机专业是~程专业Q与~程无关的,或者不太相关的评他统l都不管Q极端的学生只要书上没带"~程"两个字他׃看?
其实~程只是计算机技术应用过E中一U复杂性最低的力_Q这是Z么IT业最底层的h是程序员Q?CODERQ。计机技术包括了多媒体,计算机网l,人工Q模式识别,理信息pȝ{等q些斚w?
~程工作只是在这些具体技术在理论研究或者工E实늚q程中表辄法的q程。编E的Z一定对计算机技术的了解׃定很高。而一个有的现象是,不少大师U的计算机技术研I者是不懂~程的。网上的炒作和现实中良好的工作待遇把~程q种力_秘化了。其实每一个程序员心里都明白,自己q些东西Q学的时候ƈ不比其它专业难,所以自然也不会高到哪里去?
咬文嚼字的孔乙己作风:
我见q一本女生的《计机|络原理》教材,q个女生象小学生一样在书上划满了横杠杠Q笔记做得满满的Q打印出来一定比教材q厚。我不明白的是,象计机|络原理q样的课E有必要做笔讎ͼ我们的应试教育的害了不学生,在上《原理》这一c课E的时候许多学生象学《马列原理》一样逐字背诵记忆?
q乃是我见过的最愚蠢的行为。所谓《原理》,x需要掌握它Z么这样做Q学习whyQ而不是howQ怎样做)。极端认真的学生背下以太|的|线最大长度,数据帧的长度Q每个字D늚意义QIP报头的格式等{,但是忘了路由的原则,忘了TCP/IP协议设计的宗旨。M许多了大量的旉把书背得滚瓜烂熟却等于什么也没学?
在学习编E的时候这些学生也是这P他们切的记得C++语法的各个细节。看完了C++教程后看《Thinking in C++》(实是好书)Q《Inside C++》,《C++ reference》,this C++,thatC++……,然后是网上各U各L关于C++语法的奇闻怺Q然后发现自己又忘了C++的一些语法,最后回头l恶补…。有个师弟就跟我_"C++ 太难了,学了q里忘了那里Q学了承忘了模ѝ?我的回答道:"你不d容易了"。我q没有教坏他Q只是告诉他Q死抠C++的语法就和孔已己炫耀茴香豆的茴字有几U写法一h无意义。你Ҏ不需要对的C++语法太关心,动手~程是了,有不记得的地方一查MSDNq马搞定。我有个l论是Q实际的开发过E中对程序语法的了解是最微不道的知识。这是ؓ什么我在ؓ同学用BasicQ我以前从没有学q它Q写一个小E序的时候,只花了半个小时看了看语法Q然后再用半个小时完成了E序Q而一个小时后我又完全忘记了Basic 的所有关键字?
不顾基础Q盲目追赶时髦技术:
l于点到题目上来了。大多数的h都希望自q东西能够马上跑v来,变成钱。这U想法对一个已l进入职业领域的E序员或者项目经理来说是合理的,而且IT技术进步是如此的快Q不跟进是׃。但是对于初学者来_其是时间充裕的大中专在校生Q,q种x是另解的。一个ƈ未进入到行业竞争中来的初学者最大的资本便是他有_的时间沉下心来学习基性的东西Q学习why 而不是how。时髦的技术往往Ҏ掌握Q而且来容易掌握,q是商业利益的驱使,Z最大化的降低Y件开发的成本。但在IT领域内的现实是q样Q越Ҏ掌握的东西,学习的h多Q而且淘汰得越快。每一ơ新的技术出来,都有许多初学者跟q,q些初学者由于缺乏必要的基础而得自己在跟进的过E中p大量的时_而等他学会了Q这U技术也快淘C。基的课E,比方数据l构Q操作系l原理等{虽然不能让你立马就实现一个linuxQ这是许多h嘲笑理论评无用的原因)Q但它们能够显著的减你在学习新技术时学习曲线的坡度。而且对于许多关键的技术(比方Win32 SDK E序的设计,DDK的编E)来说甚至是不可或~的?
一个活生生的例子是我和我的一个同学,在大一时我q找不到开机按U,他已l会写些单的汇编E序了。我把大二的所有时间花在了汇编Q计机体系l构Q数据结构,操作pȝ原理{等q些评的学习上Q而他则开始学习HTML和VBQƈq赶ASP的潮。大三的时候我开始学习Windows 操作pȝ原理Q学习SDK~程Q时间是漫长的,q时我才能够用VC开发出象模象样的应用程序。我曾一度因为同学的E序已经能够q行而自p在学习如何创建对话框而懊gԌ但到毕业才发现自己的选择是何{的正确。和我谈判的公司开出的薪水是他的两倍还多。下面有一个不很恰当的比方Q假讑֭习VB~程需?个月Q学习基评和VC的程序设计需?q。那么如果你先学VBQ再来学习后者,旉不会减少Q还?q_而反q来Q如果先学习后者,再来学VBQ也怽只需?个星期就能学得非常熟l?/FONT>
几个重要的基评
如果你是学生Q或者如果你有充的旉。我你仔l的掌握下面的知识。我的徏议是针对那些希望在IT技术上有所成就的初学者。同时我q列Z一些书目,q些书应该都q可以在书店买到。说实在的,我在d他h的文章时最大的心愿是希望作者列Z个书单?
大学pQ不要觉得好W。我极力推荐q门评是因为没有专业文的阅读能力是不可想象的。中文的译往往在猴q马月才会出来,而现在的许多出版Cֹ脆就直接把E文印刷上厅R学习的Ҏ是强q自q原版的教材,开始会看不懂,用多了自然熟l。吃得苦下得狠心l对是Q何行业都需要的品质?
计算Zpȝ构和汇编语言Q关于体pȝ构的书遍地都是,而且也大同小异,倒是汇编有一本非常好的书。?0x86汇编语言E序设计教程》(清华大学出版C,黑色面Q杨季文著)。你需要着重学?86后保护模式的E序设计。否则你在学习现代操作系l底层的一些东西的时候会觉得是在看天书?
计算机操作系l原理-我们的开发L在特定的操作pȝ上进行,如果不是Q只有一U可能:你在自己实现一个操作系l。无论如何,操作pȝ原理是必ȝ。这p我们Z个芯片制作外围设备时Q芯片基本的工作时序是必需了解的。这一cM也很多,我没有发现哪一本书非常Z。只是觉得在看完了这些书后如果有I就应该看看《Inside Windows 2000?微Y出版C,我看的是E文版的,中文的书名想必是Windows 2000 技术内q之cd)。关于学习它的必要性,ZDNET上的另一文章已l有q论q?
数据l构和算法-q门评能够军_一个hE序设计水^的高低,是一门核心课E。我首选的是清华版的(朱战立,刘天Ӟ。很多h喜欢买C++版的Q但我觉得没有必要。C++的语法让法实现q程变得复杂多了Q而且许多老师喜欢用模块这一东西让算法变得更复杂。倒是在学完了C版的书以后再来浏览一下C++的版的书是最好的?
软g工程Q这门课E是到后来p发现它的重要Q虽然刚开始看时就象看马哲一样不知所云。我的徏议是看《实用Y件工E》(黄色Q清华)。不要花太多的时间去记条条框框,看不懂就跌厅R在每次自己完成了一个Y件设计Q务(不管是练习还是工作)以后再来回顾回顾Q每ơ都会有收获?
Windows E序设计Q《北京大学出版社QPetzold著》我M企图设计Windows E序的h在学习VC以前仔细的学完它。而且前面的那本《Inside Windows 2000》也最好放到这本书的后面读?
在这本书中,没有C++Q没有GUIQ没有控件。有的就是如何用原始的C语言来完成Windows E序设计。在 学完了它以后Q你才会发现VC其实是很Ҏ学的。千万不要在没有看完q本书以前提前学习VCQ你最好碰都不要碰。我知道的许多名校甚至都已经用它作ؓ教材q行授课。可见其重要?
上面的几门课E我认ؓ是必学的重要评Q如果你惛_Windows E序员)?
对于其它的课E有q样单的选择ҎQ如果你是计机pȝQ请学好你所有的专业基础课。如果不是,请参照计机pȝ评表。如果你发现自己看一本书时无法看下去了,LC的最后,看看它的参考文献,扑ֈ它们q学习它们,再回头看q本书。如果一本书的书名中带有"原理"两个字,你一定不要去记忆它其中的l节Q你应该以一天至?0늚速度掌握其要领。尽可能多的在计机上实践一U理论或者算法?
你还可以在CSDN上阅d许多书评。这些书评能够帮助你军_M么样的书?/FONT>
日三省乎?
每天ȝ书太多,Ҏ让hq失方向。一定要在每天晚上想惌己学了些什么,q有些什么相关的东西需要掌握,自己对什么最感兴,在一本书上花的时间太长还是不够等{。同时也应该多想x来最有可能出现的应用Q这栯够让你不是追赶技术潮而是引领技术潮。同Ӟ努力使用现在已经掌握的技术和理论d作具有一定新意的东西。坚持这样做能够让你真正成ؓ一个Y?研发?而不仅仅是一个CODER?
把最多的旉花在学习?
q是对初学者最后的忠告。把每个星期玩SC或者CS的时间压~到最,不玩它们是最好的。同Ӟ如果你的ASP技术已l能够来钱,甚至有公司请你兼职的话,q就证明你的天䆾能够保证你在努力的学习之后取得更好的收益Q你应该d更复杂的东西。眼光放长远一些,q无论是对谁都是适用的?
怿你已l能够决定是否学习CQ或者什么时候去学它?/FONT>
Javabeansq结数据库核心代码:
Class.forName("org.gjt.mm.mysql.Driver").newInstance(); String url ="jdbc:mysql://localhost:3306/yourDataBase?user=username&password=password&useUnicode=true&characterEncoding=gb2312"; Connection conn= DriverManager.getConnection(url); Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); ResultSet rs=stmt.executeQuery("select * from test");
其中"org.gjt.mm.mysql.Driver"是mysql的jdbc驱动。默认的是没有的Q你可以到网上下载一个,解压后就可以使用。其中点操作W表C\径,即org\gjt\mm\mysql\Driver.class。当Ӟq个包里q会有其它的classQ您可以自己看一下,如果需要的话,可以直接拿来用。在url中,yourDataBase是你的数据库的名字,username是数据库的访问名Uͼpassword是密码。后面的useUnicode=true&characterEncoding=gb2312是ؓ了解决中文问题,q样从MySql中获取的即ؓ中文字符。Rs即ؓ执行查询select * from test后返回的l果集?/P>
问题二:在jsp中如何调用javabeans
在jsp中,我们?lt;jsp:useBean id="DBConnID" class="DBConn" scope="session"/>
来调用javabeans。事实上Q这相当于导入一个类DBConnQ然后创Z个名为DBConnID的实例,我们可以直接用DBConnID.DBConn()调用cDBConn中的DBConnҎ。这和面向对象编E中的所有其它方法都是一L?/P>
问题三:提交表单的编码问?BR>
在jsp中,表单提交以后Q如果我们不q行M处理Q那么写q数据库的会是ؕ码。在q里Q我们用
String newname = new String(request.getParameter("newname").getBytes("ISO8859_1"));
卛_解决此问题?/P>
问题四:大段文本的换行问?BR>
因ؓhtml不能正常昄大段文本的换行、回车,所以我们要在输出到html的时候将其中的回车、换行替换成html标签<br>。但是在java中,StringcȝreplaceҎ只能替换单个字符。不q我们可以用StringBuffercȝreplaceҎ来解册个问题:
myStringBuffer.replace(int start, int end , String str);
其中start是要替换字符串的开始位|,end是要替换字符串的l束位置Qstr是用来替换的字符丌Ӏ我们只要用字符?lt;br>替换原文本中的\r\nQ就可以在网中正确地输Z?BR>明确了这四个问题以后Q我们就可以开始动手了?BR>
一、准备MySql数据?BR>
在MySql的test数据库中新徏表tbl_test,共有两个字段id和nameQ其中id为int型,name为text?
表tbl_test建好以后Q在其中随便加入几条数据Q以备测试用?nbsp;
二、编写连接数据库的javabeans
用文本编辑器~写如下代码Q将其保存ؓc:\j2sdk1.4.0\bin\DBConn.java?
DBConn.java
//======================================
//include java class
//======================================
import java.sql.*;
//==========================================
// Define Class DBConn
//==========================================
public class DBConn
{
public String sql_driver = "org.gjt.mm.mysql.Driver";
public String sql_url = "jdbc:mysql://localhost:3306";
public String sql_DBName = "test";
public String user = "sa";
public String pwd = "";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
public boolean DBConn()
{
try{
Class.forName(sql_driver).newInstance();
this.conn = DriverManager.getConnection(sql_url + "/" + sql_DBName + "?user=" + user + "&password=" + pwd + "&useUnicode=true&characterEncoding=gb2312");
this.stmt = this.conn.createStatement();
return true;
}catch(Exception e){
System.out.println(e.toString());
return false;
}
}
public ResultSet executeQuery(String strSql)
{
try{
this.rs = stmt.executeQuery(strSql);
return this.rs;
}catch(SQLException e){
System.out.println(e.toString());
return null;
}catch(NullPointerException e){
System.out.println(e.toString());
return null;
}
}
public boolean execute(String strSql)
{
try{
if(this.stmt.executeUpdate(strSql) == 0)
return false;
else
return true;
}catch(SQLException e){
System.out.println(e.toString());
return false;
}catch(NullPointerException e){
System.out.println(e.toString());
return false;
}
}
public boolean hasData()
{
try{
boolean has_Data = this.rs.first();
this.rs.beforeFirst();
return has_Data;
}catch(SQLException e){
System.out.println(e.toString());
return false;
}
}
public boolean rs_absolute(int row)
{
try{
this.rs.absolute(row);
return true;
}catch(SQLException e){
System.out.println(e.toString());
return false;
}
}
public void rs_afterLast()
{
try{
this.rs.afterLast();
}catch(SQLException e){
System.out.println(e.toString());
}
}
public void rs_beforeFirst()
{
try{
this.rs.beforeFirst();
}catch(SQLException e){
System.out.print(e.toString());
}
}
public boolean rs_first()
{
try{
this.rs.first();
return true;
}catch(SQLException e){
System.out.print(e.toString());
return false;
}
}
public boolean rs_next()
{
try{
return this.rs.next();
}catch(SQLException e){
System.out.println(e.toString());
return false;
}
}
public boolean rs_last()
{
try{
return this.rs.last();
}catch(SQLException e){
System.out.println(e.toString());
return false;
}
}
public boolean rs_previous()
{
try{
return this.rs.previous();
}catch(Exception e){
System.out.println(e.toString());
return false;
}
}
public void rs_deleteRow()
{
try{
this.rs.deleteRow();
}catch(SQLException e){
System.out.print(e.toString());
}
}
public String rs_getString(String column)
{
try{
return this.rs.getString(column);
}catch(SQLException e){
System.out.println(e.toString());
return null;
}
}
public String rs_getHtmlString(String column)
{
try{
String str1 = this.rs.getString(column);
String str2 = "\r\n";
String str3 = "
";
return this.replaceAll(str1,str2,str3);
}catch(SQLException e){
System.out.println(e.toString());
return null;
}
}
private static String replaceAll(String str1,String str2,String str3)
{
StringBuffer strBuf = new StringBuffer(str1);
int index=0;
while(str1.indexOf(str2,index)!=-1)
{
index=str1.indexOf(str2,index);
strBuf.replace(str1.indexOf(str2,index),str1.indexOf(str2,index)+str2.length(),str3);
index=index+str3.length();
str1=strBuf.toString();
}
return strBuf.toString();
}
public int rs_getInt(String column)
{
try{
return this.rs.getInt(column);
}catch(SQLException e){
System.out.println(e.toString());
return -1;
}
}
public void rs_close()
{
try{
this.rs.close();
}catch(SQLException e){
System.out.print(e.toString());
}
}
public static void main(String args[])
{
try{
DBConn myconn = new DBConn();
myconn.setDBName("test");
myconn.DBConn();
//myconn.execute("Insert Into tbl_test(id,name) values('10','shandaer')");
//myconn.execute("Update tbl_test set name='yyyyyyyyyyyy' where id=10");
//myconn.execute("Delete from tbl_test where id=1");
myconn.executeQuery("select * from tbl_test");
while (myconn.rs.next())
{
System.out.println(myconn.rs_getString("id") + myconn.rs_getString("name"));
System.out.println('\n' + myconn.rs_getHtmlString("name"));
System.out.println(myconn.rs.getString("name") + myconn.rs_getInt(1));
}
}catch(Exception e){
System.err.println(e.toString());
}}}
在Windows2000下,打开cmdH口Q{至c:\j2sdk1.4.0\bin目录下,键入命o:javac DBConn.javaQ如没有抛出M例外Q则~译成功?BR>如有例外抛出Q请仔细查程序代码。如果说找不到mysql的驱动,请将mysql的jdbc驱动org包放至bin目录下,那样可以连接数据库了?BR>~译完成后,键入命oQjava DBConnQ如果有数据库中的数据被输出Q说明javabeans已经~写成功?BR>
三、徏立sqlmanage服务?BR>
在JRun Administrator中,新徏sqlmanage服务器。在根目录下分别新徏文gindex.jsp、add.jsp、del.jsp、edit.jsp、editpost.jspQ?BR>同时编译好的DBConn.class文g拯sqlmanage\WEB-INF\classes\目录下。另外,我们需要到|上下蝲一个MySql的jdbc驱动Q解压羃后将
org文gҎ个拷至DBConn.class所在目录下?BR>
一Q?软g下蝲
Mysql
下蝲版本Q?.1.11
http://dev.mysql.com/downloads/mysql/4.1.html
JDBC驱动
下蝲版本Q?.1.8
http://dev.mysql.com/downloads/connector/j/3.1.html
Mysql界面插g:mysql-front
下蝲版本镜像QHongKongQ我下回来安装就是中文版了)
http://www.mysqlfront.de/download.html
二. 软g安装
1.安装mysql
请参阅相x章,推荐文章Q?A >http://blog.csdn.net/saulzy/archive/2005/04/23/359648.aspx
2.JDBC驱动Qmysql-connector-java-3.1.8
q只是一个压~包Qƈ不需要安装,只要其解压Q我么用的是文件夹mysql-connector-java-3.1.8里的文gQmysql-connector-java-3.1.8-bin.jarQ?/P>
3. Mysql界面插g:mysql-front
q是一个安装程序,按照提示安装可以了Q?/P>
三. 环境配置
首先Q我要说明的是我现在tomcat的安装\径是: D:\Program Files\Java\TomcatQJDK的安装\径是QD:\Program Files\Java\j2sdk?/P>
在这里,需要配|环境变量的是JDBC驱动Q在配置前先要把刚才说到的mysql-connector-java-3.1.8-bin.jar本地盘某处Q我攄地方QD:\Program Files\Java\mysqlforjdbcQ,然后Ҏ你放的地方,配置classpathQ我的配|是q样的:
D:\Program files\Java\j2sdk\lib\tools.jar;
D:\Program Files\Java\j2sdk\lib\mysql-connector-java-3.1.8-bin-g.jar;
D:\Program Files\Java\mysqlforjdbc\mysql-connector-java-3.1.8-bin.jar
配置q个的目的是让你的java应用E序扑ֈq接mysql的驱动.
配置完环境变量后q有很重要一步就是ؓJSPq接数据库配|驱动,q个其实很简单,是把mysql-connector-java-3.1.8- bin.jar拷到某些文g多wp了,我在|上看了很多资料问了很多人,各种说法都有Q我l合了一下,Z保险Q我都全做了Q呵呵,反正是拷一?400K的文件而已Q现列出要把mysql-connector-java-3.1.8-bin.jar拯ȝ文g夹,如下Q?BR> D:\Program Files\Java\Tomcat\common\lib
D:\Program Files\Java\Tomcat\shared\lib
四. 数据库的使用
Mysql安装完毕以后Q还有一些要注意的地方(推荐文章Q:http://blog.csdn.net/saulzy/archive/2005/04/23/359811.aspx
p在文章提到的Qmysql安装好后最重要一样就是要看数据库有没有作为系l服务启动了Q所以在大家q行数据库操作前Q应要看看,在操作系l的开始-Q运行-Q输入services.mscQ确定你在安装时你设|的关于mysql的那个服务已l启动,q样你在操作数据库时不会报连接不上的错误Q?/P>
上面提到了一个较方便的mysql界面插gQ但是这个界面是我在已经开始用mysql后才扑ֈ的,刚开始我是在dos下用命o行进行操作的Q虽焉个界面也可以q行建库啊,讑֮权限{操作,但是Q我觉得懂得在用命令行也是一个很重要的技能,所以我先从命o行开始说Q怎样单用mysqlQ到后面会谈及mysqlQfront的用.
现在我想在mysql里徏一个数据库shujukuQ以及在数据库里Z个表biaoQ具体的命o如下Q假设mysql我是刚安装好的)
1. q入dos状态(C命o行的要运行在mysql的安装目录下的bin目录的)
2. q接mysql
输入Qmysql –h localhost –u root –p
输入在安装时已设好的密码Q就q入了mysql的命令编辑界面了?/P>
3. 使用mysql的基本命?在mysql命o行编辑每输入完命令后最后一定要有分P不然会报?
昄数据库:show databases;
使用数据库:use 数据库名Q?/P>
4Q徏?BR> 命oQcreate database shujuku;
5.为数据库讄权限Q用户和密码Q?BR> 命oQgrant all privileges on shujuku.* to test@localhost identified by ?23456?
当你执行完这个命令以后,只要你再以用户名Qtest,密码Q?23456d时你只可以对shujukuq个数据库操作,q样避开使用rootQ对数据库的安全有很大帮助.
6.
命oQcreate table biao(id int(8) primary key,name varchar(10));
剩下来的与标准sqsl命o基本上是一LQ具体操作略
值得一提的是,你在命o行上输入Q?Q,׃有mysql命o的简单帮助,如下Q?/P>
呵呵Q那P我们q可以知道退出,是QexitQ,呵呵Q?/P>
五. 关于mysql-front的?BR> 我找了好几个mysql的界面工P觉得最z方便还是mysql-frontQ可惜的是要收费Q不q还好有试用期,呵呵Q可以先感受感受一下,最重要一Ҏmysql-front有简体中文版的,英文不好的我用v来就舒服多了Q下面简单说说用吧Q?/P>
首先Q安装就不用说了Q有向导Q而且很简单.安装好后W一ơ运行时会蟩出来一个要求添加对话的框,在这里你可以d例如上面已经讑֮好的shujukuQ过E如?
当你在注册的复选框里填上你在上面mysql讑֮好的用户名和密码后,在选择数据库框里就有shujuku 的数据库了,选上Q按定Q进入mysql-fron后,你就会看C面的界面Q这是你可以进行操作了Q?/P>
要说明的是,你还可以把root用户也加q去Q这要你在mysql-fron的界面上选设|-Q对话-Q新建,再按上面q行可以,Zroot你还可以加入更多的用PҎq是一LQ设|不同的用户Q是方便对不同数据库q行理Q呵呵,root是权限最高的Q可不要随便让别Z用你的root用户Q保正你数据库的安全Q?/P>
六. JSPq接mysql
现在是试用jspq接mysql?BR> 我在eclipse里徏了个test_mysql.jsp面Q代码如下:
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page language="java" %>
<%@ page import="com.mysql.jdbc.Driver" %>
<%@ page import="java.sql.*" %>
<%
//驱动E序?/P>
String driverName="com.mysql.jdbc.Driver";
//数据库用户名
String userName="cl41";
//密码
String userPasswd="123456";
//数据库名
String dbName="db";
//表名
String tableName="dbtest";
//联结字符?/P>
String url="jdbc:mysql://localhost/"+dbName+"?user="+userName+"&password="+userPasswd;
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection connection=DriverManager.getConnection(url);
Statement statement = connection.createStatement();
String sql="SELECT * FROM "+tableName;
ResultSet rs = statement.executeQuery(sql);
//获得数据l果集合
ResultSetMetaData rmeta = rs.getMetaData();
//定数据集的列数Q亦字段?/P>
int numColumns=rmeta.getColumnCount();
// 输出每一个数据?/P>
out.print("id");
out.print("|");
out.print("num");
out.print("<br>");
while(rs.next()) {
out.print(rs.getString(1)+" ");
out.print("|");
out.print(rs.getString(2));
out.print("<br>");
}
out.print("<br>");
out.print("数据库操作成功,恭喜?);
rs.close();
statement.close();
connection.close();
%>
然后把test??_mysql.jsp部v到tomcat处,如何部v可参?配置Eclpise+tomcatq实现JSP的编写与部v"Q在览器中可以看到结果了?/P>
希望q篇文章的你有帮助!Good luck!
在JBuilder中,做如下的操作Q?/P>
一、选择Tool -> Configure LibrariesQ在Configure LibrariesH口中选择左边列表框下的NewQ弹出New Library Wizard H口Q在Name中输入mysqlQ可以自己定义)QLocation中选择User HomeQ点击AddQ选择mysql jdbc的\径:c:\system\mysql-jdbc\ mysql-connector-java-3.0.9-stable-bin.jarQ点击okQ两ơ)Q?/P>
二、选择Project -> Project Properties -> Paths -> Required Libraries -> 点击AddQ选择W一步骤中添加的User Home下的mysqlQ点击okQ两ơ)Q?/P>
三、选择Tool -> Enterprise Setup -> Database Drivers -> 点击AddQ选择刚添加的User Home下的mysqlQ点击okQ在列表框中出现mysql.configQ点击okQ?/P>
四、提C重新启动JBuilderQ设|才能生效,定后,重启JBuilderQ?/P>
五、选择Tool -> Database Pilot Q在Database PilotH口中选择View -> Options -> Drivers -> 点击Add
Driver class中输入:com.mysql.jdbc.Driver
Sample URL中输入:mysql://localhost:3306/DataBaseName 点击okQ?/P>
六、在Database PilotH口中选择File -> NewQ在New URL H口中,
DriverQ从列表中选择W五步骤建立的com.mysql.jdbc.Driver
URLQ将DataBaseName改ؓ存在的数据库Q本例中的URL如下Qjdbc:mysql://localhost:3306/testQ点击okQ?/P>
七、在Database PilotH口中Database URLs列表中双d建立的urlQ输入连接数据库的用户名、密码,q接成功?/P>
public class myreport
{
public void reportName(String strBbmc)
{
JRResultSetDataSource jrds = null;
JasperPrint jasperPrint = null;
Map reportParams = new HashMap();
ResultSet rs = null;
Connection con = null;
Statement stmt = null;
String sql = "select * from bbmc";
try
{
//动态获?BR> JasperDesign jasperDesign = JasperManager.loadXmlDesign("./bbmc.jrxml");
JasperReport jasperreport = JasperManager.compileReport(jasperDesign);
//建立q接
ConnectionpoolManager mgr = new ConnectionpoolManager();
mgr.setMonitorThread(520);
mgr.addAlias("jdbcConnecpool","com.microsoft.jdbc.sqlserver.SQLServerDriver","jdbc:microsoft:sqlserver://192.168.45.233:1433;DatabaseName = ysgl ","sa","sa",10,300,520,30,false);
con = DriverManager.getConnection(ConnectionPoolManager.URL_PREFIX+ConnectionPoolManager.getPoolName(),null,null);
stmt = con.creatStatement();
rs = stmt.executeQuery(sql);
jrds = new JRResultSetDataSource(rs);
jasperPrint = JasperFillManager.fillReport(jasperReport,reportParams,jrds);
//调出JasperViewerq行打印预览
JasperViewer.viewReport(jasperPrint);
}
catch(ClassNotFoundException ee)
{
ee.printStackTrace();
}
catch(SQLException ex)
{
ex.pritStackTrace;
}
catch(JRException e)
{
e.getMessage();
}
}
}