java.version | Java 運行時環境版本 |
java.vendor | Java 運行時環境供應商 |
java.vendor.url | Java 供應商的 URL |
java.home | Java 安裝目錄 |
java.vm.specification.version | Java 虛擬機規范版本 |
java.vm.specification.vendor | Java 虛擬機規范供應商 |
java.vm.specification.name | Java 虛擬機規范名稱 |
java.vm.version | Java 虛擬機實現版本 |
java.vm.vendor | Java 虛擬機實現供應商 |
java.vm.name | Java 虛擬機實現名稱 |
java.specification.version | Java 運行時環境規范版本 |
java.specification.vendor | Java 運行時環境規范供應商 |
java.specification.name | Java 運行時環境規范名稱 |
java.class.version | Java 類格式版本號 |
java.class.path | Java 類路徑 |
java.library.path | 加載庫時搜索的路徑列表 |
java.io.tmpdir | 默認的臨時文件路徑 |
java.compiler | 要使用的 JIT 編譯器的名稱 |
java.ext.dirs | 一個或多個擴展目錄的路徑 |
os.name | 操作系統的名稱 |
os.arch | 操作系統的架構 |
os.version | 操作系統的版本 |
file.separator | 文件分隔符(在 UNIX 系統中是“/”) |
path.separator | 路徑分隔符(在 UNIX 系統中是“:”) |
line.separator | 行分隔符(在 UNIX 系統中是“/n”) |
user.name | 用戶的賬戶名稱 |
user.home | 用戶的主目錄 |
user.dir | 用戶的當前工作目錄 |
http://www.javaeye.com/topic/130309
http://i18n.javaeye.com/blog/130849
=========================================
現在很多網站都有為用戶保存登陸信息(即保存Cookie)的功能,當用戶下一次進入網站時,可以幫助用戶自動登陸,使網站顯得更加友好。筆者通過 研究ACEGI項目的自動登陸源碼,編寫了一個安全有效的實現兩星期自動登陸功能的JAVA工具類,下面是具體的實現流程和實現代碼。
先說一下流程:
1.保存用戶信息階段:
當用戶登陸網站時,在登陸頁面填寫完用戶名和密碼后,如果用戶在提交時還選擇了“兩星期內自動登陸”復選框,那么在后臺程序中驗證用戶名和密碼 全都正確后,還要為用戶保存這些信息,以便用戶下一次可以直接進入網站;如果用戶沒有勾選“兩星期內自動登陸”復選框,則不必為用戶保存信息,那么用戶在 下一次登陸網站時仍需要填寫用戶名和密碼。
在保存用戶信息階段,主要的工作是對用戶的信息進行加密并保存到客戶端。加密用戶的信息是較為繁瑣的,大致上可分為以下幾個步聚:
① 得到用戶名、經MD5加密后的用戶密碼、cookie有效時間(本文設置的是兩星期,可根據自己需要修改)
② 自定義的一個webKey,這個Key是我們為自己的網站定義的一個字符串常量,這個可根據自己需要隨意設置
③ 將上兩步得到的四個值得新連接成一個新的字符串,再進行MD5加密,這樣就得到了一個MD5明文字符串
④ 將用戶名、cookie有效時間、MD5明文字符串使用“:”間隔連接起來,再對這個連接后的新字符串進行Base64編碼
⑤ 設置一個cookieName,將cookieName和上一步產生的Base64編碼寫入到客戶端。
2.讀取用戶信息:
其實弄明白了保存原理,讀取及校驗原理就很容易做了。讀取和檢驗可以分為下面幾個步驟:
?、?根據設置的cookieName,得到cookieValue,如果值為空,就不幫用戶進行自動登陸;否則執行讀取方法
② 將cookieValue進行Base64解碼,將取得的字符串以split(“:”)進行拆分,得到一個String數組cookieValues(此操作與保存階段的第4步正好相反),這一步將得到三個值:
cookieValues[0] ---- 用戶名
cookieValues[1] ---- cookie有效時間
cookieValues[2] ---- MD5明文字符串
?、?判斷cookieValues的長度是否為3,如果不為3則進行錯誤處理。
④ 如果長度等于3,取出第二個,即cookieValues[1],此時將會得到有效時間(long型),將有效時間與服務器系統當前時間比較,如果小于當前時間,則說明cookie過期,進行錯誤處理。
⑤ 如果cookie沒有過期,就取cookieValues[0],這樣就可以得到用戶名了,然后去數據庫按用戶名查找用戶。
⑥ 如果上一步返回為空,進行錯誤處理。如果不為空,那么將會得到一個已經封裝好用戶信息的User實例對象user
⑦ 取出實例對象user的用戶名、密碼、cookie有效時間(即cookieValues[1])、webKey,然后將四個值連接起來,然后進行MD5加密,這樣做也會得到一個MD5明文字符串(此操作與保存階段的第3步類似)
⑧ 將上一步得到MD5明文與cookieValues[2]進行equals比較,如果是false,進行錯誤處理;如果是true,則將user對象添加到session中,幫助用戶完成自動登陸
完整的代碼,用途請參見注釋
CookieUtil.java
處理cookie的工具類,包括讀取,保存,清除三個主要方法。
package cn.itcast.util;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import cn.itcast.bean.User;
import cn.itcast.dao.UserDAO;
import cn.itcast.factory.DaoImplFactory;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
/*
* 2007.09.21 by lyhapple
* */
public class CookieUtil {
//保存cookie時的cookieName
private final static String cookieDomainName = “cn.itcast”;
//加密cookie時的網站自定碼
private final static String webKey = “itcast”;
//設置cookie有效期是兩個星期,根據需要自定義
private final static long cookieMaxAge = 60 * 60 * 24 * 7 * 2;
//保存Cookie到客戶端--------------------------------------------------------------------------------------------------------
//在CheckLogonServlet.java中被調用
//傳遞進來的user對象中封裝了在登陸時填寫的用戶名與密碼
public static void saveCookie(User user, HttpServletResponse response) {
//cookie的有效期
long validTime = System.currentTimeMillis() + (cookieMaxAge * 1000);
//MD5加密用戶詳細信息
String cookieValueWithMd5 =getMD5(user.getUserName() + ":" + user.getPassword()+ ":" + validTime + ":" + webKey);
//將要被保存的完整的Cookie值
String cookieValue = user.getUserName() + ":" + validTime + ":" + cookieValueWithMd5;
//再一次對Cookie的值進行BASE64編碼
String cookieValueBase64 = new String(Base64.encode(cookieValue.getBytes()));
//開始保存Cookie
Cookie cookie = new Cookie(cookieDomainName, cookieValueBase64);
//存兩年(這個值應該大于或等于validTime)
cookie.setMaxAge(60 * 60 * 24 * 365 * 2);
//cookie有效路徑是網站根目錄
cookie.setPath("/");
//向客戶端寫入
response.addCookie(cookie);
}
//讀取Cookie,自動完成登陸操作--------------------------------------------------------------------------------------------
//在Filter程序中調用該方法,見AutoLogonFilter.java
public static void readCookieAndLogon(HttpServletRequest request, HttpServletResponse response,
FilterChain chain) throws IOException, ServletException,UnsupportedEncodingException{
//根據cookieName取cookieValue
Cookie cookies[] = request.getCookies();
String cookieValue = null;
if(cookies!=null){
for(int i=0; i<cookies.length; i++){
if (cookieDomainName.equals(cookies[i].getName())) {
cookieValue = cookies[i].getValue();
break;
}
}
}
//如果cookieValue為空,返回,
if(cookieValue==null){
return;
}
//如果cookieValue不為空,才執行下面的代碼
//先得到的CookieValue進行Base64解碼
String cookieValueAfterDecode = new String (Base64.decode(cookieValue),"utf-8");
//對解碼后的值進行分拆,得到一個數組,如果數組長度不為3,就是非法登陸
String cookieValues[] = cookieValueAfterDecode.split(":");
if(cookieValues.length!=3){
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.println("你正在用非正常方式進入本站...");
out.close();
return;
}
//判斷是否在有效期內,過期就刪除Cookie
long validTimeInCookie = new Long(cookieValues[1]);
if(validTimeInCookie < System.currentTimeMillis()){
//刪除Cookie
clearCookie(response);
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<a href=’logon.jsp’>你的Cookie已經失效,請重新登陸</a>");
out.close();
return;
}
//取出cookie中的用戶名,并到數據庫中檢查這個用戶名,
String username = cookieValues[0];
//根據用戶名到數據庫中檢查用戶是否存在
UserDAO ud = DaoImplFactory.getInstance();
User user = ud.selectUserByUsername(username);
//如果user返回不為空,就取出密碼,使用用戶名+密碼+有效時間+ webSiteKey進行MD5加密
if(user!=null){
String md5ValueInCookie = cookieValues[2];
String md5ValueFromUser =getMD5(user.getUserName() + ":" + user.getPassword()+ ":" + validTimeInCookie + ":" + webKey);
//將結果與Cookie中的MD5碼相比較,如果相同,寫入Session,自動登陸成功,并繼續用戶請求
if(md5ValueFromUser.equals(md5ValueInCookie)){
HttpSession session = request.getSession(true);
session.setAttribute("user", user);
chain.doFilter(request, response);
}
}else{
//返回為空執行
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.println("cookie驗證錯誤!");
out.close();
return;
}
}
//用戶注銷時,清除Cookie,在需要時可隨時調用------------------------------------------------------------
public static void clearCookie( HttpServletResponse response){
Cookie cookie = new Cookie(cookieDomainName, null);
cookie.setMaxAge(0);
cookie.setPath("/");
response.addCookie(cookie);
}
//獲取Cookie組合字符串的MD5碼的字符串----------------------------------------------------------------------------
public static String getMD5(String value) {
String result = null;
try{
byte[] valueByte = value.getBytes();
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(valueByte);
result = toHex(md.digest());
} catch (NoSuchAlgorithmException e2){
e1.printStackTrace();
}
return result;
}
//將傳遞進來的字節數組轉換成十六進制的字符串形式并返回
private static String toHex(byte[] buffer){
StringBuffer sb = new StringBuffer(buffer.length * 2);
for (int i = 0; i < buffer.length; i++){
sb.append(Character.forDigit((buffer[i] & 0xf0) >> 4, 16));
sb.append(Character.forDigit(buffer[i] & 0x0f, 16));
}
return sb.toString();
}
}
下面的是對CookieUtil工具類各方法的調用演示:
User.java
封裝用戶信息的JavaBean對象模型
package com.itcast.bean;
public class User {
private int id;
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;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
AutoLogonFilter.java
過濾器程序,可在WEB-INF/web.xml中設置過濾規則,本文對過濾規則不作介紹,此程序主要作用是檢查用戶在上一次登陸時是否保存了Cookie,如果保存了,就處理Cookie信息,并幫助用戶自動登陸
本程序主要調用了CookieUtil.java中的讀取與自動登陸方法,即readCookieAndLogon方法
package cn.itcast.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import cn.itcast bean.User;
import cn.itcast.util.CookieUtil;
public class AutoLogonFilter implements Filter {
public void destroy() {
}
//保存cookie時的cookieName,與CookieUtil.java中的設置相同
private final static String cookieDomainName = “cn.itcast”;
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
HttpSession session = request.getSession(true);
User user = (User)session.getAttribute("user");
//如果封裝的user不為空,說明已經登陸,則繼續執行用戶的請求.下面的就不處理了
if(user!=null){
chain.doFilter(request,response);
return;
}
//user為空,說明用戶還沒有登陸,就嘗試得到瀏覽器傳送過來的Cookie
Cookie cookies[] = request.getCookies();
String cookieValue = null;
if(cookies!=null){
for(int i=0; i<cookies.length; i++){
if (cookieDomainName.equals(cookies[i].getName())) {
cookieValue = cookies[i].getValue();
break;
}
}
}
//如果cookieValue為空,也繼續執行用戶請求
if(cookieValue==null){
chain.doFilter(request,response);
return;
}
//cookieValue不為空執行下面的方法,調用CookieUtil.java中的readCookieAndLogon方法
try{
CookieUtil.readCookieAndLogon(cookieValue, request, response, chain);
}catch(Exception e){
e.printStackTrace();
}
}
public void init(FilterConfig arg0) throws ServletException {
}
}
CheckLogonServlet.java
驗證用戶登陸信息的Servlet,此程序調用了CookieUtil.java中的saveCookie方法
package cn.itcast.servlet;
/*
* update 2007.09.23 by lyhapple
* 檢查用戶登陸
* */
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import cn.itcast.bean.User;
import cn.itcast.dao.UserDAO;
import cn.itcast.factory.DaoImplFactory;
import cn.itcast.util.CookieUtil;
public class CheckLogonServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username").trim();
String password = CookieUtil.getMD5(request.getParameter("password"));
String remeberMe = request.getParameter("remeberMe");
HttpSession session = request.getSession(false);
// 將接收到的用戶名傳遞到UserDao的checkUser方法中,檢查用戶
// 返回一個User類型的對象
UserDAO ud = DaoImplFactory.getInstance();
User user = ud.selectUserByUsername(username);
if (user == null) {
request.setAttribute("checkUserError","<a href='register.jsp'><font color=red>用戶名不存在,請先注冊</font></a>");
request.getRequestDispatcher("index.jsp").forward(request, response);
return;
}
if(!password.equals(user.getPassword())){
request.setAttribute("checkPasswordError","<font color=red>密碼輸入錯誤,請重新輸入</font>");
request.getRequestDispatcher("index.jsp").forward(request, response);
return;
}
得到classpath和當前類的絕對路徑的一些方法
獲得CLASSPATH之外路徑的方法:
URL base = this.getClass().getResource("");
//先獲得本類的所在位置,如/home/popeye/testjava/build/classes/net/
String path = new File(base.getFile(), "……/……/……/"+name).getCanonicalPath();
//就可以得到/home/popeye/testjava/name
下面是一些得到classpath和當前類的絕對路徑的一些方法。你可能需要使用其中的一些方法來得到你需要的資源的絕對路徑。
1.FileTest.class.getResource("")
得到的是當前類FileTest.class文件的URI目錄。不包括自己!
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/
2.FileTest.class.getResource("/")
得到的是當前的classpath的絕對URI路徑。
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
3.Thread.currentThread().getContextClassLoader().getResource("")
得到的也是當前ClassPath的絕對URI路徑。
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
4.FileTest.class.getClassLoader().getResource("")
得到的也是當前ClassPath的絕對URI路徑。
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
5.ClassLoader.getSystemResource("")
得到的也是當前ClassPath的絕對URI路徑。
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
我推薦使用Thread.currentThread().getContextClassLoader().getResource("")來得到當前的classpath的絕對路徑的URI表示法。
在Web應用程序中,我們一般通過ServletContext.getRealPath("/")方法得到Web應用程序的根目錄的絕對路徑。這樣,我們只需要提供相對于Web應用程序根目錄的路徑,就可以構建出定位資源的絕對路徑。
注意點:
1.盡量不要使用相對于System.getProperty("user.dir")當前用戶目錄的相對路徑。這是一顆定時炸彈,隨時可能要你的命。
2.盡量使用URI形式的絕對路徑資源。它可以很容易的轉變為URI,URL,File對象。
3.盡量使用相對classpath的相對路徑。不要使用絕對路徑。使用上面ClassLoaderUtil類的public static URL getExtendResource(String relativePath)方法已經能夠使用相對于classpath的相對路徑定位所有位置的資源。
4.絕對不要使用硬編碼的絕對路徑。因為,我們完全可以使用ClassLoader類的getResource("")方法得到當前classpath的絕對路徑。
使用硬編碼的絕對路徑是完全沒有必要的!它一定會讓你死的很難看!程序將無法移植!
如果你一定要指定一個絕對路徑,那么使用配置文件,也比硬編碼要好得多!
當然,我還是推薦你使用程序得到classpath的絕對路徑來拼資源的絕對路徑.
調試Temp文件
tomcat/works
eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work
包命名規范:
目的:包的命名規范應當體現出項目資源良好的劃分
servlet類所在包命名規范:公司名稱.開發組名稱.項目名稱.web.servlet
例如:com.accp.gs2t23.netstore.web.servlet
自定義標簽類所在包命名規范:公司名稱.開發組名稱.項目名稱.web.tags
例如:com.accp.gs2t23.netstore.web.tags
過濾器類所在包命名規范:公司名稱.開發組名稱.項目名稱.web.filter
例如:com.accp.gs2t23.netstore.web.filter
Action類所在包命名規范:公司名稱.開發組名稱.項目名稱.web.struts.action
例如:com.accp.gs2t23.netstore.web.struts.action
ActionForm類所在包命名規范:公司名稱.開發組名稱.項目名稱.web.struts.form
例如:com.accp.gs2t23.netstore.web.struts.form
Javabean所在包命名規范:公司名稱.開發組名稱.項目名稱.web.struts.service.impl
例如:com.accp.gs2t23.netstore.web.service.impl
Javabean實現接口命名規范:公司名稱.開發組名稱.項目名稱.web.service
例如:com.accp.gs2t23.netstore.web.service
DAO類所在包命名規范:公司名稱.開發組名稱.項目名稱.dao.impl
例如:com.accp.gs2t23.netstore.dao.impl
DAO類所實現的接口在包中命名規范:公司名稱.開發組名稱.項目名稱.dao
例如:com.accp.gs2t23.netstore.dao
POJO類與hbm文件所在包命名規范:公司名稱.開發組名稱.項目名稱.dao.hbm
例如:com.accp.gs2t23.netstore.dao.hbm
全局公共類、接口類所在包命名規范:公司名稱.開發組名稱.項目名稱.global
例如:com.accp.gs2t23.netstore.global
全局工具類所在包命名規范:公司名稱.開發組名稱.項目名稱.util
例如:com.accp.gs2t23.netstore.util
類命名規范
基本命名規范:
類、接口命名
命名規范:以大寫字母開頭,如果有多個單詞,每個單詞頭字母大寫
例如:StudentInfo
接口命名
命名規范:以大寫字母"I"開頭,如果有多個單詞,每個單詞頭字母大寫
例如:IStudentInfo
接口實現類命名:
命名規范:將實現的接口名稱的首字母"I"去掉,以"Impl作為結尾",如果有多個單詞,每個單詞頭字母大寫。
例如:StudentInfoImpl
J2EE+SSH框架命名規范
servlet類命名:
命名規范:以Servlet單詞結尾
例如:LoginServlet
POJO命名:
使用hibernate自動生成的類即可
DAO類命名:
使用hibernate自動生成的類即可
Action類命名:
命名規范:Action的命名以POJO名稱來制定,POJO名稱Action
例如:
一個POJO名稱為Diary,其對應的action為DiaryAction
ActionForm類命名:
命名規范:ActionForm的命名以POJO名稱來制定,POJO名稱Form
例如:
一個POJO名稱為Diary,其對應的actioForm為DiaryForm
業務邏輯接口命名:
命名規范:業務邏輯接口的命名以POJO名稱來制定,IPOJO名稱Service
例如:
一個POJO名稱為Diary,其對應的業務邏輯接口為IDiaryService
業務邏輯實現類命名:
命名規范:業務邏輯接口實現類的命名以POJO名稱來制定
例如:
一個POJO名稱為Diary,對應的業務邏輯接口實現類名為DiaryServiceImpl
類變量命名:
命名規范:變量名首字母必須小寫,如果該變量名有多個單詞組成,后面的單 詞首字母大寫,單詞與單詞之間不要使用"_"做連接,變量名訪問控制必須為私有, 可以對其增加setter與getter方法。
例如:private int studentAge;
public int getStudentAge()
{
return studentAge;
}
public void setStudentAge(int studentAge)
{
this.studentAge=studentAge;
}
常量命名:
命名規范:所有字母大寫,如果有多個單詞組成,單詞與單詞之間以” _“隔開。而 且該變量必須是公共、靜態、final類型
例如:public static final String USER_NAME=”userName“;
方法命名
命名規范:首字母必須小寫,如果該變量名有多個單詞組成,后面的單詞首字母 大寫,單詞與單詞之間不要使用"_"做連接。單詞不要使用名詞。
例如:public int checkLogin(String name,String pwd){}
注釋規范:注釋規范是整個開發規范中最為重要的組成部分,必須嚴格執行。
類的注釋:
作用:注釋整個類,簡單概述該類作用。
書寫規范:類的注釋必須寫在該類的聲明語法之前。在注釋中要描述該類的基 本作用,作者,日期,版本,公司名稱,版權聲明。
格式:
/* *
* 類功能描述:(大致描述類的功能)
* @author:編寫者名稱
*
* @version: 類文件的版本號 從1.0開始(自己確定版本號的增改
* 情況), 修改情況(修改時間、作者、改動情況)
*
* @see 包名.參考類名 (列出父類,引入類,每個類占一行),如果有
* 可省略
* 相關數據如:(便于理解本類的一些常量數據及某些數據的格式
* 或認為比較重要的數據,如果沒有可省略)
*/
類的聲明語法
例如:
/**
* <p>Title:管理員模塊數據處理類 </p>
* <p>Description: 兩個數相加</p>
* <p>Copyright: Copyright (c) 2007</p>
* <p>Company:華騰軟件公司</p>
*
* @author 童金虎
*
* @version $Revision: 1.7 $ $Date: 2007/07/08$
*/
public class AdminDAO
變量、常量注釋:
作用:簡單描述該變量的意義。
書寫規范:變量注釋必須寫在變量定義之前,簡單描述其代表的意義。
格式:
/**
* 變量功能描述:(大致描述變量的功能)
*/
例如:
/**
*定義年齡變量
*/
public int age;
方法注釋:
作用:對該方法功能簡單描述,其參數、返回值意義的注解。
書寫規范:方法注釋必須寫在方法定義之前。該注釋包括:方法其功能的簡單 描述,方法的參數、返回值類型、返回值意義簡單的描述。
格式:
/**
* 方法功能說明
* @param args (參數類型可以寫在參數后,也可以省
* 略。每個參數占一行)
* @return 輸出參數(多種情況寫在同一行)
* @see 類#參考方法 (與此方法有調用關系的方法供參
* 考,不必每個方法都完整列出,要選擇有意義的,每個
* 方法占一行)
* @exception 異常處理類(方法中能夠引發的異常,每
* 個異常占一行)
*/
例如:
/**
* 修改管理員密碼
* @param adminId 管理員編號
* @param oldPassword 舊密碼
* @param password 新密碼
* @return boolean 是否編輯成功
* @throws UserException
* @throws ServiceException
*/
public booleaneditAdminPassword(int adminId,String oldPassword,
String password) throws UserException,ServiceException;
Jsp頁面命名:
命名規范:jsp頁面名稱要以小寫字母開頭,如果有多個單詞組成,后面的單詞以 大寫字母開頭。名稱要體現出該頁面的意義,最好能夠與模塊名稱聯系在一起。
例如:
login.jsp --登錄頁面
register.jsp --注冊頁面
message.jsp --客戶留言頁面
J2EE項目工程文件夾組織規范:
目的:規范學員web應用程序的資源組織形式,形成良好的文件組織習慣。文件的組織形式應當體現模塊的劃分。
根據eclipse工具的特征,項目的目錄結構為:
src
----存放java文件
WebRoot
|--images --存放web程序所需的公共圖片
|--css --存放web程序所需的公共樣式表
|--js --存放web程序所需的公共js文件
|--commons --存放web程序所需的公共文件
|--功能模塊文件夾(存放與某個功能模塊相關的資源)
|--images --存放與該功能模塊相關的圖片
|--css --存放與該模塊相關的樣式表文件
|--js --存放與該模塊相關的js文件
|--jsp、html頁面
|--WEB-INF
|--classes
|--lib
|--tld文件
J2EE項目提交規范
項目完成時要將項目作為一個產品交付用戶,良好的項目組織規范可以使用戶可以方便的找尋項目中需要的資源,同時也是一個公司專業性的體現。項目提交時,要按照下列文件格式進行提交。
項目主文件夾:
作用:存放項目其他資源文件。
命名規范:時間_班級編號_第X小組。
例如:070706_GS2T18_第四小組。
項目主文件夾下面包括以下文件夾和文件:
|--src:保存.java文件。
|--database:保存數據庫的腳本文件或者數據庫備份文件。
|--source:保存eclipse工程中WebRoot目錄下的所有文件。
|--depend:保存編譯該程序必須依賴的其他jar文件。
|--javadoc:保存所有類生成的javadoc api文檔。
|--war:保存程序的歸檔文件
|--xx.war:已經打包好的工程文件,可以直接運行。
|--project:保存開發項目原工程代碼及文件。
|--產品說明書.doc:圖文方式展現該產品使用方法。
|--build.xml:ant腳本,用于生成運行的war文件。
|--項目解說.ppt:進行項目講解的ppt(ppt僅供在校模擬項目使用,不用于其他商 業用途)
注:一個完整的項目中,數據庫必須有一定量的有效的測試數據來支持該程序的運行