1.设置一个按钮为有用或不能用,
<%
if(index.intValue()%2==1)
{
%>
<input type="button" name="Update" class="kuButton" value='Update' disabled onclick="submitUpdate();return false;">
<input type="button" name="Delete" class="kuButton" value='Delete' disabled onclick="submitDel();return false;"></td>
<%
}else{
%>
<input type="button" name="Update" class="kuButton" value='Update' disabled onclick="submitUpdate();return false;">
<input type="button" name="Delete" class="kuButton" value='Delete' disabled onclick="submitDel();return false;"></td>
<%
}
%>
2.让你一个按钮显示不显示
显示:document.formname.id.style.display="none"
不显示:document.formname.id.style.display="inline"
3.在一个链接中要用到动态的参数,要调用方法,但是传参数时容易出现问题,最好的方式是:
action='<%="artMaintAction.do?method="+ session.getAttribute("method")+"&firstlevel=3&secondlevel=1"%>'
4,当页面提交是为默为的utf-u编码,我们要转换成GB2312才能正确插入到数据库中:
在SEVLETK加上:request.seCharacterEncoding("gb2312")
5.传递表单参数:
String name = new String(request.getParameter("name"));
7.文件操作
~~将一个字符串写到一个指定的文件中,如果该文件不存在,则新建一个文件,并完成写入;如果存在,则用此字符串覆盖原文件的所有内容
import java.io.*;
String str = "print me";
//定义好打印的目标文件名
//取得当前主机存放WEB页面的绝对路径
String hostdir = System.getProperty("user.dir");
//取得当前主机所采用的路径分隔符
String fileBar = System.getProperty("file.separator");
//书写完整的目标文件存放路径
String nameOfFile=hostdir+fileBar+"test.html";
try
//实例化一个文件输出流对象
FileOutputStream afile = new FileOutputStream(nameOfFile);
//将文件输出流,创建一个打印输出流对象
PrintWriter pw = new PrintWriter(afile);
pw.println(str);
//clean up
pw.close();
{}
catch(IOException e)
out.println(e.getMessage());
{}
~~列出指定目录下的文件列表
import java.io.*;
String cdur = System.getProperty("user.dir");
String fileBar = System.getProperty("file.separator");
String mydir =cdur+fileBar+"doc"+fileBar+"jspsky";
File my = new File(mydir);
String d[] = my.list();
int i;
int l=d.length;
for(i=0;i out.print(d[i]);
{}
---文件更名:file 有一个属性就是renameTo更名
File file = new File("./");
File file1 = new File("../");
file.renameTo(file1);
renameTo( )。它会把文件重命名成(或者说移动到)新的目录,也就是参数所给出的目录。
而参数本身就是一个File对象。这个方法也适用于目录。
8.计数器
Integer count = null;
synchronized (application)
count =(Integer) application.getAttribute("d");
if (count ==null)
count =new Integer("0");
count = new Integer(count.intValue()+1);
application.setAttribute("d",count);
{}
out.println(count);
// 首先定义一个整形对象,并初始化为:NULL,
// 取回APPLICATION对像的属性D的值,并强制转化为整形对象,赋给COUNT
// 判断COUNT是否为空,为空时,将O赋给COUNT对象,
// 否则,通过COUNT。INTVALUE()方法,实现COUNT对象加1,并赋值给COUNT
// 最后,将COUNT对象保存在APPLICATION对象的D变量中。
9,在JAVA中
String a[] = { "a", "ab" };
String b[][] = { { "abc", "abcd" }, { "d" } };
10,不能把逻辑直接放在一个类里面方法外面,这是一个很低级的错误,而且会使你找不到错误在哪里。
11,在数组中
String a[] = { "a", "aa" ,"aaa"};
String c[] = { "c", "cc" };
如果a = c 即变成是a[]== { "c", "cc" };
c = a 即变成是c[]=={ "a", "aa" ,"aaa"};它们不是一个一个的赋值。
11,数组能存放原始对象(primitive)和Object对象,容器只能存放Object对象,不过可以使用类将其转换,不过数组的效率比容器高很多。数组是不可变的
12,n = Math.abs(n)是返回N的决对值]
13,http://java.sun.com/docs/books/tutorial/index.html THE Java Tutorial
14,Array中Arrays.fill(a9, 1, 3, "World");是把a9中的第二个字符和第三个字符填上world
15,java.util.array类是一组用于数组操作的static方法它有四个基本方法:
Arrays.fill(object, values) , Arrays.sort(), Arrays.equals() , Arrays.binarySearch()[用天排列数组查找对象]
System.arraycopy(fromobject,startnum,toobject,startnum,length)用于数组之间的拷贝
Arrays.equals(objecta,objectb);返回一个boolen值,这里相等一定指长度相同,而且第一个元素相同
Arrays.sort(a); 对对象a进行排序,a是数字以小数字放前面,a是字母以A开头a第二,以此类推
int location = Arrays.binarySearch(a, 20);查找a中为20(必须为20不能多不能少)的位置,在查找之前必须用Arrays.sort(a);排序
16.在JAVA数组中:
String[] s1 = { "Hi", "Hi", "Hi", "Hi", "Hi" };
String[] s2 = { "Hi", "Hi", "Hi", "Hi", "Hi" };
String[] s3 = { "Hi", "Hi", "Hi", "11", "" };
Arrays.equals(s1,s2)成立,Arrays.equals(s3,s2)不成立,它是基本内容的比较,相当与s1-s2(中间为减号),返回的是一个大于小于或等于O的数
s2.equals(s3),s2==s3它们是基于对象的比较(内存中比较)
17,返回一个1-100的整数:
static Random r = new Random();
Math.abs(r.nextInt()) % 100;
18,在其它类里面调用静态方法:new testT.TConstraction1(5);只会调用静态类的确定的构造函数,不会调用其它代码:
class testT {
testT() {System.out.println("TConstraction(..)");}
public static class TConstraction1 {
public void atest() {
System.out.println(" 会执行所有的Constaction代代码");
}
public TConstraction1(int i) {
System.out.println("-static void TConstraction1 i==" + i);
};
}
}
19,s.toLowerCase()将s中所有字母转换成小写字母
20,容器分为:collection map
collection分为set ,list.
set里面的值不能重复,ArrayList,hashSet 添加为a.add("test") set会进行排序
MAP是一个链接保存一对对象,也可以转换成Collection 添加为:a.put("test","test2"):
21,list中也能用Collections.fill()静态方法来填充字符,但是必须要在原来里面有值的时候才能填
List list = new ArrayList();
for (int i = 0; i < 10; i++) {
list.add("");
}
Collections.fill(list, "Hello");
21,ArrayList其实就是一个可变长的数组,它方法也较简单:用add("a")加,用get(i)得到第i个对象
22.collection(list and set)包含以下功能:
exp: collection c= new Arraylist(); collection b= new Arraylist(); String c ="1";
c.add(object c);
c.addAll(collection b);
c.clear();
c.contains(object b);
c.containsAll(collection b);
c.isEmpty();
Iterator iteratora = a.iterator(); while(iteratora.hasNest())
c.remove(object c);
c.removeAll(collection b);
c.size();容器大小
没有get(i)随机取值
LinkedList有addFirst() removeFirst() addLast() removeLast();
23.map有两个方法可以分别打印key and values
System.out.println(mapt1.values());
System.out.println(mapt1.keySet());
也可以直接打印System.out.println(mapt1);
map使用Iterator 必须使用keySet 或values如:Iterator it =map1.keySet.iterator();
map1中可以使用map1.get(object key);
containsKey()包含一个key对象;
containsValues()包含一个值对象;
24,Math.random() * 20
返回一个1-20之间的一个应意随机数,返回的是一个doubel型的,如果想产生在1-20整数使用:
Integer r = new Integer( (int) (Math.random() * 20));
25,SortedMap 比HASHMAP多了几个属性:
map1.firstKey();第一个
map1.lastKey();最后一个
map1.subMap(fromKey,toKey);返回值中包括前者不包括后者
map1.headMap(toKey);返回的值都小于fromKey
map1.tailMap(fromKey);返回的值都大于fromKey
26。HashMap 要用equals()不能判断查询的键是不是与表里面的其它键相等。
equals()具有五个属性:反身,对称,传递,一致,非空
27.取得当前主机的名称:
//取得当前主机存放WEB页面的绝对路径
String hostdir = System.getProperty("user.dir");
//取得当前主机所采用的路径分隔符
String fileBar = System.getProperty("file.separator");
//书写完整的目标文件存放路径
String nameOfFile=hostdir+fileBar+"test.html";
28.在页面上显示日期
(1)在JS中定义:
var today = new Date();
function showday(){
var year = today.getYear();
var month = today.getMonth() + 1;
var date = today.getDate(); //日期
var day = today.getDay(); //星期
var week =new Array("星期日","星期一","星期二","星期三","星期四","星期五","星期六");
var dayValue = "";
dayValue += year + "-";
dayValue += ((month < 10) ? "0" : "") + month + "-";
dayValue += date + " ";
dayValue += (week[day]);
document.write(dayValue);
}
(2)在JSP中只要:
<script>showday()</script>
29,从配置文件里面读数据:
第一步:web.xml中定义如下, 如果配置文件为:config.properties
<servlet>
<servlet-name>InitServlet</servlet-name>
<servlet-class>com.cpic.adapter.adapterapp.util.InitServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/config.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
第二步:定义InitServlet
package com.cpic.adapter.adapterapp.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.PropertyResourceBundle;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import org.apache.log4j.Logger;
import com.cpic.adapter.adapterapp.constant.Constants;
/**
* <p>Title:InitServlet.java</p>
* <p>Description:当应用起动时加载要读取的数据放入context中</p>
* <p>Copyright:Copyright (c) 2005 chenhua,Inc</p>
* <p>Company:chenhua,Inc</p>
* @author spark 2005-12-26
* @version 1.0
*/
public class InitServlet extends HttpServlet {
private Logger logger;
public void init() throws ServletException{
super.init();
ServletContext context = getServletContext();
context.setAttribute(Constants.ADAPTER_INIT_STATUS,Boolean.FALSE);
//initialize proxy configuration
initAdapter();
context.setAttribute(Constants.ADAPTER_INIT_STATUS,Boolean.TRUE);
logger.info("initAdapter initialized successfully");
}
/**
* <p>Description:加载和设置数据</p>
* @throws ServletException
* spark 2005-12-26
*/
private void initAdapter() throws ServletException{
ServletContext context = getServletContext();
String configFile = getInitParameter("config");
if (configFile == null) {
String errMsg="Initialize Adapter configuration config file is not set in web.xml.";
logger.error(errMsg);
ServletException e = new ServletException(errMsg);
throw e;
}
InputStream in;
PropertyResourceBundle configBundle;
try {
in = this.getServletContext().getResourceAsStream(configFile);
configBundle = new PropertyResourceBundle(in);
context.setAttribute(Constants.ADAPTER_FILE_SEND,configBundle.getString(Constants.ADAPTER_FILE_SEND));
context.setAttribute(Constants.ADAPTER_FILE_RECEIVE,configBundle.getString(Constants.ADAPTER_FILE_RECEIVE));
} catch (IOException e) {
String errMsg = "Initialize adapter config.properties failed.";
logger.error(errMsg);
ServletException e1 = new ServletException(errMsg);
throw e1;
}
catch (Exception e) {
String errMsg = "Initialize adapter config.properties failed.";
logger.error(errMsg);
ServletException e1 = new ServletException(errMsg);
throw e1;
}
}
}
第三步,在应用利用:
在servlet中如下:
ServletContext context = getServletContext();
( String) context.getAttribute(Constants.PARTNER_NAME)
在STRUTS的ACTION中如下:
ServletContext context = request.getSession().getServletContext();
(String) context.getAttribute(Constants.PARTNER_NAME);
30.现在要提取所有儿子的名字中有 "中" 或 "华" 的父亲。 这个sql语句 。 最好怎么写?
select f.no,f.name from father f,son s where f.no=s.f.no and s.name like '[中华]'
31.输出错误的详细信息用ex.printStackTrace();
try{
System.out.println(" the app end....");
}catch(JRException ex){
out.print("Jasper Output Error:"+ex.getMessage());
ex.printStackTrace();
}
34.JAVA环境变量设置
JAVA_HOME=C:\JDK
PATH=%JAVA_HOME%\bin
set CLASSPATH=%JAVA_HOME%\lib\Tools.jar;%JAVA_HOME%\lib\dt.jar;
35,用MD5加密,每次加密的数据是一样的,修改hexDigits前面数据加密的密文会变,修改hexDigits后面密文不变???:
import java.security.MessageDigest;
public class EncryptUtils {
/**
* 采用MD5算法加密字符串
* @param s
* @return
*/
public final static String MD5(String s){
char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
try {
if( s == null){
return null;
}
byte[] strTemp = s.getBytes();
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(strTemp);
byte[] md = mdTemp.digest();
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
}catch (Exception e){
return null;
}
}
/**
* 使用MD5算法加密密码,返回前面16位
* @param pwd
* @return
*/
public final static String EncryptPwd(String password){
if( password!=null){
return EncryptUtils.MD5(password).substring(0,16);
}
return null;
}
public static void main(String[] args){
System.out.print(EncryptUtils.EncryptPwd("111111"));
}
}
36.输入和输出
InputStream的任务就是代表那些能从各种输入源获取数据的类。这些源包括:
1.byte数组
2.String对象
3.文件
4.类似流水线的"管道(pipe)"。把东西从一头放进去,让它从另一头出来。
5.一个"流的序列(A sequence of other streams)",可以将它们组装成一个单独的流。
6.其它源,比如Internet的连接。(这部分内容在Thinking in Enterprise Java中讨论。)
37,油漆工模式
Decorator模式常用于如下的情形:如果用继承来解决各种需求的话,类的数量会多到不切实际的地步。Java的I/O类库需要提供很多功能的组合,于是decorator模式就有了用武之地。[62] 但是decorator有个缺点,在提高编程的灵活性的同时(因为你能很容易地混合和匹配属性),也使代码变得更复杂了。Java的I/O类库之所以会这么怪,就是因为它"必须为一个I/O对象创建很多类",也就是为一个"核心"I/O类加上很多decorator。
38.虽然InputStream和OutputStream的某些功能已经淘汰了(如果你继续使用,编译器就会发警告),但它们仍然提供了很多很有价值的,面向byte的I/O功能,而Reader和Writer则提供了Unicode兼容的,面向字符的I/O功能
39, BufferedReader in = new BufferedReader(new FileReader("IOStreamDemo.java"));
String s, s2 = new String();
BufferedReader inst = new BufferedReader(new InputStreamReader(
System.in));
System.out.print("Enter a line:");
System.out.println(inst.readLine());
为什么 inst.readLine()返回的是一个数字??????????,不是读取一行信息吗?
40.文件操作首先要建立一个流BufferedReader
BufferedReader in = new BufferedReader(new FileReader(
"IOStreamDemo.java"));
String s, s2 = new String();
while ((s = in.readLine()) != null)
s2 += s + "\n";
in.close();
41. 读取文件
先创建一个FileWriter。BufferedWriter总是免不掉的。(试试把BufferedWriter去掉,
你就能看到它对性能的影响了—— 缓冲能大幅提高I/O的性能)。然后再让PrintWriter去排版
PrintWriter out1 = new PrintWriter(
new BufferedWriter(
new FileWriter("spark.out")
比读文件多了一个排版用的FileWriter,其它只将Reader换成Writer就OK了
这里的while ((s = in4.readLine()) != null)这里只能用while
out1.println(outnum++ + ": " + s);
42.从键盘上输入数据然后打印出来,用readLine( )一行一行地读取输入,因此要把System.in包装成
BufferedReader。但在这之前还得先用InputSteamReader把System.in转换成Reader
import java.io.*;
public class Echo {
public static void main(String[] args) throws IOException {
//以然用BufferedReader作缓冲
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String s;
while ((s = in.readLine()).length() != 0)
System.out.println(s);
// An empty line terminates the program
}
} ///:~
43.对象序列化
Java的"对象序列化"能让你将一个实现了Serializable接口的对象转换成一组byte,这样日后
要用这个对象时候,你就能把这些byte数据恢复出来,并据此重新构建那个对象了
实现两个重要的功能。
(1)Java的远程方法调用(Remote Method Invocation简称RMI)能让你像调用自己机器上的对象那样去
调用其它机器上的对象。当你向远程对象传递消息的时候,就需通过对象序列化来传送参数和返回值了。
(2).Bean的状态信息通常是在设计时配置的。这些状态信息必须保存起来,供程序启动的时候用;
对象序列化就负责这个工作。
44.使用Externalizable对象序列化时,
使用Externalizable对象序列化时恢复对象时会调用的默认构造函数(一定要是public的)。这一点同恢复Serializable对象不同,后者不调用任何构造函数,
完全根据存储的数据来重建对象。对于Externalizable对象,内部方法要在默认的构造行为会发生之后
(包括在定义数据成员时进行的初始化)才启动。只有知道这一切——特别是默认的构造过程肯定会发生——你才能
正确地使用Externalizable对象。
45,Externalizable对象不保存任何字段,因此transient只能用于Serializable对象。
46.使用正则表达式,如匹配所有有字母的
(1)import java.util.regex.*;
public class TestRegularExpression {
public static void main(String[] args) {
String patern1 = "asdfsdfgsgdsdgsdfgsdfgsdg";
Pattern p = Pattern.compile("\\w");
Matcher m = p.matcher(patern1);
while (m.find()) {
System.out.println("Match \"" + m.group() + "\" at positions "
+ m.start() + "-" + (m.end() - 1));
}
}
} ///:~
(2)m.group()表示相匹配的字,"\\w+"的意思是"一个或多个单词字符",因此它会将字符串直接分解成单词。find( )像一个迭代器,从头到尾
扫描一遍字符串。第二个find( )是带int参数的,正如你所看到的,它会告诉方法从哪里开始找——即从参数位置开始查找。
Matcher m = Pattern.compile("\\w+").matcher(
"Evening is full of the linnet's wings");
while (m.find())
System.out.println(m.group());
int i = 0;
System.out.println("---------------");
while (m.find(i)) {
System.out.println(m.group() + "## ");
i++;
} }
lookingAt( )和matches( ),只有在字符串与正则表达式一开始就相匹配的情况下才能返回true。matches( )成功的前提是正则表达式
与字符串完全匹配,而lookingAt( )[67]成功的前提是,字符串的开始部分与正则表达式相匹配
47.利用split将有相同字符串的分解。
String input = "This!!unusual use!!of exclamation!!points";
System.out.println(Arrays.asList(Pattern.compile("!!").split(input)));
// Only do the first three:只要替换前面三个
System.out.println(Arrays.asList(Pattern.compile("!!").split(input, 3)));
结果为:
[This, unusual use, of exclamation, points]
[This, unusual use, of exclamation!!points]只替换了前面三个
48,读取文本文件用
String s = TextFile.read("TheReplacements.java");
String input2= input.replaceAll("e","u");是把所有的e替换成u
49.Thread的run( )里面总是会有循环,这些循环会一直运行下去,直到线程结束。所以你必须设定条件打破循环
(或者像上面那样,直接在run( )里面return)。通常run( )是个无限循环,也就是说,刨开那些会让run( )
停下来的意外情况,线程会一直运行下去(
50.yield( )会把一些运行很久的线程停下来,让其它线程运行,但是yield( )只会在很少的情况下起作用,
而且不能用来进行很严肃的调校。