一个完整的新闻发布系统 关键字:JSP、Java、新闻发布 我将分几个步骤完成对一个新闻发布系统的构建,来理解JSP的一些基本使用方法! 首先我将先介绍这个新闻发布系统的基本结构: index.jsp:管理员登陆界面 而后台的程序主要有: DB.java:数据库连接 即当你从index -> main -> display 走一趟你基本就可以完成一个新闻发布系统的基本功能了! 我并非把新闻的标题和内容都写入数据库,因为那样太耗费数据库系统的资源,而且在访问的时候总要读取数 据库,很费劲,我把新闻写入了一个单独的HTM文件,之后把标题及HTM文件的名字写入的数据库! 而这个HTM文件的名字怎么随机生成呢?我选择了MD5算法,因为每个新闻的标题都不会相同,所以保证了唯一 性! 下面我先把这个系统的基本框架勾勒出来,说的大一点,这似乎就是这个“系统”的“内核”啦!:) ================数据库部分================== CREATE TABLE administrator CREATE TABLE news ================程序部分================== package login; import java.sql.*; public class DB { private Connection conn; ("jdbc:postgresql://localhost:5432/news?user=admin&&password="); package login; import java.sql.*; public class PubBean { public void pubIt() { package login; import java.sql.*; public class CheckBean { admin='"+this.admin+"'"); ================页面部分================== index.jsp: <% page contentType="text/html;charset=gb2312"%> check.jsp <% page contentType="text/html;charset=gb2312"%> main.jsp <% page contentType="text/html;charset=gb2312"%> pub.jsp <% page contentType="text/html;charset=gb2312"%> display.jsp <% page contentType="text/html;charset=gb2312"%> (1)+"</a>"); 好了,基本的东西都实现了,希望现在已经可以给你一个完整的面貌了,在后面的文章中,我再把程序一步步 的完善,增加一些新的功能! 下面的是md5的算法在网上找的,转载一下: package login; import java.lang.reflect.*; public class MD5 { static final int S21 = 5; static final int S31 = 4; static final int S41 = 6; static final byte[] PADDING = { -128, 0, 0, 0, 0, 0, 0, 0, 0, */ /* digestHexStr是keyBean的唯一一个公共成员,是最新一次计算结果的 /* digest,是最新一次计算结果的2进制内部表示,表示128bit的keyBean值. /* } return; /* keyBeanInit是一个初始化函数,初始化核心变量,装入标准的幻数 */ state[0] = 0x67452301L; return; private long F(long x, long y, long z) { } } private long I(long x, long y, long z) { /* private long FF(long a, long b, long c, long d, long x, long s, private long GG(long a, long b, long c, long d, long x, long s, int i, index, partLen; partLen = 64 - index; // Transform as many times as possible. for (i = partLen; i + 63 < inputLen; i += 64) { keyBeanMemcpy(block, inbuf, 0, i, 64); } else i = 0; ///* Buffer remaining input */ } /* ///* Save number of bits */ ///* Pad out to 56 mod 64. ///* Append length (before padding) */ ///* Store state in digest */ } /* keyBeanMemcpy是一个内部使用的byte数组的块拷贝函数,从input的inpos开始把len长度的 private void keyBeanMemcpy (byte[] output, byte[] input, for (i = 0; i < len; i++) /* Decode (x, block, 64); /* Round 1 */ /* Round 2 */ /* Round 3 */ /* Round 4 */ state[0] += a; } /*Encode把long数组按顺序拆成byte数组,因为java的long类型是64bit的, for (i = 0, j = 0; j < len; i++, j += 4) { /*Decode把byte数组按顺序合成成long数组,因为java的long类型是64bit的, for (i = 0, j = 0; j < len; i++, j += 4) return; /* /*byteHEX(),用来把一个byte类型的数转换成十六进制的ASCII表示, MD5 m = new MD5(); }
环境:Tomcat 5.5.7 + J2SE 5.0 + PostgreSQL 8.0
check.jsp:验证管理员身份
main.jsp:管理员添加新闻的页面
pub.jsp:发布信息的页面
display:显示所有的新闻
MD5.java:MD5算法
PubBean.java:发布
CheckBean.java:核实登陆身份
(
admin char(16),
"password" char(32)
)
WITHOUT OIDS;
ALTER TABLE administrator OWNER TO admin;
(
title char(255),
page char(255)
)
WITHOUT OIDS;
ALTER TABLE news OWNER TO admin;
private Statement stmt;
private ResultSet rs;
public DB() {
try {
Class.forName("org.postgresql.Driver");
conn = DriverManager.getConnection
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;
}
}
import java.io.*;
private String title,context;
private DB db;
private MD5 md5;
public PubBean() {
db = new DB();
md5 = new MD5();
}
public void setTitle(String title){
this.title = title;
}
public void setContext(String context) {
this.context = context;
}
try {
title = new String(title.getBytes("8859_1"),"gb2312");
context = new String(context.getBytes("8859_1"),"gb2312");
String titleMD5 = md5.getkeyBeanofStr(title);
db.update("insert into news values('"+title+"','"+titleMD5+"')");
String file = "news\\ice"+titleMD5+".htm";
PrintWriter pw = new PrintWriter(new FileOutputStream(file));
pw.println("<title>"+title+"</title>");
pw.println(context);
pw.close();
}
catch(Exception e){
System.out.println(e);
}
}
}
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
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;
}
}
<html><head><title>登陆系统</title></head>
<body>
<form name="login" action="check.jsp" method="post">
用户:<input type="text" name="admin">
密码:<input type="password" name="password">
<input type="submit" value="登陆">
</form>
</body>
</html>
<%
String error=request.getParameter("error");
error=new String(error.getBytes("8859_1"),"gb2312");
if(error==null) {}
else{
%>
<%=error%>
<%
}
%>
<% 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>
<%
}
%>
<%
String admin =(String)(session.getAttribute("admin"));
if(admin==null){
response.sendRedirect("index.jsp");
}
else{
%>
<html><head><title>新闻发布</title></head>
<body>
<form name="pub" action="pub.jsp" method="post">
题目:<input type="text" name="title">
内容:<textarea cols="100" rows="10" name="context"></textarea>
<input type="submit" value="提交">
</form>
</body>
</html>
<%}%>
<%
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");
}
%>
<% page import="java.sql.*"%>
<%
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn=DriverManager.getConnection("jdbc:odbc:PostgreSQL","","");
Statement stmt=conn.createStatement();
%>
<html><head><title>新闻</title></head>
<body>
<%
ResultSet rs=stmt.executeQuery("SELECT * FROM news");
//显示记录
while(rs.next()){
out.print("<a href=news/ice"+rs.getString(2)+".htm target=_blank>"+rs.getString
out.println("
");
} %>
</body>
</html>
/* 下面这些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 S22 = 9;
static final int S23 = 14;
static final int S24 = 20;
static final int S32 = 11;
static final int S33 = 16;
static final int S34 = 23;
static final int S42 = 10;
static final int S43 = 15;
static final int S44 = 21;
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 };
/* 下面的三个成员是keyBean计算过程中用到的3个核心数据,在原始的C实现中
被定义到keyBean_CTX结构中
private long[] state = new long[4]; // state (ABCD)
private long[] count = new long[2]; // number of bits, modulo 2^64 (lsb first)
private byte[] buffer = new byte[64]; // input buffer
16进制ASCII表示.
*/
public String digestHexStr;
*/
private byte[] digest = new byte[16];
getkeyBeanofStr是类keyBean最主要的公共方法,入口参数是你想要进行keyBean变换的字符串
返回的是变换完的结果,这个结果是从公共成员digestHexStr取得的.
*/
public String getkeyBeanofStr(String inbuf) {
keyBeanInit();
keyBeanUpdate(inbuf.getBytes(), inbuf.length());
keyBeanFinal();
digestHexStr = "";
for (int i = 0; i < 16; i++) {
digestHexStr += byteHEX(digest[i]);
}
return digestHexStr;
// 这是keyBean这个类的标准构造函数,JavaBean要求有一个public的并且没有参数的构造函数
public MD5() {
keyBeanInit();
}
private void keyBeanInit() {
count[0] = 0L;
count[1] = 0L;
///* Load magic initialization constants.
state[1] = 0xefcdab89L;
state[2] = 0x98badcfeL;
state[3] = 0x10325476L;
}
/* F, G, H ,I 是4个基本的keyBean函数,在原始的keyBean的C实现中,由于它们是
简单的位运算,可能出于效率的考虑把它们实现成了宏,在java中,我们把它们
实现成了private方法,名字保持了原来C中的。 */
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;
}
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.
*/
long ac) {
a += F (b, c, d) + x + ac;
a = ((int) a << s) | ((int) a >>> (32 - s));
a += b;
return a;
}
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;
}
/*
keyBeanUpdate是keyBean的主计算过程,inbuf是要变换的字节串,inputlen是长度,这个
函数由getkeyBeanofStr调用,调用之前需要调用keyBeaninit,因此把它设计成private的
*/
private void keyBeanUpdate(byte[] inbuf, int inputLen) {
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);
if (inputLen >= partLen) {
keyBeanMemcpy(buffer, inbuf, index, 0, partLen);
keyBeanTransform(buffer);
keyBeanTransform (block);
}
index = 0;
keyBeanMemcpy(buffer, inbuf, index, i, inputLen - i);
keyBeanFinal整理和填写输出结果
*/
private void keyBeanFinal () {
byte[] bits = new byte[8];
int index, padLen;
Encode (bits, count, 8);
index = (int)(count[0] >>> 3) & 0x3f;
padLen = (index < 56) ? (56 - index) : (120 - index);
keyBeanUpdate (PADDING, padLen);
keyBeanUpdate(bits, 8);
Encode (digest, state, 16);
字节拷贝到output的outpos位置开始
*/
int outpos, int inpos, int len)
{
int i;
output[outpos + i] = input[inpos + i];
}
keyBeanTransform是keyBean核心变换程序,有keyBeanUpdate调用,block是分块的原始字节
*/
private void keyBeanTransform (byte block[]) {
long a = state[0], b = state[1], c = state[2], d = state[3];
long[] x = new long[16];
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 */
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 */
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 */
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[1] += b;
state[2] += c;
state[3] += d;
只拆低32bit,以适应原始C实现的用途
*/
private void Encode (byte[] output, long[] input, int len) {
int i, j;
output[j] = (byte)(input[i] & 0xffL);
output[j + 1] = (byte)((input[i] >>> 8) & 0xffL);
output[j + 2] = (byte)((input[i] >>> 16) & 0xffL);
output[j + 3] = (byte)((input[i] >>> 24) & 0xffL);
}
}
只合成低32bit,高32bit清零,以适应原始C实现的用途
*/
private void Decode (long[] output, byte[] input, int len) {
int i, j;
output[i] = b2iu(input[j]) |
(b2iu(input[j + 1]) << 8) |
(b2iu(input[j + 2]) << 16) |
(b2iu(input[j + 3]) << 24);
}
b2iu是我写的一个把byte按照不考虑正负号的原则的"升位"程序,因为java没有unsigned运算
*/
public static long b2iu(byte b) {
return b < 0 ? b & 0x7F + 128 : b;
}
因为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[]) {
System.out.println("我爱你:"+m.getkeyBeanofStr("我爱你"));
}
*/
一个完整的新闻发布系统
80酷酷网 80kuku.com