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ò)兩次,一直沒有找到很好的解決方案,這個(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判斷日期類型比較麻煩,所以就沒有做日期類型校驗(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。 那么有沒有一種除了應(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ò)沒關(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.女:您好,您撥叫的用戶沒有開機(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)這女的沒聽清","(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ó)人才沒有斷層,只是待遇和職稱斷層","(D)經(jīng)常陪李嵐清打敲三家和拱豬,對(duì)高校合并做出突出貢獻(xiàn)"},
??{"(A)人妖是指:媽媽還健在就去做了和尚的妖精","(B)人和妖精沒有本質(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ō)明安裝成功了,如果沒有打印出這句話,你需要仔細(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,是不是有一種喜上眉梢的感覺?
在論壇里我見得最多的就是很多人不知道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,您看到了什么?呵,別告訴我您什么都沒看到,那肯定是您設(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的安裝目錄,如果沒有進(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ù)。
<!DOCTYPE html PUBliC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"<html xmlns="<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>css菜單演示</title>
<style type="text/css">
<!--
*{margin:0;padding:0;border:0;}
body {
??? font-family: arial, 宋體, serif;
??????? font-size:12px;
}
#nav {
???? line-height: 24px;? list-style-type: none; background:#666;
}
#nav a {
??? display: block; width: 80px; text-align:center;
}
#nav a:link? {
??? color:#666; text-decoration:none;
}
#nav a:visited? {
??? color:#666;text-decoration:none;
}
#nav a:hover? {
??? color:#FFF;text-decoration:none;font-weight:bold;
}
#nav li {
??? float: left; width: 80px; background:#CCC;
}
#nav li a:hover{
??? background:#999;
}
#nav li ul {
??? line-height: 27px;? list-style-type: none;text-align:left;
??? left: -999em; width: 180px; position: absolute;
}
#nav li ul li{
??? float: left; width: 180px;
??? background: #F6F6F6;
}
#nav li ul a{
??? display: block; width: 156px;text-align:left;padding-left:24px;
}
#nav li ul a:link? {
??? color:#666; text-decoration:none;
}
#nav li ul a:visited? {
??? color:#666;text-decoration:none;
}
#nav li ul a:hover? {
??? color:#F3F3F3;text-decoration:none;font-weight:normal;
??? background:#C00;
}
#nav li:hover ul {
??? left: auto;
}
#nav li.sfhover ul {
??? left: auto;
}
#content {
??? clear: left;
}
-->
</style>
<script type=text/javascript><!--//--><![CDATA[//><!--
function menuFix() {
??? var sfEls = document.getElementById("nav").getElementsByTagName("li");
??? for (var i=0; i<sfEls.length; i++) {
??????? sfEls[i].onmouseover=function() {
??????? this.className+=(this.className.length>0? " ": "") + "sfhover";
??????? }
??????? sfEls[i].onMouseDown=function() {
??????? this.className+=(this.className.length>0? " ": "") + "sfhover";
??????? }
??????? sfEls[i].onMouseUp=function() {
??????? this.className+=(this.className.length>0? " ": "") + "sfhover";
??????? }
??????? sfEls[i].onmouseout=function() {
??????? this.className=this.className.replace(new RegExp("( ?|^)sfhover\\b"),
"");
??????? }
??? }
}
window.onload=menuFix;
//--><!]]></script>
</head>
<body>
<ul id="nav">
<li><a href="#">產(chǎn)品介紹</a>
??? <ul>
??? <li><a href="#">產(chǎn)品一</a></li>
??? <li><a href="#">產(chǎn)品一</a></li>
??? <li><a href="#">產(chǎn)品一</a></li>
??? <li><a href="#">產(chǎn)品一</a></li>
??? <li><a href="#">產(chǎn)品一</a></li>
??? <li><a href="#">產(chǎn)品一</a></li>
??? </ul>
</li>
<li><a href="#">服務(wù)介紹</a>
??? <ul>
??? <li><a href="#">服務(wù)二</a></li>
??? <li><a href="#">服務(wù)二</a></li>
??? <li><a href="#">服務(wù)二</a></li>
??? <li><a href="#">服務(wù)二服務(wù)二</a></li>
??? <li><a href="#">服務(wù)二服務(wù)二服務(wù)二</a></li>
??? <li><a href="#">服務(wù)二</a></li>
??? </ul>
</li>
<li><a href="#">成功案例</a>
??? <ul>
??? <li><a href="#">案例三</a></li>
??? <li><a href="#">案例</a></li>
??? <li><a href="#">案例三案例三</a></li>
??? <li><a href="#">案例三案例三案例三</a></li>
??? </ul>
</li>
<li><a href="#">關(guān)于我們</a>
??? <ul>
??? <li><a href="#">我們四</a></li>
??? <li><a href="#">我們四</a></li>
??? <li><a href="#">我們四</a></li>
??? <li><a href="#">我們四111</a></li>
??? </ul>
</li>
<li><a href="#">在線演示</a>
??? <ul>
??? <li><a href="#">演示</a></li>
??? <li><a href="#">演示</a></li>
??? <li><a href="#">演示</a></li>
??? <li><a href="#">演示演示演示</a></li>
??? <li><a href="#">演示演示演示</a></li>
??? <li><a href="#">演示演示</a></li>
??? <li><a href="#">演示演示演示</a></li>
??? <li><a href="#">演示演示演示演示演示</a></li>
??? </ul>
</li>
<li><a href="#">聯(lián)系我們</a>
??? <ul>
??? <li><a href="#">聯(lián)系聯(lián)系聯(lián)系聯(lián)系聯(lián)系</a></li>
??? <li><a href="#">聯(lián)系聯(lián)系聯(lián)系</a></li>
??? <li><a href="#">聯(lián)系</a></li>
??? <li><a href="#">聯(lián)系聯(lián)系</a></li>
??? <li><a href="#">聯(lián)系聯(lián)系</a></li>
??? <li><a href="#">聯(lián)系聯(lián)系聯(lián)系</a></li>
??? <li><a href="#">聯(lián)系聯(lián)系聯(lián)系</a></li>
??? </ul>
</li>
</ul>
</body>
</html>
Jakarta-Struts是Apache軟件組織提供的一項(xiàng)開放源代碼項(xiàng)目,它為Java Web應(yīng)用提供了模型-視圖-控制器(MVC)框架,尤其適用于開發(fā)大型可擴(kuò)展的Web應(yīng)用. Struts為Web應(yīng)用提供了一個(gè)通用的框架,使得開發(fā)人員可以把精力集中在如何解決實(shí)際業(yè)務(wù)問(wèn)題上. 此外,Struts框架提供了許多可供擴(kuò)展和定制的地方使得應(yīng)用程序可以方便的擴(kuò)展框架,來(lái)更好的適應(yīng)用戶的實(shí)際需求.
本文是一篇介紹利用MyEclipse進(jìn)行Struts開發(fā)的基礎(chǔ)教程,通過(guò)詳細(xì)的描述和大量的圖片來(lái)展現(xiàn)Struts開發(fā)的具體過(guò)程. 這里所采用的是我們經(jīng)常會(huì)遇到的用戶登陸的實(shí)例,如果用戶登陸成功進(jìn)入程序的主界面(main.jsp),否則返回登陸頁(yè)面并提示錯(cuò)誤信息.
n??????? 創(chuàng)建Web項(xiàng)目
在菜單中依次點(diǎn)擊File→New→Project,然后在彈出的窗口中選擇J2EE→Web Project,啟動(dòng)Web項(xiàng)目創(chuàng)建向?qū)А?/span>
點(diǎn)擊下一步,在項(xiàng)目名稱中,我們輸入StrutsDemo,然后修改Context root URL為/hello,其他我們使用默認(rèn)的設(shè)置,最后點(diǎn)擊Finish按鈕完成創(chuàng)建工作.
在項(xiàng)目創(chuàng)建后,我們需要讓它支持Struts功能. 在菜單中選擇MyEclipse→Add Struts Capabilities. 在彈出的對(duì)話框中, 將Struts specification修改為1.2,將Base package for new classes修改為我們喜歡的包名,如com.study.struts,修改完成后點(diǎn)擊Finish按鈕.
在Package Explore中,我們可以看到增加了Struts能力后,MyEclipse在Web項(xiàng)目中增加了很多jar文件和tld文件,請(qǐng)參考下圖:
n??????? 創(chuàng)建JSP文件
在我們的登陸程序中一共需要兩個(gè)JSP文件. 一個(gè)是index.jsp,作為用戶登陸的界面和登陸失敗后的返回界面. 一個(gè)是main.jsp,作為登陸成功后的主界面.
在Package Explore中雙擊struts-config.xml將其打開,在源代碼窗口中點(diǎn)擊左側(cè)工具欄中的
,在彈出的JSP文件創(chuàng)建向?qū)е行薷奈募麨?/span>index.jsp,選擇5]Standard JSP using Struts 1.2 with a form模板,然后點(diǎn)擊Finish按鈕. MyEclipse會(huì)為我們創(chuàng)建一個(gè)名為index.jsp的帶一個(gè)Form的JSP文件.
按照同樣的方法創(chuàng)建main.jsp. 由于我們只是簡(jiǎn)單的在主界面中顯示成功登陸的信息,因此在創(chuàng)建的時(shí)候,我們選擇的是第一個(gè)缺省的模板.
JSP文件創(chuàng)建后,我們可以根據(jù)自己的需要來(lái)修改其中的內(nèi)容. 對(duì)于index.jsp,我們修改Form的action屬性和提交參數(shù)的名字, 并增加了標(biāo)簽,可參考下面的代碼:
??? <html:form action="/login.do" method="post" focus="login">
????? <center><html:errors/>center>
????? <table border="0">
??????? <tr>
????????? <td>Name:td>
????????? <td><html:text property="name" />td>
??????? tr>
??????? <tr>
????????? <td>Password:td>
????????? <td><html:password property="password" />td>
??????? tr>
??????? <tr>
????????? <td colspan="2" align="center"><html:submit />td>
??????? tr>
????? table>
html:form>
?????? 對(duì)于main.jsp,我們修改中的輸出信息,提示用戶登陸成功,代碼如下:
? ? <body>
?? ???? ?You have logged in!<br>
? ? body>
?????? 保存兩個(gè)JSP文件和struts-config.xml文件.
n??????? 創(chuàng)建ActionForm
在我們的登陸程序中需要用戶提交用戶名和密碼,因此我們需要?jiǎng)?chuàng)建一個(gè)ActionForm Bean來(lái)保存提交的HTML表單數(shù)據(jù).
將源代碼窗口中的標(biāo)簽切換到struts-config.xml,右上角的Outline窗口內(nèi)容如下:
選中其中的form-beans,右鍵單擊,在彈出的菜單中選擇New Form. 在Form Bean創(chuàng)建向?qū)?duì)話框中,輸入Use case的名字login,然后在下方的Form Properties中增加name和password兩個(gè)屬性.
?
n??????? 創(chuàng)建Action
?????? 在完成上面的創(chuàng)建后,我們接下來(lái)創(chuàng)建Action類. 在源代碼窗口中切換到struts-config.xml文件,點(diǎn)擊左側(cè)工具欄中的.?在彈出的創(chuàng)建向?qū)е休斎?/span>Use case名字為Login.
?????? 在對(duì)話框的下部Optional Details中,點(diǎn)擊Name行末的Browse按鈕,選中我們剛才創(chuàng)建的loginForm.
點(diǎn)擊Input Source行末的Browse按鈕,在彈出的對(duì)話框中選中index.jsp.
將Optional Details標(biāo)簽切換到Forwards,點(diǎn)擊Add按鈕增加一個(gè)局部的Forward.
這里的success是我們給Forward的名字,你也可以使用其它你喜歡的名字. 增加后如下:
完成新建Action的設(shè)置后如下圖:
點(diǎn)擊Finish按鈕后,MyEclipse會(huì)為我們創(chuàng)建一個(gè)名叫LoginAction.java的文件,我們可以根據(jù)自己的需要來(lái)實(shí)現(xiàn)具體的驗(yàn)證邏輯. 這里,我們僅僅通過(guò)登陸的名字是否為hello來(lái)判斷. 如果不是提示登陸失敗. 代碼參考如下:??
????????????? ActionMessages errors=new ActionMessages();
?????????????
????????????? LoginForm loginForm = (LoginForm) form;???????
????????????? String username=loginForm.getName();
?????????????
????????????? if(username.equals("hello")) {
???????????????????? return mapping.findForward("success");
????????????? } else {
???????????????????? errors.add("username",new ActionMessage("error.msg"));
???????????????????? saveErrors(request,errors);
???????????????????? return (new ActionForward(mapping.getInput()));
????????????? }
從上面的代碼中我們可以看到,當(dāng)用戶登陸失敗后會(huì)使用一個(gè)鍵值為error.msg的ActionMessage. 因此,我們?cè)?/span>Package Explore中找到ApplicationResources.properties文件并雙擊打開,輸入以下內(nèi)容并保存.
error.msg=Login Failed
在完成了上述所有的工作后,我們可以看到圖示化的struts-config.xml如下:
n??????? 部署和測(cè)試應(yīng)用程序
這里StrutsDemo的部署同其他的Web應(yīng)用程序一樣,我們就不在贅述了,具體的方法可以參閱MyEclipse系列文章的第二篇Web項(xiàng)目的開發(fā).
部署成功后,在IE的地址欄中輸入http://localhost:8080/hello/index.jsp并回車.
我們首先驗(yàn)證登陸失敗的場(chǎng)景. 當(dāng)我們輸入的用戶名不是hello時(shí),應(yīng)返回到登陸頁(yè)面并提示登陸失敗. 在Name中輸入abcd,點(diǎn)擊Submit按鈕.
我們可以看到又回到了登陸頁(yè)面,并且出現(xiàn)了Login Failed的提示信息. 修改用戶名為hello,然后點(diǎn)擊Submit按鈕.
完.
?????? 以一個(gè)很簡(jiǎn)單的 Web 應(yīng)用來(lái)說(shuō)明使用 MyEclipse 的 Web 服務(wù)器配置,應(yīng)用部署和調(diào)試過(guò)程。??????
? 一、準(zhǔn)備開發(fā)工具???????
???????? 這里使用 Eclipse 3.1.2 和 MyEclipse4.1.1 ,當(dāng)然 Java 通常都是用來(lái)開發(fā)網(wǎng)絡(luò)應(yīng)用的,那么 Web 服務(wù)器也就少不了了,這里使用tomcat5.0版本,當(dāng)然如果你沒有 J2SDK 那么所有的程序都沒法編譯運(yùn)行了,所以,你也去準(zhǔn)備一個(gè)吧,這里使用 J2SDK 1.5.0_06-b05 ,上,就無(wú)所謂,我們就可以使用所有的功能。??????????????
下載地址:???????
http://www.inspiresky.com/bbs/dispbbs.asp?boardID=13&ID=6356&page=1 ?????? http://www.inspiresky.com/bbs/dispbbs.asp?boardID=13&ID=3889&page=1 ?????? http://java.sun.com ?????? http://www.eclipse.org ?????? http://www.apache.org
http://www.myeclipseide.com/ContentExpress-display-ceid-10.html??????
里面有 MyEclipse 的注冊(cè)碼,這里提供的僅供個(gè)人學(xué)習(xí)研究使用,公司用戶請(qǐng)自行購(gòu)買序列號(hào)。???????
二、軟件的安裝和注冊(cè)??????????????
????? 首先要安裝 JDK ,我這里使用默認(rèn)安裝,目錄所有的都不改變, C:\Program Files\Java ,下面有兩個(gè)文件夾,一個(gè)是 jdk ,一徑之類的,請(qǐng)去網(wǎng)上查找相關(guān)資料吧,那個(gè)很多文章講了。
??????? Tomcat 的安裝,我們使用 Exe 版本的安裝文件,除了選擇目錄外,其他的都默認(rèn)好了,這里安裝到 D:\Tomcat5.5 ,注意中間為有時(shí)候有空格會(huì)很麻煩。
??????? Eclipse 的安裝比較方便,直接解包就行了,然后把解開的文件 Eclipse 文件夾放置到適當(dāng)?shù)陌惭b目錄,如這里是 D:/eclipse 。 pse.exe 文件,啟動(dòng) Eclipse ,設(shè)置 JDK 和工作路徑后就可以看到 Eclipse 的歡迎頁(yè)面了。這里我們不使用 Eclipse ,所以,把它關(guān)閉 ?????? ?????? MyEclipse 是一個(gè) Exe 安裝文件,有安裝向?qū)В苯与p擊安裝,選擇完 Eclipse 安裝目錄 D:/eclipse 和自身的安裝目錄,這里使用 pse ,然后一路 next 就行了。 ?????? ?????? 我們?cè)诔绦蚪M中可以找到 MyEclipse 程序組,點(diǎn)擊打開,如果你沒有默認(rèn)的工作路徑,選擇一個(gè)工作路徑后,會(huì)看到集成 e 的典型界面。 ?????? 最后需要輸入 MyEclipse 的注冊(cè)碼,打開菜單 window->preferences ,在對(duì)話框的菜單樹中打開 MyEclipse->Subscription 項(xiàng), n … 按鈕,然后輸入注冊(cè)用戶名和密碼即可。 ?????? OK ,到這里所有需要的軟件都安裝好了,下面我們來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的工程來(lái)說(shuō)明 MyEclipse 的應(yīng)用。
?????? 三、創(chuàng)建 Web 工程
????? 由于這里只講解 MyEclipse 的基本操作和設(shè)置,所以,就不做很復(fù)雜的項(xiàng)目了,完全可以觸類旁通的。
??????? 打開 MyEclipse 開發(fā)界面, File->New->Projects … ,打開新建項(xiàng)目對(duì)話框,選中 MyEclipse->J2EE Projects->Web Project ,點(diǎn) Project Details 的 Projects Name 中輸入 WebTest ,其他采用默認(rèn)值,注意這里的 Context root URL 為 /WebTest ,否則,你就要在 IE 才能使用了。注意這里的最下面有是否加入標(biāo)簽庫(kù)支持,我們選擇 JSTL1.1 。然后,點(diǎn)擊 Finish 按鈕完成項(xiàng)目創(chuàng)建。
??????? 我們察看我們新建的工程,需要的類都已經(jīng)自動(dòng)加載了進(jìn)來(lái),還有一個(gè) J2EE 的類環(huán)境變量,這就是使用 MyEclipse 的方便之?
?????? 四、新建 Hello 類 ?????? 選中工程項(xiàng)目 WebTest 下的 src 文件夾(注意是在 Package Explorer 下,如果這個(gè)找不到,去找 Eclipse 使用指南看吧, Window kage Explorer ),右鍵菜單 New->Package ,新建一個(gè)包 com.inspiresky.bean 。選中新建的包,右鍵菜單 New ->Class , Name 中輸 static void main 選項(xiàng),其他全部默認(rèn),點(diǎn)擊 Finish 按鈕完成類的創(chuàng)建。
編輯類的代碼,如下所示:
?package com.inspiresky.bean;
/* * Junsan * http://www.inspiresky.com/bbs */
public class Hello
{ private String message = "Hello World";
/** * @return Returns the message. */
public String getMessage()
{ ????????return message; }
/** * @param message The message to set. */
public void setMessage(String message)
{ ????????this.message = message; } }???????
??????? 注意這里 Bean 屬性的操作方法,可以先定義好屬性,然后,在編輯窗口右鍵菜單 Source->Generate Getters and Setters 框中選擇要生成 get 和 set 方法的屬性確定就可以了
?????? 五、創(chuàng)建 JSP 頁(yè)面
??????? 在 WebTest 工程中,選中 WebRoot 文件夾,右鍵菜單 New->JSP , File Name 修改為 index.jsp ,其他默認(rèn),點(diǎn)擊 Finish 按
??????? 編輯 JSP 文件的內(nèi)容如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<jsp:useBean id="hello" class="com.inspiresky.bean.Hello" scope="page"/>
<jsp:setProperty name="hello" property="message" value="Hello World!"/>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
? <head>
??? <base href="<%=basePath%>">
???
??? <title>My JSP 'index.jsp' starting page</title>
???
?<meta http-equiv="pragma" content="no-cache">
?<meta http-equiv="cache-control" content="no-cache">
?<meta http-equiv="expires" content="0">???
?<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
?<meta http-equiv="description" content="This is my page">
?<!--
?<link rel="stylesheet" type="text/css" href="styles.css">
?-->
? </head>
?
? <body>
? <jsp:getProperty name="hello" property="message" /><br>
??? This is my JSP page. <br>
? </body>
</html>
注意紅色部分為我們添加的代碼。好了我們的代碼已經(jīng)編寫完畢了。
??????? 六、配置 Tomcat 服務(wù)器
??????? Eclipse 菜單, Window->Preference… ,打開 Preference 對(duì)話框,找到菜單樹中 MyEclipse->Application Servers->Tomcatat 5 項(xiàng),在對(duì)話框中,選中 Enable 單選按鈕,然后點(diǎn)擊 Tomcat Home Directory 輸入框后的 Browse 按鈕,選擇 Tomcat 的安裝根目 omcat5.5 ,其它的框會(huì)自動(dòng)填充。點(diǎn)擊 Apply 按鈕。 ?????? 選中 Tomcat 5 中的 JDK 一項(xiàng),這里要特別注意,默認(rèn)的是 JRE 的運(yùn)行環(huán)境,這里要設(shè)定成 JDK 的,否則, MyEclipse 無(wú)法正常
也無(wú)法正常運(yùn)行 Tomcat 服務(wù)器。
?????????????? 我們點(diǎn)擊 Add 按鈕, JRE Name 中寫入 JDK1.5.0_06 ,然后在 Browse 選擇框中選擇 JDK 的根目錄,這里是 C:\Program Files\Java\jdk1.5.0_0 6 ,其他的默認(rèn),點(diǎn)擊 OK 按鈕。在 Tomcat JDK Name 中選擇我們剛才創(chuàng)建的那個(gè),就是 JDK1.5.0_06 。點(diǎn)擊 Apply 按鈕,每次都點(diǎn) e 出問(wèn)題,你不點(diǎn)這個(gè)跑到另一個(gè)配置頁(yè)面就會(huì)丟失上面的配置。
??????? 我們?cè)?Tomcat 5 的 Launch 中確保選中了 Debug 模式。
??????? 而 Paths 中就是一些類路徑設(shè)置,第一個(gè)是提前加載的類路徑,有些包一啟動(dòng)服務(wù)器初始化 Web Application 時(shí)就要用到第二個(gè)是運(yùn)行時(shí)才用到的;第三個(gè)是沒有打包的類,這里我們就不管了。
??????? 現(xiàn)在可以點(diǎn)擊 preference 對(duì)話框的 OK 按鈕了,完成 Tomcat 的配置。 ?????? 七、部屬 Web 應(yīng)用程序
??????? 這里就簡(jiǎn)單點(diǎn)了,我們選中 WebTest 工程的根目錄,右鍵菜單 MyEclipse->Add and Remove Projects Deployments… ,確保 Projects 為 WebTest ,點(diǎn)擊 Add 按鈕,在彈出對(duì)話框的 Server 中選擇 Tomcat 5 ,下面的兩個(gè)單選項(xiàng), Exploaded Archive 和分別是目錄方式部屬和包方式部屬,這個(gè)都是由 MyEclipse 來(lái)做的,我們使用目錄部署方式,不用打成 war 包,其他的不管它了鈕回到上一個(gè)頁(yè)面。
??????? 服務(wù)器指定了,下面來(lái)部署應(yīng)用程序。選中對(duì)話框服務(wù)器列表中的 Tomcat 5 項(xiàng),此時(shí),灰顯的按鈕變?yōu)榭捎茫渲?Remove 是移除部署和重新部署,我們點(diǎn)擊 Redeploy 按鈕,以后我們修改了工程也可以點(diǎn)此按鈕重新部署。這里我們可以點(diǎn)擊一下了。
??????? OK ,程序已經(jīng)部署完成了,下面要運(yùn)行調(diào)試了。
??????? 八、運(yùn)行調(diào)試程序?
?????? 在 Eclipse 的圖形菜單欄找到(這個(gè)按鈕左邊那個(gè)是重新部署按鈕,右邊是自掉的瀏覽器),點(diǎn)擊下拉按鈕,后點(diǎn)擊 Start 菜單,啟動(dòng) Tomcat 。 ?????? ?????? 等 Consol 窗口中提示 Tomcat 啟動(dòng)成功,我們就可以運(yùn)行我們的程序了。打開一個(gè) IE 瀏覽器窗口,輸入 http://localhost:8080/WebTes t/ ,我們可以看到如下信息:
??????? Hello World!???
???? This is my JSP page. 說(shuō)明運(yùn)行成功。
板橋里人 http://www.jdon.com 2005/06/20
J2EE學(xué)習(xí)者越來(lái)越多,J2EE本身技術(shù)不斷在發(fā)展,涌現(xiàn)出各種概念,本文章試圖從一種容易理解的角度對(duì)這些概念向初學(xué)者進(jìn)行解釋,以便掌握學(xué)習(xí)J2EE學(xué)習(xí)方向。
首先我們需要知道Java和J2EE是兩個(gè)不同概念,Java不只是指一種語(yǔ)言,已經(jīng)代表與微軟不同的另外一個(gè)巨大陣營(yíng),所以Java有時(shí)是指一種軟件系統(tǒng)的流派,當(dāng)然目前主要是.NET和Java兩大主流體系。
J2EE可以說(shuō)指Java在數(shù)據(jù)庫(kù)信息系統(tǒng)上實(shí)現(xiàn),數(shù)據(jù)庫(kù)信息系統(tǒng)從早期的dBase、到Delphi/VB等C/S結(jié)構(gòu),發(fā)展到B/S(Browser瀏覽器/Server服務(wù)器)結(jié)構(gòu),而J2EE主要是指B/S結(jié)構(gòu)的實(shí)現(xiàn)。
J2EE又是一種框架和標(biāo)準(zhǔn),框架類似API、庫(kù)的概念,但是要超出它們。如果需要詳細(xì)了解框架,可先從 設(shè)計(jì)模式 開始學(xué)習(xí)。
J2EE是一個(gè)虛的大的概念,J2EE標(biāo)準(zhǔn)主要有三種子技術(shù)標(biāo)準(zhǔn):WEB技術(shù)、EJB技術(shù)和JMS,談到J2EE應(yīng)該說(shuō)最終要落實(shí)到這三個(gè)子概念上。
這三種技術(shù)的每個(gè)技術(shù)在應(yīng)用時(shí)都涉及兩個(gè)部分:容器部分和應(yīng)用部分,Web容器也是指Jsp/Servlet容器,你如果要開發(fā)一個(gè)Web應(yīng)用,無(wú)論是編譯或運(yùn)行,都必須要有Jsp/Servlet庫(kù)或API支持(除了JDK/J2SE以外)。
Web技術(shù)中除了Jsp/Servlet技術(shù)外,還需要JavaBeans或Java Class實(shí)現(xiàn)一些功能或者包裝攜帶數(shù)據(jù),所以Web技術(shù)最初裸體簡(jiǎn)稱為Jsp/Servlet+JavaBeans系統(tǒng)。
談到JavaBeans技術(shù),就涉及到組件構(gòu)件技術(shù)(component),這是Java的核心基礎(chǔ)部分,很多軟件設(shè)計(jì)概念(設(shè)計(jì)模式)都是通過(guò)JavaBeans實(shí)現(xiàn)的。
JavaBeans不屬于J2EE概念范疇中,如果一個(gè)JavaBeans對(duì)象被Web技術(shù)(也就是Jsp/Servlet)調(diào)用,那么JavaBeans就運(yùn)行在J2EE的Web容器中;如果它被EJB調(diào)用,它就運(yùn)行在EJB容器中。
EJB(企業(yè)JavaBeans)是普通JavaBeans的一種提升和規(guī)范,因?yàn)槠髽I(yè)信息系統(tǒng)開發(fā)中需要一個(gè)可伸縮的性能和事務(wù)、安全機(jī)制,這樣能保證企業(yè)系統(tǒng)平滑發(fā)展,而不是發(fā)展到一種規(guī)模重新更換一套軟件系統(tǒng)。
至此,JavaBeans組件發(fā)展到EJB后,并不是說(shuō)以前的那種JavaBeans形式就消失了,這就自然形成了兩種JavaBeans技術(shù):EJB和POJO,POJO完全不同于EJB概念,指的是普通JavaBeans,而且這個(gè)JavaBeans不依附某種框架,或者干脆可以說(shuō):這個(gè)JavaBeans是你為這個(gè)應(yīng)用程序單獨(dú)開發(fā)創(chuàng)建的。
J2EE應(yīng)用系統(tǒng)開發(fā)工具有很多:如JBuilder、Eclipse等,這些IDE首先是Java開發(fā)工具,也就是說(shuō),它們首要基本功能是可以開發(fā)出JavaBeans或Java class,但是如果要開發(fā)出J2EE系統(tǒng),就要落實(shí)到要么是Web技術(shù)或EJB技術(shù),那么就有可能要一些專門模塊功能(如eclipse需要lomboz插件),最重要的是,因?yàn)镴2EE系統(tǒng)區(qū)分為容器和應(yīng)用兩個(gè)部分,所以,在任何開發(fā)工具中開發(fā)J2EE都需要指定J2EE容器。
J2EE容器分為WEB容器和EJB容器,Tomcat/Resin是Web容器;JBoss是EJB容器+Web容器等,其中Web容器直接使用Tomcat實(shí)現(xiàn)的。所以你開發(fā)的Web應(yīng)用程序可以在上面兩種容器運(yùn)行,而你開發(fā)的Web+EJB應(yīng)用則只可以在JBoss服務(wù)器上運(yùn)行,商業(yè)產(chǎn)品Websphere/Weblogic等和JBoss屬于同一種性質(zhì)。
J2EE容器也稱為J2EE服務(wù)器,大部分時(shí)它們概念是一致的。
如果你的J2EE應(yīng)用系統(tǒng)的數(shù)據(jù)庫(kù)連接是通過(guò)JNDI獲得,也就是說(shuō)是從容器中獲得,那么你的J2EE應(yīng)用系統(tǒng)基本與數(shù)據(jù)庫(kù)無(wú)關(guān),如果你在你的J2EE應(yīng)用系統(tǒng)耦合了數(shù)據(jù)庫(kù)JDBC驅(qū)動(dòng)的配置,那么你的J2EE應(yīng)用系統(tǒng)就有數(shù)據(jù)庫(kù)概念色彩,作為一個(gè)成熟需要推廣的J2EE應(yīng)用系統(tǒng),不推薦和具體數(shù)據(jù)庫(kù)耦合,當(dāng)然這其中如何保證J2EE應(yīng)用系統(tǒng)運(yùn)行性能又是體現(xiàn)你的設(shè)計(jì)水平了。
衡量J2EE應(yīng)用系統(tǒng)設(shè)計(jì)開發(fā)水平高低的標(biāo)準(zhǔn)就是:解耦性;你的應(yīng)用系統(tǒng)各個(gè)功能是否能夠徹底脫離?是否不相互依賴,也只有這樣,才能體現(xiàn)可維護(hù)性、可拓展性的軟件設(shè)計(jì)目標(biāo)。
為了達(dá)到這個(gè)目的,誕生各種框架概念,J2EE框架標(biāo)準(zhǔn)將一個(gè)系統(tǒng)劃分為WEB和EJB主要部分,當(dāng)然我們有時(shí)不是以這個(gè)具體技術(shù)區(qū)分,而是從設(shè)計(jì)上抽象為表現(xiàn)層、服務(wù)層和持久層,這三個(gè)層次從一個(gè)高度將J2EE分離開來(lái),實(shí)現(xiàn)解耦目的。
因此,我們實(shí)際編程中,也要將自己的功能向這三個(gè)層次上靠,做到大方向清楚,涇渭分明,但是沒有技術(shù)上約束限制要做到這點(diǎn)是很不容易的,因此我們還是必須借助J2EE具體技術(shù)來(lái)實(shí)現(xiàn),這時(shí),你可以使用EJB規(guī)范實(shí)現(xiàn)服務(wù)層和持久層,Web技術(shù)實(shí)現(xiàn)表現(xiàn)層;
EJB為什么能將服務(wù)層從Jsp/Servlet手中分離出來(lái),因?yàn)樗鼘?duì)JavaBeans編碼有強(qiáng)制的約束,現(xiàn)在有一種對(duì)JavaBeans弱約束,使用Ioc模式實(shí)現(xiàn)的(當(dāng)然EJB 3.0也采取這種方式),在Ioc模式誕生前,一般都是通過(guò)工廠模式來(lái)對(duì)JavaBeans約束,形成一個(gè)服務(wù)層,這也是是Jive這樣開源論壇設(shè)計(jì)原理之一。
由此,將服務(wù)層從表現(xiàn)層中分離出來(lái)目前有兩種可選架構(gòu)選擇:管理普通JavaBeans(POJO)框架(如Spring、 JdonFramework )以及管理EJB的EJB框架,因?yàn)镋JB不只是框架,還是標(biāo)準(zhǔn),而標(biāo)準(zhǔn)可以擴(kuò)展發(fā)展,所以,這兩種區(qū)別將來(lái)是可能模糊,被納入同一個(gè)標(biāo)準(zhǔn)了。 但是,個(gè)人認(rèn)為:標(biāo)準(zhǔn)制定是為某個(gè)目的服務(wù)的,總要犧牲一些換取另外一些,所以,這兩種架構(gòu)會(huì)長(zhǎng)時(shí)間并存。
這兩種架構(gòu)分歧也曾經(jīng)誕生一個(gè)新名詞:完全POJO的系統(tǒng)也稱為輕量級(jí)系統(tǒng)(lightweight),其實(shí)這個(gè)名詞本身就沒有一個(gè)嚴(yán)格定義,更多是一個(gè)吸引人的招牌,輕量是指容易學(xué)習(xí)容易使用嗎?按照這個(gè)定義,其實(shí)輕量Spring等系統(tǒng)并不容易學(xué)習(xí);而且EJB 3.0(依然叫EJB)以后的系統(tǒng)是否可稱為輕量級(jí)了呢?
前面談了服務(wù)層框架,使用服務(wù)層框架可以將JavaBeans從Jsp/Servlet中分離出來(lái),而使用表現(xiàn)層框架則可以將Jsp中剩余的JavaBeans完全分離,這部分JavaBeans主要負(fù)責(zé)顯示相關(guān),一般是通過(guò)標(biāo)簽庫(kù)(taglib)實(shí)現(xiàn),不同框架有不同自己的標(biāo)簽庫(kù),Struts是應(yīng)用比較廣泛的一種表現(xiàn)層框架。
這樣,表現(xiàn)層和服務(wù)層的分離是通過(guò)兩種框架達(dá)到目的,剩余的就是持久層框架了,通過(guò)持久層的框架將數(shù)據(jù)庫(kù)存儲(chǔ)從服務(wù)層中分離出來(lái)是其目的,持久層框架有兩種方向:直接自己編寫JDBC等SQL語(yǔ)句(如iBatis);使用O/R Mapping技術(shù)實(shí)現(xiàn)的Hibernate和JDO技術(shù);當(dāng)然還有EJB中的實(shí)體Bean技術(shù)。
持久層框架目前呈現(xiàn)百花齊放,各有優(yōu)缺點(diǎn)的現(xiàn)狀,所以正如表現(xiàn)層框架一樣,目前沒有一個(gè)框架被指定為標(biāo)準(zhǔn)框架,當(dāng)然,表現(xiàn)層框架現(xiàn)在又出來(lái)了一個(gè)JSF,它代表的頁(yè)面組件概念是一個(gè)新的發(fā)展方向,但是復(fù)雜的實(shí)現(xiàn)讓人有些忘而卻步。
在所有這些J2EE技術(shù)中,雖然SUN公司發(fā)揮了很大的作用,不過(guò)總體來(lái)說(shuō):網(wǎng)絡(luò)上有這樣一個(gè)評(píng)價(jià):SUN的理論天下無(wú)敵;SUN的產(chǎn)品用起來(lái)撞墻;對(duì)于初學(xué)者,特別是那些試圖通過(guò)或已經(jīng)通過(guò)SUN認(rèn)證的初學(xué)者,趕快擺脫SUN的陰影,立即開溜,使用開源領(lǐng)域的產(chǎn)品來(lái)實(shí)現(xiàn)自己的應(yīng)用系統(tǒng)。
最后,你的J2EE應(yīng)用系統(tǒng)如果采取上面提到的表現(xiàn)層、服務(wù)層和持久層的框架實(shí)現(xiàn),基本你也可以在無(wú)需深刻掌握設(shè)計(jì)模式的情況下開發(fā)出一個(gè)高質(zhì)量的應(yīng)用系統(tǒng)了。
還要注意的是: 開發(fā)出一個(gè)高質(zhì)量的J2EE系統(tǒng)還需要正確的業(yè)務(wù)需求理解,那么域建模提供了一種比較切實(shí)可行的正確理解業(yè)務(wù)需求的方法,相關(guān)詳細(xì)知識(shí)可從UML角度結(jié)合理解。
當(dāng)然,如果你想設(shè)計(jì)自己的行業(yè)框架,那么第一步從設(shè)計(jì)模式開始吧,因?yàn)樵O(shè)計(jì)模式提供你一個(gè)實(shí)現(xiàn)JavaBeans或類之間解耦參考實(shí)現(xiàn)方法,當(dāng)你學(xué)會(huì)了系統(tǒng)基本單元JavaBean或類之間解耦時(shí),那么系統(tǒng)模塊之間的解耦你就可能掌握,進(jìn)而你就可以實(shí)現(xiàn)行業(yè)框架的提煉了,這又是另外一個(gè)發(fā)展方向了。
以上理念可以總結(jié)為一句話:
J2EE開發(fā)三件寶: Domain Model(域建模)、patterns(模式)和framework(框架)。
推薦一套高質(zhì)量的J2EE開源系統(tǒng):
JPestore
如果初學(xué)者沒有理解,歡迎
繼續(xù)討論
,大膽提出你心中的疑問(wèn)。
參考文章:Java企業(yè)系統(tǒng)架構(gòu)選擇考量
Jdon Framework的服務(wù)調(diào)用命令模式實(shí)現(xiàn)
不解風(fēng)情的豬 |
2005-01-13 17:06 |
很多同志在學(xué)習(xí)新東西時(shí)候都是先講究招式--如何快速入門!對(duì)任何語(yǔ)言來(lái)說(shuō),學(xué)習(xí)我感覺分三個(gè)步驟。第一:快速掌握語(yǔ)言的配置 環(huán)境等。對(duì)java尤其如此。第二:開始把自己以前用其他語(yǔ)言寫的東西慢慢用新語(yǔ)言來(lái)實(shí)現(xiàn)。比如我以前是用ASP,后來(lái)因?yàn)槟承┰蛴肰B了,因?yàn)锳SP是BS的,VB呢卻是CS,如果快速進(jìn)入VB殿堂?這需要來(lái)找規(guī)律。用了VB后發(fā)現(xiàn)VB也有很多東西實(shí)現(xiàn)起來(lái)比較復(fù)雜與繁瑣,還有一些底層的不容易實(shí)現(xiàn),我第一感覺就是轉(zhuǎn)向其他的用其他來(lái)實(shí)現(xiàn)。比如RAD的話我選擇用Delphi,系統(tǒng)底層的如鉤子Hook 行置轉(zhuǎn)換我會(huì)選擇用C++,這樣學(xué)習(xí)的過(guò)程進(jìn)行不斷總結(jié)并且自己給自己找事做,我相信很快利用第二個(gè)步驟把基礎(chǔ)打扎實(shí)的。我在學(xué)習(xí)Delphi的時(shí)候是自己慢慢與VF和VB進(jìn)行比較來(lái)學(xué)習(xí)的。現(xiàn)在學(xué)習(xí)NET和JAVA我同樣是比較。把Delphi和Net比較,語(yǔ)言特性上,操作上等,并且把自己的Delphi一些認(rèn)識(shí)在Net上進(jìn)行比劃一下。拿Net的類庫(kù)和Java的比較。先進(jìn)在哪里不足在哪里,這樣下個(gè)步驟我就有的放矢。比如一個(gè)項(xiàng)目分布式的應(yīng)用。必須有客戶端,還有一些項(xiàng)目管理等。我會(huì)如何來(lái)做呢?我有了各種語(yǔ)言之間的差異比較后,然后思考一下就會(huì)拿出一個(gè)不錯(cuò)的方案。客戶端的話我會(huì)采用Delphi來(lái)做,因?yàn)镈elphi的開發(fā)周期的確比較短,再者我自己也積累了不少的資源,這樣做起來(lái)也會(huì)游刃有余,選擇C#也一樣,不過(guò)就是對(duì)C#精致的類庫(kù)還不能面面俱到的掌握。服務(wù)器端如果沒有平臺(tái)限制的話我當(dāng)然會(huì)采用ASP。Net或者JAVA,因?yàn)樽鯳eb服務(wù)用這兩個(gè)語(yǔ)言畢竟很不錯(cuò)。這樣一個(gè)項(xiàng)目雛形就出來(lái)了。學(xué)習(xí)第三個(gè)步驟:學(xué)習(xí)規(guī)劃。經(jīng)歷了以上幾個(gè)步驟,個(gè)人認(rèn)為就應(yīng)該可以獨(dú)當(dāng)一面,但是人的進(jìn)步則是逆水行舟不進(jìn)退,當(dāng)然成為高手后要什么我還不知道,因?yàn)槲疫€沒成為高手。 |
1.新建一個(gè)"swt/jface"項(xiàng)目
2.新建designer application Window文件
3.在可視界面加入MenuBar
4.再加入一個(gè)SubMenu名為File
5.分別加入兩個(gè)Menuitem 取名分別為OPen 和Quit
6.導(dǎo)入一個(gè)文本Text,并且Lines為Multi
7.分別雙擊OPen?與Quit ,這樣就注冊(cè)了事件處理方法"WidgetSelected"的SelectionListener監(jiān)聽器.出現(xiàn)如下代碼.
8.分別加入代碼:
??openMenuItem.addSelectionListener(new SelectionAdapter() {
???public void widgetSelected(final SelectionEvent e) {
????FileDialog fd = new FileDialog(shell, SWT.OPEN);
????String s = fd.open();
????if (s != null && !s.equals("")) {
?????FileReader fr;
?????try {
??????fr = new FileReader(s);
??????BufferedReader br = new BufferedReader(fr);
??????String s1 = br.readLine();
??????while (s1 != null) {
???????text.append(s1 + "\n");
???????s1 = br.readLine();
??????}
??????br.close();
??????fr.close();
?????} catch (IOException e1) {
??????e1.printStackTrace();
?????}
????}
???}
??});
??quitMenuItem.addSelectionListener(new SelectionAdapter() {
???public void widgetSelected(final SelectionEvent e) {
????shell.close();
???}
??});
9.運(yùn)行結(jié)果如下:
1.先安裝SWT Designer插件.
2.新建SWT/JFace項(xiàng)目
3.在可視窗口中Design中,進(jìn)行增加如下組件.
4.各選中文本組件在Events屬性中選中事件處理類型verity->text 并雙擊后面區(qū)域,這樣將到它進(jìn)行監(jiān)聽注冊(cè).
5.選中事件處理類型Selection->widgetselected并雙擊后面區(qū)域,這樣將到它進(jìn)行監(jiān)聽注冊(cè).
6.雙擊提交后進(jìn)入代碼編輯界面,輸入代碼:
??button.addSelectionListener(new SelectionAdapter() {
???public void widgetSelected(final SelectionEvent e) {
????
????String sname = name.getText();
????String spwd = pwd.getText();
????try {
?????Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
?????Connection con = DriverManager.getConnection(
???????"jdbc:odbc:test", "", "");
?????Statement stmt = con.createStatement();
?????ResultSet rs = stmt
???????.executeQuery("select * from userid where name='"+sname+"'and psw='"+spwd+"'");
?????if (rs.next()) {
??????MessageDialog.openInformation(shell, "",
????????"謝謝你的登錄!你是合法用戶!");
?????} else {
??????MessageDialog.openInformation(shell, "",
????????"請(qǐng)你正確登錄!用戶名或密碼不正確!");
?????}
?????rs.close();
?????stmt.close();
?????con.close();
????} catch (Exception e1) {
?????e1.printStackTrace();
????}
???}
??});
7.運(yùn)行如下:
8.如下為數(shù)據(jù)庫(kù)設(shè)計(jì),當(dāng)然要在這個(gè)項(xiàng)目之運(yùn)行之前設(shè)計(jì)好!
對(duì)新手一定是絕好的教程哦
目錄列示器
本實(shí)例演示如何得到一個(gè)目錄下的所有文件列表 .
1.?????? 這里利用了 DirFilter 實(shí)現(xiàn)了 FilenameFilter 接口 , 因此必須繼承 accept 的方法 .
2.?????? 用到了匹配字符序列與正則表達(dá)式指定模式的類 Matcher,Pattern 所以要 java.util.regex 引入 .
實(shí)例程序
:
package javaio;
import java.io.*;
import java.util.*;
import java.util.regex.*;
public class DirList {
? public static void main(String[] args) {
? ??File path = new File("c:/");
??? String[] list;
??? if(args.length == 0){
????? list = path.list();
??? }
??? else{
????? // 這里將輸入的參數(shù)作為過(guò)濾因子
????? list = path.list(new DirFilter(args[0]));
??? }
??? for(int i = 0; i < list.length; i++){
????? System.out.println(list[i]);
??? }
? }
}
class DirFilter implements FilenameFilter {
?
private Pattern pattern;
? public DirFilter(String regex) {
??? pattern = Pattern.compile(regex);
? }
? public boolean accept(File dir, String name) {
??? // 判斷名為 name 的文件是不是符合過(guò)濾條件
??? return pattern.matcher(new File(name).getName()).matches();/*matches() 嘗試將整個(gè)區(qū)域 / 與模式匹配。 new File(name).getName() 得到 String 類的 name*/
? }
}
運(yùn)行結(jié)果 :
本實(shí)例演示 util 包中類 Calendar 的使用
Clendar 類是一種日期處理類 , 可以想像它是一個(gè)掛在墻壁上的典型日歷 , 有許多日期和頁(yè)數(shù)翻閱 .
1.?????? Clendar 類的變量域的概念 . 每個(gè)元素都是域 , 并且這些域在 Clendar 類中表現(xiàn)為靜態(tài)變量 . 這些變量域 , 可能通過(guò) get/set 類方法獲得或者設(shè)置域值 .
[Calendardemo.java
代碼
]:
import java.util.*;
public class Calendardemo {
?????? public static void main(String[] args) {
????????????? // 創(chuàng)建一個(gè)日歷對(duì)象
????????????? Calendar calendar = Calendar.getInstance();
????????????? // 用當(dāng)前時(shí)間初始化日歷對(duì)象
????????????? calendar.setTime(new Date());
????????????? String year = String.valueOf(calendar.get(Calendar.YEAR));
????????????? String month = String.valueOf(calendar.get(Calendar.MONTH) + 1);
????????????? String date = String.valueOf(calendar.get(Calendar.DAY_OF_MONTH));
????????????? String day = String.valueOf(calendar.get(Calendar.DAY_OF_WEEK) - 1);
????????????? int hour = calendar.get(Calendar.HOUR);// 以 12 小時(shí)制
????????????? int hour_1 = calendar.get(Calendar.HOUR_OF_DAY);// 以 24 小時(shí)制
????????????? int minute = calendar.get(Calendar.MINUTE);
????????????? int second = calendar.get(Calendar.SECOND);
????????????? // 輸出結(jié)果
????????????? System.out.println("year=? " + year);
????????????? System.out.println("month=? " + month);
????????????? System.out.println("date=? " + date);
????????????? System.out.println("day=? " + day);
????????????? System.out.println("hour=? " + hour);
????????????? System.out.println("hour1=? " + hour_1);
????????????? System.out.println("minute=? " + minute);
????????????? System.out.println("second=? " + second);
????????????? System.out.println(" 現(xiàn)在時(shí)間是: ");
????????????? System.out.println(" " + year + " 年 " + month + " 月 " + date + " 星期 " + day);
????????????? calendar.set(1983, 7, 21);// 將日歷翻到某個(gè)時(shí)間. 7 表示八月
????????????? long time1983 = calendar.getTimeInMillis();// 返回當(dāng)前時(shí)間,作為從開始時(shí)間的 UTC 毫秒值
????????????? calendar.setTime(new Date());// 將日歷翻到現(xiàn)在這個(gè)時(shí)間.
????????????? long time2006 = calendar.getTimeInMillis();
????????????? long interdays = (time2006 - time1983) / (1000 * 60 * 60 * 24);
????????????? System.out.println(" 現(xiàn)在和 1983.8.21 相隔 " + interdays + " 天 ");
?????? }
}
注意
:
應(yīng)該以靜態(tài)方式訪問(wèn)靜態(tài)字段
Calendar.year
運(yùn)行結(jié)果
: