Java学习笔记

来源:互联网 发布:python future 编辑:程序博客网 时间:2024/05/16 13:47
 

==================================================
默认导入:
"java.lang.*","javax.servlet.*","javax.servlet.jsp.*","javax.servlet.http.*"

==================================================
<!--abc-->注释
<%--abc--%>隐藏注释

==================================================
java.util.Vector:向量
1.Vector a=new Vector(),不必指定大小;
2.用add(Object o)把任一对象添加到向量末尾,向量大小自增;
3.add(index,Object o)可追加到指定位置;
4.用elementAt(int index)获取指定索引处的向量元素(初始为0);
5.size()获取向量元素个数;
6.与数组不同的是不要求元素类型一致,但取出时要强制转化。

Hashtables 哈希表 散离表:是使用相关关键字查找被存储的数据项的一种数据结构。相对于数组链表两种数据结构更高效。hashCode()

Enumeration 列举 枚举

Enueration e=v.elements();

==================================================
Collection List Set区别:

Collection对象之间无顺序,允许元素重复和多个null
Set对象之间无顺序,不允许元素重复,最多一个null
List对象之间指定顺序,允许元素重复和多个null

==================================================
汉字处理:
<%!
    public String getString(String s)
     {
       if(s==null) s="";
       try {byte a[]=s.getBytes("ISO-8859-1");
            s=new String(a);
           }
       catch(Exception e)
           {
           }
       return s;
     }
%>

汉字处理:convertedString = new String(originalString.getBytes("ISO-8859-1"),"utf-8");

修改server.xml使tomct支持中文文件名
<Connector
port="8080"  maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="UTF-8"/>

注意文件格式的编码类型。

==================================================
静态加载:
<%@ include file="head.txt"%>

动态加载
<jsp:include page="file.jsp" flush="true"/>

<jsp:include page="file.jsp" flush="true">
</jsp:include>

<jsp:include page="file.jsp" flush="true">
 <jsp: param name="requestName" value="requestValue">
</jsp:include>

file.jsp:
<%=request.getParameter("requestName")%>将输出requestValue

forward:
<jsp:forward page="another.jsp"></jsp:forward>
<jsp:forward page="another.jsp"/>

加载Applet:
(1)、<applet code="my.class" height="50" width="200">
 <param name="name" value="AValue">
</applet>

(2)、<jsp:plugin type="applet" code="my.class" height="50" width="200">
 <jsp:params>
  <jsp:param name="name" value="AValue"/>
 </jsp:params>
 <jsp:fallback>无法载入Applet</jsp:fallback>
</jsp:plugin>

==================================================
时间日期:

(1)、Date类型的转化
Date now=new Date();
long time=now.getTime();
Date today=new Date(time);//Date today=new Date(time-1000*60*30),延迟30分钟

(2)、从数据库中取出时间日期(如:datetime)格式的数据:
java.util.Date now=(java.util.Date)rs.getDate("now");只能取出为年月日,如:2005-03-24
java.util.Date now=(java.util.Date)rs.getObject("now");取出的为年月日时分秒微秒,如:2005-03-24 08:44:47.0

(3)、<%@ page import="java.text.SimpleDateFormat"%>
<%
  java.util.Date now=new java.util.Date();
  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd E HH:mm:ss SS");//E表示星期,SS表示毫秒
  String discusstime=new String(formatter.format(now)); 
%>

(4)、<%= (new java.util.Date()).toLocaleString() %>

(5)、字符串转date
Date dt=java.sql.Date.valuOf("2005-2-9")

==================================================
数字操作:
转化为int:     Integer.parseInt(Stirng s);  Integer:Integer.valueOf(s)
转化为long:    Long.parseLong(String s);    Long:    Long.valueOf(s)
转化为float:   Float.parseFloat(String s);  Float:   Float.valueOf(s)
转化为double:  Double.parseDouble(String s);Double:  Double.valueOf(s)

==================================================
字符串操作:
(1)、if (cc.indexOf("%u") >= 0) 就是有中文

(2)、posttime.substring(0,19)

(3)、str.trim();

(4)、<%//endsWith() startsWith同样用法
  String str="grbok";
  if(str.endsWith("ok"))
  {
    out.print("ok");
  }
%>

(5)、<%@ page import="java.util.StringTokenizer"%>

String str="str@sohu@home@yes@no";
String s[]=str.split("@");
for(int i=0;i<s.length;i++)
{
  out.print(s[i]+"<br>");
}

StringTokenizer token=new StringTokenizer(str,"@");
int i=token.countTokens();
while(token.hasMoreTokens())
{
  out.print(token.nextToken());
}

(6)、toLowerCase()转为小写
toUpperCase()转为大写
equalsIgnoreCase(String anotherString)忽略大小写比较

==================================================
表单:
<select name=job size=1>
  <option selected>student</option>
  <option>teacher</option>
</select>
request.getParameter("job");

<select name=job size=3>
  <option value="parameter1" selected>student</option>
  <option value="parameter2">teacher</option>
</select>

<select name=job size=3 Multiple>
  <option value="parameter1" selected>student</option>
  <option value="parameter2">teacher</option>
</select>

