??xml version="1.0" encoding="utf-8" standalone="yes"?>
1Q js,一般都攑֜head之间、注释的作用是当客户端浏览器版本q低Ӟ不能识别而发生错?br /><script language="JavaScript">
<!--
document.write( "Hello World!");
//-->
</script>
2Q另外你也可以编?js文gQ然后在面里面直接引用可以了
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>javascript</title><script language="javascript"src="Untitled-2.js"></script></head>
2、write
其中marquee中h(hun)eight中的属性可以更Ҏ(gu)ơ显C的行数Q…?/P>
先分析原因,我用的是Mysql数据库,新闻内容采用的是TextcdQ查看数据库中上传的新闻发现里面换行和空格都能表现出来,q就说明Q肯定是用Rs.getstring时显C的问题Q先查看了Java.sql.*的Api想用别的GetҎ(gu)Q试了几个结果都不行Q?/FONT>
|上也有q样cM的问题,但大多是在Servlet里面或者Bean里面专门的做一个函数解决的Q我觉得q样做很复杂
最后终于找C的解x法,在调用Rs.getstring的页面里面的表格中加入style="word-break:break-all"
q用<pre>rs.getString()<>标签来显C就解决了换行的问题。其?STRONG><pre></pre>q句话一定不能少
然而加入这些以后,当一行内容过长时Q表g然会(x)被撑开Q需要在表格胡Style属性修Ҏ(gu)style="table-layout: fixed; word-wrap: break-word" q样才能真正解决中文撑开表格的问题?/STRONG>
因ؓ(f)同时要上传文Ӟ所以ENCTYPE="multipart/form-data" 必须要加在form里面
可是q样的话Q我再servlet里面用request.getParameter()Ҏ(gu)无论如何都只是获得null|
不是一般的郁闷Q百度了一下,有h出现了同L(fng)问题可是它用的是jspsmartuploadlg实现文g上传的,
而我用的commons fileuploadlgQ仔l看了一下这个组件的apiQ可是英语太差了Q没有发现相关的信息
我又试用session传递参敎ͼ可是发现有点ȝ(ch)Q因为在表单提交之时你就得赋lsession表单上它的数|
q似乎要javascriptQ可是偶也不?x)?/P>
后来只有google了,搜烦(ch)了一些中文网,也没有找到资料,试试不限制语aQ呵呵呵Q一大片Q后来被俺发
Cq个
I cannot read the submitter using request.getParameter("submitter") (it returns null). ]
Situation: javax.servlet.HttpServletRequest.getParameter(String) returns null when the ContentType is multipart/form-data Solutions: Solution A: 1. download http://www.servlets.com/cos/index.html 2. invoke getParameters() on com.oreilly.servlet.MultipartRequest Solution B: 1. download http://jakarta.apache.org/commons/sandbox/fileupload/ 2. invoke readHeaders() in org.apache.commons.fileupload.MultipartStream Solution C: 1. download http://users.boone.net/wbrameld/multipartformdata/ 2. invoke getParameter on com.bigfoot.bugar.servlet.http.MultipartFormData Solution D: Use Struts. Struts 1.1 handles this automatically.
说是不详l,接着往下看Q另一U解x?/PRE>> Solution B:
> 1. download
> http://jakarta.apache.org/commons/sandbox/fileupload/
> 2. invoke readHeaders() in
> org.apache.commons.fileupload.MultipartStream
The Solution B as given by my dear friend is a bit hectic and a bit complex :(
We can try the following solution which I found much simpler (at least in usage).
1. Download one of the versions of UploadFile from http://jakarta.apache.org/commons/fileupload/
2. Invoke parseRequest(request) on org.apache.commons.fileupload.FileUploadBase which returns list of org.apache.commons.fileupload.FileItem objects.
3. Invoke isFormField() on each of the FileItem objects. This determines whether the file item is a form paramater or stream of uploaded file.
4. Invoke getFieldName() to get parameter name and getString() to get parameter value on FileItem if it's a form parameter. Invoke write(java.io.File) on FileItem to save the uploaded file stream to a file if the FileItem is not a form parameter.按照上面的步骤来Q果然一切都okQGQOQLQ真不错Q主要是getFieldName和getStringQ?/PRE>虽然说这U做法有一炚w?ch),但稍微判断加工一下,L获取不到?BR>
]]>
q_是xp+mysql+tomcat4
从网上搜了一?从一叫::::<<<Servlet学习(fn)W记(?-----使用Servlet处理用户注册和登?gt;>
中搜C一些源代码,它有两个html面:分别是login.html和register.html
然后分别调用了两个servlet:LoginForm.java用来实现用户和密码的验证,
和RegisterForm.java用来实现注册,住数据库中添加字D?/SPAN>
׃加蝲的jdbc驱动不同,我加载的是mm.mysql-2.0.4-bin.jarE微做了修改
遇到的问?/FONT>
1,l的源码中login面中的按纽用的是图片,我都把其换成按纽Q可是蟩转到reigster面的按钮点?yn)L没有M反应Q换了Nơ链接地址后,q是不管用,于是把type换成文字l果OQ了Q用dreamweaver打开以后发现在表单里button只有提交和重|的功能Q而不能用来实现链接页面,
q说明我的html知识太过匮乏Q因Z要做的是servletQ就凑合着用吧Q以后还得加强html的学?/SPAN>
Q在配置好web.xml后,发现点击submit跌{到正的urlQ但是servletq没有vM作用Q?/SPAN>
q时有点困惑Q不知道从什么地方入手,q是先修改servlet加点print看看执行到哪一步才出的问题Q?/SPAN>
可是加入以后在ie中还是没有反应,后来才想hprint应该是在tomcat的窗口中输出Q一看exception
是连接数据库p|Q可是连接没有问题,q点我比较肯定,那肯定是tomcat的jdbc驱动没有加蝲
于是把mm.mysql-2.0.4-bin.jar拷到tomcat目录下comman/lib目录下,
一试数据库没问题了,但是抛出一个nullpointer的异常,(g)查了一下解决了
在这ơ做的过E中发现自己的基知识相当~ZQ尤其是html和sql语句Q以后要加强学习(fn)Q同时感觉自己效率太低了Q?/SPAN>
开发^?winxp+tomcat4+mysql+javabean
在实现在了用servlet注册q有d以后Q打做一个注册页?/P>
首先创徏一个表Qusername VARCHAR2(20) 用户?
password VARCHAR2(20) 密码
email VARCHAR2(30) Email地址
homepage VARCHAR2(50) 主页
signs VARCHAR2(200) {
regtime DATE 注册时 Q/q个date我没有实?/P>
主要有三个jsp面Q?/P>
addnewuser.jspQ主要用来实现注册用L(fng)界面Q?/P>
doadduser.jsp 实现填加到数据库中的具体功能
listuser.jsp 来实现显C所有用户信?/P>
两个beanQ?/P>
db.java实现数据库的操作Q主要有两个Ҏ(gu)public ResultSet executeQuery(sql)q回rs用来q行记录的查?/P>
public boolean executeUpdate(String sql)用来q行记录的更?/P>
adduser.javal承了dbcȝ来提供所需更新和查询的sql语句;
我直接调用原文的代码时后发现调用了span什么,不太懂,而且有很多字W不对,所以调试时的问题基本上都是html代码的问?q是一个仅有基本功能,很多斚wq需q一步完善,比如实现注册旉Q虽然这不难Q可是我q没看util.date和sql.date 区别Q,email地址的识别,q登录都没有做 Q)(j) Q我发现Zq种beanl构的功能很吸引人,比servlet要好Q肤之?/P>
源码如下Qdb.java
package rkind;
import java.net.*;
import java.sql.*;
import java.lang.*;
import java.io.*;
import java.util.*;
public class db {
//成员变量初始?
Connection conn = null; //数据库连?
ResultSet rs = null; //记录?
String Username=""; //用户?
String Password=""; //密码
String Email=""; //email
String Homepage=""; //主页
String Signs=""; //{
String url="jdbc:mysql://172.20.0.73/rk";
//db的构建器
public db() {
try {
//注册数据库驱动程序ؓ(f)Oracle驱动
String name="org.gjt.mm.mysql.Driver";
Class.forName(name);
conn = DriverManager.getConnection(url,"root","你的密码");
System.out.println("success");
}
catch(Exception e) {
//q样写是Z方便调试E序Q出错打印mydb()q道在什么地方出错了
System.err.println("mydb(): " + e.getMessage());
}
}
//executeQueryҎ(gu)用于q行记录的查询操?
//入口参数为sql语句Q返回ResultSet对象
public ResultSet executeQuery(String sql) {
rs = null;
try {
//建立数据库连接,使用Oracle的一Uthinq接方式QdemoZ机名字,demodb为数据库Q后面的两个
//demo为用户名和密?
Statement stmt = conn.createStatement();
//执行数据库查询操?
rs = stmt.executeQuery(sql);
}
catch(SQLException ex) {
System.err.println("db.executeQuery: " + ex.getMessage());
}
return rs;
}
//executeUpdateҎ(gu)用于q行add或者update记录的操?
//入口参数为sql语句Q成功返回trueQ否则ؓ(f)false
public boolean executeUpdate(String sql) {
boolean bupdate=false;
rs = null;
try {
//建立数据库连接,其它参数说明同上面的一?
Statement stmt = conn.createStatement();
int rowCount = stmt.executeUpdate(sql);
//如果不成功,bupdate׃(x)q回0
if(rowCount!=0)bupdate=true;
}
catch(SQLException ex) {
//打印出错信息
System.err.println("db.executeUpdate: " + ex.getMessage());
}
return bupdate;
}
//toChineseҎ(gu)用于一个字W串q行中文处理
//否则会(x)???q样的字W串
public static String toChinese(String strvalue) {
try{
if(strvalue==null)
{
return null;
}
else {
strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK");
return strvalue;
}
}catch(Exception e){
return null;
}
}
}
adduser.java
package rkind;
import java.sql.*;
import java.lang.*;
import java.util.Date;
//adduser由dbz出来Q拥有db的成员变量和Ҏ(gu)
public class adduser extends db {
//构徏?
public boolean addNewUser(){
boolean boadduser=false;
try {
//q行用户注册的记录添加操作,生成sql语句
String sSql=new String("insert into demo(username,password,email,homepage, signs)");
sSql=sSql+ " values('"+Username+"','"+Password+"','"+Email+"','"+Homepage +"','"+Signs+"')";
//一U调试的Ҏ(gu)Q可以打印出sql语句Q以便于查看错误
System.out.println(sSql);
//调用父类的executeUpdateҎ(gu)QƈҎ(gu)成功以否来设|返回?
if(super.executeUpdate(sSql))boadduser=true;
}
catch(Exception ex) {
//出错处理
System.err.println("adduser.addNewUser: " + ex.getMessage());
}finally{
//无论是否出错Q都要返回?
return boadduser;
}
}
//checkUser()Ҏ(gu)用来(g)查用户名是否重复
//如果重复q回一个false
public boolean checkUser(){
boolean boadduser=false;
try {
//构徏sql查询语句
String sSql="select * from demo where username='"+Username+"'";
//调用父类的executeQueryҎ(gu)
if((super.executeQuery(sSql)).next()){
//查询出来的记录集为空
boadduser=false;
}else{
boadduser=true;
}
}
catch(Exception ex) {
//出错处理
System.err.println("adduser.addNewUser: " + ex.getMessage());
}finally{
//q回?
return boadduser;
}
}
public String getUsername(){ return Username;}
public void setUsername(String newUsername){
//用户名有可能是中文,需要进行{?
Username =db.toChinese(newUsername);}
//属性密码Password的get/setҎ(gu)
public String getPassword(){
return Password;}
public void setPassword(String newPassword){ Password = newPassword;}
//属性Email的get/setҎ(gu)
public String getEmail(){ return Email;}
public void setEmail(String newEmail){ Email = newEmail;}
//属性主Homepage的get/setҎ(gu)
public String getHomepage(){ return Homepage;}
public void setHomepage(String newHomepage){ Homepage = newHomepage;}
//属性主Signs的get/setҎ(gu)
public String getSigns(){ return Signs;}
public void setSigns(String newSigns){
//{有可能是中文Q需要进行{?
Signs = db.toChinese(newSigns);}
}
newuser.jsp
<%@ page contentType="text/html;charset=gb2312"%>
<% response.setHeader("Expires","0"); %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>新用h?</title>
</head>
<body bgcolor="#FFFAD9">
<script language="JavaScript">
function valid(form)
{
if(form.username.value.length==0)
{
alert("Please enter username!");
form.username.focus();
return false;
}
if(form.Password.value==form.password1.value){
alert("你输入的验证密码不正?);
form.password1.focus();
}
}
</script>
<p align="center"><font color="#8484FF"><strong><big>C?
用户注册 </font>
<form onsubmit="return valid(this)" method="POST" name="formreg" action="donewuser.jsp">
<div align="center"><center>
<table width="49%" height="281"
border="1"
cellspacing="0">
<tr>
<td width="27%" bgcolor="#DDDDFF" align="center">用户名:(x)
<td width="73%" bgcolor="#DDDDFF"><input type="text"
name="username" size="20" >
<font color="#00CCFF"><b>* </b></font>
</tr>
<tr>
<td width="27%" bgcolor="#DDDDFF" align="center">输入密码Q?
<td width="73%" bgcolor="#DDDDFF"><input type="password" name="password" size="20"
>
<font color="#FF0000"><b>* </b></font>
</tr>
<tr>
<td width="27%" bgcolor="#DDDDFF" align="center">校验密码Q?
<td width="73%" bgcolor="#DDDDFF"><input type="password" name="password1" size="20"
>
<font color="#FF0000"><b>* </b></font>
</tr>
<tr>
<td width="27%" bgcolor="#DDDDFF" align="center">E-mail
<td width="73%" bgcolor="#DDDDFF"><input type="text" name="email" size="20" >
<font color="#FF0000">* </font>
</tr>
<tr>
<td width="27%" bgcolor="#DDDDFF" align="center">主页地址Q?
<td width="73%" bgcolor="#DDDDFF"><input type="text" name="homepage" size="20"
value="http://">
</tr>
<tr>
<td width="100%" height="20" colspan="2" bgcolor="#DDDDFF"><br>
<center>
<font color="red"><b>介绍自己Q?Q介l自己,不能过120字)(j)</span></b></font>
</center> </tr>
<td width="70%">
<tr>
<td><textarea rows="6"
name="signs" cols="30" ></textarea>
</tr>
<tr>
<td width="30%" bgcolor="#DDDDFF" colspan="2"><center>
<p>
<input
type="submit" value="递交" onClick="return checkmsg();" name="B1" >
<input type="reset" value="清除" name="B2" >
</center>
</tr>
</table>
</div>
</form>
<hr size="1" color="#FF0000">
<p align="center">Better View:800*600 Best View:1024x768
Z本系l能够更好的为?zhn)服务Q请使用IE4.0或以上版本浏览器
<font color="#000000"></font><a href="javascript:%20newGuide("copyright.htm")"
target="_self">版权所?</a>
</body>
</html>
listuser.jsp
<%@ page contentType="text/html;charset=gb2312"%>
<% response.setHeader("Expires","0"); %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="org.gjt.mm.mysql.Driver.*" %>
<!--生成一个JavaBean:lyf.db的实?->
<jsp:useBean id="db" class="rkind.db" scope="request"/>
<jsp:setProperty name="db" property="*"/>
<%
java.lang.String strSQL; //SQL语句
int intPageSize; //一|C的记录?
int intRowCount; //记录L
int intPageCount; //总页?
int intPage; //待显C页?
java.lang.String strPage;
int i,j,k;
//讄一|C的记录?
intPageSize = 15;
//取得待显C页?
strPage = request.getParameter("page");
if(strPage==null){//表明在QueryString中没有pageq一个参敎ͼ此时昄W一|?
intPage = 1;
}
else{//字W串转换成整?
intPage = java.lang.Integer.parseInt(strPage);
if(intPage<1) intPage = 1;
}
//获取记录L
strSQL = "select count(*) from demo";
ResultSet result = db.executeQuery(strSQL); //执行SQL语句q取得结果集
result.next(); //记录集刚打开的时候,指针位于W一条记录之?
intRowCount = result.getInt(1);
result.close(); //关闭l果?
//记算总页?
intPageCount = (intRowCount+intPageSize-1) / intPageSize;
//调整待显C的늠
if(intPage>intPageCount) intPage = intPageCount;
strSQL="select * from demo ";
//执行SQL语句q取得结果集
result = db.executeQuery(strSQL);
//记录指针定位到待显C页的第一条记录上
i = (intPage-1) * intPageSize;
for(j=0;j<i;j++) result.next();
%>
<html>
<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>用户列表</title>
</head>
<body bgcolor="#FFEBBD">
<div align="center"><center>
<table border="1"
borderColorDark="#FFFFFF" borderColorLight="#000000" cellspacing="0" height="22"
width="100%">
<tr bgcolor="#FFEBAD">
<td height="1" width="691" class="main">
W?lt;%=intPage%>??lt;%=intPageCount%>?
<a href="listuser.jsp?page=0">首页</a>
<%if(intPage>1){%><a href="listuser.jsp?page=<%=intPage-1%>">上一?lt;/a><%}%>
<%if(intPage<=1){%>上一?lt;%}%>
<%if(intPage<intPageCount){%><a href="listuser.jsp?page=<%=intPage+1%>">下一?lt;/a><%}%>
<%if(intPage>=intPageCount){%>下一?lt;%}%>
<a href="listuser.jsp?page=<%=intPageCount%>">N</a>
W?lt;input type="text" class="main" name="page" size="3" value="<%=intPage%>" tabindex="1">?lt;input type="submit" class="main" value="go" name="B1" tabindex="2"><class="main">
</td></tr></table></form>
<table border="1" width="100%" cellspacing="0" bordercolorlight="#000000"
bordercolordark="#FFFFFF" class="main">
<tr bgcolor="#FFEBAD">
<td >
<div align="left">用户?lt;/div>
</td>
<td >
<p align="center">Email
</td>
<td >
<p align="center">主页
</td>
<td>
<p align="center">登记旉
</td>
<td>
<p align="center">说明
</td>
</tr>
<%
//昄数据
i = 0;
while(i<intPageSize && result.next()){
%>
<tr bgcolor="#FFEBAD">
<td>
<div align="left"><%=result.getString("username") %></div></td>
<td><div align="center"><%=result.getString("email") %></a></div></td>
<td><div align="center"><font color="#0000CC"><%=result.getString("homepage") %></font></div></td>
<td><div align="center"><font color="#FF6666"><%=result.getDate("regtime") %></font></div></td>
<td><div align="center"><font color="#0000FF"><%=result.getString("signs") %></font></div></td></tr>
<%
i++;
}
%>
</table>
<% result.close(); //关闭l果?>
</body>
</html>
donewuser.jsp
<%@ page contentType="text/html;charset=gb2312"%>
<% response.setHeader("Expires","0"); %>
<!--生成一个JavaBean:lyf.adduser的实例,id为adduserQ生存范围ؓ(f)page-->
<jsp:useBean id="adduser" class="rkind.adduser" scope="page"/>
<!--讄JavaBean中各个属性的|q会(x)调用JavaBean中各个属性的setҎ(gu)Q以便JavaBean得到正确的属性|?”代表进行所有属性的匚w-->
<jsp:setProperty name="adduser" property="*"/>
<html>
<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>用户d</title>
</head>
<body bgcolor="#FFEBBD">
<div align="center"><center>
<%
//调用lyf.adduser的checkUser()Ҏ(gu)(g)查是否有重复的用户名
//如果有重复就昄对应的信?
if(!adduser.checkUser())
{
//面文字输出信息Q用jsp内置对象out的printlnҎ(gu)Q相当于asp中的response.writeҎ(gu)
out.println("对不Pq个用户?+adduser.getUsername()+"已经被申请了Q请重新选择Q?);
//return代表q回Q运行时候碰到return׃?x)进行下面的处理了,功能相当于asp中的response.end
return;
}
%>
<%
//如果没有用户名重复的问题Q调用lyf.adduser的addNewUser()Ҏ(gu)来将用户数据d到数据库中,q根据数据添加成功否来显C对应的信息
if(adduser.addNewUser()){
%>
<H2>d用户成功Q?lt;/P>
<%}else{%>
<H2>d用户p|Q请和管理员联系Q?lt;/P>
<%}%>
</BODY>
</HTML>
着先配|好classpath,加上servlet.jar和commons-fileupload-1.0.jar,
然后把commons-fileupload-1.0.jar攑ֈroot下的web-inf/lib/?/P>
~写up.javaq编l?攑ֈweb-inf/classes目录?/P>
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.util.regex.*;
import org.apache.commons.fileupload.*;
public class up extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=GB2312";
//Process the HTTP Post request
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
PrintWriter out=response.getWriter();
try {
DiskFileUpload fu = new DiskFileUpload();
// 讄允许用户上传文g大小,单位:字节Q这里设?m
fu.setSizeMax(2*1024*1024);
// 讄最多只允许在内存中存储的数?单位:字节
fu.setSizeThreshold(4096);
// 讄一旦文件大超qgetSizeThreshold()的值时数据存放在硬盘的目录
fu.setRepositoryPath("c:\\windows\\temp");
//开始读取上传信?BR> List fileItems = fu.parseRequest(request);
// 依次处理每个上传的文?BR> Iterator iter = fileItems.iterator();
//正则匚wQ过滤\径取文g?BR> String regExp=".+\\\\(.+)$";
//qo(h)掉的文gcd
String[] errorType={".exe",".com",".cgi",".asp"};
Pattern p = Pattern.compile(regExp);
while (iter.hasNext()) {
FileItem item = (FileItem)iter.next();
//忽略其他不是文g域的所有表单信?BR> if (!item.isFormField()) {
String name = item.getName();
long size = item.getSize();
if((name==null||name.equals("")) && size==0)
continue;
Matcher m = p.matcher(name);
boolean result = m.find();
if (result){
for (int temp=0;temp<errorType.length;temp++){
if (m.group(1).endsWith(errorType[temp])){
throw new IOException(name+": wrong type");
}
}
try{
//保存上传的文件到指定的目?/P>
//在下文中上传文gx据库Ӟ对q里改写
item.write(new File("d:\\" + m.group(1)));
out.print(name+" "+size+"<br>");
}
catch(Exception e){
out.println(e);
}
}
else
{
throw new IOException("fail to upload");
}
}
}
}
catch (IOException e){
out.println(e);
}
catch (FileUploadException e){
out.println(e);
}
}
}
然后布v好web.xml,在其中加?/P>
<servlet>
<servlet-name>up</servlet-name>
<servlet-class>up</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>up</servlet-name>
<url-pattern>/fileup</url-pattern>
</servlet-mapping>
好了现在再编写一个htm试一下就ok?注意url-pattern里面的\径必跟表格中action的属性一?
<html>
<h1>文g上传演示</h1>
<form name="uploadform" method="POST" action="/fileup" ENCTYPE="multipart/form-data">
<table border="1" width="450" cellpadding="4" cellspacing="2" bordercolor="#9BD7FF">
<tr><td width="100%" colspan="2">
文g1Q?lt;input name="x" size="40" type="file">
</td></tr>
<tr><td width="100%" colspan="2">
文g2Q?lt;input name="y" size="40" type="file">
</td></tr>
<tr><td width="100%" colspan="2">
文g3Q?lt;input name="z" size="40" type="file">
</td></tr>
</table>
<br/><br/>
<table>
<tr><td align="center"><input name="upload" type="submit" value="开始上?/></td></tr>
</table>
</form>
</html>