BBS Struts项目 - 02. 数据库/链接池/中文乱码处理以及其他
正如之前所说的,开发一个struts应用和一般的web应用并没有什么两样。
1. 创建数据库
a. guestbook表:用于记录留言的所有信息
b. ICON表:用于记录所有的图标记录
2. JDBC Resource与链接池
记得在做上一个Servlet的项目的时候,在每个servlet处理request的时候(processRequest()方法),都做过一个request.setCharacterEncoding("UTF-8")的操作;将request的内容转成UTF-8的内码,以解决中文乱码问题。
在Struts的项目里面,我们仍然会遇到中文乱码问题。而我们通过一个创建的CharacterEncodingFilter的辅助类来解决问题。
4. DbUtils
在处理数据连接的问题上,还是使用DbUtils这个类,详细请看 Blog系统开发 5. JDBC的基本操作与DbUtils的使用 内容。
这里还是写一个DbHelper的辅助类,来简化连接的操作。
DbHelper.java
因为这个bbs的网页设计是按照日月星辰的留言板的页面制作的,所以类似icon之类的数据,直接添加到数据库(假设所有的icon都在
img 目录下,icon素材可以直接到星辰去抓的, sql的脚本)
1. 创建数据库
create
database
guestbook;
a. guestbook表:用于记录留言的所有信息
CREATE
TABLE
`guestbook` (
`id` int ( 11 ) NOT NULL AUTO_INCREMENT ,
`name` varchar ( 40 ) ,
`email` varchar ( 60 ),
`url` varchar ( 60 ),
`subject` varchar ( 200 ),
`content` varchar ( 1024 ),
`font` varchar ( 100 ),
`date` datetime ,
`replyId` int ( 11 ) DEFAULT ' -1 ' ,
`iconId` int ( 3 ),
`lastReplyTime` datetime ,
`password` varchar ( 16 ),
PRIMARY KEY (`id`)
);
`id` int ( 11 ) NOT NULL AUTO_INCREMENT ,
`name` varchar ( 40 ) ,
`email` varchar ( 60 ),
`url` varchar ( 60 ),
`subject` varchar ( 200 ),
`content` varchar ( 1024 ),
`font` varchar ( 100 ),
`date` datetime ,
`replyId` int ( 11 ) DEFAULT ' -1 ' ,
`iconId` int ( 3 ),
`lastReplyTime` datetime ,
`password` varchar ( 16 ),
PRIMARY KEY (`id`)
);
字段 | 说明 |
---|---|
id | 留言编号 |
name | 留言人姓名 |
email地址 | |
url | url地址 |
subject | 留言标题 |
content | 留言内容 |
iconId | 留言使用的表情图标编号 |
font | 内容字体颜色 |
date | 留言时间 |
replyId | 回复留言ID,默认为-1表示不是回复 |
lastReplyTime | 最近回复时间 |
password | 留言所用的密码(用于编辑) |
b. ICON表:用于记录所有的图标记录
CREATE
TABLE
`icon` (
`id` int ( 11 ) NOT NULL AUTO_INCREMENT ,
`name` varchar ( 20 ),
`src` varchar ( 200 ),
`alt` varchar ( 100 ),
PRIMARY KEY (`id`)
);
`id` int ( 11 ) NOT NULL AUTO_INCREMENT ,
`name` varchar ( 20 ),
`src` varchar ( 200 ),
`alt` varchar ( 100 ),
PRIMARY KEY (`id`)
);
字段 | 说明 |
---|---|
id | 图标编号 |
name | 图标名称 |
src | 图标的位置 |
alt | 图标的说明 |
2. JDBC Resource与链接池
- 给刚刚建的database建立一个连接,Services标签,点击Databases的MySql Server at localhost:3306;
- 选择刚刚建的guestbook,按右键点击connect;我们可以看到在databases的列表里多了jdbc:mysql://localhost:3306/guestbook的链接;
- 回到projects标签,点击项目名称BBS,按右键选择New > Other... 在Categories里面选择GlassFish;File types项目下面,选择JDBC Connection Pool,按Next;
- 在New JDBC Connection Pool面板里,JDBC Connection Pool Name里输入GuestBookPool(随意),Extract from Existiong Connection的下拉菜单里选择刚刚建立的database连接jdbc:mysql://localhost:3306/guestbook,
其他设置使用默认值即可,按finish结束连接池的创建。
- 同样在Categories里面选择GlassFish;File types项目下面,选择JDBC Resource,按Next;
- 在New JDBC Resource面板里,Using Existing JDBC Connection Pool里选择GuestBookPool(与之前创建的连接池对应);
JNDI Name输入jdbc/bbs(随意),按finish,完成JDBC Resource配置。
记得在做上一个Servlet的项目的时候,在每个servlet处理request的时候(processRequest()方法),都做过一个request.setCharacterEncoding("UTF-8")的操作;将request的内容转成UTF-8的内码,以解决中文乱码问题。
在Struts的项目里面,我们仍然会遇到中文乱码问题。而我们通过一个创建的CharacterEncodingFilter的辅助类来解决问题。
- CharacterEncodingFilter.java
package com.bbs.struts.util;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
*
* @author Chucky
*/
public class CharacterEncodingFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding( " UTF-8 " );
chain.doFilter(request, response);
}
public void destroy() {
}
}
- 打开web.xml,在Filters的面板中添加以下内容
4. DbUtils
在处理数据连接的问题上,还是使用DbUtils这个类,详细请看 Blog系统开发 5. JDBC的基本操作与DbUtils的使用 内容。
这里还是写一个DbHelper的辅助类,来简化连接的操作。
DbHelper.java
package
com.bbs.struts.util;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import org.apache.commons.dbutils.QueryRunner;
/**
*
* @author Chucky
*/
public class DbHelper {
public static QueryRunner getQueryRunner() {
Context context = null ;
DataSource ds = null ;
try {
context = new InitialContext();
ds = (DataSource) context.lookup( " jdbc/bbs " );
} catch (NamingException ex) {
Logger.getLogger(DbHelper. class .getName()).log(Level.SEVERE, null , ex);
}
QueryRunner qr = new QueryRunner(ds);
return qr;
}
}
注意context.lookup()中的数据源,要与之前的数据源匹配。
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import org.apache.commons.dbutils.QueryRunner;
/**
*
* @author Chucky
*/
public class DbHelper {
public static QueryRunner getQueryRunner() {
Context context = null ;
DataSource ds = null ;
try {
context = new InitialContext();
ds = (DataSource) context.lookup( " jdbc/bbs " );
} catch (NamingException ex) {
Logger.getLogger(DbHelper. class .getName()).log(Level.SEVERE, null , ex);
}
QueryRunner qr = new QueryRunner(ds);
return qr;
}
}
因为这个bbs的网页设计是按照日月星辰的留言板的页面制作的,所以类似icon之类的数据,直接添加到数据库(假设所有的icon都在
img 目录下,icon素材可以直接到星辰去抓的, sql的脚本)