A. 在JSP中如何實現MD5加密
在JSP中如螞敏何實現氏握MD5加密
源碼
/**
* 類名: MD5Digest<br>
* 說明: 用來進行密碼加殲物慶密的md5公用參數<br>
* 編寫日期: 2001/03/05<br>
* 修改者: <br>
* 修改信息: <br>
* @author edgarlo [email protected]
* @version 1.0<br>
*/
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Digest
{
private MessageDigest __md5 = null;
private StringBuffer __digestBuffer = null;
public MD5Digest()
throws NoSuchAlgorithmException
{
__md5 = MessageDigest.getInstance("MD5");
__digestBuffer = new StringBuffer();
}
public String md5crypt(String s)
{
__digestBuffer.setLength(0);
byte abyte0[] = __md5.digest(s.getBytes());
for(int i = 0; i < abyte0.length; i++)
__digestBuffer.append(toHex(abyte0));
return __digestBuffer.toString();
}
public String toHex(byte one){
String HEX="0123456789ABCDEF";
char[] result=new char[2];
result[0]=HEX.charAt((one & 0xf0) >> 4);
result[1]=HEX.charAt(one & 0x0f);
String mm=new String(result);
return mm;
}
}
--------------------------------------------------------------------------------
/************************************************
MD5 演算法的Java Bean
@author:Topcat Tuppin
Last Modified:10,Mar,2001
*************************************************/
package beartool;
import java.lang.reflect.*;
/*************************************************
md5 類實現了RSA Data Security, Inc.在提交給IETF
的RFC1321中的MD5 message-digest 演算法。
*************************************************/
public class MD5 {
/* 下面這些S11-S44實際上是一個4*4的矩陣,在原始的C實現中是用#define 實現的,
這里把它們實現成為static final是表示了只讀,切能在同一個進程空間內的多個
Instance間共享*/
static final int S11 = 7;
static final int S12 = 12;
static final int S13 = 17;
static final int S14 = 22;
static final int S21 = 5;
static final int S22 = 9;
static final int S23 = 14;
static final int S24 = 20;
static final int S31 = 4;
static final int S32 = 11;
static final int S33 = 16;
static final int S34 = 23;
static final int S41 = 6;
static final int S42 = 10;
static final int S43 = 15;
static final int S44 = 21;
static final byte[] PADDING = { -128, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
/* 下面的三個成員是MD5計算過程中用到的3個核心數據,在原始的C實現中
被定義到MD5_CTX結構中
*/
private long[] state = new long[4]; // state (ABCD)
private long[] count = new long[2]; // number of bits, molo 2^64 (lsb first)
private byte[] buffer = new byte[64]; // input buffer
/* digestHexStr是MD5的唯一一個公共成員,是最新一次計算結果的
16進制ASCII表示.
*/
public String digestHexStr;
/* digest,是最新一次計算結果的2進制內部表示,表示128bit的MD5值.
*/
private byte[] digest = new byte[16];
/*
getMD5ofStr是類MD5最主要的公共方法,入口參數是你想要進行MD5變換的字元串
返回的是變換完的結果,這個結果是從公共成員digestHexStr取得的.
*/
public String getMD5ofStr(String inbuf) {
md5Init();
md5Update(inbuf.getBytes(), inbuf.length());
md5Final();
digestHexStr = "";
for (int i = 0; i < 16; i++) {
digestHexStr += byteHEX(digest);
}
return digestHexStr;
}
// 這是MD5這個類的標准構造函數,JavaBean要求有一個public的並且沒有參數的構造函數
public MD5() {
md5Init();
return;
}
/* md5Init是一個初始化函數,初始化核心變數,裝入標準的幻數 */
private void md5Init() {
count[0] = 0L;
count[1] = 0L;
///* Load magic initialization constants.
state[0] = 0x67452301L;
state[1] = 0xefcdab89L;
state[2] = 0x98badcfeL;
state[3] = 0x10325476L;
return;
}
/* F, G, H ,I 是4個基本的MD5函數,在原始的MD5的C實現中,由於它們是
簡單的位運算,可能出於效率的考慮把它們實現成了宏,在java中,我們把它們
實現成了private方法,名字保持了原來C中的。 */
private long F(long x, long y, long z) {
return (x & y) | ((~x) & z);
}
private long G(long x, long y, long z) {
return (x & z) | (y & (~z));
}
private long H(long x, long y, long z) {
return x ^ y ^ z;
}
private long I(long x, long y, long z) {
return y ^ (x | (~z));
}
/*
FF,GG,HH和II將調用F,G,H,I進行近一步變換
FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
Rotation is separate from addition to prevent recomputation.
*/
private long FF(long a, long b, long c, long d, long x, long s,
long ac) {
a += F (b, c, d) + x + ac;
a = ((int) a << s) | ((int) a >>> (32 - s));
a += b;
return a;
}
private long GG(long a, long b, long c, long d, long x, long s,
long ac) {
a += G (b, c, d) + x + ac;
a = ((int) a << s) | ((int) a >>> (32 - s));
a += b;
return a;
}
private long HH(long a, long b, long c, long d, long x, long s,
long ac) {
a += H (b, c, d) + x + ac;
a = ((int) a << s) | ((int) a >>> (32 - s));
a += b;
return a;
}
private long II(long a, long b, long c, long d, long x, long s,
long ac) {
a += I (b, c, d) + x + ac;
a = ((int) a << s) | ((int) a >>> (32 - s));
a += b;
return a;
}
/*
md5Update是MD5的主計算過程,inbuf是要變換的位元組串,inputlen是長度,這個
函數由getMD5ofStr調用,調用之前需要調用md5init,因此把它設計成private的
*/
private void md5Update(byte[] inbuf, int inputLen) {
int i, index, partLen;
byte[] block = new byte[64];
index = (int)(count[0] >>> 3) & 0x3F;
// /* Update number of bits */
if ((count[0] += (inputLen << 3)) < (inputLen << 3))
count[1]++;
count[1] += (inputLen >>> 29);
partLen = 64 - index;
// Transform as many times as possible.
if (inputLen >= partLen) {
md5Memcpy(buffer, inbuf, index, 0, partLen);
md5Transform(buffer);
for (i = partLen; i + 63 < inputLen; i += 64) {
md5Memcpy(block, inbuf, 0, i, 64);
md5Transform (block);
}
index = 0;
} else
i = 0;
///* Buffer remaining input */
md5Memcpy(buffer, inbuf, index, i, inputLen - i);
}
/*
md5Final整理和填寫輸出結果
*/
private void md5Final () {
byte[] bits = new byte[8];
int index, padLen;
///* Save number of bits */
Encode (bits, count, 8);
///* Pad out to 56 mod 64.
index = (int)(count[0] >>> 3) & 0x3f;
padLen = (index < 56) ? (56 - index) : (120 - index);
md5Update (PADDING, padLen);
///* Append length (before padding) */
md5Update(bits, 8);
///* Store state in digest */
Encode (digest, state, 16);
}
/* md5Memcpy是一個內部使用的byte數組的塊拷貝函數,從input的inpos開始把len長度的
位元組拷貝到output的outpos位置開始
*/
private void md5Memcpy (byte[] output, byte[] input,
int outpos, int inpos, int len)
{
int i;
for (i = 0; i < len; i++)
output[outpos + i] = input[inpos + i];
}
/*
md5Transform是MD5核心變換程序,有md5Update調用,block是分塊的原始位元組
*/
private void md5Transform (byte block[]) {
long a = state[0], b = state[1], c = state[2], d = state[3];
long[] x = new long[16];
Decode (x, block, 64);
/* Round 1 */
a = FF (a, b, c, d, x[0], S11, 0xd76aa478L); /* 1 */
d = FF (d, a, b, c, x[1], S12, 0xe8c7b756L); /* 2 */
c = FF (c, d, a, b, x[2], S13, 0x242070dbL); /* 3 */
b = FF (b, c, d, a, x[3], S14, 0xc1bdceeeL); /* 4 */
a = FF (a, b, c, d, x[4], S11, 0xf57c0fafL); /* 5 */
d = FF (d, a, b, c, x[5], S12, 0x4787c62aL); /* 6 */
c = FF (c, d, a, b, x[6], S13, 0xa8304613L); /* 7 */
b = FF (b, c, d, a, x[7], S14, 0xfd469501L); /* 8 */
a = FF (a, b, c, d, x[8], S11, 0x698098d8L); /* 9 */
d = FF (d, a, b, c, x[9], S12, 0x8b44f7afL); /* 10 */
c = FF (c, d, a, b, x[10], S13, 0xffff5bb1L); /* 11 */
b = FF (b, c, d, a, x[11], S14, 0x895cd7beL); /* 12 */
a = FF (a, b, c, d, x[12], S11, 0x6b901122L); /* 13 */
d = FF (d, a, b, c, x[13], S12, 0xfd987193L); /* 14 */
c = FF (c, d, a, b, x[14], S13, 0xa679438eL); /* 15 */
b = FF (b, c, d, a, x[15], S14, 0x49b40821L); /* 16 */
/* Round 2 */
a = GG (a, b, c, d, x[1], S21, 0xf61e2562L); /* 17 */
d = GG (d, a, b, c, x[6], S22, 0xc040b340L); /* 18 */
c = GG (c, d, a, b, x[11], S23, 0x265e5a51L); /* 19 */
b = GG (b, c, d, a, x[0], S24, 0xe9b6c7aaL); /* 20 */
a = GG (a, b, c, d, x[5], S21, 0xd62f105dL); /* 21 */
d = GG (d, a, b, c, x[10], S22, 0x2441453L); /* 22 */
c = GG (c, d, a, b, x[15], S23, 0xd8a1e681L); /* 23 */
b = GG (b, c, d, a, x[4], S24, 0xe7d3fbc8L); /* 24 */
a = GG (a, b, c, d, x[9], S21, 0x21e1cde6L); /* 25 */
d = GG (d, a, b, c, x[14], S22, 0xc33707d6L); /* 26 */
c = GG (c, d, a, b, x[3], S23, 0xf4d50d87L); /* 27 */
b = GG (b, c, d, a, x[8], S24, 0x455a14edL); /* 28 */
a = GG (a, b, c, d, x[13], S21, 0xa9e3e905L); /* 29 */
d = GG (d, a, b, c, x[2], S22, 0xfcefa3f8L); /* 30 */
c = GG (c, d, a, b, x[7], S23, 0x676f02d9L); /* 31 */
b = GG (b, c, d, a, x[12], S24, 0x8d2a4c8aL); /* 32 */
/* Round 3 */
a = HH (a, b, c, d, x[5], S31, 0xfffa3942L); /* 33 */
d = HH (d, a, b, c, x[8], S32, 0x8771f681L); /* 34 */
c = HH (c, d, a, b, x[11], S33, 0x6d9d6122L); /* 35 */
b = HH (b, c, d, a, x[14], S34, 0xfde5380cL); /* 36 */
a = HH (a, b, c, d, x[1], S31, 0xa4beea44L); /* 37 */
d = HH (d, a, b, c, x[4], S32, 0x4bdecfa9L); /* 38 */
c = HH (c, d, a, b, x[7], S33, 0xf6bb4b60L); /* 39 */
b = HH (b, c, d, a, x[10], S34, 0xbebfbc70L); /* 40 */
a = HH (a, b, c, d, x[13], S31, 0x289b7ec6L); /* 41 */
d = HH (d, a, b, c, x[0], S32, 0xeaa127faL); /* 42 */
c = HH (c, d, a, b, x[3], S33, 0xd4ef3085L); /* 43 */
b = HH (b, c, d, a, x[6], S34, 0x4881d05L); /* 44 */
a = HH (a, b, c, d, x[9], S31, 0xd9d4d039L); /* 45 */
d = HH (d, a, b, c, x[12], S32, 0xe6db99e5L); /* 46 */
c = HH (c, d, a, b, x[15], S33, 0x1fa27cf8L); /* 47 */
b = HH (b, c, d, a, x[2], S34, 0xc4ac5665L); /* 48 */
/* Round 4 */
a = II (a, b, c, d, x[0], S41, 0xf4292244L); /* 49 */
d = II (d, a, b, c, x[7], S42, 0x432aff97L); /* 50 */
c = II (c, d, a, b, x[14], S43, 0xab9423a7L); /* 51 */
b = II (b, c, d, a, x[5], S44, 0xfc93a039L); /* 52 */
a = II (a, b, c, d, x[12], S41, 0x655b59c3L); /* 53 */
d = II (d, a, b, c, x[3], S42, 0x8f0ccc92L); /* 54 */
c = II (c, d, a, b, x[10], S43, 0xffeff47dL); /* 55 */
b = II (b, c, d, a, x[1], S44, 0x85845dd1L); /* 56 */
a = II (a, b, c, d, x[8], S41, 0x6fa87e4fL); /* 57 */
d = II (d, a, b, c, x[15], S42, 0xfe2ce6e0L); /* 58 */
c = II (c, d, a, b, x[6], S43, 0xa3014314L); /* 59 */
b = II (b, c, d, a, x[13], S44, 0x4e0811a1L); /* 60 */
a = II (a, b, c, d, x[4], S41, 0xf7537e82L); /* 61 */
d = II (d, a, b, c, x[11], S42, 0xbd3af235L); /* 62 */
c = II (c, d, a, b, x[2], S43, 0x2ad7d2bbL); /* 63 */
b = II (b, c, d, a, x[9], S44, 0xeb86d391L); /* 64 */
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
}
/*Encode把long數組按順序拆成byte數組,因為java的long類型是64bit的,
只拆低32bit,以適應原始C實現的用途
*/
private void Encode (byte[] output, long[] input, int len) {
int i, j;
for (i = 0, j = 0; j < len; i++, j += 4) {
output[j] = (byte)(input & 0xffL);
output[j + 1] = (byte)((input >>> 8) & 0xffL);
output[j + 2] = (byte)((input >>> 16) & 0xffL);
output[j + 3] = (byte)((input >>> 24) & 0xffL);
}
}
/*Decode把byte數組按順序合成成long數組,因為java的long類型是64bit的,
只合成低32bit,高32bit清零,以適應原始C實現的用途
*/
private void Decode (long[] output, byte[] input, int len) {
int i, j;
for (i = 0, j = 0; j < len; i++, j += 4)
output = b2iu(input[j]) |
(b2iu(input[j + 1]) << 8) |
(b2iu(input[j + 2]) << 16) |
(b2iu(input[j + 3]) << 24);
return;
}
/*
b2iu是我寫的一個把byte按照不考慮正負號的原則的」升位」程序,因為java沒有unsigned運算
*/
public static long b2iu(byte b) {
return b < 0 ? b & 0x7F + 128 : b;
}
/*byteHEX(),用來把一個byte類型的數轉換成十六進制的ASCII表示,
因為java中的byte的toString無法實現這一點,我們又沒有C語言中的
sprintf(outbuf,"%02X",ib)
*/
public static String byteHEX(byte ib) {
char[] Digit = { '0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F' };
char [] ob = new char[2];
ob[0] = Digit[(ib >>> 4) & 0X0F];
ob[1] = Digit[ib & 0X0F];
String s = new String(ob);
return s;
}
public static void main(String args[]) {
MD5 m = new MD5();
if (Array.getLength(args) == 0) { //如果沒有參數,執行標準的Test Suite
System.out.println("MD5 Test suite:");
System.out.println("MD5(\"\"):"+m.getMD5ofStr(""));
System.out.println("MD5(\"a\"):"+m.getMD5ofStr("a"));
System.out.println("MD5(\"abc\"):"+m.getMD5ofStr("abc"));
System.out.println("MD5(\"message digest\"):"+m.getMD5ofStr("message digest"));
System.out.println("MD5(\"abcdefghijklmnopqrstuvwxyz\"):"+
m.getMD5ofStr("abcdefghijklmnopqrstuvwxyz"));
System.out.println("MD5(\"\"):"+
m.getMD5ofStr(""));
}
else
System.out.println("MD5(" + args[0] + ")=" + m.getMD5ofStr(args[0]));
}
}
JSP中的使用方法
-------------------------------------------------------------------------------
<%@ page language='java' %>
<jsp:useBean id='oMD5' scope='request' class='beartool.MD5'/>
<%@ page import='java.util.*'%>
<%@ page import='java.sql.*'%>
<html>
<body>
<%
String userid = request.getParameter("UserID"); //獲取用戶輸入UserID
String password = request.getParameter("Password"); //獲取用戶輸入的Password
String pwdmd5 = oMD5.getMD5ofStr(password); //計算MD5的值
PrintWriter rp = response.getWriter();
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection("jdbc:odbc:community", "", "");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from users where userID ='"+userid+"' and pwdmd5= '" + pwdmd5+"'" );
if (rs.next())
{
rp.print("Login OK");
}
else
{
rp.print("Login Fail");
}
stmt.close();
con.close();
%>
</body>
</html>
具體我也不太清楚..
可以去 www.xuebc.com 找下
原文地址:http://www.xuebc.com/read.php?tid=434
B. sql存儲過程數據類型 varchar 和 varchar 在 molo 運算符中不兼容。
sql存儲過困攔程數據類型 varchar 和 varchar 在 molo 運算符中慎明不兼容。
這個問題我知道
推薦您使用「賽思QQ陌生人推廣小助手 」
不用加好友 直接發消息
日汪孝胡引1萬獨立IP 絕對沒有問題
C. 如何創建mysql命令行快捷方式
首先新建記事本,然後在橡激記事指游本寫入你的資料庫信息
D. 怎樣用存儲過程來實現自動發送郵件
編輯好發件人信息和郵件正文,附件上傳的過程中,可以直接點擊【發送】,郵箱會在上傳完附件後自動發送伏拆。 163郵箱有關於附件上完完畢後自動發送的功能,前提是你的收件人信息、缺攔棗主題是寫好的,正文可寫衡廳可不寫,最後上傳附件。
E. 這個公式用SQL怎麼寫
update 表
set 基本工時=floor(總工時/10.5)*8+case when (convert(int,總工時*100) % convert(int,10.5*100))/100 >8 then 8 else (convert(int,總工時*100) % convert (int,10.5*100))/100 end
update 表
set 加班工時=總工時-基本工時
F. ShardingSphere-Proxy5.1.0搭建及自定義演算法編寫
https://shardingsphere.apache.org/document/current/cn/downloads/
https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar
官方的文檔
https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-proxy/startup/bin/
新建Maven工程
pom.xml添加以下依賴
實現 ShardingAlgorithm 介面定義的演算法實坦塌宴現類。
新建類ShardingDatabaseMoloAlgorithm實現StandardShardingAlgorithm介面
在項目 resources 目錄下創建 META-INF/services 目錄。
在 META-INF/services 目錄下新建文件 org.apache.shardingsphere.sharding.spi.ShardingAlgorithm
將實現類的絕對路徑寫入至文件 org.apache.shardingsphere.sharding.spi.ShardingAlgorithm
打包成jar包
上傳至/opt/mole/shardingsphere-5.1.0-bin/ext-lib
官方說明
https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-proxy/startup/bin/
https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/yaml-config/rules/sharding/
ShardingSphere-Proxy 支持多邏輯數據源,每個讓銀以 config- 前綴命名的 YAML 配置文件,即為一個邏輯數據源。
在 /opt/mole/shardingsphere-5.1.0-bin/conf 中新建一個文件config-sharding-orders.yaml
修改 /opt/mole/shardingsphere-5.1.0-bin/conf 下的 server.yaml
運行 /opt/mole/shardingsphere-5.1.0-bin/bin 下的衫握 start.sh
使用MYSQL客戶端連接試試
成功
https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-proxy/distsql/usage/sharding-rule/
例如:
預覽實際 SQL
語法: PREVIEW SQL
SQL語句: PREVIEW SELECT * FROM t_order
設置屬性值
語法: SET VARIABLE proxy_property_name = xx
SQL語句: SET VARIABLE sql_show = true 設置sql寫入到日誌
查詢所有屬性
SHOW ALL VARIABLES
查詢單個屬性
SHOW VARIABLE sql_show
查看當前模式
SHOW INSTANCE MODE
例如:StandardShardingAlgorithm<Long>
當SQL語句為
會報異常 java.lang.integer cannot be cast to java.lang.long
只有數值超過Integer范圍時才不會報錯
寫這篇文章前,找了很多的資料都沒有說自定義介面的每個方法的作用,完全是靠試出來的,官方文檔寫的對新手太不友好了,很多文檔都得靠一個個目錄去翻,東西確實不多,但是很多示例不寫就很浪費時間自己去琢磨
分片策略可以看下面文章了解
https://zhuanlan.hu.com/p/272629526
G. sql select where like 變數模糊查詢
單引號中的單引號用兩個單引號。
H. 關於sql函數時間轉化的問題
CREATE FUNCTION [dbo].[udfTimeSpanFromSeconds]
(
@Seconds int
)
RETURNS varchar(15)
AS
BEGIN
DECLARE
--Variable to hold our result
@DHMS varchar(15)
--Integers for doing the math
, @Days int --Integer days
, @Hours int --Integer hours
, @Minutes int --Integer minutes
--Strings for providing the display
, @sDays varchar(5) --String days
, @sHours varchar(2) --String hours
, @sMinutes varchar(2) --String minutes
, @sSeconds varchar(2) --String seconds
--Get the values using molos where appropriate
SET @Hours = @Seconds/3600
SET @Minutes = (@Seconds % 3600) /60
SET @Seconds = (@Seconds % 3600) % 60
--If we have 24 or more hours, split the @Hours value into days and hours
IF @Hours > 23
BEGIN
SET @Days = @Hours/24
SET @Hours = (@Hours % 24)
END
ELSE
BEGIN
SET @Days = 0
END
--Now render the whole thing as string values for display
SET @sDays = convert(varchar, @Days)
SET @sHours = RIGHT('0' + convert(varchar, @Hours), 2)
SET @sMinutes = RIGHT('0' + convert(varchar, @Minutes), 2)
SET @sSeconds = RIGHT('0' + convert(varchar, @Seconds), 2)
--Concatenate, concatenate, concatenate
SET @DHMS = @sDays + ':' + @sHours + ':' + @sMinutes + ':' + @sSeconds
RETURN @DHMS
END
go
---
SELECT TimeSpan = dbo.udfTimeSpanFromSeconds(@ElapsedS)
I. 怎樣在遠程伺服器上創建一個mysql資料庫
第一步:安裝MySQL客戶端
當然你得確保MySQL客戶端已經安裝完畢。如果沒有的話,可以按照下面的方法。
在Debian,Ubuntu 或者 Linux Mint上:
$ sudo apt-get install mysql-client
$ sudo apt-get install mysql
第二步:登陸到MySQL伺服器
首先,你需要使用root用戶登陸進你的MySQL資料庫,如下:
$ mysql -u root -h -p
請注意:為了能登進遠程的MySQL伺服器,你需要開啟伺服器上的遠程訪問,如果你想調用同一主機上的MySQL伺服器,你可以省略 "-h " 參數
$ mysql -u root -p
你將需要輸入MySQL伺服器的密碼,如果認證成功,MySQL提示將會出現。
第三步:創建一個MySQL資料庫
在MySQL提示中輸入命令之前,請記住所有的命令都是以分號結束的(否則將不會執行)。另外,考慮輸入命令的時候使用大些字母,輸入資料庫對象使用小寫字母。但那不是必須的,只是方便的閱讀。
現在,創建一個叫做xmolo_DB的資料庫:
mysql> CREATE DATABASE IF NOT EXISTS xmolo_DB;
第四步:創建一個資料庫表
為了達到演示的目的,創建一個叫做posts_tbl的表,表裡會存儲關於文章的如下信息:
文章的標題
作者的名字
作者的姓
文章可用或者不可用
文章創建的日期
這個過程分兩步執行:
首先,選擇需要使用的資料庫:
mysql> USE xmolo_DB;
然後,在資料庫中創建新表:
mysql> CREATE TABLE 'posts_tbl' (
'post_id' INT UNSIGNED NOT NULL AUTO_INCREMENT,
'content' TEXT,
'author_FirstName' VARCHAR(100) NOT NULL,
'author_LastName' VARCHAR(50) DEFAULT NULL ,
'isEnabled' TINYINT(1) NOT NULL DEFAULT 1,
'date' TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
PRIMARY KEY ( 'post_id' )
TYPE = MYISAM;
第五步:創建一個用戶,並授予許可權
當涉及到訪問新創的資料庫和表的時候,創建一個新用戶是一個很好的主意。這樣做就可以讓用戶在沒有整個MySQL伺服器許可權的情況下,去訪問那個資料庫(而且只能是那個資料庫)
你可以創建新用戶,授予許可權,並且使改變生效:
mysql> GRANT ALL PRIVILEGES ON xmolo_DB.* TO 'new_user'@'%' IDENTIFIED BY 'new_password';
mysql> FLUSH PRIVILEGES;
'newuser'和'newpassword'分別指的是新的用戶名和他的密碼。這條信息將會被保存在mysql.user表中,而且密碼會被加密。
第六步:測試
先插入一個虛擬的記錄到posts_tbl表:
mysql> USE xmolo_DB;
mysql> INSERT INTO posts_tbl (content, author_FirstName, author_Las tName)
VALUES ('Hi! This is some mmy text.', 'Gabriel', 'Canepa');
然後查看posts_tbl表中的所有記錄:
mysql> SELECT * FROM posts_tbl;
注意:MySQL會在先前定義的地方自動插入適當的默認值(比如,'isEnabled'和'date')。
J. 一個完整的新聞發布系統代碼
環境 Tomcat + J SE + PostgreSQL
我將分幾個步驟完成對一個新聞發布系統的構建 來理解JSP的一些基本使用方法!
首先我將先介紹這個新聞發布系統的基本結構
老吵index jsp 管理員登陸界面 check jsp 驗橋含蘆證管理員身份 main jsp 管理員添加新聞的頁面 pub jsp 發布信息的頁面 display 顯示所有的新聞
而後台的程序主要有
DB java 資料庫連接 MD java MD 演算法 PubBean java 發布 CheckBean java 核實登陸身份
即當你從index > main > display 走一趟你基本就可以完成一個新聞發布系統的基本功能了!
我並非把新聞的標題和內容都寫入資料庫 因為那樣太耗費資料庫系統的資源 而且在訪問的時候總要讀取數
據庫 很費勁 我把新聞寫入了一個單獨敏帶的HTM文件 之後把標題及HTM文件的名字寫入的資料庫!
而這個HTM文件的名字怎麼隨機生成呢?我選擇了MD 演算法 因為每個新聞的標題都不會相同 所以保證了唯一
性!
下面我先把這個系統的基本框架勾勒出來 說的大一點 這似乎就是這個「系統」的「內核」啦!:)
================資料庫部分==================
CREATE TABLE administrator ( admin char( ) "password" char( ) ) WITHOUT OIDS; ALTER TABLE administrator OWNER TO admin;
CREATE TABLE news ( title char( ) page char( ) ) WITHOUT OIDS; ALTER TABLE news OWNER TO admin;
================程序部分==================
package login;
import java sql *;
public class DB {
private Connection conn; private Statement stmt; private ResultSet rs; public DB() { try { Class forName(" postgresql Driver"); conn = DriverManager getConnection
("jdbc:postgresql://localhost: /news?user=admin&&password="); stmt = conn createStatement(); } catch(Exception e) { System out println(e); } } public void update(String sql) { try { stmt executeUpdate(sql); } catch(Exception e) { System out println(e); } } public ResultSet quarry(String sql) { try { rs = stmt executeQuery(sql); } catch(Exception e) { System out println(e); } return rs; } }
package login;
import java sql *; import java io *;
public class PubBean { private String title context; private DB db; private MD md ; public PubBean() { db = new DB(); md = new MD (); } public void setTitle(String title){ this title = title; } public void setContext(String context) { this context = context; }
public void pubIt() { try { title = new String(title getBytes(" _ ") "gb "); context = new String(context getBytes(" _ ") "gb "); String titleMD = md getkeyBeanofStr(title); db update("insert into news values( "+title+" "+titleMD +" )"); String file = "news\ice"+titleMD +" "; PrintWriter pw = new PrintWriter(new FileOutputStream(file)); pw println("<title>"+title+"</title>"); pw println(context); pw close(); } catch(Exception e){ System out println(e); } } }
package login;
import java sql *;
public class CheckBean { private String message="" admin password; private DB db; public CheckBean() { db = new DB(); } public void setAdmin(String admin){ this admin = admin; } public void setPassword(String password) { this password = password; } public String checkIt() { try { ResultSet rs = db quarry("select * from administrator where
admin= "+this admin+" "); while(rs next()){ String pws = rs getString("password") trim(); if(pws equals(this password)){ message = "密碼正確!"; } else message = "密碼錯誤!"; return message; } message = "用戶不存在!"; } catch(Exception e) { System out println(e); } return message; } }
================頁面部分==================
index jsp:
<%@ page contentType="text/;charset=gb "%> <><head><title>登陸系統</title></head> <body> <form name=login action="check jsp" method="post"> 用戶 <input type=text name=admin><br> 密碼 <input type=password name=password><br> <input type=submit value="登陸"><br> </form> </body> </> <% String error=request getParameter("error"); error=new String(error getBytes(" _ ") "gb "); if(error==null){} else{ %> <%=error%> <% } %>
check jsp
<%@ page contentType="text/;charset=gb "%> <%@ page import="login CheckBean"%> <% String admin = request getParameter("admin"); String password = request getParameter("password"); %> <jsp:useBean id="checkBean" class="login CheckBean"/> <jsp:setProperty name=checkBean property="admin" value="<%= admin trim() %>"/> <jsp:setProperty name=checkBean property="password" value="<%= password trim() %>"/> <% String result = checkBean checkIt(); if(result equals("密碼正確!")){ session setAttribute("admin" admin); response sendRedirect("main jsp"); } else { %> <jsp:forward page="index jsp"> <jsp:param name=error value="<%=result%>"/> </jsp:forward> <% } %>
main jsp
<%@ page contentType="text/;charset=gb "%> <% String admin =(String)(session getAttribute("admin")); if(admin==null){ response sendRedirect("index jsp"); } else{ %> <><head><title>新聞發布</title></head> <body> <form name=pub action="pub jsp" method="post"> 題目 <input type=text name=title><br> 內容 <textarea cols=" " rows=" " name=context></textarea><br> <input type=submit value="提交"><br> </form> </body> </> <%}%>
pub jsp
<%@ page contentType="text/;charset=gb "%> <% String admin = (String)(session getAttribute("admin")); String title = request getParameter("title"); String context = request getParameter("context"); if(admin == null){ response sendRedirect("index jsp"); } else{ %> <jsp:useBean id="pubBean" class="login PubBean"/> <jsp:setProperty name=pubBean property="title" value="<%= title trim() %>"/> <jsp:setProperty name=pubBean property="context" value="<%= context %>"/> <% pubBean pubIt(); response sendRedirect("display jsp"); } %>
display jsp
<%@ page contentType="text/;charset=gb "%> <%@ page import="java sql *"%> <% Class forName("sun jdbc odbc JdbcOdbcDriver"); Connection conn=DriverManager getConnection("jdbc:odbc:PostgreSQL" "" ""); Statement stmt=conn createStatement(); %> <><head><title>新聞</title></head> <body> <% ResultSet rs=stmt executeQuery("SELECT * FROM news"); //顯示記錄 while(rs next()){ out print("<a href=news/ice"+rs getString( )+" target=_blank>"+rs getString
( )+"</a>"); out println("<br>"); }%> </body> </>
好了 基本的東西都實現了 希望現在已經可以給你一個完整的面貌了 在後面的文章中 我再把程序一步步
的完善 增加一些新的功能!
import java lang reflect *;
public class MD { /* 下面這些S S 實際上是一個 * 的矩陣 在原始的C實現中是用#define 實現的 這里把它們實現成為static final是表示了只讀 切能在同一個進程空間內的多個 Instance間共享*/ static final int S = ; static final int S = ; static final int S = ; static final int S = ;
static final int S = ; static final int S = ; static final int S = ; static final int S = ;
static final int S = ; static final int S = ; static final int S = ; static final int S = ;
static final int S = ; static final int S = ; static final int S = ; static final int S = ;
static final byte[] PADDING = { }; /* 下面的三個成員是keyBean計算過程中用到的 個核心數據 在原始的C實現中 被定義到keyBean_CTX結構中
*/ private long[] state = new long[ ]; // state (ABCD) private long[] count = new long[ ]; // number of bits molo ^ (l *** first) private byte[] buffer = new byte[ ]; // input buffer
/* digestHexStr是keyBean的唯一一個公共成員 是最新一次計算結果的 進制ASCII表示 */ public String digestHexStr;
/* digest 是最新一次計算結果的 進制內部表示 表示 bit的keyBean值 */ private byte[] digest = new byte[ ];
/* getkeyBeanofStr是類keyBean最主要的公共方法 入口參數是你想要進行keyBean變換的字元串 返回的是變換完的結果 這個結果是從公共成員digestHexStr取得的. */ public String getkeyBeanofStr(String inbuf) { keyBeanInit(); keyBeanUpdate(inbuf getBytes() inbuf length()); keyBeanFinal(); digestHexStr = ""; for (int i = ; i < ; i++) { digestHexStr += byteHEX(digest[i]); } return digestHexStr;
} // 這是keyBean這個類的標准構造函數 JavaBean要求有一個public的並且沒有參數的構造函數 public MD () { keyBeanInit();
return; }
/* keyBeanInit是一個初始化函數 初始化核心變數 裝入標準的幻數 */ private void keyBeanInit() { count[ ] = L; count[ ] = L; ///* Load magic initialization constants
state[ ] = x L; state[ ] = xefcdab L; state[ ] = x badcfeL; state[ ] = x L;
return; } /* F G H I 是 個基本的keyBean函數 在原始的keyBean的C實現中 由於它們是 簡單的位運算 可能出於效率的考慮把它們實現成了宏 在java中 我們把它們 實現成了private方法 名字保持了原來C中的 */
private long F(long x long y long z) { return (x & y) | ((~x) & z);
} private long G(long x long y long z) { return (x & z) | (y & (~z));
} private long H(long x long y long z) { return x ^ y ^ z; }
private long I(long x long y long z) { return y ^ (x | (~z)); }
/* FF GG HH和II將調用F G H I進行近一步變換 FF GG HH and II transformations for rounds and Rotation is separate from addition to prevent reputation */
private long FF(long a long b long c long d long x long s long ac) { a += F (b c d) + x + ac; a = ((int) a << s) | ((int) a >>> ( s)); a += b; return a; }
private long GG(long a long b long c long d long x long s long ac) { a += G (b c d) + x + ac; a = ((int) a << s) | ((int) a >>> ( s)); a += b; return a; } private long HH(long a long b long c long d long x long s long ac) { a += H (b c d) + x + ac; a = ((int) a << s) | ((int) a >>> ( s)); a += b; return a; } private long II(long a long b long c long d long x long s long ac) { a += I (b c d) + x + ac; a = ((int) a << s) | ((int) a >>> ( s)); a += b; return a; } /* keyBeanUpdate是keyBean的主計算過程 inbuf是要變換的位元組串 inputlen是長度 這個 函數由getkeyBeanofStr調用 調用之前需要調用keyBeaninit 因此把它設計成private的 */ private void keyBeanUpdate(byte[] inbuf int inputLen) {
int i index partLen; byte[] block = new byte[ ]; index = (int)(count[ ] >>> ) & x F; // /* Update number of bits */ if ((count[ ] += (inputLen << )) < (inputLen << )) count[ ]++; count[ ] += (inputLen >>> );
partLen = index;
// Transform as many times as possible if (inputLen >= partLen) { keyBeanMemcpy(buffer inbuf index partLen); keyBeanTransform(buffer);
for (i = partLen; i + < inputLen; i += ) {
keyBeanMemcpy(block inbuf i ); keyBeanTransform (block); } index = ;
} else
i = ;
///* Buffer remaining input */ keyBeanMemcpy(buffer inbuf index i inputLen i);
}
/* keyBeanFinal整理和填寫輸出結果 */ private void keyBeanFinal () { byte[] bits = new byte[ ]; int index padLen;
///* Save number of bits */ Encode (bits count );
///* Pad out to mod index = (int)(count[ ] >>> ) & x f; padLen = (index < ) ? ( index) : ( index); keyBeanUpdate (PADDING padLen);
///* Append length (before padding) */ keyBeanUpdate(bits );
///* Store state in digest */ Encode (digest state );
}
/* keyBeanMemcpy是一個內部使用的byte數組的塊拷貝函數 從input的inpos開始把len長度的 位元組拷貝到output的outpos位置開始 */
private void keyBeanMemcpy (byte[] output byte[] input int outpos int inpos int len) { int i;
for (i = ; i < len; i++) output[outpos + i] = input[inpos + i]; }
/* keyBeanTransform是keyBean核心變換程序 有keyBeanUpdate調用 block是分塊的原始位元組 */ private void keyBeanTransform (byte block[]) { long a = state[ ] b = state[ ] c = state[ ] d = state[ ]; long[] x = new long[ ];
Decode (x block );
/* Round */ a = FF (a b c d x[ ] S xd aa L); /* */ d = FF (d a b c x[ ] S xe c b L); /* */ c = FF (c d a b x[ ] S x dbL); /* */ b = FF (b c d a x[ ] S xc bdceeeL); /* */ a = FF (a b c d x[ ] S xf c fafL); /* */ d = FF (d a b c x[ ] S x c aL); /* */ c = FF (c d a b x[ ] S xa L); /* */ b = FF (b c d a x[ ] S xfd L); /* */ a = FF (a b c d x[ ] S x d L); /* */ d = FF (d a b c x[ ] S x b f afL); /* */ c = FF (c d a b x[ ] S xffff bb L); /* */ b = FF (b c d a x[ ] S x cd beL); /* */ a = FF (a b c d x[ ] S x b L); /* */ d = FF (d a b c x[ ] S xfd L); /* */ c = FF (c d a b x[ ] S xa eL); /* */ b = FF (b c d a x[ ] S x b L); /* */
/* Round */ a = GG (a b c d x[ ] S xf e L); /* */ d = GG (d a b c x[ ] S xc b L); /* */ c = GG (c d a b x[ ] S x e a L); /* */ b = GG (b c d a x[ ] S xe b c aaL); /* */ a = GG (a b c d x[ ] S xd f dL); /* */ d = GG (d a b c x[ ] S x L); /* */ c = GG (c d a b x[ ] S xd a e L); /* */ b = GG (b c d a x[ ] S xe d fbc L); /* */ a = GG (a b c d x[ ] S x e cde L); /* */ d = GG (d a b c x[ ] S xc d L); /* */ c = GG (c d a b x[ ] S xf d d L); /* */ b = GG (b c d a x[ ] S x a edL); /* */ a = GG (a b c d x[ ] S xa e e L); /* */ d = GG (d a b c x[ ] S xfcefa f L); /* */ c = GG (c d a b x[ ] S x f d L); /* */ b = GG (b c d a x[ ] S x d a c aL); /* */
/* Round */ a = HH (a b c d x[ ] S xfffa L); /* */ d = HH (d a b c x[ ] S x f L); /* */ c = HH (c d a b x[ ] S x d d L); /* */ b = HH (b c d a x[ ] S xfde cL); /* */ a = HH (a b c d x[ ] S xa beea L); /* */ d = HH (d a b c x[ ] S x bdecfa L); /* */ c = HH (c d a b x[ ] S xf bb b L); /* */ b = HH (b c d a x[ ] S xbebfbc L); /* */ a = HH (a b c d x[ ] S x b ec L); /* */ d = HH (d a b c x[ ] S xeaa faL); /* */ c = HH (c d a b x[ ] S xd ef L); /* */ b = HH (b c d a x[ ] S x d L); /* */ a = HH (a b c d x[ ] S xd d d L); /* */ d = HH (d a b c x[ ] S xe db e L); /* */ c = HH (c d a b x[ ] S x fa cf L); /* */ b = HH (b c d a x[ ] S xc ac L); /* */
/* Round */ a = II (a b c d x[ ] S xf L); /* */ d = II (d a b c x[ ] S x aff L); /* */ c = II (c d a b x[ ] S xab a L); /* */ b = II (b c d a x[ ] S xfc a L); /* */ a = II (a b c d x[ ] S x b c L); /* */ d = II (d a b c x[ ] S x f ccc L); /* */ c = II (c d a b x[ ] S xffeff dL); /* */ b = II (b c d a x[ ] S x dd L); /* */ a = II (a b c d x[ ] S x fa e fL); /* */ d = II (d a b c x[ ] S xfe ce e L); /* */ c = II (c d a b x[ ] S xa L); /* */ b = II (b c d a x[ ] S x e a L); /* */ a = II (a b c d x[ ] S xf e L); /* */ d = II (d a b c x[ ] S xbd af L); /* */ c = II (c d a b x[ ] S x ad d bbL); /* */ b = II (b c d a x[ ] S xeb d L); /* */
state[ ] += a; state[ ] += b; state[ ] += c; state[ ] += d;
}
/*Encode把long數組按順序拆成byte數組 因為java的long類型是 bit的 只拆低 bit 以適應原始C實現的用途 */ private void Encode (byte[] output long[] input int len) { int i j;
for (i = j = ; j < len; i++ j += ) { output[j] = (byte)(input[i] & xffL); output[j + ] = (byte)((input[i] >>> ) & xffL); output[j + ] = (byte)((input[i] >>> ) & xffL); output[j + ] = (byte)((input[i] >>> ) & xffL); } }
/*Decode把byte數組按順序合成成long數組 因為java的long類型是 bit的 只合成低 bit 高 bit清零 以適應原始C實現的用途 */ private void Decode (long[] output byte[] input int len) { int i j;
for (i = j = ; j < len; i++ j += ) output[i] = b iu(input[j]) | (b iu(input[j + ]) << ) | (b iu(input[j + ]) << ) | (b iu(input[j + ]) << );
return; }
/* b iu是我寫的一個把byte按照不考慮正負號的原則的"升位"程序 因為java沒有unsigned運算 */ public static long b iu(byte b) { return b < ? b & x F + : b; }
/*byteHEX() 用來把一個byte類型的數轉換成十六進制的ASCII表示 因為java中的byte的toString無法實現這一點 我們又沒有C語言中的 sprintf(outbuf "% X" ib) */ public static String byteHEX(byte ib) { char[] Digit = { A B C D E F }; char [] ob = new char[ ]; ob[ ] = Digit[(ib >>> ) & X F]; ob[ ] = Digit[ib & X F]; String s = new String(ob); return s; } /* public static void main(String args[]) {
MD m = new MD (); System out println("我愛你 "+m getkeyBeanofStr("我愛你")); } */
lishixin/Article/program/Java/JSP/201311/20523