java 學(xué)習(xí)

          軟件開發(fā)相關(guān)方面的學(xué)習(xí)

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            33 Posts :: 1 Stories :: 5 Comments :: 0 Trackbacks

          #

          1.如何獲得當(dāng)前文件路徑

          常用:

          字符串類型:System.getProperty("user.dir");

          綜合:

          package com.zcjl.test.base;
          import java.io.File;
          public class Test {
          ??? public static void main(String[] args) throws Exception {
          ??????? System.out.println(
          Thread.currentThread().getContextClassLoader().getResource(""));
          ??????? System.out.println(Test.class.getClassLoader().getResource(""));
          ??????? System.out.println(ClassLoader.getSystemResource(""));
          ??????? System.out.println(Test.class.getResource(""));
          ??????? System.out.println(Test.class.getResource("/"));
          ??????? System.out.println(new File("").getAbsolutePath());
          ??????? System.out.println(System.getProperty("user.dir"));

          ??? }
          }

          2.Web服務(wù)中

          (1).Weblogic

          WebApplication的系統(tǒng)文件根目錄是你的weblogic安裝所在根目錄。
          例如:如果你的weblogic安裝在c:\bea\weblogic700.....
          那么,你的文件根路徑就是c:\.
          所以,有兩種方式能夠讓你訪問你的服務(wù)器端的文件:
          a.使用絕對路徑:
          比如將你的參數(shù)文件放在c:\yourconfig\yourconf.properties,
          直接使用 new FileInputStream("yourconfig/yourconf.properties");
          b.使用相對路徑:
          相對路徑的根目錄就是你的webapplication的根路徑,即WEB-INF的上一級目錄,將你的參數(shù)文件放在yourwebapp\yourconfig\yourconf.properties,
          這樣使用:
          new FileInputStream("./yourconfig/yourconf.properties");
          這兩種方式均可,自己選擇。

          (2).Tomcat

          在類中輸出System.getProperty("user.dir");顯示的是%Tomcat_Home%/bin

          (3).Resin

          不是你的JSP放的相對路徑,是JSP引擎執(zhí)行這個(gè)JSP編譯成SERVLET
          的路徑為根.比如用新建文件法測試File f = new File("a.htm");
          這個(gè)a.htm在resin的安裝目錄下

          (4).如何讀相對路徑哪?

          在Java文件中g(shù)etResource或getResourceAsStream均可

          例:getClass().getResourceAsStream(filePath);//filePath可以是"/filename",這里的/代表web發(fā)布根路徑下WEB-INF/classes

          (5).獲得文件真實(shí)路徑

          string? file_real_path=request.getRealPath("mypath/filename");?

          通常使用request.getRealPath("/");?

          3.文件操作的類

          import java.io.*;
          import java.net.*;
          import java.util.*;
          //import javax.swing.filechooser.*;
          //import org.jr.swing.filter.*;

          /**
          * 此類中封裝一些常用的文件操作。
          * 所有方法都是靜態(tài)方法,不需要生成此類的實(shí)例,
          * 為避免生成此類的實(shí)例,構(gòu)造方法被申明為private類型的。
          * @since? 0.1
          */

          public class FileUtil {
          ? /**
          ?? * 私有構(gòu)造方法,防止類的實(shí)例化,因?yàn)楣ぞ哳惒恍枰獙?shí)例化。
          ?? */
          ? private FileUtil() {

          ? }

          ? /**
          ?? * 修改文件的最后訪問時(shí)間。
          ?? * 如果文件不存在則創(chuàng)建該文件。
          ?? * <b>目前這個(gè)方法的行為方式還不穩(wěn)定,主要是方法有些信息輸出,這些信息輸出是否保留還在考

          慮中。</b>
          ?? * @param file 需要修改最后訪問時(shí)間的文件。
          ?? * @since? 0.1
          ?? */
          ? public static void touch(File file) {
          ??? long currentTime = System.currentTimeMillis();
          ??? if (!file.exists()) {
          ????? System.err.println("file not found:" + file.getName());
          ????? System.err.println("Create a new file:" + file.getName());
          ????? try {
          ??????? if (file.createNewFile()) {
          ??????? //? System.out.println("Succeeded!");
          ??????? }
          ??????? else {
          ??????? //? System.err.println("Create file failed!");
          ??????? }
          ????? }
          ????? catch (IOException e) {
          ????? //? System.err.println("Create file failed!");
          ??????? e.printStackTrace();
          ????? }
          ??? }
          ??? boolean result = file.setLastModified(currentTime);
          ??? if (!result) {
          ??? //? System.err.println("touch failed: " + file.getName());
          ??? }
          ? }

          ? /**
          ?? * 修改文件的最后訪問時(shí)間。
          ?? * 如果文件不存在則創(chuàng)建該文件。
          ?? * <b>目前這個(gè)方法的行為方式還不穩(wěn)定,主要是方法有些信息輸出,這些信息輸出是否保留還在考

          慮中。</b>
          ?? * @param fileName 需要修改最后訪問時(shí)間的文件的文件名。
          ?? * @since? 0.1
          ?? */
          ? public static void touch(String fileName) {
          ??? File file = new File(fileName);
          ??? touch(file);
          ? }

          ? /**
          ?? * 修改文件的最后訪問時(shí)間。
          ?? * 如果文件不存在則創(chuàng)建該文件。
          ?? * <b>目前這個(gè)方法的行為方式還不穩(wěn)定,主要是方法有些信息輸出,這些信息輸出是否保留還在考

          慮中。</b>
          ?? * @param files 需要修改最后訪問時(shí)間的文件數(shù)組。
          ?? * @since? 0.1
          ?? */
          ? public static void touch(File[] files) {
          ??? for (int i = 0; i < files.length; i++) {
          ????? touch(files);
          ??? }
          ? }

          ? /**
          ?? * 修改文件的最后訪問時(shí)間。
          ?? * 如果文件不存在則創(chuàng)建該文件。
          ?? * <b>目前這個(gè)方法的行為方式還不穩(wěn)定,主要是方法有些信息輸出,這些信息輸出是否保留還在考

          慮中。</b>
          ?? * @param fileNames 需要修改最后訪問時(shí)間的文件名數(shù)組。
          ?? * @since? 0.1
          ?? */
          ? public static void touch(String[] fileNames) {
          ??? File[] files = new File[fileNames.length];
          ??? for (int i = 0; i < fileNames.length; i++) {
          ????? files = new File(fileNames);
          ??? }
          ??? touch(files);
          ? }

          ? /**
          ?? * 判斷指定的文件是否存在。
          ?? * @param fileName 要判斷的文件的文件名
          ?? * @return 存在時(shí)返回true,否則返回false。
          ?? * @since? 0.1
          ?? */
          ? public static boolean isFileExist(String fileName) {
          ??? return new File(fileName).isFile();
          ? }

          ? /**
          ?? * 創(chuàng)建指定的目錄。
          ?? * 如果指定的目錄的父目錄不存在則創(chuàng)建其目錄書上所有需要的父目錄。
          ?? * <b>注意:可能會在返回false的時(shí)候創(chuàng)建部分父目錄。</b>
          ?? * @param file 要?jiǎng)?chuàng)建的目錄
          ?? * @return 完全創(chuàng)建成功時(shí)返回true,否則返回false。
          ?? * @since? 0.1
          ?? */
          ? public static boolean makeDirectory(File file) {
          ??? File parent = file.getParentFile();
          ??? if (parent != null) {
          ????? return parent.mkdirs();
          ??? }
          ??? return false;
          ? }

          ? /**
          ?? * 創(chuàng)建指定的目錄。
          ?? * 如果指定的目錄的父目錄不存在則創(chuàng)建其目錄書上所有需要的父目錄。
          ?? * <b>注意:可能會在返回false的時(shí)候創(chuàng)建部分父目錄。</b>
          ?? * @param fileName 要?jiǎng)?chuàng)建的目錄的目錄名
          ?? * @return 完全創(chuàng)建成功時(shí)返回true,否則返回false。
          ?? * @since? 0.1
          ?? */
          ? public static boolean makeDirectory(String fileName) {
          ??? File file = new File(fileName);
          ??? return makeDirectory(file);
          ? }

          ? /**
          ?? * 清空指定目錄中的文件。
          ?? * 這個(gè)方法將盡可能刪除所有的文件,但是只要有一個(gè)文件沒有被刪除都會返回false。
          ?? * 另外這個(gè)方法不會迭代刪除,即不會刪除子目錄及其內(nèi)容。
          ?? * @param directory 要清空的目錄
          ?? * @return 目錄下的所有文件都被成功刪除時(shí)返回true,否則返回false.
          ?? * @since? 0.1
          ?? */
          ? public static boolean emptyDirectory(File directory) {
          ??? boolean result = false;
          ??? File[] entries = directory.listFiles();
          ??? for (int i = 0; i < entries.length; i++) {
          ????? if (!entries.delete()) {
          ??????? result = false;
          ????? }
          ??? }
          ??? return true;
          ? }

          ? /**
          ?? * 清空指定目錄中的文件。
          ?? * 這個(gè)方法將盡可能刪除所有的文件,但是只要有一個(gè)文件沒有被刪除都會返回false。
          ?? * 另外這個(gè)方法不會迭代刪除,即不會刪除子目錄及其內(nèi)容。
          ?? * @param directoryName 要清空的目錄的目錄名
          ?? * @return 目錄下的所有文件都被成功刪除時(shí)返回true,否則返回false。
          ?? * @since? 0.1
          ?? */
          ? public static boolean emptyDirectory(String directoryName) {
          ??? File dir = new File(directoryName);
          ??? return emptyDirectory(dir);
          ? }

          ? /**
          ?? * 刪除指定目錄及其中的所有內(nèi)容。
          ?? * @param dirName 要?jiǎng)h除的目錄的目錄名
          ?? * @return 刪除成功時(shí)返回true,否則返回false。
          ?? * @since? 0.1
          ?? */
          ? public static boolean deleteDirectory(String dirName) {
          ??? return deleteDirectory(new File(dirName));
          ? }

          ? /**
          ?? * 刪除指定目錄及其中的所有內(nèi)容。
          ?? * @param dir 要?jiǎng)h除的目錄
          ?? * @return 刪除成功時(shí)返回true,否則返回false。
          ?? * @since? 0.1
          ?? */
          ? public static boolean deleteDirectory(File dir) {
          ??? if ( (dir == null) || !dir.isDirectory()) {
          ????? throw new IllegalArgumentException("Argument " + dir +
          ???????????????????????????????????????? " is not a directory. ");
          ??? }

          ??? File[] entries = dir.listFiles();
          ??? int sz = entries.length;

          ??? for (int i = 0; i < sz; i++) {
          ????? if (entries.isDirectory()) {
          ??????? if (!deleteDirectory(entries)) {
          ????????? return false;
          ??????? }
          ????? }
          ????? else {
          ??????? if (!entries.delete()) {
          ????????? return false;
          ??????? }
          ????? }
          ??? }

          ??? if (!dir.delete()) {
          ????? return false;
          ??? }
          ??? return true;
          ? }


          ? /**
          ?? * 返回文件的URL地址。
          ?? * @param file 文件
          ?? * @return 文件對應(yīng)的的URL地址
          ?? * @throws MalformedURLException
          ?? * @since? 0.4
          ?? * @deprecated 在實(shí)現(xiàn)的時(shí)候沒有注意到File類本身帶一個(gè)toURL方法將文件路徑轉(zhuǎn)換為URL。
          ?? *???????????? 請使用File.toURL方法。
          ?? */
          ? public static URL getURL(File file) throws MalformedURLException {
          ??? String fileURL = "file:/" + file.getAbsolutePath();
          ??? URL url = new URL(fileURL);
          ??? return url;
          ? }

          ? /**
          ?? * 從文件路徑得到文件名。
          ?? * @param filePath 文件的路徑,可以是相對路徑也可以是絕對路徑
          ?? * @return 對應(yīng)的文件名
          ?? * @since? 0.4
          ?? */
          ? public static String getFileName(String filePath) {
          ??? File file = new File(filePath);
          ??? return file.getName();
          ? }

          ? /**
          ?? * 從文件名得到文件絕對路徑。
          ?? * @param fileName 文件名
          ?? * @return 對應(yīng)的文件路徑
          ?? * @since? 0.4
          ?? */
          ? public static String getFilePath(String fileName) {
          ??? File file = new File(fileName);
          ??? return file.getAbsolutePath();
          ? }

          ? /**
          ?? * 將DOS/Windows格式的路徑轉(zhuǎn)換為UNIX/Linux格式的路徑。
          ?? * 其實(shí)就是將路徑中的"\"全部換為"/",因?yàn)樵谀承┣闆r下我們轉(zhuǎn)換為這種方式比較方便,
          ?? * 某中程度上說"/"比"\"更適合作為路徑分隔符,而且DOS/Windows也將它當(dāng)作路徑分隔符。
          ?? * @param filePath 轉(zhuǎn)換前的路徑
          ?? * @return 轉(zhuǎn)換后的路徑
          ?? * @since? 0.4
          ?? */
          ? public static String toUNIXpath(String filePath) {
          ??? return filePath.replace('\\', '/');
          ? }

          ? /**
          ?? * 從文件名得到UNIX風(fēng)格的文件絕對路徑。
          ?? * @param fileName 文件名
          ?? * @return 對應(yīng)的UNIX風(fēng)格的文件路徑
          ?? * @since? 0.4
          ?? * @see #toUNIXpath(String filePath) toUNIXpath
          ?? */
          ? public static String getUNIXfilePath(String fileName) {
          ??? File file = new File(fileName);
          ??? return toUNIXpath(file.getAbsolutePath());
          ? }

          ? /**
          ?? * 得到文件的類型。
          ?? * 實(shí)際上就是得到文件名中最后一個(gè)“.”后面的部分。
          ?? * @param fileName 文件名
          ?? * @return 文件名中的類型部分
          ?? * @since? 0.5
          ?? */
          ? public static String getTypePart(String fileName) {
          ??? int point = fileName.lastIndexOf('.');
          ??? int length = fileName.length();
          ??? if (point == -1 || point == length - 1) {
          ????? return "";
          ??? }
          ??? else {
          ????? return fileName.substring(point + 1, length);
          ??? }
          ? }

          ? /**
          ?? * 得到文件的類型。
          ?? * 實(shí)際上就是得到文件名中最后一個(gè)“.”后面的部分。
          ?? * @param file 文件
          ?? * @return 文件名中的類型部分
          ?? * @since? 0.5
          ?? */
          ? public static String getFileType(File file) {
          ??? return getTypePart(file.getName());
          ? }

          ? /**
          ?? * 得到文件的名字部分。
          ?? * 實(shí)際上就是路徑中的最后一個(gè)路徑分隔符后的部分。
          ?? * @param fileName 文件名
          ?? * @return 文件名中的名字部分
          ?? * @since? 0.5
          ?? */
          ? public static String getNamePart(String fileName) {
          ??? int point = getPathLsatIndex(fileName);
          ??? int length = fileName.length();
          ??? if (point == -1) {
          ????? return fileName;
          ??? }
          ??? else if (point == length - 1) {
          ????? int secondPoint = getPathLsatIndex(fileName, point - 1);
          ????? if (secondPoint == -1) {
          ??????? if (length == 1) {
          ????????? return fileName;
          ??????? }
          ??????? else {
          ????????? return fileName.substring(0, point);
          ??????? }
          ????? }
          ????? else {
          ??????? return fileName.substring(secondPoint + 1, point);
          ????? }
          ??? }
          ??? else {
          ????? return fileName.substring(point + 1);
          ??? }
          ? }

          ? /**
          ?? * 得到文件名中的父路徑部分。
          ?? * 對兩種路徑分隔符都有效。
          ?? * 不存在時(shí)返回""。
          ?? * 如果文件名是以路徑分隔符結(jié)尾的則不考慮該分隔符,例如"/path/"返回""。
          ?? * @param fileName 文件名
          ?? * @return 父路徑,不存在或者已經(jīng)是父目錄時(shí)返回""
          ?? * @since? 0.5
          ?? */
          ? public static String getPathPart(String fileName) {
          ??? int point = getPathLsatIndex(fileName);
          ??? int length = fileName.length();
          ??? if (point == -1) {
          ????? return "";
          ??? }
          ??? else if (point == length - 1) {
          ????? int secondPoint = getPathLsatIndex(fileName, point - 1);
          ????? if (secondPoint == -1) {
          ??????? return "";
          ????? }
          ????? else {
          ??????? return fileName.substring(0, secondPoint);
          ????? }
          ??? }
          ??? else {
          ????? return fileName.substring(0, point);
          ??? }
          ? }

          ? /**
          ?? * 得到路徑分隔符在文件路徑中首次出現(xiàn)的位置。
          ?? * 對于DOS或者UNIX風(fēng)格的分隔符都可以。
          ?? * @param fileName 文件路徑
          ?? * @return 路徑分隔符在路徑中首次出現(xiàn)的位置,沒有出現(xiàn)時(shí)返回-1。
          ?? * @since? 0.5
          ?? */
          ? public static int getPathIndex(String fileName) {
          ??? int point = fileName.indexOf('/');
          ??? if (point == -1) {
          ????? point = fileName.indexOf('\\');
          ??? }
          ??? return point;
          ? }

          ? /**
          ?? * 得到路徑分隔符在文件路徑中指定位置后首次出現(xiàn)的位置。
          ?? * 對于DOS或者UNIX風(fēng)格的分隔符都可以。
          ?? * @param fileName 文件路徑
          ?? * @param fromIndex 開始查找的位置
          ?? * @return 路徑分隔符在路徑中指定位置后首次出現(xiàn)的位置,沒有出現(xiàn)時(shí)返回-1。
          ?? * @since? 0.5
          ?? */
          ? public static int getPathIndex(String fileName, int fromIndex) {
          ??? int point = fileName.indexOf('/', fromIndex);
          ??? if (point == -1) {
          ????? point = fileName.indexOf('\\', fromIndex);
          ??? }
          ??? return point;
          ? }

          ? /**
          ?? * 得到路徑分隔符在文件路徑中最后出現(xiàn)的位置。
          ?? * 對于DOS或者UNIX風(fēng)格的分隔符都可以。
          ?? * @param fileName 文件路徑
          ?? * @return 路徑分隔符在路徑中最后出現(xiàn)的位置,沒有出現(xiàn)時(shí)返回-1。
          ?? * @since? 0.5
          ?? */
          ? public static int getPathLsatIndex(String fileName) {
          ??? int point = fileName.lastIndexOf('/');
          ??? if (point == -1) {
          ????? point = fileName.lastIndexOf('\\');
          ??? }
          ??? return point;
          ? }

          ? /**
          ?? * 得到路徑分隔符在文件路徑中指定位置前最后出現(xiàn)的位置。
          ?? * 對于DOS或者UNIX風(fēng)格的分隔符都可以。
          ?? * @param fileName 文件路徑
          ?? * @param fromIndex 開始查找的位置
          ?? * @return 路徑分隔符在路徑中指定位置前最后出現(xiàn)的位置,沒有出現(xiàn)時(shí)返回-1。
          ?? * @since? 0.5
          ?? */
          ? public static int getPathLsatIndex(String fileName, int fromIndex) {
          ??? int point = fileName.lastIndexOf('/', fromIndex);
          ??? if (point == -1) {
          ????? point = fileName.lastIndexOf('\\', fromIndex);
          ??? }
          ??? return point;
          ? }

          ? /**
          ?? * 將文件名中的類型部分去掉。
          ?? * @param filename 文件名
          ?? * @return 去掉類型部分的結(jié)果
          ?? * @since? 0.5
          ?? */
          ? public static String trimType(String filename) {
          ??? int index = filename.lastIndexOf(".");
          ??? if (index != -1) {
          ????? return filename.substring(0, index);
          ??? }
          ??? else {
          ????? return filename;
          ??? }
          ? }
          ? /**
          ?? * 得到相對路徑。
          ?? * 文件名不是目錄名的子節(jié)點(diǎn)時(shí)返回文件名。
          ?? * @param pathName 目錄名
          ?? * @param fileName 文件名
          ?? * @return 得到文件名相對于目錄名的相對路徑,目錄下不存在該文件時(shí)返回文件名
          ?? * @since? 0.5
          ?? */
          ? public static String getSubpath(String pathName,String fileName) {
          ??? int index = fileName.indexOf(pathName);
          ??? if (index != -1) {
          ????? return fileName.substring(index + pathName.length() + 1);
          ??? }
          ??? else {
          ????? return fileName;
          ??? }
          ? }

          }
          ?4.遺留問題

          目前new FileInputStream()只會使用絕對路徑,相對沒用過,因?yàn)橐鄬τ趙eb服務(wù)器地址,比較麻煩

          還不如寫個(gè)配置文件來的快哪

          5.按Java文件類型分類讀取配置文件

          配置文件是應(yīng)用系統(tǒng)中不可缺少的,可以增加程序的靈活性。java.util.Properties是從jdk1.2就有的類,一直到現(xiàn)在都支持load ()方法,jdk1.4以后save(output,string) ->store(output,string)。如果只是單純的讀,根本不存在煩惱的問題。web層可以通過 Thread.currentThread().getContextClassLoader().
          getResourceAsStream("xx.properties") 獲取;Application可以通過new FileInputStream("xx.properties");直接在classes一級獲取。關(guān)鍵是有時(shí)我們需要通過web修改配置文件,我們不能將路徑寫死了。經(jīng)過測試覺得有以下心得:

          1.servlet中讀寫。如果運(yùn)用Struts 或者Servlet可以直接在初始化參數(shù)中配置,調(diào)用時(shí)根據(jù)servlet的getRealPath("/")獲取真實(shí)路徑,再根據(jù)String file = this.servlet.getInitParameter("abc");獲取相對的WEB-INF的相對路徑。
          例:
          InputStream input = Thread.currentThread().getContextClassLoader().
          getResourceAsStream("abc.properties");
          Properties prop = new Properties();
          prop.load(input);
          input.close();
          OutputStream out = new FileOutputStream(path);
          prop.setProperty("abc", “test");
          prop.store(out, “–test–");
          out.close();

          2.直接在jsp中操作,通過jsp內(nèi)置對象獲取可操作的絕對地址。
          例:
          // jsp頁面
          String path = pageContext.getServletContext().getRealPath("/");
          String realPath = path+"/WEB-INF/classes/abc.properties";

          //java 程序
          InputStream in = getClass().getClassLoader().getResourceAsStream("abc.properties"); // abc.properties放在webroot/WEB-INF/classes/目錄下
          prop.load(in);
          in.close();

          OutputStream out = new FileOutputStream(path); // path為通過頁面?zhèn)魅氲穆窂?br />prop.setProperty("abc", “abcccccc");
          prop.store(out, “–test–");
          out.close();

          3.只通過Java程序操作資源文件
          InputStream in = new FileInputStream("abc.properties"); // 放在classes同級

          OutputStream out = new FileOutputStream("abc.properties");

          posted @ 2006-04-19 16:11 zxf 閱讀(587) | 評論 (0)編輯 收藏

          <html:optionsCollection name="xxxActionForm" property="xxxVector"/>
          xxxActionForm.getXxxVector();xxxActionForm.setXxxVector()
          Vector xxxVector = new Vector();
          xxxVector.add(new LabelValueBean(label,value));
          posted @ 2006-04-19 10:33 zxf 閱讀(1246) | 評論 (0)編輯 收藏

          <script langage="javascript" type="text/javascript">
          location.reload();//刷新當(dāng)前窗口
          window.opener.location.reload();//刷新戶窗口
          </script>
          posted @ 2006-04-17 14:30 zxf 閱讀(1465) | 評論 (1)編輯 收藏

          < meta http-equiv="Refresh" content="秒數(shù); url=跳轉(zhuǎn)的文件或地址" >?
          posted @ 2006-04-17 10:37 zxf 閱讀(302) | 評論 (0)編輯 收藏

          利用Token解決重復(fù)重復(fù)提交:
          Struts利用同步令牌(Token)的方式來解決Web應(yīng)用中重復(fù)提交的問題,其機(jī)制是在form表單中增加一個(gè)隱藏的域,保存當(dāng)前令牌值,然后在程序中判斷此令牌值是否合法.
          org.apache.struts.action.Action類提供了相關(guān)操作Token的方法:
          1、isTokenValie方法:
          判斷存儲在當(dāng)前用戶會話中的令牌值和請求參數(shù)中的令牌值是否匹配.如果匹配,返回true,反之返回false.只要符合下列情況之一的,就會返回false:
          不存在HttpSession對象;
          在session范圍內(nèi)沒有保存令牌值;
          在請求參數(shù)中沒有令牌值;
          存儲在當(dāng)前用戶session范圍內(nèi)的令牌值和請求參數(shù)中的令牌值不匹配.
          2、resetToken方法:
          從當(dāng)前session范圍內(nèi)刪除令牌屬性.
          3、saveToken方法:
          創(chuàng)建一個(gè)新的令牌,并把它保存在當(dāng)前session范圍內(nèi).如果HttpSession不存在,就首先創(chuàng)建一個(gè)HttpSession對象.

          如何利用上述方法應(yīng)用令牌機(jī)制解決重復(fù)提交問題:
          以用戶注冊為例:
          在用戶請求newUser.jsp之前,首先把請求轉(zhuǎn)發(fā)到PrepareAction,PrepareAction 調(diào)用saveToken方法,創(chuàng)建一個(gè)新的令牌,并將令牌值保存在當(dāng)前HttpSession中(新創(chuàng)建的),PrepareAction接著把請求轉(zhuǎn)發(fā)給newUser.jsp.

          newUser.jsp中的<html:form>標(biāo)簽自動判斷在session范圍內(nèi)是否存在Token,如果存在,就自動在表單中生成一個(gè)包含Token信息的隱藏字段,例如:
          <input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="....">

          在用戶提交表單后,由InsertUserAction處理請求.在InsertUserAction中,調(diào)用isTokenValid方法,判斷當(dāng)前用戶會話中的令牌值和請求參數(shù)中的令牌值是否匹配.如果匹配,就調(diào)用resetToken方法,刪除Token,然后執(zhí)行插入數(shù)據(jù)操作.如果不匹配,返回相關(guān)錯(cuò)誤提示,進(jìn)行相關(guān)操作.

          OK.醬紫就可以有效放置重復(fù)提交了.

          如何在不使用Struts的前提下利用令牌機(jī)制解決重復(fù)提交問題:
          Struts的令牌機(jī)制有幾個(gè)要點(diǎn)可以讓我們在普通的JSP/Servlet中解決重復(fù)提交問題.
          1、提供幾個(gè)操作Token的相關(guān)方法:
          關(guān)鍵有三個(gè):
          resetToken(HttpServletRequest request)-->重置令牌值.
          saveToken(HttpServletRequest request)-->保存令牌值.
          isTokenValid(HttpServletRequest request)-->檢測令牌是否合法.

          2、在form表單中增加隱藏域,保存當(dāng)前令牌值.

          3、在執(zhí)行持久性數(shù)據(jù)操作之前調(diào)用相關(guān)方法判斷當(dāng)前令牌是否合法,之后在進(jìn)行相關(guān)操作.

          方法是相同的,只是實(shí)現(xiàn)的方式不太一樣.

          truts1.1 API關(guān)于幾個(gè)Token操作方法的說明:

          protected? boolean isTokenValid(javax.servlet.http.HttpServletRequest request)
          ????????? Return true if there is a transaction token stored in the user's current session, and the value submitted as a request parameter with this action matches it.

          protected? boolean isTokenValid(javax.servlet.http.HttpServletRequest request, boolean reset)
          ????????? Return true if there is a transaction token stored in the user's current session, and the value submitted as a request parameter with this action matches it.

          protected? void resetToken(javax.servlet.http.HttpServletRequest request)
          ????????? Reset the saved transaction token in the user's session.

          protected? void saveToken(javax.servlet.http.HttpServletRequest request)
          ????????? Save a new transaction token in the user's current session, creating a new session if necessary.

          posted @ 2006-04-12 17:05 zxf 閱讀(448) | 評論 (0)編輯 收藏

          在Action中的add方法中,我們需要將Token值明確的要求保存在頁面中,只需增加一條語句:saveToken(request);,如下所示:
            
            public ActionForward add(ActionMapping mapping, ActionForm form,
            
            HttpServletRequest request, HttpServletResponse response)
            
            //前面的處理省略
            
            saveToken(request);
            
            return mapping.findForward("add");
            
            }在Action的insert方法中,我們根據(jù)表單中的Token值與服務(wù)器端的Token值比較,如下所示:
            
            public ActionForward insert(ActionMapping mapping, ActionForm form,
            
            HttpServletRequest request, HttpServletResponse response)
            
            if (isTokenValid(request, true)) {
            
            // 表單不是重復(fù)提交
            
            //這里是保存數(shù)據(jù)的代碼
            
            } else {
            
            //表單重復(fù)提交
            
            saveToken(request);
            
            //其它的處理代碼
            
            }
            
            }
          posted @ 2006-04-11 16:52 zxf 閱讀(290) | 評論 (0)編輯 收藏

          ActionMessages errors = new ActionMessages();
          errors.add("ExistLoginName",new ActionMessage("admin.user.jsp.existlogin",this.loginName));

          <html:messages id="ExistLoginName" property="ExistLoginName" message="true">
          <script language="javascript" type="text/javascript">
          alert("<bean:write name="ExistLoginName"/>");
          </script>
          </html:messages>
          posted @ 2006-04-07 17:26 zxf 閱讀(807) | 評論 (0)編輯 收藏

          <html:radio value="1" property="gender" styleId="g1"/>
          <label for="g1">
          <bean:message bundle="SITEADMIN_RESOURCE_KEY" key="site.gender.male"/>
          </label>
          <html:radio value="0" property="gender" styleId="g2"/>
          <label for="g2">
          <bean:message bundle="SITEADMIN_RESOURCE_KEY" key="site.gender.female"/>
          </label>
          posted @ 2006-04-07 09:25 zxf 閱讀(480) | 評論 (0)編輯 收藏

          最新版本的代碼片段: 1.0

          
          <!-- IE5.5以上 -->
          <OBJECT id=WebBrowser classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 width=0></OBJECT>
          <input type=button value=打印 onclick=document.all.WebBrowser.ExecWB(6,1)>
          <input type=button value=直接打印 onclick=document.all.WebBrowser.ExecWB(6,6)>
          <input type=button value=頁面設(shè)置 onclick=document.all.WebBrowser.ExecWB(8,1)>
          <input type=button value=打印預(yù)覽 onclick=document.all.WebBrowser.ExecWB(7,1)>
          
          <input type=button value=打開 onclick=document.all.WebBrowser.ExecWB(1,1)>
          <input type=button value=另存為 onclick=document.all.WebBrowser.ExecWB(4,1)>
          <input type=button value=屬性 onclick=document.all.WebBrowser.ExecWB(10,1)>
          <input type=button value=全選 onclick=document.all.WebBrowser.ExecWB(17,1)>
          <input type=button value=刷新 onclick=document.all.WebBrowser.ExecWB(22,1)>
          <input type=button value=關(guān)閉窗口 onclick=document.all.WebBrowser.ExecWB(45,1)>
          
          posted @ 2006-03-16 17:33 zxf 閱讀(266) | 評論 (0)編輯 收藏

          1.-----------------------------------------
          得到系統(tǒng)當(dāng)前時(shí)間:

          java.util.Date dt=new java.util.Date();
          System.out.print(dt);  //輸出結(jié)果是:Wed Aug 10 11:29:11 CST 2005

          SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
          System.out.print(sdf.format(dt));  //輸出結(jié)果是:2005-08-10

          2.-----------------------------------------
          把字符串轉(zhuǎn)化為java.util.Date
          方法一:
          SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
          java.util.Date dt=sdf.parse("2005-2-19");
          System.out.print(sdf.format(dt));    //輸出結(jié)果是:2005-2-19

          方法二:
          java.util.Date dt=null;
          DateFormat df=DateFormat.getDateInstance();
          dt=df.parse("2005-12-19");
          System.out.println(dt);              //輸出結(jié)果為:Mon Dec 19 00:00:00 CST 2005
          System.out.println(df.format(dt));  //輸出結(jié)果為:2005-2-19

          3.-----------------------------------------
          把字符串轉(zhuǎn)化為java.sql.Date
          字符串必須是"yyyy-mm-dd"格式,否則會拋出IllegalArgumentException異常
          java.sql.Date sdt=java.sql.Date.valueOf("2005-9-6");
          System.out.println(sdt);          //輸出結(jié)果為:2005-9-6

          4.-----------------------------------------
          TestApp.java

          public class TestApp {

              public static void main(String[] args) {
                  System.out.println("Hello World!");
                  Date d=new Date();
                 
                  //System.out.println(d.toLocaleString());
                 
                  //Calendar cld=Calendar.getInstance();
                  System.out.println("Calendar.get(Calendar.DATE)"+(Calendar.getInstance().get(Calendar.DATE)));
                 
                  Date dt=new Date();//Date(103,-5,-6);
                  System.out.println("getNowYear(Date dt)"+getYear(dt));
                  System.out.println("getNowMonth(Date dt)"+getMonth(dt));
                  System.out.println("getNowDate(Date dt)"+getDate(dt));
              }
             

              /**
              * 獲得當(dāng)前日期的年份。
              * @return int 年份
              */
              public static int getNowYear(){
                  return Calendar.getInstance().get(Calendar.YEAR);
              }

              /**
              * 獲得給定日期的年份
              * @param dt 給定日期
              * @return int 年份
              * @throws NullPointerException 如果參數(shù)年份為null,拋出異常。
              */
              public static int getYear(Date dt)throws NullPointerException{
                  if(dt==null){
                      throw new NullPointerException("日期參數(shù)為null");
                  }else{
                      Calendar cld=Calendar.getInstance();
                      cld.setTime(dt);
                      return cld.get(Calendar.YEAR);
                  }
              }
             
              /**
              * 獲得當(dāng)前日期的月份。
              * @return int 月份
              */
              public static int getNowMonth(){
                  return 1+Calendar.getInstance().get(Calendar.MONTH);
              }
             
              /**
              * 獲得給定日期的月份
              * @param dt 給定日期
              * @return int 月份(1-12)
              * @throws NullPointerException 如果參數(shù)年份為null,拋出異常。
              */
              public static int getMonth(Date dt)throws NullPointerException{
                  if(dt==null){
                      throw new NullPointerException("日期參數(shù)為null");
                  }else{
                      Calendar cld=Calendar.getInstance();
                      cld.setTime(dt);
                      return 1+cld.get(Calendar.MONTH);
                  }
              }
              /**
              * 獲得當(dāng)前日期的當(dāng)月的天數(shù)。
              * @return int 當(dāng)月的天數(shù)
              */
              public static int getNowDate(){
                  return 1+Calendar.getInstance().get(Calendar.DATE);
              }
             
              /**
              * 獲得給定日期的當(dāng)月的天數(shù)
              * @param dt 給定日期
              * @return int 當(dāng)月的天數(shù)
              * @throws NullPointerException 如果參數(shù)年份為null,拋出異常。
              */
              public static int getDate(Date dt)throws NullPointerException{
                  if(dt==null){
                      throw new NullPointerException("日期參數(shù)為null");
                  }else{
                      Calendar cld=Calendar.getInstance();
                      cld.setTime(dt);
                      return cld.get(Calendar.DATE);
                  }
              }
          }
          posted @ 2006-02-27 17:31 zxf 閱讀(4075) | 評論 (2)編輯 收藏

          僅列出標(biāo)題
          共4頁: 上一頁 1 2 3 4 下一頁 
          主站蜘蛛池模板: 云霄县| 贵港市| 南川市| 正定县| 塔城市| 吉木乃县| 鸡西市| 亚东县| 乌兰浩特市| 和田市| 通河县| 浦城县| 香格里拉县| 长垣县| 丹江口市| 镇雄县| 张掖市| 于都县| 东乡县| 建阳市| 宝丰县| 梅河口市| 辽阳市| 墨玉县| 贵港市| 新余市| 滦南县| 白沙| 同仁县| 沁阳市| 瓦房店市| 呼图壁县| 页游| 内江市| 康保县| 新泰市| 马关县| 阿拉善右旗| 怀宁县| 汉源县| 新巴尔虎右旗|