当前位置:首页 » 编程语言 » sqlmodulo
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sqlmodulo

发布时间: 2023-04-29 06:22:16

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