今天作逻辑层和表述层的封装,由于需求并不清楚,所以表是边作边完善的……
mybbs作为数据库,
讨论区要做成树状菜单,也就是sections这张表,sections和users是多对多的关系(masters),也就是版主。
用户和角色是多对一关系(user_role), 角色和权限是多对多关系(role_privilege)
sections里面要有
sectionId: Integer类型
sectionName: Varchar(40)
sectionEnglishName: Varchar(40)
sectionTable: varchar(50) :将来需要将该版面存到哪张表里面去
onlineAmount: Integer : 在线访问的人数
sectionCreateTime : Date&Time 创建时间
users:
userId : Integer
userName: Varchar(40)
password : varchar(16)
visitTimes : Integer 登陆的次数(访问次数)
visitTime : Date&Time 最近的访问时间
email : varchar
roles:
roleId : Integer
roleName : varchar
notes : varchar
privilege:
privilegeId: Integer
privilegeName : varchar
====================================
在PowerDesigner中,CTRL和J的组合键可以打开生成数据库的界面。
可以选择从odbc里面生成数据库,也可以从odbc先连接上,然后生成数据库,
还可以先生成脚本,然后在命令行里面执行:
mysql -uroot -proot mybbs < mybbs.sql
===========================
新建包org.mybbs.service封装逻辑层
新建org.mybbs.vo封装实体类:
package org.mybbs.vo ;
public class SectionBean
{
private Integer sectionId ;
private String sectionName ;
private String sectionEnglishName ;
private String sectionTable ;
private TimeStamp sectionCreateTime ;
//然后加上它们的getter方法和setter方法
}
package org.mybbs.service;
public class SectionService//完成了对所有section的增删改的操作
{
private SectionBean section ;
private DBReader reader ;
private DBWriter writer ;
public SectionService()
{
reader = DBManager.getInstance().getDBReader();
writer = DBManager.getInstance().getDBWriter();
}
public SectionBean getSection()
{
return this.section ;
}
public void setSection(SectionBean section)
{
this.section = section ;
}
public static ArrayList getAllSection() throws SQLException
{
String sql = "select * from sections" ;
DBReader dbReader = DBManager.getInstance().getDBReader();
ArrayList result = null ;
result = dbReader.getData(sql,SectionBean.class) ;
return result ;//利用了数据层的封装
}
public int delete() throws SQLException
{
return writer.setData("delete from sections where sectionId ="+section.getSectionId());
}
public int insert() throws SQLException
{
return writer.addData("sections",section);
}
public int update() throws SQLException
{
return writer.modifyData(section) ;//这个方法需要自己去完善!
}
}
//其实应该把DBReader和DBWriter定义成为接口,而不是实际的类,这样逻辑和数据之间的依赖就更降低了,
//只要是接口,那么只要是接口的实现类都可以放到逻辑层中,逻辑层可以依赖于多个实现,而不是单一的
如下所示:
public interface DBWriter
{
public int addData(String sql , Object obj) throws SQLException;
public int addData(String sql , Object obj , String keyName) throws SQLException;
public void modifyData(Object obj) throws SQLException;
public int setData(Connection conn, String sql) throws SQLException;
}
然后就可以:
public DBWriterImpl implements DBWriter
{
}
//DBManager中要从配置文件中读取实现类的类名,
//由于DBWriter现在是接口了,所以要得到实现类的话,必须首先知道类名
public DBWriter getDBWriter()
{
DBWriter writer = null ;
try
{
String writerName = DBConfig.getWriterName() ;
Class clazz = Class.forName(writerName);
Class[] param = {DBManager.class} ;
Constructor con = clazz.getConstructor(param);
Object[] objs = {this} ;
writer = (DBWriter)con.newInstance(objs) ;
}
catch(Exception e)
{
e.printStackTrace() ;
}
//writer = (DBWriter)Class.forName(DBConfig.getWriterName()).newInstance() ;
//也可以像上面那么写(前提是DBWriter中必须有个无参的构造函数才可以!!!)
return writer ;
}
============================
其他逻辑层可以自行去封装,下面进入表述层
将老师给的树状菜单和css样式拷贝进WebRoot中去。
将树状菜单改为jsp页面,然后要新建一个框架页面index.jsp……
//左右结构的框架
<frameset cols="22%,1%, *" frameborder="1">
<frame src="tree.jsp" />
<frame src="changeSize.html" />
<frame src="" />
</frameset>
在tree.jsp页面中引入css
<link type="text/css" rel="stylesheet" href="css/tree.css"/>
就可以使用那里面的样式了
别忘记引入核心标签库,这样就可以在tree.jsp上使用核心标签了。
<c:forEach var="row" items="${sections}"> //这个sections是个ArrayList集合,但是要先存储在某个作用域里才可以!
<div>
${row.sectionName}
</div>
</c:forEach>
具体实现要参考老师的源代码,这里只是记载一些关键的步骤
<%
pageContext.setAttribute("sections",SectionService.getAllSection());//表述层中调用逻辑层的内容
%>
=============================================================