import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TempClass {
/**
* @param args
* @throws UnsupportedEncodingException
* @throws ClassNotFoundException
* @throws SQLException
*/
public static void main(String[] args) throws UnsupportedEncodingException {
String url = "jdbc:microsoft:sqlserver://localhost:1433;databaseName=tran";
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Connection conn = DriverManager.getConnection(url, "sa", "sa");
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select vcword from cn_other");
// mysql
String url_mysql = "jdbc:mysql://127.0.0.1:3306/zwspace";
Class.forName("org.gjt.mm.mysql.Driver");
Connection conn_mysql = DriverManager.getConnection(url_mysql,
"root", "root");
PreparedStatement st_mysql = conn_mysql
.prepareStatement("insert into chds_cihui(name) values(?)");
if (rs.next()) {
String rsname = rs.getString("vcword");
// String name = new String(rsname.getBytes("GB2312"),
// "GB2312");
// String name = new String(rsname.getBytes("UTF-8"), "GB2312");
// String name = new String(rsname.getBytes("utf8"), "GB2312");
// String name = new String(rsname.getBytes("iso-8859-1"),
// "GB2312");
// String name = new String(rsname.getBytes("GBK"), "GB2312");
// String name = new String(rsname.getBytes("GBK"), "GBK");
// String name = new String(rsname.getBytes("GB2312"), "GBK");
// String name = new String(rsname.getBytes("UTF-8"), "GBK");
// String name = new String(rsname.getBytes("iso-8859-1"),
// "GBK");
// String name = new String(rsname.getBytes("GBK"), "UTF-8");
// String name = new String(rsname.getBytes("GB2312"), "UTF-8");
// String name = new String(rsname.getBytes("UTF-8"), "UTF-8");
// String name = new String(rsname.getBytes("iso-8859-1"),
// "UTF-8");
// String name = new String(rsname.getBytes("GBK"),
// "iso-8859-1");
// String name = new String(rsname.getBytes("GB2312"),
// "iso-8859-1");
// String name = new String(rsname.getBytes("UTF-8"),
// "iso-8859-1");
// String name = new String(rsname.getBytes("iso-8859-1"),
// "iso-8859-1");
// String name = new String(rsname.getBytes(), "GBK");
// String name = new String(rsname.getBytes(), "GB2312");
// String name = new String(rsname.getBytes(), "UTF-8");
// String name = new String(rsname.getBytes(), "iso-8859-1");
String name = rsname;
System.out.println(rsname);
st_mysql.setString(1, name);
st_mysql.executeUpdate();
}
rs.close();
st.close();
conn.close();
st_mysql.close();
conn_mysql.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
String
。 byte[] |
getBytes(String charsetName) 使用指定的字符集將此 String 編碼為 byte 序列,并將結(jié)果存儲(chǔ)到一個(gè)新的 byte 數(shù)組中 |
#800080
#7B7D62
#56B6E9
#4B8D32
<script language="JavaScript"><input type="button" name="Submit3" value="搜 索" onClick="location.href='SearchResult.jsp?cluster_node_id=&key_word=' + document.CMS4JSearchForm.KEY_WORD.value + '&db_id=' + document.CMS4JSearchForm.DB_ID.value;">這個(gè)錯(cuò)誤我一共遇到過(guò)兩次,一直沒(méi)有找到很好的解決方案,這個(gè)錯(cuò)誤產(chǎn)生原因相信大家都知道,因?yàn)樵趆ibernate中同一個(gè)session里面有了兩個(gè)相同標(biāo)識(shí)但是是不同實(shí)體.
上一次在做交友模板時(shí),出來(lái)了這種問(wèn)題,后來(lái)才發(fā)現(xiàn)是hibernate的一個(gè)映射文件配錯(cuò)了,今天在做DC攝影時(shí),
映射文件加了一個(gè)lazy="false" fetch="join" 結(jié)果,也出現(xiàn)了數(shù)據(jù)重復(fù)取。
<many-to-one name="user" column="user_id" class="com.zwspace.domain.User" lazy="false" fetch="join" />
這樣也會(huì)有錯(cuò)嗎!想不通,只能把它給刪了。
js驗(yàn)證表單大全
1. 長(zhǎng)度限制
<script>
function test()
{
if(document.a.b.value.length>50)
{
alert("不能超過(guò)50個(gè)字符!");
document.a.b.focus();
return false;
}
}
</script>
<form name=a onsubmit="return test()">
<textarea name="b" cols="40" wrap="VIRTUAL" rows="6"></textarea>
<input type="submit" name="Submit" value="check">
</form>
2. 只能是漢字
<input onkeyup="value="/oblog/value.replace(/[^\u4E00-\u9FA5]/g,'')">
3." 只能是英文
<script language=javascript>
function onlyEng()
{
if(!(event.keyCode>=65&&event.keyCode<=90))
event.returnvalue=false;
}
</script>
<input onkeydown="onlyEng();">
4. 只能是數(shù)字
<script language=javascript>
function onlyNum()
{
if(!((event.keyCode>=48&&event.keyCode<=57)||(event.keyCode>=96&&event.keyCode<=105)))
//考慮小鍵盤上的數(shù)字鍵
event.returnvalue=false;
}
</script>
<input onkeydown="onlyNum();">
5. 只能是英文字符和數(shù)字
<input onkeyup="value="/oblog/value.replace(/[\W]/g,"'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))">
6. 驗(yàn)證油箱格式
<SCRIPT LANGUAGE=javascript RUNAT=Server>
function isEmail(strEmail) {
if (strEmail.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1)
return true;
else
alert("oh");
}
</SCRIPT>
<input type=text onblur=isEmail(this.value)>
7. 屏蔽關(guān)鍵字(這里屏蔽***和****)
<script language="javascript1.2">
function test() {
if((a.b.value.indexOf ("***") == 0)||(a.b.value.indexOf ("****") == 0)){
alert(":)");
a.b.focus();
return false;}
}
</script>
<form name=a onsubmit="return test()">
<input type=text name=b>
<input type="submit" name="Submit" value="check">
</form>
8. 兩次輸入密碼是否相同
<FORM METHOD=POST ACTION="">
<input type="password" id="input1">
<input type="password" id="input2">
<input type="button" value="test" onclick="check()">
</FORM>
<script>
function check()
{
with(document.all){
if(input1.value!=input2.value)
{
alert("false")
input1.value = "";
input2.value = "";
}
else document.forms[0].submit();
}
}
</script>
夠了吧 :)
屏蔽右鍵 很酷
oncontextmenu="return false" ondragstart="return false" onselectstart="return false"
加在body中
二
2.1 表單項(xiàng)不能為空
<script language="javascript">
<!--
function CheckForm()
{
if (document.form.name.value.length == 0) {
alert("請(qǐng)輸入您姓名!");
document.form.name.focus();
return false;
}
return true;
}
-->
</script>
2.2 比較兩個(gè)表單項(xiàng)的值是否相同
<script language="javascript">
<!--
function CheckForm()
if (document.form.PWD.value != document.form.PWD_Again.value) {
alert("您兩次輸入的密碼不一樣!請(qǐng)重新輸入.");
document.ADDUser.PWD.focus();
return false;
}
return true;
}
-->
</script>
2.3 表單項(xiàng)只能為數(shù)字和"_",用于電話/銀行帳號(hào)驗(yàn)證上,可擴(kuò)展到域名注冊(cè)等
<script language="javascript">
<!--
function isNumber(String)
{
var Letters = "1234567890-"; //可以自己增加可輸入值
var i;
var c;
if(String.charAt( 0 )=='-')
return false;
if( String.charAt( String.length - 1 ) == '-' )
return false;
for( i = 0; i < String.length; i ++ )
{
c = String.charAt( i );
if (Letters.indexOf( c ) < 0)
return false;
}
return true;
}
function CheckForm()
{
if(! isNumber(document.form.TEL.value)) {
alert("您的電話號(hào)碼不合法!");
document.form.TEL.focus();
return false;
}
return true;
}
-->
</script>
2.4 表單項(xiàng)輸入數(shù)值/長(zhǎng)度限定
<script language="javascript">
<!--
function CheckForm()
{
if (document.form.count.value > 100 || document.form.count.value < 1)
{
alert("輸入數(shù)值不能小于零大于100!");
document.form.count.focus();
return false;
}
if (document.form.MESSAGE.value.length<10)
{
alert("輸入文字小于10!");
document.form.MESSAGE.focus();
return false;
}
return true;
}
//-->
</script>
2.5 中文/英文/數(shù)字/郵件地址合法性判斷
<SCRIPT LANGUAGE="javascript">
<!--
function isEnglish(name) //英文值檢測(cè)
{
if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) {
if(name.charCodeAt(i) > 128)
return false;
}
return true;
}
function isChinese(name) //中文值檢測(cè)
{
if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) {
if(name.charCodeAt(i) > 128)
return true;
}
return false;
}
function isMail(name) // E-mail值檢測(cè)
{
if(! isEnglish(name))
return false;
i = name.indexOf(" at ");
j = name dot lastIndexOf(" at ");
if(i == -1)
return false;
if(i != j)
return false;
if(i == name dot length)
return false;
return true;
}
function isNumber(name) //數(shù)值檢測(cè)
{
if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) {
if(name.charAt(i) < "0" || name.charAt(i) > "9")
return false;
}
return true;
}
function CheckForm()
{
if(! isMail(form.Email.value)) {
alert("您的電子郵件不合法!");
form.Email.focus();
return false;
}
if(! isEnglish(form.name.value)) {
alert("英文名不合法!");
form.name.focus();
return false;
}
if(! isChinese(form.cnname.value)) {
alert("中文名不合法!");
form.cnname.focus();
return false;
}
if(! isNumber(form.PublicZipCode.value)) {
alert("郵政編碼不合法!");
form.PublicZipCode.focus();
return false;
}
return true;
}
//-->
</SCRIPT>
2.6 限定表單項(xiàng)不能輸入的字符
<script language="javascript">
<!--
function contain(str,charset)// 字符串包含測(cè)試函數(shù)
{
var i;
for(i=0;i<charset.length;i++)
if(str.indexOf(charset.charAt(i))>=0)
return true;
return false;
}
function CheckForm()
{
if ((contain(document.form.NAME.value, "%\(\)><")) || (contain(document.form.MESSAGE.value, "%\(\)><")))
{
alert("輸入了非法字符");
document.form.NAME.focus();
return false;
}
return true;
}
//-->
</script>
1. 檢查一段字符串是否全由數(shù)字組成
---------------------------------------
<script language="Javascript"><!--
function checkNum(str){return str.match(/\D/)==null}
alert(checkNum("1232142141"))
alert(checkNum("123214214a1"))
// --></script>
2. 怎么判斷是否是字符
---------------------------------------
if (/[^\x00-\xff]/g.test(s)) alert("含有漢字");
else alert("全是字符");
3. 怎么判斷是否含有漢字
---------------------------------------
if (escape(str).indexOf("%u")!=-1) alert("含有漢字");
else alert("全是字符");
4. 郵箱格式驗(yàn)證
---------------------------------------
//函數(shù)名:chkemail
//功能介紹:檢查是否為Email Address
//參數(shù)說(shuō)明:要檢查的字符串
//返回值:0:不是 1:是
function chkemail(a)
{ var i=a.length;
var temp = a.indexOf('@');
var tempd = a.indexOf('.');
if (temp > 1) {
if ((i-temp) > 3){
if ((i-tempd)>0){
return 1;
}
}
}
return 0;
}
5. 數(shù)字格式驗(yàn)證
---------------------------------------
//函數(shù)名:fucCheckNUM
//功能介紹:檢查是否為數(shù)字
//參數(shù)說(shuō)明:要檢查的數(shù)字
//返回值:1為是數(shù)字,0為不是數(shù)字
function fucCheckNUM(NUM)
{
var i,j,strTemp;
strTemp="0123456789";
if ( NUM.length== 0)
return 0
for (i=0;i<NUM.length;i++)
{
j=strTemp.indexOf(NUM.charAt(i));
if (j==-1)
{
//說(shuō)明有字符不是數(shù)字
return 0;
}
}
//說(shuō)明是數(shù)字
return 1;
}
6. 電話號(hào)碼格式驗(yàn)證
---------------------------------------
//函數(shù)名:fucCheckTEL
//功能介紹:檢查是否為電話號(hào)碼
//參數(shù)說(shuō)明:要檢查的字符串
//返回值:1為是合法,0為不合法
function fucCheckTEL(TEL)
{
var i,j,strTemp;
strTemp="0123456789-()# ";
for (i=0;i<TEL.length;i++)
{
j=strTemp.indexOf(TEL.charAt(i));
if (j==-1)
{
//說(shuō)明有字符不合法
return 0;
}
}
//說(shuō)明合法
return 1;
}
7. 判斷輸入是否為中文的函數(shù)
---------------------------------------
function ischinese(s){
var ret=true;
for(var i=0;i<s.length;i++)
ret=ret && (s.charCodeAt(i)>=10000);
return ret;
}
8. 綜合的判斷用戶輸入的合法性的函數(shù)
---------------------------------------
<script language="javascript">
//限制輸入字符的位數(shù)開始
//m是用戶輸入,n是要限制的位數(shù)
function issmall(m,n)
{
if ((m<n) && (m>0))
{
return(false);
}
else
{return(true);}
}
9. 判斷密碼是否輸入一致
---------------------------------------
function issame(str1,str2)
{
if (str1==str2)
{return(true);}
else
{return(false);}
}
10. 判斷用戶名是否為數(shù)字字母下滑線
---------------------------------------
function notchinese(str){
var reg=/[^A-Za-z0-9_]/g
if (reg.test(str)){
return (false);
}else{
return(true); }
}
11. form文本域的通用校驗(yàn)函數(shù)
---------------------------------------
作用:檢測(cè)所有必須非空的input文本,比如姓名,賬號(hào),郵件地址等等。
該校驗(yàn)現(xiàn)在只針對(duì)文本域,如果要針對(duì)form里面的其他域?qū)ο螅梢愿淖兣袛鄺l件。
使用方法:在要檢測(cè)的文本域中加入title文字。文字是在提示信息,你要提示給用戶的該字段的中文名。比如要檢測(cè)用戶名
html如下<input name="txt_1" title="姓名">,當(dāng)然,最好用可視化工具比如dreamweaver什么的來(lái)編輯域。
如果要檢測(cè)數(shù)字類型數(shù)據(jù)的話,再把域的id統(tǒng)一為sz.
javascript判斷日期類型比較麻煩,所以就沒(méi)有做日期類型校驗(yàn)的程序了.高手可以補(bǔ)充。
程序比較草,只是提供一個(gè)思路。拋磚引玉! :)
哦,對(duì)了,函數(shù)調(diào)用方法:< form onsubmit="return dovalidate()">
function dovalidate()
{
fm=document.forms[0] //只檢測(cè)一個(gè)form,如果是多個(gè)可以改變判斷條件
for(i=0;i<fm.length;i++)
{
//檢測(cè)判斷條件,根據(jù)類型不同可以修改
if(fm[i].tagName.toUpperCase()=="INPUT" &&fm[i].type.toUpperCase()=="TEXT" && (fm[i].title!=""))
if(fm[i].value="/blog/="")//
{
str_warn1=fm[i].title+"不能為空!";
alert(str_warn1);
fm[i].focus();
return false;
}
if(fm[i].id.toUpperCase()=="SZ")//數(shù)字校驗(yàn)
{
if(isNaN(fm[i].value))
{ str_warn2=fm[i].title+"格式不對(duì)";
alert(str_warn2);
fm[i].focus();
return false;
}
}
}
return true;
}
2 >表單提交驗(yàn)證類
2.1 表單項(xiàng)不能為空
<script language="javascript">
<!--
function CheckForm()
{
if (document.form.name.value.length == 0) {
alert("請(qǐng)輸入您姓名!");
document.form.name.focus();
return false;
}
return true;
}
-->
</script>
2.2 比較兩個(gè)表單項(xiàng)的值是否相同
<script language="javascript">
<!--
function CheckForm()
if (document.form.PWD.value != document.form.PWD_Again.value) {
alert("您兩次輸入的密碼不一樣!請(qǐng)重新輸入.");
document.ADDUser.PWD.focus();
return false;
}
return true;
}
-->
</script>
2.3 表單項(xiàng)只能為數(shù)字和"_",用于電話/銀行帳號(hào)驗(yàn)證上,可擴(kuò)展到域名注冊(cè)等
<script language="javascript">
<!--
function isNumber(String)
{
var Letters = "1234567890-"; //可以自己增加可輸入值
var i;
var c;
if(String.charAt( 0 )=='-')
return false;
if( String.charAt( String.length - 1 ) == '-' )
return false;
for( i = 0; i < String.length; i ++ )
{
c = String.charAt( i );
if (Letters.indexOf( c ) < 0)
return false;
}
return true;
}
function CheckForm()
{
if(! isNumber(document.form.TEL.value)) {
alert("您的電話號(hào)碼不合法!");
document.form.TEL.focus();
return false;
}
return true;
}
-->
</script>
2.4 表單項(xiàng)輸入數(shù)值/長(zhǎng)度限定
<script language="javascript">
<!--
function CheckForm()
{
if (document.form.count.value > 100 || document.form.count.value < 1)
{
alert("輸入數(shù)值不能小于零大于100!");
document.form.count.focus();
return false;
}
if (document.form.MESSAGE.value.length<10)
{
alert("輸入文字小于10!");
document.form.MESSAGE.focus();
return false;
}
return true;
}
//-->
</script>
2.5 中文/英文/數(shù)字/郵件地址合法性判斷
<SCRIPT LANGUAGE="javascript">
<!--
function isEnglish(name) //英文值檢測(cè)
{
if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) {
if(name.charCodeAt(i) > 128)
return false;
}
return true;
}
function isChinese(name) //中文值檢測(cè)
{
if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) {
if(name.charCodeAt(i) > 128)
return true;
}
return false;
}
function isMail(name) // E-mail值檢測(cè)
{
if(! isEnglish(name))
return false;
i = name.indexOf(" at ");
j = name dot lastIndexOf(" at ");
if(i == -1)
return false;
if(i != j)
return false;
if(i == name dot length)
return false;
return true;
}
function isNumber(name) //數(shù)值檢測(cè)
{
if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) {
if(name.charAt(i) < "0" || name.charAt(i) > "9")
return false;
}
return true;
}
function CheckForm()
{
if(! isMail(form.Email.value)) {
alert("您的電子郵件不合法!");
form.Email.focus();
return false;
}
if(! isEnglish(form.name.value)) {
alert("英文名不合法!");
form.name.focus();
return false;
}
if(! isChinese(form.cnname.value)) {
alert("中文名不合法!");
form.cnname.focus();
return false;
}
if(! isNumber(form.PublicZipCode.value)) {
alert("郵政編碼不合法!");
form.PublicZipCode.focus();
return false;
}
return true;
}
//-->
</SCRIPT>
2.6 限定表單項(xiàng)不能輸入的字符
<script language="javascript">
<!--
function contain(str,charset)// 字符串包含測(cè)試函數(shù)
{
var i;
for(i=0;i<charset.length;i++)
if(str.indexOf(charset.charAt(i))>=0)
return true;
return false;
}
function CheckForm()
{
if ((contain(document.form.NAME.value, "%\(\)><")) || (contain(document.form.MESSAGE.value, "%\(\)><")))
{
alert("輸入了非法字符");
document.form.NAME.focus();
return false;
}
return true;
}
//-->
</script>
Java中文問(wèn)題一直困擾著很多初學(xué)者,如果了解了Java系統(tǒng)的中文問(wèn)題原理,我們就可以對(duì)中文問(wèn)題能夠采取根本的解決之道。
最古老的解決方案是使用String的字節(jié)碼轉(zhuǎn)換,這種方案問(wèn)題是不方便,我們需要破壞對(duì)象封裝性,進(jìn)行字節(jié)碼轉(zhuǎn)換。 還有一種方式是對(duì)J2EE容器進(jìn)行編碼設(shè)置,如果J2EE應(yīng)用系統(tǒng)脫離該容器,則會(huì)發(fā)生亂碼,而且指定容器配置不符合J2EE應(yīng)用和容器分離的原則。 在Java內(nèi)部運(yùn)算中,涉及到的所有字符串都會(huì)被轉(zhuǎn)化為UTF-8編碼來(lái)進(jìn)行運(yùn)算。那么,在被Java轉(zhuǎn)化之前,字符串是什么樣的字符集? Java總是根據(jù)操作系統(tǒng)的默認(rèn)編碼字符集來(lái)決定字符串的初始編碼,而且Java系統(tǒng)的輸入和輸出的都是采取操作系統(tǒng)的默認(rèn)編碼。 因此,如果能統(tǒng)一Java系統(tǒng)的輸入、輸出和操作系統(tǒng)3者的編碼字符集合,將能夠使Java系統(tǒng)正確處理和顯示漢字。這是處理Java系統(tǒng)漢字的一個(gè)原則,但是在實(shí)際項(xiàng)目中,能夠正確抓住和控制住Java系統(tǒng)的輸入和輸出部分是比較難的。J2EE中,由于涉及到外部瀏覽器和數(shù)據(jù)庫(kù)等,所以中文問(wèn)題亂碼顯得非常突出。 J2EE應(yīng)用程序是運(yùn)行在J2EE容器中。在這個(gè)系統(tǒng)中,輸入途徑有很多種:一種是通過(guò)頁(yè)面表單打包成請(qǐng)求(request)發(fā)往服務(wù)器的;第二種是通過(guò)數(shù)據(jù)庫(kù)讀入;還有第3種輸入比較復(fù)雜,JSP在第一次運(yùn)行時(shí)總是被編譯成Servlet,JSP中常常包含中文字符,那么編譯使用javac時(shí),Java將根據(jù)默認(rèn)的操作系統(tǒng)編碼作為初始編碼。除非特別指定,如在Jbuilder/eclipse中可以指定默認(rèn)的字符集。 輸出途徑也有幾種:第一種是JSP頁(yè)面的輸出。由于JSP頁(yè)面已經(jīng)被編譯成Servlet,那么在輸出時(shí),也將根據(jù)操作系統(tǒng)的默認(rèn)編碼來(lái)選擇輸出編碼,除非指定輸出編碼方式;還有輸出途徑是數(shù)據(jù)庫(kù),將字符串輸出到數(shù)據(jù)庫(kù)。 由此看來(lái),一個(gè)J2EE系統(tǒng)的輸入輸出是非常復(fù)雜,而且是動(dòng)態(tài)變化的,而Java是跨平臺(tái)運(yùn)行的,在實(shí)際編譯和運(yùn)行中,都可能涉及到不同的操作系統(tǒng),如果任由Java自由根據(jù)操作系統(tǒng)來(lái)決定輸入輸出的編碼字符集,這將不可控制地出現(xiàn)亂碼。 正是由于Java的跨平臺(tái)特性,使得字符集問(wèn)題必須由具體系統(tǒng)來(lái)統(tǒng)一解決,所以在一個(gè)Java應(yīng)用系統(tǒng)中,解決中文亂碼的根本辦法是明確指定整個(gè)應(yīng)用系統(tǒng)統(tǒng)一字符集。 指定統(tǒng)一字符集時(shí),到底是指定ISO8859_1 、GBK還是UTF-8呢? (1)如統(tǒng)一指定為ISO8859_1,因?yàn)槟壳按蠖鄶?shù)軟件都是西方人編制的,他們默認(rèn)的字符集就是ISO8859_1,包括操作系統(tǒng)Linux和數(shù)據(jù)庫(kù)MySQL等。這樣,如果指定Jive統(tǒng)一編碼為ISO8859_1,那么就有下面3個(gè)環(huán)節(jié)必須把握: 開發(fā)和編譯代碼時(shí)指定字符集為ISO8859_1。 運(yùn)行操作系統(tǒng)的默認(rèn)編碼必須是ISO8859_1,如Linux。 在JSP頭部聲明:<%@ page contentType="text/html;charset=ISO8859_1" %>。 (2)如果統(tǒng)一指定為GBK中文字符集,上述3個(gè)環(huán)節(jié)同樣需要做到,不同的是只能運(yùn)行在默認(rèn)編碼為GBK的操作系統(tǒng),如中文Windows。 統(tǒng)一編碼為ISO8859_1和GBK雖然帶來(lái)編制代碼的方便,但是各自只能在相應(yīng)的操作系統(tǒng)上運(yùn)行。但是也破壞了Java跨平臺(tái)運(yùn)行的優(yōu)越性,只在一定范圍內(nèi)行得通。例如,為了使得GBK編碼在linux上運(yùn)行,設(shè)置Linux編碼為GBK。 那么有沒(méi)有一種除了應(yīng)用系統(tǒng)以外不需要進(jìn)行任何附加設(shè)置的中文編碼根本解決方案呢? 將Java/J2EE系統(tǒng)的統(tǒng)一編碼定義為UTF-8。UTF-8編碼是一種兼容所有語(yǔ)言的編碼方式,惟一比較麻煩的就是要找到應(yīng)用系統(tǒng)的所有出入口,然后使用UTF-8去“結(jié)扎”它。 一個(gè)J2EE應(yīng)用系統(tǒng)需要做下列幾步工作:
|
ClientService.java
package com.soft.client;
import org.apache.axis.client.Service;
import javax.xml.rpc.ServiceException;
import java.net.MalformedURLException;
import org.apache.axis.client.Call;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import javax.xml.namespace.QName;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
import java.rmi.RemoteException;
public class ClientService {
public ClientService() {
}
public UserDTO getUserDTO() {
String endpoint = "http://localhost:8080/WebModule/services/Myservice";
QName qset = new QName("urn:Myservice", "UserDTO");
QName qmethod = new QName("urn:Myservice", "getUserDTO");
Class clsUserDTO = UserDTO.class;
UserDTO dto = new UserDTO();
Service service = new Service();
try {
Call call = (Call) service.createCall();
call.registerTypeMapping(clsUserDTO, qset,
new BeanSerializerFactory(clsUserDTO, qset),
new BeanDeserializerFactory(clsUserDTO,qset));
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName(qmethod);
call.setReturnClass(clsUserDTO);
dto = (UserDTO) call.invoke(new Object[] {});
} catch (ServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return dto;
}
public static void main(String[] args) {
ClientService cs = new ClientService();
UserDTO user = cs.getUserDTO();
System.out.println(user.getPassword());
System.out.println(user.getUsername());
}
}
UserDTO.java
package com.soft.client;
public class UserDTO {
private String username;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
import java.util.Map.Entry;
private static Map oldvote=new HashMap();
...............................
ModelAndView mav = new ModelAndView();
String voteid = ServletRequestUtils.getRequiredStringParameter(request,
"voteid");
String ip = ServletRequestUtils.getStringParameter(request, "ip");
//遍歷HasMap
Boolean isoldvote=false;
Iterator it=oldvote.entrySet().iterator();
while(it.hasNext()){
Entry entry=(Entry) it.next();
Object key=entry.getKey();
Object value=entry.getValue();
if(key.equals(voteid)&&value.equals(ip)){
isoldvote=true;
break;
}
}
if (isoldvote) {
...............................
1.
<html>
?<head>
??<title>transPara.htm</title>
?</head>
<body>
?<form method="POST" action="acceptPara.jsp">
? ??<p align="center">
??姓 名:<input type="text" name="name" size="20"><br>
? ??年 齡: <input type="text" name="age" size="15"><br>
? ??性 別:
???<input type="radio" value="male" checked name="sex">
????男 ?
? ???<input type="radio" name="sex" value="female">女</p>
? ??<p align="center">
???<input type="submit" value="submit" name="submit">
? ???<input type="reset" value="reset" name="reset"></p>
?</form>
</body>
</html>
2.
<html>
<%@ page contentType="text/html;charset=gb2312"%>
<jsp:useBean id="atest"? class="test.AcceptPara"/>
<head><title>acceptPara.jsp</title></head>
<body>
<jsp:setProperty name="atest" property="*"/>?? //? ***將javabean中的屬性自動(dòng)與html提交過(guò)來(lái)的變量匹配***********
Value of property "name" :
<jsp:getProperty name="atest" property="name"/><br>
Value of property "age" :
<jsp:getProperty name="atest" property="age"/><br>
Value of property "sex" :
<jsp:getProperty name="atest" property="sex"/><br>
Value of property "submit" :
<jsp:getProperty name="atest" property="submit"/><br>
</body>
</html>
3.
package test;//?? 在一些tomcat舊版本包定義一定要有,且在jsp引用中如下:<jsp:useBean id="atest"? class="test.AcceptPara"/>? 編譯后放在\WEB-INF\classes\test\中
public class AcceptPara{
?String name;
?int age;
?String sex;
?String submit;
?
?public void setName(String value){
??name=value;
?}
?
?public String getName(){
??return name;
?}
?
?public void setAge(int value){
??age=value;
?}
?
?public int getAge(){
??return age;
?}
?
?public void setSex(String value){
??sex=value;
?}
?
?public String getSex(){
??return sex;
?}
?
?public void setSubmit(String value){
??submit=value;
?}
?
?public String getSubmit(){
??return submit;
?}
??
?public void acceptPara(){}
?
}
過(guò)程:
1.停掉MSSQLSERVER,將MSSQL安裝目錄下的E:\Program Files\Microsoft SQL
Server\MSSQL\Data\pubs.mdf和E:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf文
件移走。
2.重新啟動(dòng)MSSQLSERVER,在SQL Server Enterprise Manager中可看到PUBS的圖標(biāo)是灰色的加了個(gè)'(置疑
)',刪除PUBS。至此是為了模擬Pubs數(shù)據(jù)庫(kù)只留下了pubs.mdf,(pubs_log.ldf不再用到)。
3.將pubs.mdf移到MSSQL安裝目錄下E:\Program Files\Microsoft SQL Server\MSSQL\Data\
4.在SQL查詢分析器中執(zhí)行 exec sp_attach_db 'pubs' ,'E:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf'
會(huì)有錯(cuò)誤提示:
設(shè)備激活錯(cuò)誤。物理文件名 'e:\Program Files\Microsoft SQL Server\MSSQL\data\pubs_log.ldf' 可
能有誤。
已創(chuàng)建名為 'E:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.LDF' 的新日志文件。
不過(guò)沒(méi)關(guān)系,因?yàn)樾氯罩疚募褎?chuàng)建了,呵呵。
用此方法只要有.mdf文件,就能回復(fù)數(shù)據(jù)庫(kù)。
??????? 試題是模仿GRE考試,在這實(shí)例中,編了一套"中文GRE測(cè)試"總共有十道題,讀者可自行增加.
??????? 注:實(shí)例中的試題,可選答案,正確答案封裝在文件exam.java 中.用index.jsp文件來(lái)實(shí)現(xiàn)對(duì)問(wèn)題的調(diào)用.核對(duì),顯示結(jié)果.所以要先編譯exam.java成exam.class ,之后index.jsp才能調(diào)用.
少說(shuō)費(fèi)話--直入主題:
1.在Tomcat目錄下的webapps目錄下新建book文件夾,
1.5 在Tomcat目錄下的conf/Catalina/localhost目錄下新建一個(gè)book.xml (這一步很重要!!)
?寫入:
<?xml version='1.0' encoding='utf-8'?>
<Context docBase="E:/Program Files/Apache Software Foundation/Tomcat 5.0/webapps/book" path="/book" reloadable="true">
</Context>
2.在book文件夾下新建WEB-INF文件夾.
2.5 在WEB-INF目錄下新建web.xml 寫入:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
?xmlns="http://java.sun.com/xml/ns/j2ee"
?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
?xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
?http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>
3.在WEB-INF文件夾下新建classes文件夾.
4.把index.jsp? exam.java 放到book目錄下.
5.用javac? exam.java? 編譯exam.java成exam.jsp? (可在命令行中運(yùn)行此步)
6.exam.jsp 放到WEB-INF/classes/exam目錄下.
7.啟動(dòng)tomcat.
8.輸入地址: http://localhost:8080/book???? 回車 OK !!!!
附index.jsp代碼:
<html>
<head>
<META http-equiv=Content-Type content="text/html; charset=GB2312">
<title>網(wǎng)上測(cè)試</title>
</head>
<body>
<%@ page language="java" contentType="text/html;charset=GB2312" buffer="none"%>
<jsp:useBean id="exam" scope="session" class="exam.exam"/>
<FONT SIZE="+2"><B>
<%=exam.getExamName()%>
</B></FONT>
<br><br>
<%
int current=exam.getCurrent();
String reset=null;
reset=request.getParameter("Reset");
if(reset==null){
?reset="";
}
if(reset.equals("1"))
{
?exam.reset();
}
int iqn=0;
String questionNum=null;
questionNum=request.getParameter("QuestionNum");
if(questionNum==null)
{
?iqn=0;
}
else
{
?Integer tmpInt=new Integer(questionNum);
?iqn=tmpInt.intValue();
}
if(iqn!=0)
{
?current++;
?exam.setCurrent(current);
}
?String answer=null;
?answer=request.getParameter("Answer");
?
if(answer==null)
{
?answer="";
}
if(exam.getCurrent()>exam.getCount())
{
?if(exam.getCorrect()>=6)
?{
%>
??恭喜!你以<%=exam.getCorrect()*10 %>分的成績(jī)通過(guò)了測(cè)試!<BR>
<%
?}
?else
?{
%>
??對(duì)不起,你需要60分以上的成績(jī)才能通過(guò)測(cè)試!<BR>
??你可以按<A HREF="exam.jsp?Reset=1">這里</A>重新進(jìn)行測(cè)試。<BR>
<%
?}
}
else
{
?if(iqn==0)
?{
??if(answer. equals(exam.getCorrectAnswer(exam.getCurrent()-1)))
??{
???exam.setCorrect(exam.getCorrect()+1);
??}
?}
?else
?{
??if(answer.equals(exam.getCorrectAnswer(exam.getCurrent()-2)))
??{
???exam.setCorrect(exam.getCorrect()+1);
??}
?}
%>
?<FORM action="exam.jsp" method="post">
?<input type="hidden" name="QuestionNum" value="<%=current%>">
<P>
?總共<%=exam.getCount()%>個(gè)問(wèn)題,現(xiàn)在是第<%=exam.getCurrent()%>個(gè)問(wèn)題
</P>
<br>
<b>
?<%=current%>
</b>
<%
out.println(exam.getExamQuestion(current-1));
%>
<br>
<input type="radio" name="Answer" value="A">
<%
out.println(exam.getExamAnswer(current-1,0));
%>
<br>
<input type="radio" name="Answer" value="B">
<%
out.println(exam.getExamAnswer(current-1,1));
%>
<br>
<input type="radio" name="Answer" value="C">
<%
out.println(exam.getExamAnswer(current-1,2));
%>
<br>
<input type="radio" name="Answer" value="D">
<%
out.println(exam.getExamAnswer(current-1,3));
%>
<br>
<input type="submit" value="確定">
</form>
<%
}
%>
</body>
</html>
exam.java代碼:
package exam;
public class exam
{
?int count;
?int current;
?int correct;
?String examName;
//?String answer;
?String[] examQuestion=
?{//存放所有的問(wèn)題
??"1.科學(xué)常識(shí):下列有關(guān)科學(xué)家的敘述,何者正確?",
??"2.牛頓三大運(yùn)動(dòng)定律的第一定律是:",
??"3.兩個(gè)報(bào)名參加海軍的年輕人被問(wèn)道:\"你們會(huì)游泳嗎?\"他倆愣住了。過(guò)了一會(huì)兒,其中一個(gè)人回答說(shuō):\"怎么回事,難道船不夠用嗎?\"這篇文章的主題是什么",
??"4.接上題。考官為什么要問(wèn)這兩個(gè)人游泳的事?",
??"5.男:看那個(gè)妹妹,好靚哦!女:看你個(gè)大頭鬼!問(wèn):這個(gè)女的是什么意思?",
??"6.男:今天天氣不錯(cuò)。女:可不是咋得!問(wèn):這個(gè)女的什么意思?",
??"7.男:我把撿來(lái)的錢包交給警察了。男:我KAO!",
??"8.女:您好,您撥叫的用戶沒(méi)有開機(jī),要留言請(qǐng)留言,不留言請(qǐng)掛機(jī)。問(wèn):這是發(fā)生在什么時(shí)候?",
??"9.ABCD四教授申請(qǐng)中科院院士,如果以下事實(shí)為真,誰(shuí)最有資格入選",
??"10.以下是摘自電影《大話西游》中唐僧的一句臺(tái)詞,選項(xiàng)中可能正確的是人和妖精都是媽生的,不同的人是人他媽的,妖是妖他媽的,妖要有了仁慈之心,就不是妖了,而是人妖"
?};
?String[][] examAnswer=
?{//問(wèn)題可選的答案
??{"(A)天文學(xué)家常常到天體營(yíng)去研究天文的奧秘","(B)地質(zhì)學(xué)家常常到地牢去研究地層結(jié)構(gòu)","(C)大氣科學(xué)家常常坐熱氣球到天空研究臺(tái)風(fēng)","(D)以上都不對(duì)"},
??{"(A)靜如處子 動(dòng)于脫兔","(B)靜中有動(dòng) 動(dòng)中有靜","(C)運(yùn)動(dòng)絕對(duì) 靜止相對(duì)","(D)靜者恒靜 動(dòng)者恒動(dòng)"},
??{"(A)參軍","(B)打魚","(C)游泳","(D)造船"},
??{"(A)他想讓他們教他游泳","(B)他想知道這兩個(gè)人會(huì)不會(huì)被淹死","(C)他擔(dān)心船不夠用","(D)他想舉行游泳比賽"},
??{"(A) 這個(gè)男的頭有病","(B)這個(gè)男的頭比較大","(C)這個(gè)男的看見的是鬼","(D)這個(gè)女的有點(diǎn)吃醋"},
??{"(A)今天天氣不好","(B)今天天氣很好","(C)這女的沒(méi)聽清","(D)這女的不知道"},
??{"(A)他很驚訝","(B)他丟了錢包","(C)他想揍第一個(gè)人","(D)他累了想找個(gè)地方靠靠"},
??{"(A)打電話","(B) 開飛機(jī)","(C) 發(fā)EMAIL","(D)坐飛機(jī)"},
??{"(A)是中國(guó)改革開放以后第一個(gè)公費(fèi)留德的四十歲以下的女性的在微電子領(lǐng)域的花了少于三年畢業(yè)的毅然回國(guó)的博士","(B)是在使用黑白膠卷照出彩照這一國(guó)際前沿領(lǐng)域做出突破貢獻(xiàn)的科學(xué)家","(C)畢業(yè)于我國(guó)著名的海南熱帶作物學(xué)院,學(xué)慣東西,差一點(diǎn)就復(fù)制出了恐龍。而且率先提出,中國(guó)人才沒(méi)有斷層,只是待遇和職稱斷層","(D)經(jīng)常陪李嵐清打敲三家和拱豬,對(duì)高校合并做出突出貢獻(xiàn)"},
??{"(A)人妖是指:媽媽還健在就去做了和尚的妖精","(B)人和妖精沒(méi)有本質(zhì)區(qū)別,因?yàn)樗麄兌际峭晃慌可?,"(C)唐僧為了超度一只妖精,不惜和妖精一起罵人","(D)唐僧暗示自己的母親原來(lái)就是一只妖精變的"}
?};
?
?String[] correctAnswer=
?{//正確的答案
??"D","C","A","B","D","B","A","A","B","C"
?};
?String message;
?
?public exam()
?{//重設(shè)測(cè)試
??reset();
?}
?public void reset()
?{//重設(shè)測(cè)試
??count=10;
??current=1;
??correct=0;
??examName="中文GRE考試樣題";
?}
?public void setCount(int c)
?{
??count=c;
?}
?public int getCount()
?{
??return count;
?}
?public void setCurrent(int c)
?{
??current=c;
?}
?public int getCurrent()
?{
??return current;
?}
?public void setCorrect(int c)
?{
??correct=c;
?}
?public int getCorrect()
?{
??return correct;
?}
?public void setExamName(String name)
?{
??examName=name;
?}
?public String getExamName()
?{
??return examName;
?}
?public void setCorrectAnswer(String[] answer)
?{
??correctAnswer=answer;
?}
?public void setCorrectAnswer(int i,String answer)
?{
??correctAnswer[i]=answer;
?}
?public String getCorrectAnswer(int i)
?{
??return correctAnswer[i];
?}
?public String[] getCorrectAnswer()
?{
??return correctAnswer;
?}
?public void setExamQuestion(String[] question)
?{
??examQuestion=question;
?}
?public void setExamQuestion(int i,String question)
?{
??examQuestion[i]=question;
?}
?public String[] getExamQuestion()
?{
??return examQuestion;
?}
?public String getExamQuestion(int i)
?{
??return examQuestion[i];
?}
?public void setExamAnswer(String[][] answer)
?{
??examAnswer=answer;
?}
?public void setExamAnswer(int i,String[] answer)
?{
??examAnswer[i]=answer;
?}
?public void setExamAnswer(int i ,int j,String answer)
?{
??examAnswer[i][j]=answer;
?}
?
?public String[][] getExamAnswer()
?{
??return examAnswer;
?}
?public String[] getExamAnswer(int i)
?{
??return examAnswer[i];
?}
?public String getExamAnswer(int i,int j)
?{
??return examAnswer[i][j];
?}
}
經(jīng)常看到j(luò)sp的初學(xué)者問(wèn)tomcat下如何配置jsp、servlet和bean的問(wèn)題,于是總結(jié)了一下如何tomcat下配置jsp、servlet和ben,希望對(duì)那些初學(xué)者有所幫助。
一、開發(fā)環(huán)境配置
第一步:下載j2sdk和tomcat:到sun官方站(http://java.sun.com/j2se/1.5.0/download.jsp)下載j2sdk,注意下載版本為Windows Offline Installation的SDK,同時(shí)最好下載J2SE 1.5.0 Documentation,然后到tomcat官方站點(diǎn)(http://jakarta.apache.org/site/downloads/downloads_tomcat-5.cgi)下載tomcat(下載最新5.5.9版本的tomcat);
第二步:安裝和配置你的j2sdk和tomcat:執(zhí)行j2sdk和tomcat的安裝程序,然后按默認(rèn)設(shè)置進(jìn)行安裝即可。
1.安裝j2sdk以后,需要配置一下環(huán)境變量,在我的電腦->屬性->高級(jí)->環(huán)境變量->系統(tǒng)變量中添加以下環(huán)境變量(假定你的j2sdk安裝在c:\j2sdk1.5.0):
JAVA_HOME=c:\j2sdk1.5.0
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(.;一定不能少,因?yàn)樗懋?dāng)前路徑)
path=%JAVA_HOME%\bin
接著可以寫一個(gè)簡(jiǎn)單的java程序來(lái)測(cè)試J2SDK是否已安裝成功:
public class Test{
public static void main(String args[]){
System.out.println("This is a test program.");
}
}
將上面的這段程序保存為文件名為Test.java的文件。
然后打開命令提示符窗口,cd到你的Test.java所在目錄,然后鍵入下面的命令
javac Test.java
java Test
此時(shí)如果看到打印出來(lái)This is a test program.的話說(shuō)明安裝成功了,如果沒(méi)有打印出這句話,你需要仔細(xì)檢查一下你的配置情況。
2.安裝Tomcat后,在我的電腦->屬性->高級(jí)->環(huán)境變量->系統(tǒng)變量中添加以下環(huán)境變量(假定你的tomcat安裝在c:\tomcat):
CATALINA_HOME=c:\tomcat
CATALINA_BASE=c:\tomcat
然后修改環(huán)境變量中的classpath,把tomat安裝目錄下的common\lib下的(可以根據(jù)實(shí)際追加)servlet.jar追加到classpath中去,修改后的classpath如下:
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet.jar;
接著可以啟動(dòng)tomcat,在IE中訪問(wèn)http://localhost:8080,如果看到tomcat的歡迎頁(yè)面的話說(shuō)明安裝成功了。
第三步:建立自己的jsp app目錄
1.到Tomcat的安裝目錄的webapps目錄,可以看到ROOT,examples, tomcat-docs之類Tomcat自帶的的目錄;
2.在webapps目錄下新建一個(gè)目錄,起名叫myapp;
3.myapp下新建一個(gè)目錄WEB-INF,注意,目錄名稱是區(qū)分大小寫的;
4.WEB-INF下新建一個(gè)文件web.xml,內(nèi)容如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd
">
<web-app>
<display-name>My Web Application</display-name>
<description>
A application for test.
</description>
</web-app>
5.在myapp下新建一個(gè)測(cè)試的jsp頁(yè)面,文件名為index.jsp,文件內(nèi)容如下:
<html><body><center>
Now time is: <%=new java.util.Date()%>
</center></body></html>
6.重啟Tomcat
7.打開瀏覽器,輸入http://localhost:8080/myapp/index.jsp 看到當(dāng)前時(shí)間的話說(shuō)明就成功了。
第四步:建立自己的Servlet:
1.用你最熟悉的編輯器(建議使用有語(yǔ)法檢查的java ide)新建一個(gè)servlet程序,文件名為Test.java,文件內(nèi)容如下:
package test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out=response.getWriter();
out.println("<html><body><h1>This is a servlet test.</h1></body></html>");
out.flush();
}
}
2 .編譯
將Test.java放在c:\test下,使用如下命令編譯:
C:\Test>javac Test.java
然后在c:\Test下會(huì)產(chǎn)生一個(gè)編譯后的servlet文件:Test.class
3 .將結(jié)構(gòu)test\Test.class剪切到%CATALINA_HOME%\webapps\myapp\WEB-INF\classes下,也就是剪切那個(gè)test目錄到classes目錄下,如果classes目錄不存在,就新建一個(gè)。 現(xiàn)在webapps\myapp\WEB-INF\classes下有test\Test.class的文件目錄結(jié)構(gòu)
4 .修改webapps\myapp\WEB-INF\web.xml,添加servlet和servlet-mapping
編輯后的web.xml如下所示,紅色為添加的內(nèi)容:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"<web-app>
<display-name>My Web Application</display-name>
<description>
A application for test.
</description>
<servlet>
<servlet-name>Test</servlet-name>
<display-name>Test</display-name>
<description>A test Servlet</description>
<servlet-class>test.Test</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Test</servlet-name>
<url-pattern>/Test</url-pattern>
</servlet-mapping>
</web-app>
這段話中的servlet這一段聲明了你要調(diào)用的Servlet,而servlet-mapping則是將聲明的servlet"映射"到地址/Test上
5 .好了,重啟動(dòng)Tomcat,啟動(dòng)瀏覽器,輸入http://localhost:8080/myapp/Test 如果看到輸出This is a servlet test.就說(shuō)明編寫的servlet成功了。
注意:修改了web.xml以及新加了class,都要重啟Tomcat
第四步:建立自己的Bean:
1.用你最熟悉的編輯器(建議使用有語(yǔ)法檢查的java ide)新建一個(gè)java程序,文件名為TestBean.java,文件內(nèi)容如下:
package test;
public class TestBean{
private String name = null;
public TestBean(String strName_p){
this.name=strName_p;
}
public void setName(String strName_p){
this.name=strName_p;
}
public String getName(){
return this.name;
}
}
2 .編譯
將TestBean.java放在c:\test下,使用如下命令編譯:
C:\Test>javac TestBean.java
然后在c:\Test下會(huì)產(chǎn)生一個(gè)編譯后的bean文件:TestBean.class
3 .將TestBean.class文件剪切到 %CATALINA_HOME%\webapps\myapp\WEB-INF\classes\test下,
4 .新建一個(gè)TestBean.jsp文件,文件內(nèi)容為:
<%@ page import="test.TestBean" %>
<html><body><center>
<%
TestBean testBean=new TestBean("This is a test java bean.");
%>
Java bean name is: <%=testBean.getName()%>
</center></body></html>
5 .好了,重啟Tomcat,啟動(dòng)瀏覽器,輸入http://localhost:8080/myapp/TestBean.jsp 如果看到輸出Java bean name is: This is a test java bean.就說(shuō)明編寫的Bean成功了。
這樣就完成了整個(gè)Tomcat下的jsp、servlet和javabean的配置。接下來(lái)需要做的事情就是多看書、多讀別人的好代碼,自己多動(dòng)手寫代碼以增強(qiáng)自己在這方面開發(fā)的能力了。
jvm應(yīng)填寫到
c:\j2sdk\bin
給你一個(gè)簡(jiǎn)單的配置::::
JSP環(huán)境配置心得
首先要說(shuō)的是,使用jdk+tomcat完全可以配置我們的jsp服務(wù)器,不再需要其實(shí)任何東東,有很多文章介紹了Apache,其實(shí)根本用不著,一般的學(xué)習(xí)調(diào)試tomcat完全可以勝任了。
安裝jdk后,tomcat在安裝之前會(huì)自動(dòng)找到j(luò)dk的安裝路徑,一路點(diǎn)擊"下一步",經(jīng)過(guò)一段時(shí)間的文件復(fù)制,最后"close",完成comcat的安裝。
您最好去下載一個(gè)版本較高的tomcat,比如4.1以上的,因?yàn)樗恍枰O(shè)置太多的系統(tǒng)變量,右擊"我的電腦",選擇"屬性"->"高級(jí)"->"環(huán)境變量"->"系統(tǒng)變量",新建一個(gè)TOMCAT_HOME,值設(shè)置成你的tomcat所在的路徑,比如:D:\Program Files\Apache Group\Tomcat 5.5,配置完成。
從開始菜單中找到tomcat選項(xiàng),一般打開順序是:開始->程序->Apache Tomcat 5.5,選擇"Start Tomcat",讓jsp服務(wù)器開始運(yùn)行,此時(shí)會(huì)打開一個(gè)類似Dos的窗口,會(huì)顯示一些相關(guān)的信息。
如果您使用代理上網(wǎng),一定要先撤掉代理,不然您的jsp程序永遠(yuǎn)也得不到執(zhí)行。如果不是代理的,這一步就跳過(guò)了。
打開瀏覽器,在地址欄中輸入:http://localhost:8080,如果看到有老虎(我也不知道是老虎還是貓)的畫面,恭喜您,您成功了一半。
先來(lái)享受一下成功的喜悅吧,請(qǐng)輸入下面的代碼:
<html>
<head>
<title>First Page</title>
</head>
<body>
<H3>Today is: h
<%= new java.util.Date() %>
</H3>
</body>
</html>
將該程序保存為:First.jsp,放到Tomcat的ROOT目錄下,然后在瀏覽器的地址欄中輸入:http://localhost:8080/First.jsp,(First.jsp跟我們保存的文件名的大小寫要一致)回車,如果不出意外,應(yīng)該可以看到形如Today is: h Fri Apr 11 08:32:38 CST 2003 的結(jié)果。
注意:ROOT是tomcat的默認(rèn)虛擬目錄,如果要改成自己的虛擬目錄怎么辦呢?請(qǐng)繼續(xù)往下看吧。
要改成自己的虛擬目錄,就要請(qǐng)出server.xml來(lái)了,該文件是一個(gè)配置文件,在Tomcat\conf目錄下,使用任何文本編輯軟件都能打開它,我們先找到下面一句:
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
port="8080" minProcessors="5" maxProcessors="75"
enableLookups="true" redirectPort="8443"
acceptCount="100" debug="0" connectionTimeout="20000"
useURIValidationHack="false" disableUploadTimeout="true" />
這里的port="8080"就是端口,我們完全可以用別的端口來(lái)代替,但不能是被系統(tǒng)占用的端口(0--1023),這里簡(jiǎn)單提一下。
下面我們?cè)偻抡遥瑫?huì)發(fā)現(xiàn)以下的語(yǔ)句:
</Context>
</Host>
我們就應(yīng)該找到這兩個(gè)語(yǔ)句,如果不懂E文,您就認(rèn)定這兩個(gè)語(yǔ)句好了。然后我們將該語(yǔ)句更改如下:
</Context>
<Context path="/myjsp" debug="0" docBase="e:/myjsp" reloadable="true">
</Context>
</Host>
這里的path="/myjsp"就是我們就配置的虛擬目錄了,以后在地址欄中輸入http://localhost:8080/myjsp即可。而docBase="e:/myjsp" 則是機(jī)器本地路徑,他們通過(guò)這個(gè)語(yǔ)句形成一個(gè)映射關(guān)系,其它照抄。
將上面的First.jsp文件放到e:/myjsp目錄下,輸入http://localhost:8080/myjsp/First.jsp,是不是有一種喜上眉梢的感覺(jué)?
在論壇里我見得最多的就是很多人不知道javaBean文件放到哪里,老實(shí)說(shuō)開始我也不知道,更令人不解的是,十個(gè)人有九種不同的說(shuō)法,這更讓我們茫然。其實(shí)這問(wèn)題也不是我們想像的那么復(fù)雜,我們以一個(gè)例子說(shuō)明:
先建立一個(gè)java程序,代碼如下:
package hall;
public class SimpleBean {
private String message = "No message specified";
public String getMessage() {
return(message);
}
public void setMessage(String message) {
this.message = message;
}
}
保存為SimpleBean.java,編譯后會(huì)生成一個(gè)包,其實(shí)就相當(dāng)于一個(gè)目錄,也就是SimpleBean.class會(huì)存放在hall目錄中,暫且保存起來(lái),將來(lái)備用。
再輸入以下代碼:
<HTML>
<HEAD>
<TITLE>Reusing JavaBeans in JSP</TITLE>
</HEAD>
<BODY>
<CENTER>
<TABLE BORDER=5>
<TR><TH CLASS="TITLE">
Reusing JavaBeans in JSP</TABLE>
</CENTER>
<P>
<jsp:useBean id="test" class="hall.SimpleBean" />
<jsp:setProperty name="test" property="message" value="Hello WWW" />
<H1>Message: <I>
<jsp:getProperty name="test" property="message" />
</I></H1>
</BODY>
保存在我們剛才建立的虛擬目錄e:/myjsp下面,并命名為:BeanTest.jsp。
現(xiàn)在我們應(yīng)該將hall(包)目錄放在哪兒呢?別急,我們先在e:/myjsp下建立一個(gè)文件夾WEB-INF,然后再在WEB-INF下建立一個(gè)classes文件夾,最后將hall目錄放到classes下,當(dāng)然,hall下的字節(jié)碼文件SimpleBean.class也一并要移過(guò)來(lái),而SimpleBean.java就和BeanTest.jsp放到同一目錄吧(可以不需要放的,自己試試)。
重新啟動(dòng)機(jī)器(如果您試了好多次都不行,這一步一定要做),在瀏覽器中輸入:http://localhost:8080/myjsp/BeanTest.jsp,您看到了什么?呵,別告訴我您什么都沒(méi)看到,那肯定是您設(shè)置的問(wèn)題了。
?1、JAVA的安裝:
正常安裝JDK,完成后添加系統(tǒng)變量JAVA_HOME,其值為JDK的根目錄,如C:\J2SDK1.4.2(TOMCAT安裝時(shí)使用此變量捕獲JDK)
2、TOMCAT的安裝:
A:運(yùn)行jakarta-tomcat-5.0.12.exe文件,自動(dòng)捕獲JDK
B:解壓縮jakarta-tomcat-5.0.12.zip,解壓的過(guò)程既是安裝的過(guò)程,
安裝完成后設(shè)置系統(tǒng)變量:CATALINA_HOME,它是TOMCAT的安裝目錄,如果沒(méi)有進(jìn)行設(shè)置,則在TOMCAT第一次啟動(dòng)時(shí)自動(dòng)設(shè)置
3、TOMCAT的測(cè)試:
A啟動(dòng):如果安裝時(shí)是.EXE文件,則會(huì)在開始菜單中出現(xiàn)TOMCAT的菜單,如果解壓縮安裝則在安裝目錄的BIN目錄下有STARTUP.BAT
B關(guān)閉:如果安裝時(shí)是.EXE文件,則會(huì)在開始菜單中出現(xiàn)TOMCAT的菜單,如果解壓縮安裝則在安裝目錄的BIN目錄下有SHUTDOWN.BAT
C測(cè)試:TOMCAT服務(wù)器啟動(dòng)后,瀏覽器中輸入HTTP://LOCALHOST:8080
若要改變?cè)L問(wèn)端口號(hào),則在CONF目錄下將SERVER.XML中CONNECTOR元素的PORT屬性值改變即可。
4、TOMCAT目錄結(jié)構(gòu)
bin 存放啟動(dòng)和關(guān)閉tomcat腳本
conf 包含不同的配置文件,server.xml(Tomcat的主要配置文件)和web.xml
SERVER? 包含3個(gè)子目錄classes,lib,webapps
server/classes? 各種類文件,默認(rèn)為空
server/lib?? 存放tomcat服務(wù)器所需的各種JAR文件
server/webapps? 存放tomcat自帶的兩個(gè)web應(yīng)用案例:admin? manager
common? tomcat服務(wù)器以及所有web應(yīng)用都可以訪問(wèn)的JAR文件
shared? 所有web應(yīng)用都可以訪問(wèn)的JAR文件
work 存放jsp編譯后產(chǎn)生的class文件
logs 存放日志文件
webapp 存放應(yīng)用程序示例,以后你要部署的應(yīng)用程序也要放到此目錄 (重要)
5、WEB應(yīng)用程序的目錄結(jié)構(gòu)
在WEB上發(fā)布的J2EE應(yīng)用程序都有自己特定的目錄結(jié)構(gòu)
假設(shè)創(chuàng)建一名為HELLOAPP的WEB項(xiàng)目
HELLOAPP:WEB應(yīng)用根目錄,所有JSP\HTML等文件均存放于此
HELLOAPP/WEB-INF? 存放WEb應(yīng)用的發(fā)布描述文件web.xml
HELLOAPP/WEB-INF/classes 存放各種class文件,servlet類文件也存放于此
HELLOAPP/WEB-INF/lib? 存放WEb應(yīng)用所需的各種JAR文件
6、web.xml文件配置
參見conf目錄下web.xml
7、server.xml文件配置(重要的配置)
server port 指定一個(gè)端口,這個(gè)端口負(fù)責(zé)監(jiān)聽關(guān)閉tomcat的請(qǐng)求
shutdown 指定向端口發(fā)送的命令字符串
service name 指定service的名字
Connector
(表示客戶端和service之間的連接) port 指定服務(wù)器端要?jiǎng)?chuàng)建的端口號(hào),并在這個(gè)斷口監(jiān)聽來(lái)自客戶端的請(qǐng)求
minProcessors 服務(wù)器啟動(dòng)時(shí)創(chuàng)建的處理請(qǐng)求的線程數(shù)
maxProcessors 最大可以創(chuàng)建的處理請(qǐng)求的線程數(shù)
enableLookups 如果為true,則可以通過(guò)調(diào)用request.getRemoteHost()進(jìn)行DNS查詢來(lái)得到遠(yuǎn)程客戶端的實(shí)際主機(jī)名,若為false則不進(jìn)行DNS查詢,而是返回其ip地址
redirectPort 指定服務(wù)器正在處理http請(qǐng)求時(shí)收到了一個(gè)SSL傳輸請(qǐng)求后重定向的端口號(hào)
acceptCount 指定當(dāng)所有可以使用的處理請(qǐng)求的線程數(shù)都被使用時(shí),可以放到處理隊(duì)列中的請(qǐng)求數(shù),超過(guò)這個(gè)數(shù)的請(qǐng)求將不予處理
connectionTimeout 指定超時(shí)的時(shí)間數(shù)(以毫秒為單位)
Engine
(表示指定service中的請(qǐng)求處理機(jī),接收和處理來(lái)自Connector的請(qǐng)求) defaultHost 指定缺省的處理請(qǐng)求的主機(jī)名,它至少與其中的一個(gè)host元素的name屬性值是一樣的
Context
(表示一個(gè)web應(yīng)用程序,通常為WAR文件,關(guān)于WAR的具體信息見servlet規(guī)范) docBase 應(yīng)用程序的路徑或者是WAR文件存放的路徑
path 表示此web應(yīng)用程序的url的前綴,這樣請(qǐng)求的url為http://localhost:8080/path/****
reloadable 這個(gè)屬性非常重要,如果為true,則tomcat會(huì)自動(dòng)檢測(cè)應(yīng)用程序的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動(dòng)裝載新的應(yīng)用程序,我們可以在不重起tomcat的情況下改變應(yīng)用程序
host
(表示一個(gè)虛擬主機(jī))
name 指定主機(jī)名
appBase 應(yīng)用程序基本目錄,即存放應(yīng)用程序的目錄
unpackWARs 如果為true,則tomcat會(huì)自動(dòng)將WAR文件解壓,否則不解壓,直接從WAR文件中運(yùn)行應(yīng)用程序
Logger
(表示日志,調(diào)試和錯(cuò)誤信息)
className 指定logger使用的類名,此類必須實(shí)現(xiàn)org.apache.catalina.Logger 接口
prefix 指定log文件的前綴
suffix 指定log文件的后綴
timestamp 如果為true,則log文件名中要加入時(shí)間,如下例:localhost_log.2001-10-04.txt
Realm
(表示存放用戶名,密碼及role的數(shù)據(jù)庫(kù))
className 指定Realm使用的類名,此類必須實(shí)現(xiàn)org.apache.catalina.Realm接口
Valve
(功能與Logger差不多,其prefix和suffix屬性解釋和Logger 中的一樣)
className 指定Valve使用的類名,如用org.apache.catalina.valves.AccessLogValve類可以記錄應(yīng)用程序的訪問(wèn)信息
directory 指定log文件存放的位置
pattern 有兩個(gè)值,common方式記錄遠(yuǎn)程主機(jī)名或ip地址,用戶名,日期,第一行請(qǐng)求的字符串,HTTP響應(yīng)代碼,發(fā)送的字節(jié)數(shù)。combined方式比common方式記錄的值更多
?
在以上的設(shè)置項(xiàng)目中Context是最重要也是使用最頻繁的元素,他代表了運(yùn)行在主機(jī)上的每個(gè)web應(yīng)用。一個(gè)主機(jī)上可以用 多個(gè)web應(yīng)用,每個(gè)web應(yīng)用對(duì)應(yīng)一個(gè)唯一的地址,而地址在Context元素的path屬性中設(shè)置
path:訪問(wèn)web程序的url入口
docbase:制定web程序的路徑,如果web應(yīng)用是開放目錄結(jié)構(gòu),則為根目錄,若為war文件則為war文件的路徑
例如:
<Context path="/helloapp" docbase="helloapp" reloadable="true"/>
當(dāng)設(shè)置jsp文件時(shí),只需把文件放到web應(yīng)用根目錄下即可訪問(wèn),而設(shè)置servlet還要在web.xml中設(shè)置
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=813657
1.one page:? action_demo.html
<html>
<head></head>
<body>
<form? name="input" action="html_form_action.html" method="get">
Usename:
<input type="text" name="user" value="admin"><input type="submit" value="Submit">
</form>
</body>
</html>
2.two page:? html_from_action.html
<html>
<head></head>
<script language="javascript">
function getparastr(strname)
? {
?? var hrefstr,pos,parastr,para,tempstr;
?? hrefstr = window.location.href;
?? pos = hrefstr.indexOf("?")
?? parastr = hrefstr.substring(pos+1);
?? para = parastr.split("&");
?? tempstr="";
?? for(i=0;i<para.length;i++)
?? {
??? tempstr = para[i];
??? pos = tempstr.indexOf("=");
??? if(tempstr.substring(0,pos) == strname)
??? {
???? return tempstr.substring(pos+1);
???? }
?? }
?? return null;
? }
// 獲取program參數(shù)
//var userstr = getparastr("user");
//document.write(userstr);
//用得到的值給form中的文本框賦值?
function getname()
{
var userstr = getparastr("user");
document.fr1.input.value=userstr;
}
</script>
<body>
<form name="fr1" >
你的名字是:
<input type="text" name="input" >
<input type="button" name="bt1" value="查看用戶名" onclick="getname()">
</form>
</body>
</html>
來(lái)自:
Matrix
?:
http://www.matrix.org.cn/resource/article/43/43811.html
你需要精通面向?qū)ο蠓治雠c設(shè)計(jì)(OOA/OOD)、涉及模式(GOF,J2EEDP)以及綜合模式。你應(yīng)該十分了解UML,尤其是class,object,interaction以及state diagrams.
你需要學(xué)習(xí)JAVA語(yǔ)言的基礎(chǔ)知識(shí)以及它的核心類庫(kù)(collections,serialization,streams,networking,multithreading,reflection,event,handling,NIO,localization,以及其他)。
你應(yīng)該了解JVM,class loaders,class reflect,以及垃圾回收的基本工作機(jī)制等。你應(yīng)該有能力反編譯一個(gè)類文件并且明白一些基本的匯編指令。
如果你將要寫客戶端程序,你需要學(xué)習(xí)WEB的小應(yīng)用程序(applet),必需掌握GUI設(shè)計(jì)的思想和方法,以及桌面程序的SWING,AWT,SWT。你還應(yīng)該對(duì)UI部件的JAVABEAN組件模式有所了解。JAVABEANS也被應(yīng)用在JSP中以把業(yè)務(wù)邏輯從表現(xiàn)層中分離出來(lái)。
你需要學(xué)習(xí)java數(shù)據(jù)庫(kù)技術(shù),如JDBC API并且會(huì)使用至少一種persistence/ORM構(gòu)架,例如Hibernate, JDO, CocoBase, TopLink,Inside Liberator(國(guó)產(chǎn)JDO 紅工廠軟件)或者iBatis。你還應(yīng)該了解對(duì)象關(guān)系的阻抗失配的含義,以及它是如何影響業(yè)務(wù)對(duì)象的與關(guān)系型數(shù)據(jù)庫(kù)的交互,和它的運(yùn)行結(jié)果,還需要掌握不同的數(shù)據(jù)庫(kù)產(chǎn)品運(yùn)用,比如: oracle,mysql,ms sql server.
你需要學(xué)習(xí)JAVA的沙盒安全模式(class loaders, byte code verification, managers, policy and permissions, code signing, digital signatures, cryptography, certification, Kerberos,以及其他)還有不同的安全/認(rèn)證API,例如JAAS( Java Authentication and Authorization Service), JCE (Java Cryptography Extension), JSSE (Java Secure Socket Extension), 以及 JGSS (Java General Security Service).
你需要學(xué)習(xí)Servlets, JSP, 以及JSTL(Standard Tag Libraries)和可以選擇的第三方Tag Libraries。
你需要熟悉主流的網(wǎng)頁(yè)框架,例如JSF, Struts, Tapestry, Cocoon, WebWork, 以及他們下面的涉及模式,如MVC/MODEL2.
你需要學(xué)習(xí)如何使用及管理WEB服務(wù)器,例如tomcat,resin,Jrun,并且知道如何在其基礎(chǔ)上擴(kuò)展和維護(hù)WEB程序。
你需要學(xué)習(xí)分布式對(duì)象以及遠(yuǎn)程API,例如RMI和RMI/IIOP。
你需要掌握各種流行中間件技術(shù)標(biāo)準(zhǔn)和與java結(jié)合實(shí)現(xiàn),比如Tuxedo、CROBA,當(dāng)然也包括java EE 本身.
你需要學(xué)習(xí)最少一種的XML API,例如JAXP (Java API for XML Processing), JDOM (Java for XML Document Object Model), DOM4J, 或 JAXR (Java API for XML Registries).
你應(yīng)該學(xué)習(xí)如何利用JAVA API和工具來(lái)構(gòu)建Web Service。例如JAX-RPC (Java API for XML/RPC), SAAJ (SOAP with Attachments API for Java), JAXB (Java Architecture for XML Binding), JAXM (Java API for XML Messaging), JAXR (Java API for XML Registries), 或者 JWSDP (Java Web Services Developer Pack)。
你需要學(xué)習(xí)一門輕量級(jí)應(yīng)用程序框架,例如Spring, PicoContainer, Avalon, 以及它們的IoC/DI 風(fēng)格(setter, constructor, interface injection)。
你需要熟悉不同的J2EE技術(shù),例如JNDI (Java Naming and Directory Interface), JMS (Java Message Service), JTA/JTS (Java Transaction API/Java Transaction Service), JMX (Java Management eXtensions), 以及 JavaMail.
你需要學(xué)習(xí)企業(yè)級(jí)Java Beans(EJB)以及它們的不同組件模式:Stateless/Stateful Session Beans, Entity Beans (包含Bean-Managed Persistence [BMP] 或者 Container-Managed Persistence [CMP] 和它的 EJB-QL), 或者M(jìn)essage-Driven Beans (MDB).
你需要學(xué)習(xí)如何管理與配置一個(gè)J2EE應(yīng)用程序服務(wù)器,如WebLogic ,JBoss等,并且利用它的附加服務(wù),例如簇類,連接池以及分布式處理支援。你還需要了解如何在它上面封裝和配置應(yīng)用程序并且能夠監(jiān)控、調(diào)整它的性能。
你需要熟悉面向方面的程序設(shè)計(jì)以及面向?qū)傩缘某绦蛟O(shè)計(jì)(這兩個(gè)都被很容易混淆的縮寫為AOP),以及他們的主流JAVA規(guī)格和執(zhí)行。例如AspectJ 和AspectWerkz。
你需要熟悉對(duì)不同有用的API和framework等來(lái)為你服務(wù)。例如Log4J (logging/tracing), Quartz (scheduling), JGroups (network group communication), JCache (distributed caching), Lucene (full-text search), Jakarta Commons等等。
如果你將要對(duì)接或者正和舊的系統(tǒng)或者本地平臺(tái),你需要學(xué)習(xí)JNI (Java Native Interface) and JCA (Java Connector Architecture).
你需要熟悉JINI技術(shù)以及與它相關(guān)的分布式系統(tǒng),比如掌握CROBA。
你需要Java Community Process(JCP)以及他的不同Java Specification Requests (JSRs), 例如 Portlets (168), JOLAP (69), Data Mining API (73), 等等。
你應(yīng)該熟練掌握一種JAVA IDE例如sunOne ,netBeans ,IntelliJ IDEA或者Eclipse。(有些人更喜歡VI或EMACS來(lái)編寫文件。隨便你用什么了:))
JAVA(精確的說(shuō)是有些配置)是冗長(zhǎng)的,它需要很多的人工代碼(例如EJB),所以你需要熟悉代碼生成工具,例如XDoclet。
你需要熟悉一種單元測(cè)試體系(JNunit),并且學(xué)習(xí)不同的生成、部署工具(Ant, Maven)。
你需要熟悉一些在JAVA開發(fā)中經(jīng)常用到的軟件工程過(guò)程。例如RUP (Rational Unified Process) and Agile methodologies.
你需要能夠深入了解加熟練操作和配置不同的操作系統(tǒng),比如GNU/linux ,sun solaris,mac OS等,做為跨平臺(tái)軟件的開發(fā)者。
你還需要緊跟java發(fā)展的步伐,比如現(xiàn)在可以深入的學(xué)習(xí)java ME ,以及各種java 新規(guī)范,技術(shù)的運(yùn)用,如 新起的web富客戶端技術(shù)。
你必需要對(duì)open source有所了解,因?yàn)橹辽賘ava 的很多技術(shù)直接是靠開源來(lái)驅(qū)動(dòng)發(fā)展的 ,如 java 3D技術(shù)。