<input type="checkbox" name="sameName" checked>
String box[]=request.getParameterValues("sameName");//字符串矩阵
int len=java.lang.reflect.Array.getLength(box);//取得字符串矩阵长度
for(int i=0;i<len;i++)//也可以只用box.length
out.println(box[i]);

method=get:
<%=request.getQueryString()%>//取得表单输出值
<%=java.net.URLDecoder.decode(request.getQueryString())%>


<input type="checkbox" name="name1" checked>

for(int i=1;i<=4;i++)
{
  str=request.getParameter("name"+i);
  if(str!=null)
 {
  out.print(str+" ");
 }
}

==================================================
表单验证:

<script language=javascript>
<!--
function check()
{
  if(form1.name.vlaue=="")
  {window.alert("请输入");form1.elements(0/1).focus();}
  else if(form1.mail.value.indexOf('@')==-1){form1.mail.select();}
  else{form1.submit();}

-->
</script>

indexOf("@")返回@所在的第一个位置(int),没有就返回-1

<input type=button value=submit name=button1 OnClick='check()'>

==================================================
jsp指令标签:include page taglib
jsp动作标签:include param forward plugin useBean
9种内置对象:request response pageContext session application out config page exception

request:
getProtocol()       获取提交信息所用协议;
getServletPath()    客户请求的jsp页面文件目录;
getContentLength()  提交的整个信息的长度;
getMethod()         提交信息方式;
getHeader(String s) HTTP头文件中由参数s指定的头名字的值;
  s 可取:accept referer accept-language content-type accept-encoding user-agent host content-length connection cookie
getHeaderNames()   头名字的一个枚举;
getHeaders()       头名字文件中指定名字的全部值的一个枚举;
getRemoteAddr()    客户IP地址;
getRemoteHost()    客户机的名字(惹取不到,就取IP);
getServerName()    服务器名称;
getServerPort()    服务器端口号;
getParameterNames()客户提交的信息体部分中name参数值的一个枚举。

getContextPath();
getPathInfo();
getRequestURL();  获取连接到此页面的地址,不包括参数;
getQueryString(); 获取连接到此页面的各参数;

==================================================
String path=request.getRealPath("star/admin");
String path=application.getRealPath("star/admin");

==================================================
获得完整地址的方法是:
request.getServerName()+":"+request.getServerPort()+request.getRequestURI()+"?"+request.getQueryString()

获得完整地址的方法是:
request.getServerName()+":"+request.getServerPort()+request.getRequestURI()

==================================================
response测试word查看

<%@ page contentType="text/html;charset=gb2312"%>
<html><body>
将当前文档保存为word吗?<br>
你确定吗?
<form action="" method="post" name="form">
  <input type="submit" value="yes" name="submit">
</form>
<%
  String str=request.getParameter("submit");
  if(str==null)
  {
    str="";
  }
  if(str.equals("yes"))
  {
    response.setContentType("application/msword;charset=gb2312");
   
  }
%>
</body></html>

==================================================
自动刷新、跳转、关闭:
<% response.setHeader("Refresh","5"); %>
或:<meta http-equiv="refresh" content="5">
<% response.setHeader("Refresh","5;url="+url+"");%>
或 :<meta http-equiv="refresh" content="5;url=index.htm">

<body onLoad="setTimeout(window.close, 5000)">

==================================================
URL重写实现session唯一性
<% String str1=response.encodeRedirectURL("car.jsp"); %>或
<% String str1=response.encodeURL("car.jsp"); %>
<form action="<%=str1%>" method=post name=form>

==================================================
session:
取得session ID:       String id=session.getId();
取得session的建立时间:Date startTime=new Date(session.getCreationTime());
最后使用session的时间:Date lastTime=new Date(session.getLastAccessedTime());
取得session的有效时间:int tempTime=session.getMaxInactiveInterval();
设置session的有效时间:session.setMaxInactiveInterval(60*10);

存值到session:        session.putValue("name",name)或session.setAttribute("属性名",属性值)
取值于session:        session.getValue("name")或session.getAttribute("属性名")

session.isNew();       判断这个session是不是新的,是的话传回true,否则传回false
session.invalidate();  强制session中断,常用在使用者登出时
 
public void setAttribute(String key,Object obj)
public Object getAttribute(String key)任何对象都可存入,取出时强制转化为原类型。
public Enumeration getAttributeNames()产生枚举对象,用nextElements()遍历逐个对象。
public long getCreationTime()单位是毫秒
public long getLastAccessedTime()
public int getMaxInactiveIterval()
public void setMaxInactiveIterval(int n)
public void removeAttribute(String key)从当前session中删除关键字是key的对象。

==================================================
Cookies适合做保存用户的个人设置,爱好等,Session适合做客户的身份验证.

cookie:
String getComment()      返回cookie中注释,如果没有注释的话将返回空值.
StringgetDomain()       返回cookie中Cookie适用的域名. 使用getDomain()方法可以指示浏览器把Cookie返回给同一域内的其他服务器,而通常Cookie只返回给与发送它的服务器名字完全相同的服务器。注意域名必须以点开始
int getMaxAge()          返回Cookie过期之前的最大时间,以秒计算。
String getName()         返回Cookie的名字
String getPath()         返回Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面所在目录及其子目录下 的所有页面。
boolean getSecure()      如果浏览器通过安全协议发送cookies将返回true值,如果浏览器使用标准协议则返回false值。
String getValue()        返回Cookie的值。
int getVersion()         返回Cookie所遵从的协议版本。
void setComment(String purpose) 设置cookie中注释
void setDomain(String pattern)  设置cookie中Cookie适用的域名 
void setMaxAge(int expiry)      以秒计算,设置Cookie过期时间。
void setPath(String uri)        指定Cookie适用的路径。
void setSecure(boolean flag)    指出浏览器使用的安全协议,例如HTTPS或SSL。
void setValue(String newValue)  cookie创建后设置一个新的值。
void setVersion(int v)          设置Cookie所遵从的协议版本

<%//写入
String cookieName="Sender";
Cookie cookie=new Cookie(cookieName, "Test_Content");
cookie.setMaxAge(10);
response.addCookie(cookie);
%>

<%//读出
Cookie cookies[]=request.getCookies();
Cookie sCookie=null;
String svalue=null;
String sname=null;
for(int i=0;i<cookies.length;i++)
{
sCookie=cookies[i];
svalue=sCookie.getValue();
sname=sCookie.getName();
}
%>

Ver 0 不支持:空格,方括号,圆括号,等于号(=),逗号,双引号,斜杠,问号,@符号,冒号,分号都不能作为Cookie的内容

==================================================
所有用户共享一个application,直到服务器关闭

存值到application:application.setValue("name",name);
取值于application:application.getValue("name")

==================================================
out基本方法:
newLine print println clear clearBuffer flush close getBufferSize getRemaining isAutoFlush

==================================================
exception基本方法:
getMessage getLocalizedMessage toString printStackTrace fillInStackTrace

==================================================
创建一个File对象的三个构造方法:
File(String filename);
File(String directoryPath,String filename);
File(File f;String filename);

File类的方法:
public String getName();
public boolean canRead();
public boolean canWrite();
public boolean exits();
public long length();
public String getAbsolutePath();绝对路径
public String getParent();父目录
public boolean isFile();
public boolean isDirectory();
public boolean isHidden();
public long lastModified();最后的修改时间

如果File对象是一个目录可以调用以下方法:
public String[] list();
public File[] listFiles();

==================================================
File fileName=new File(path,"createFile52.txt");
fileName.createNewFile();
fileName.delete();

==================================================
File dir=new File("d:/tomcat/webapps/root/tsinghua/04","ok");
成功否?<%=dir.mkdir()%>
或直接建:new File("d:/tomcat/webapps/root/tsinghua/04","ooo").mkdir();

==================================================
<%
  File dir=new File("d:/tomcat/webapps/root/tsinghua/04");
  File file[]=dir.listFiles();
  for(int i=0;i<file.length;i++)
  {
    if(file[i].isDirectory())
    out.print(file[i].toString()+"<br>");
  }
%>
<%
  File dir=new File("d:/tomcat/webapps/root/tsinghua/04","mulu");
  if(!(dir.isDirectory()))
  {
    dir.mkdir();
  }
%>

==================================================
使用字节流读写文件:
InputStream               OutputStream
FileInputStream           FileOutputStream
BufferedInputStream       BufferedOutputStream

==================================================
使用字节流写入并读出文件内容:
<%
  String path=request.getRealPath("/")+"//test";
  File dir=new File(path,"write");
  dir.mkdir();
  File f=new File(dir,"hello.txt");
  try
  {
    FileOutputStream outfile=new FileOutputStream(f);
    BufferedOutputStream bufferout=new BufferedOutputStream(outfile);
    byte b[]="皇图霸业谈笑中<br>不胜今宵一场醉".getBytes();
    bufferout.write(b);//bufferout.write(str.getBytes());
    bufferout.flush();
    bufferout.close();
    outfile.close();
   
    FileInputStream in=new FileInputStream(f);
    BufferedInputStream bufferin=new BufferedInputStream(in);
    byte c[]=new byte[90];
    int n=0;
    while((n=bufferin.read(c))!=-1)
    {
      String temp=new String(c,0,n);
      out.print(temp);
    }
    bufferin.close();
    in.close();
  }
  catch(IOException e)
  {
    out.print(e.toString());
  }
%>

==================================================
使用字符流读写文件:
Reader              Writer
FileReader          FileWriter
BufferedReader      BufferedWriter

==================================================
使用字符流写信并读出文件内容:
<%
  String path=request.getRealPath("test/write/");
  File f=new File(path,"apple.txt");
  try
  {
    FileWriter outfile=new FileWriter(f);
    BufferedWriter bufferout=new BufferedWriter(outfile);
    bufferout.write("皇图霸业谈笑中");
    bufferout.newLine();
    bufferout.write("不胜今宵一场醉");
    bufferout.flush();
    out.print("write successful.");
    bufferout.close();
    outfile.close();
   
    FileReader in=new FileReader(f);
    BufferedReader bufferin=new BufferedReader(in);
    String str=null;                         // int c=bufferin.read();
    while((str=bufferin.readLine())!=null)   // while(c!=-1){
    {                                        // out.print((char)c); c=bufferin.read();
      out.print("<br>"+str);                 // if(c==13){out.print("<br>");}
    }                                        // }
    bufferin.close();
    in.close();
  }
  catch(IOException e)
  {
    out.print(e.toString());
  }
%>

==================================================
追加文件内容(beans):
public String writeSomething(){
 try{
  FileWriter theFile=new FileWriter(path,true);
  PrintWriter out=new PrintWriter(theFile);
  out.println();
  out.println(something+"");
  out.close();
  theFile.close();
  return "success";
 }
 catch(IOException e){
  return e.toString();
 }
}

<%
  FileWriter fw=new FileWriter("d:/site/test2/dir/apple.txt",true);//true为追加
  BufferedWriter bw=new BufferedWriter(fw);
  bw.newLine();
  bw.write("append");
  bw.close();
  fw.close();
%>

==================================================
建并写文件(直接用fw也可以,用BufferedWriter是为了提高读写效率)
<%@ page import="java.io.*"%>
<%
  FileWriter fw=new FileWriter("d://jdk1.3//myjsp.txt");
  BufferedWriter bw=new BufferedWriter(fw);
  for(int i=1;i<201;i++)
  {
    bw.write("("+i+")");
    bw.newLine();
  }
  bw.flush();
  fw.close();
%>

==================================================
文件是否为空
FileReader fr=new FileReader(path,"ms.txt")
if(fr.read()==-1)
或:
File file=new File(path,"ms.txt")
if(file.length()==0)

略过3个字符不读
FileReader fr.skip(3)

==================================================
回压字符流:PuchbackReader(Reader in)

用回压字符流显示文件:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html><body>
<%
  String path=request.getRealPath("star/");
  File f=new File(path,"message.jsp");
  try
  {
    FileReader in=new FileReader(f);
 PushbackReader push=new PushbackReader(in);
 int c;
 char b[]=new char[1];
 while((c=push.read(b,0,1))!=-1)
 {
   String s=new String(b);
   if(s.equals("<"))
   {
     push.unread('&');
  push.read(b,0,1);
  out.print(new String(b));
  push.unread('L');// < &LT &GT >
  push.read(b,0,1);
  out.print(new String(b));
  push.unread('T');
  push.read(b,0,1);
  out.print(new String(b));
   }
   else if(s.equals(">"))
   {
     push.unread('&');
  push.read(b,0,1);
  out.print(new String(b));
  push.unread('G');
  push.read(b,0,1);
  out.print(new String(b));
  push.unread('T');
  push.read(b,0,1);
  out.print(new String(b));
   }
   else if(s.equals("/n"))
   {
     out.print("<br>");
   }
   else
   {
     out.print(new String(b));
   }
 }
 push.close();
  }
  catch(IOException e){}
%>
</body></html>

==================================================
数据流:DataInputStream DataOutputStream

对象流:ObjectInputStream ObjectInputStream(分别是DataInputStream和DataOutputStream的子类)

RandomAccessFile:与前面的几个文件输入输出流不同,但仍称其为流,既可输入也可输出。
其两个构造方法:RandomAccessFile(String name,String mode) RandomAccessFile(File file,String mode)

==================================================
用RandomAccessFile写入内容:
<%@ page import="java.io.*"%>
<html><body>
<%
  File f=new File("d:/site/test/write","apple.txt");
  RandomAccessFile raf=new RandomAccessFile(f,"rw");
  raf.seek(raf.length());//定位到文件末尾,续写。
  raf.writeUTF("杀人放火金腰带 修桥补路无尸骸");
  raf.close();
  out.print("write successful.");
%>
</body></html>

读出内容:
  String temp=null;
  while((temp=raf.readUTF())!=null)
  {
    byte b[]=temp.getBytes("iso-8859-1");
    temp=new String(b);
    out.print("<br>"+temp);
  }
  raf.close();


==================================================
文件下载:
<a href="loadFile.jsp">htmlarea.zip</a>
loadFile.jsp:

<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html><body>
<%
  OutputStream o=response.getOutputStream();
  byte b[]=new byte[500];//每次发送500个字节到输出流
  File fileLoad=new File("d:/site","htmlarea.zip");//下载文件
  response.setHeader("Content-disposition","attachment;filename="+"htmlarea.zip");//客户使用保存文件的对话框
  response.setContentType("application/x-tar");//通知客户文件的类型
  long fileLength=fileLoad.length();//通知客户文件的长度
  String length=String.valueOf(fileLength);
  response.setHeader("Content_Length",length);
  FileInputStream in=new FileInputStream(fileLoad);//读取文件,并发送给客户下载
  int n=0;
  while((n=in.read(b))!=-1)
  {
    o.write(b,0,n);
  }
%>
</body></html>


==================================================
文件的上传:

<%@ page language="java" import="com.jspsmart.upload.*"%>
<%@ page import="java.io.*,java.util.Date"%>
<%
    com.jspsmart.upload.SmartUpload mySmartUpload=new com.jspsmart.upload.SmartUpload();

    int count=0;
 mySmartUpload.initialize(pageContext);
 mySmartUpload.setTotalMaxFileSize(1000000);
 mySmartUpload.upload();
//设置上传路径
    java.util.Date today=new java.util.Date();
 int year0=today.getYear()+1900;
 int month0=today.getMonth()+1;
 int date0=today.getDate();
 String year="",month="",date="";
 year=""+year0;
 if(month0<10)
 {
   month="0"+month0;
 }
 else{month=""+month0;}
 if(date0<10)
 {
   date="0"+date0;
 }
 else{date=""+date0;}
 
 String path=request.getRealPath("/");
 path=path+"star//upload";
 
 java.io.File yearDir=new java.io.File(path,year);
 yearDir.mkdir();
 path=path+"//"+year;
 
 java.io.File monthDir=new java.io.File(path,month);
 monthDir.mkdir();
 path=path+"//"+month;
 
 java.io.File dateDir=new java.io.File(path,date);
 dateDir.mkdir();
 path=path+"//"+date;
//设置上传路径
 try
     {
  count = mySmartUpload.save(path);
  out.println(count + " file(s) uploaded.");
  out.print("<br>");
  for (int i=0;i<mySmartUpload.getFiles().getCount();i++)
  {
         com.jspsmart.upload.File myFile=mySmartUpload.getFiles().getFile(i);
   String fn=myFile.getFileName();
   out.print("文件<font color=red>"+fn+"</font>的地址为:");
   out.print("<input type=text name=fn size=50 value=upload/"+year+"/"+month+"/"+date+"/"+fn+"><br><br>");
            out.print("<img src=../upload/"+year+"/"+month+"/"+date+"/"+myFile.getFileName()+">");
       }
  }
    catch (Exception e)
    {
   out.println(e.toString());
 }
%>

==================================================
文件的上传,在同一表单中提交:
<%@ page language="java" import="com.jspsmart.upload.*"%>
<jsp:useBean id="up" scope="page" class="com.jspsmart.upload.SmartUpload"/>
<%
  //文件上传
  int count=0;
  up.initialize(pageContext);
  up.setTotalMaxFileSize(100000);
  up.upload();
  try
  {
    count=up.save("/forum/photo/");
  }
  catch(Exception e)
  {
    out.print(e.toString());
  }
  //获得其它提交信息:
  java.util.Enumeration e=up.getRequest().getParameterNames();
  while(e.hasMoreElements())
  {
    String key=(String)e.nextElement();
    String[] values=up.getRequest().getParameterValues(key);
    for(int i=0;i<values.length;i++)
    {
      out.print(key+"="+values[i]+"<br>");
    }
  }
%>

  //获得其它提交信息(对于简单的文本框可用简单方法):
  String[] logname=up.getRequest().getParameterValues("logname");
  out.print(logname[0]);

==================================================
jsp连接sqlServer 2000
<%@ page import="java.sql.*"%>
<%
  Connection con;
  Statement sql;
  ResultSet rs;  
  try
  {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  }
  catch(ClassNotFoundException e){}
  try
  {
    con=DriverManager.getConnection("jdbc:odbc:ghost","","");
    sql=con.createStatement();
    //sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
    String condition="select * from basicmessage";
    //select top 10 * from star where subject like '%rdmx%' order by filevalue desc,id desc
    rs=sql.executeQuery(condition);
    while(rs.next())
    {}
    con.close();
  }
  catch(SQLException e1){}
%>

==================================================
jsp连接MySQL
把驱动放在tomcat的common的lib中
<%
  Connection con=null;
  Statement sql=null;
  ResultSet rs=null;
  try
  {
    Class.forName("org.gjt.mm.mysql.Driver").newInstance();
  }
  catch(Exception e){}
  try
  {
    con=DriverManager.getConnection("jdbc:mysql://localhost/forum?

user=root&password=tomcat&useUnicode=true&characterEncoding=gb2312");
    sql=con.createStatement();
    String condition="select * from message";
    rs=sql.executeQuery(condition);
    while(rs.next())
    {}
    sql.close();
    con.close();
  }
  catch(SQLException e)
  {
    out.print(e.toString());
  }
%>
==================================================
jsp连接Oracle
<%@ page import="java.sql.*"%>
<html><body>
<%
  Connection con=null;
  Statement sql=null;
  ResultSet rs=null;
  try
  {
    Class.forName("oracle.jdbc.driver.OracleDriver");
  }
  catch(ClassNotFoundException e){}
  try
  {
    con=DriverManager.getConnection("jdbc:oracle:thin:@workstationgrb:1521:ora9","grb","tomcat");
    sql=con.createStatement();
    rs=sql.executeQuery("select * from grb_test");
    while(rs.next())
    {
    }
    con.close();
  }
  catch(SQLException ee)
  {
    out.print(" "+ee.toString());
  }
%>
</body></html>

==================================================
使用同步连接访问数据库:
<%@ page import="java.sql.*"%>
<%!
  Connection con=null;
%>
<%
  String id=request.getParameter("id");
  String title="",content="";
  Statement sql=null;
  ResultSet rs=null;
  if(con==null)
  {
    try
    {
      Class.forName("org.gjt.mm.mysql.Driver").newInstance();
    }
    catch(Exception e){out.print(e.toString());}
    try
    {
      con=DriverManager.getConnection("jdbc:mysql://localhost/qingnong?

user=root&password=tomcat&useUnicode=true&characterEncoding=gb2312");
      sql=con.createStatement();
      rs=sql.executeQuery("select * from message where id="+id);
    }
    catch(SQLException ee){out.print(ee.toString());}
  }
  else
  {
    synchronized(con)
    {
      try
      {
        sql=con.createStatement();
        rs=sql.executeQuery("select * from message where id="+id);
      }
      catch(SQLException eee){out.print(eee.toString());}
    }
  }
  try
  {
 while(rs.next())
 {
   title=rs.getString("title");
   content=rs.getString("content");
 }
 %>
   <%=title%>
   <%=content%>
 <%
  }
  catch(Exception e4)
  {
    out.print(e4.toString());
  }
%>

==================================================
ResultSetMetaData用于查找ResultSet中列的类型和特性:
<%
    rs=sql.executeQuery(condition);
    ResultSetMetaData rsmd=rs.getMetaData();
    out.print(rsmd.getColumnCount());//取的列数
    for(int i=1;i<=rsmd.getColumnCount();i++)//列出各列名称
    {
      out.print(rsmd.getColumnName(i)+",");
    }
%>
其它请查看:java.sql.ResultSetMetaData

==================================================
select count(*) as NAME from table_name
getString("NAME");

==================================================
游动查询:Statement sql=con.createStatement(int type,int concurrency)

type:(取值决定滚动方式)
ResultSet.TYPE_FORWORD_ONLY          结果集游标只能向下游动
ResultSet.TYPE_SCROLL_INSENSITIVE    可以上下移动,但数据库变化时结果集不变
ResultSet.TYPE_SCROLL_SENSITIVE      可上下移动且结果集与数据库同步变化

concurrency:(是否可用结果集更新数据库)
ResultSet.CONCUR_READ_ONLY          不能用结果集更新数据库
ResultSet.CONCUR_UPDATETABLE        可以

ResultSet方法:
public boolean previous()           游标上移,可用于逆序输入,到结果集之前返回false,相对于rs.next()
public void beforeFirst()           移动到初始位置,即第一行之前
public void afterLast()
public void first()
public void last()
public boolean isAfterLast()        判断是否在最后一行之后
public boolean isBeforeFirst()
public boolean isFirst()            是否指向第一行
public boolean isLast()
public int getRow()                 返回所在行数,如果没有就返回0
public boolean absolute(int row)    移到指定行

==================================================
随机查询:
double i=Math.random();产生一个0<i<1的数
int i=(int)(Math.random()*number+1)产生一个1到number的随机数用于随机查询

==================================================
分页:
<%!
  int pageSize=5;
  int pageCount=0;
%>
<%
  Connection con=null;
  Statement sql=null;
  ResultSet rs=null;
  try
  {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  }
  catch(ClassNotFoundException e){}
  try
  {
    con=DriverManager.getConnection("jdbc:odbc:ghost","","");
 sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
 rs=sql.executeQuery("select * from star order by id desc");
 rs.last();
 int lastRow=rs.getRow();
 pageCount=(lastRow%pageSize==0)?(lastRow/pageSize):(lastRow/pageSize+1);
 //pageCount=(lastRow+pageSize-1)/pageSize;
 
  int showPage=1;
  String currentPage=request.getParameter("showPage");
  if(currentPage==null)
  {
    currentPage="1";
  }
  try
  {
    showPage=Integer.parseInt(currentPage);
  }
  catch(NumberFormatException e)
  {
    showPage=1;
  }
  if(showPage<=1)
  {
    showPage=1;
  }
  if(showPage>=pageCount)
  {
    showPage=pageCount;
  }
  int posion=(showPage-1)*pageSize+1;
  rs.absolute(posion);
  for(int i=1;i<=pageSize;i++)
  {
    String id=rs.getString("id"),t=rs.getString("title");
 out.print("<a href='message.jsp?id="+id+"' target='_blank'>"+t+"</a><br>");
 if(!rs.next()){break;}
  }
 out.print("<<<ahref='mxzx.jsp?showPage="+(showPage-1)+"'>上一页</a> <ahref='mxzx.jsp?showPage="+(showPage+1)+"'>下一页

</a>>>");
  out.print("<br>"+showPage+"/"+pageCount+",每页显示"+pageSize+"条记录。");
  con.close();
  }
  catch(SQLException e1){}
%>

==================================================
1.(汉字处理在jsp中)
<jsp:useBean id="apple" class="circle2.Circle2" scope="page"></jsp:useBean>
<jsp:setProperty name="apple" property="number" value="001"/>
<jsp:getProperty name="apple" property="number"/>将得到value值001

2.提交了和该beans相对应的form后,该指令标签才被执行(汉字处理在java中)
<jsp:useBean id="grb" class="student" scope="page"></jsp:useBean>
<jsp:setProperty name="grb" property="*"/>然后用getProperty取出form提交的各数据

3.通过request的参数设置beans,要求参数名和属性名一至(不能在<jsp:setProperty>中同时使用value和param)
<jsp:useBean id="grb" class="student" scope="page"></jsp:useBean>
<jsp:setProperty name="grb" property="number" param="number"/>然后用getProperty各数据

==================================================
tomcat下的jsp虚拟目录:

新增一个虚拟目录只需要在D:/Tomcat/conf/Catalina/localhost/目录下新建一个名为目录名的xml文件保存重启tomcat即可!
例如:在D:盘下新建一个名为www的虚拟目录,www.xml内容如下所示:
<?xml version='1.0' encoding='utf-8'?>
<Context crossContext="true" debug="5" docBase="D:/www" path="/www" reloadable="true">
</Context>
打开IE键入http://localhost:8080/www就能访问你指向虚拟目录的jsp文件,以上实用于tomcat5。

apache虚拟目录建立

在配置文件中找下面这行:<IfModule mod_alias.c>
在这行下面添加如下内容:
Alias /vdir/ "c:/dir/"
<Directory "c:/dir/">
Options MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
以后通过http://localhost/vdir/就能访问到c:/dir/下的内容了.

支持中文:
AddDefaultCharset off

==================================================
tomcat中的servlet设置(修改web.xml),添加:
    <servlet>
      <servlet-name>ser</servlet-name>
      <servlet-class>serp.Hello</servlet-class>
    </servlet>
   
    <servlet-mapping>
      <servlet-name>ser</servlet-name>
      <url-pattern>/serp/Hello</url-pattern> //这里是sevlet的连接映射,可以写的随便一些,如:/serp.Hello 或 /Hello 或 /ok
    </servlet-mapping>

其中,serp为包名,访问:http://172.16.1.237:8080/serp/Hello
新添加的虚拟目录无须再设置web.xml,只要将servlet copy到相应目录即可:http://172.16.1.237:8080/site/serp/Hello

<%@ page contentType="text/html;charset=gb2312"%>
<html><body>
输入一个数,servlet求这个数的平方根:
<form action="../serp/Sqrt" method="get">
<input type="text" name="number">
<input type="submit" value="submit">
</form>
</body></html>

==================================================
打包发布(进入根目录):
jar cvf helloapp.war *.*

==================================================
简单的servlet例子:
package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Hello extends HttpServlet{
 public void init(ServletConfig config)throws ServletException{
  super.init(config);
 }
 public void service(HttpServletRequest request,HttpServletResponse response)throws IOException{
  PrintWriter out=response.getWriter();
  response.setContentType("text/html;charset=gb2312");
  out.print("<html><body>");
  out.print("Hello Servlet.");
  out.print("</body></html>");
 }
}

package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ComputerFactor extends HttpServlet{
 public void init(ServletConfig config) throws ServletException{
  super.init(config);
 }
 public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
  PrintWriter out=response.getWriter();
  response.setContentType("text/html;charset=gb2312");
  out.println("<html><body>");
  out.println("anything");
  out.println("</body></html>");
 }
 public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
  doPost(request,response);
 }
}
==================================================
文章信息管理系统字段设置:
信息表message:
id
subject
title
assets
author
posttime
modifytime
content
keyword
titleimage
filevalue
summary
fileurl
ifpub
editor
day/week/month/total
ip

管理表users:
logname
name
phone
address
email
grade

论坛message:
id reid reName title subject author content ifre posttime modifytime ordertime hits
论坛users:
logname nickname email qq msn grade

网上一个网友的字段设置:
ForumConfig   /** 论坛设置 */
    forumID         /** 唯一关键字 */
    postnum         /** 每页显示回复数 */
    topicnum        /** 每页显示主题数 */
    boardID         /** 显示在首页上的版块ID,默认为 ? */
    userID          /** 每个用户都可以有个人设定 */

User          /** 用户 */
    userID          /** 唯一关键字 */
    logname         /** 登录名 */
    pwd             /** 密码 */
    IDCard          /** 身份证号 */
    gender          /** 性别 */
    birthday        /** 生日 */
    country         /** 国家 */
    province        /** 省份 */
    city            /** 城市 */
    realname        /** 真名 */
    study           /** 学历 */
    vocation        /** 职业 */
    registerTime    /** 注册时间 */
    lastLogTime     /** 最后登录时间 */
    logNum          /** 登录次数 */
    motto           /** 座右铭 */
    intro           /** 个人介绍 */
    favor           /** 个人爱好 */
    score           /** 发表一个论题+5',回复一次+3',别人回复你的论题,一次+0.5' */
    QQ              /** QQ号码 */
    MSN             /** MSN帐号 */
    homepage        /** 个人主页 */
    email           /** 电子邮箱 */
    sign            /** 个性签名 */
    userHead        /** 头像 */
    topicNum        /** 发表论题数 */
    postNum         /** 回复数 */
    question        /** 密码提示问题 */
    answer          /** 密码提示答案 */
    Punished        /** 是否被惩罚 0 无  1 惩罚ing */
    haveMsg         /** 是否有未读消息 0:无  n: 有n条未读消息 */

Topic           /** 主题/帖子 */
    topicID         /** 唯一关键字 */
    userID          /** 发表者ID */
    subject         /** 帖子的题目 */
    content         /** 帖子内容 */
    image           /** 图片(只允许加一张) */
    publishTime     /** 发表时间 */
    type            /** 新/精华/置顶/热门 (帖) */
    state           /** 帖子状态  0:正常  -1:封杀  -2:删除? */
    readNum         /** 阅读次数 */
    replyNum        /** 回复次数 */
    clientIP        /** 发表者IP */

Post            /** 回复 */
    postID          /** 唯一关键字 */
    topicID         /** 主题ID */
    userID          /** 回复者ID */
    content         /** 回复内容 */
    image           /** 图片(只允许加一张) */
    publishTime     /** 回复时间 */
    clientIP        /** 回复者IP */

Punish          /** 惩罚 */
    punishID        /** 唯一关键字 */
    userID          /** 被惩罚用户 */
    state           /** 状态(0:完全功能;-2:不能发贴; -1:不能回贴) */
    lastTime        /** 惩罚天数 */
    startTime       /** 开始惩罚时间 */
    reason          /** 被惩罚原因 */

Board            /** 版块 */
    boardID          /** 唯一关键字 */
    parentID         /** 父版ID */
    name             /** 版块名字 */
    intro            /** 版块介绍 */

AdminMap         /** 斑竹与版块的映射 */
    adminMapID       /** 唯一关键字 */
    boardID          /** 版块ID */
    userID           /** 斑竹ID */
    superAdmin       /** 超级管理员,可能对斑竹进行操作 (userID) */

Message          /** 消息 */
    messageID        /** 唯一关键字 */
    Deliver          /** 发送者登录名 */
    Reciever         /** 接收者登录名 */
    topic            /** 消息主题 */
    content          /** 消息内容 */
    DeliverTime      /** 发送时间 */
    state            /** 状态,是否被阅读 */

Relation         /** 用户之间的关系 */
    relationID       /** 唯一关键字 */
    host             /** 设定者 */    这里不知道用怎么的命名好。。。
    guest            /** 设定对象 */  
    type             /** 关系类型 0 正常  -1 黑名单 1 好友 */

==================================================
这是一个生成html文件的bean
import java.util.Date;
import java.io.FileOutputStream;
import java.io.File;
import java.io.IOException;
public class WriteHtml
{
public WriteHtml()
{
}
public String gettime()
{
Date obj=new Date();
String time=String.valueOf(obj.getTime());
time=time+".htm";
return time;
}
/**
       * 生成文件
       * @param String 文件内容,String pathName 文件路径,fileName 文件名
       */
   public static void save(String content,String pathName,String fileName)
{
try{
              FileOutputStream fos = new FileOutputStream(pathName + fileName);
              byte contentByte[] = content.getBytes();
              fos.write(contentByte);
              fos.close();
          }
catch(IOException ie)
{
       }
}
}

==================================================
String s = "hello"; 这里有两个动作: 1、声明s变量, 2、创建"hello"实例,并将此赋值给s。
String s = new String("hello"); 有三个动作:1、声明s变量,2、创建"hello"实例;3、再创建一个新的String实例,并赋值"hello", 再将String实例赋值给s。 所以这种写法是多余并低效的。

==================================================
JSP避免Form重复提交的三种方案

  1 javascript ,设置一个变量,只允许提交一次。 

  <script language="javascript">

   var checkSubmitFlg = false;

   function checkSubmit() {

   if (checkSubmitFlg == true) {

   return false;

   }

   checkSubmitFlg = true;

   return true;

   }

   document.ondblclick = function docondblclick() {

   window.event.returnValue = false;

   }

   document.onclick = function doconclick() {

   if (checkSubmitFlg) {

   window.event.returnValue = false;

   }

   }

  </script>

  <html:form action="myAction.do" method="post" onsubmit="return checkSubmit();">  

  2 还是javascript,将提交按钮或者image置为disable  

   <html:form action="myAction.do" method="post"

   onsubmit="getElById('submitInput').disabled = true; return true;">   

   <html:image styleId="submitInput" src="images/ok_b.gif" border="0" /> 

   </html:form>  

  3 利用struts的同步令牌机制  

  利用同步令牌(Token)机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。

  基本原理: 

  服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。 

  if (isTokenValid(request, true)) {

   // your code here

   return mapping.findForward("success");

  } else {

   saveToken(request);

   return mapping.findForward("submitagain");

  } 

  Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考TokenProcessor类中的generateToken()方法。  

  1. //验证事务控制令牌,<html:form >会自动根据session中标识生成一个隐含input代表令牌,防止两次提交

  2. 在action中:  

   //<input type="hidden" name="org.apache.struts.taglib.html.TOKEN"

   // value="6aa35341f25184fd996c4c918255c3ae">

   if (!isTokenValid(request))
errors.add(ActionErrors.GLOBAL_ERROR,

   new ActionError("error.transaction.token"));

   resetToken(request); //删除session中的令牌  

  3. action有这样的一个方法生成令牌  

   protected String generateToken(HttpServletRequest request) {  

   HttpSession session = request.getSession();

   try {

   byte id[] = session.getId().getBytes();

   byte now[] =

   new Long(System.currentTimeMillis()).toString().getBytes();

   MessageDigest md = MessageDigest.getInstance("MD5");

   md.update(id);

   md.update(now);

   return (toHex(md.digest()));

   } catch (IllegalStateException e) {

   return (null);

   } catch (NoSuchAlgorithmException e) {

   return (null);

   }

   }

==================================================

原创粉丝点击