基于 Java spring MVC 框架 开发初步
——以做一个留言板为例
作者: zccst
开发环境:
1 : java 1.6
2: mysql 5.1
3: resin 3.1
4: eclipse 3+
开发环境配置:
在 Eclipse 里运行 resin
以做一个记事本( guestbook )为例,全部工作可分为三部分:
第一部分:前台 html 页面。
第二部分: Java 程序
第三部分:配置
第一部分:前台 html 页面
在 velocity 里 编写 guestbook.vm
解释: guestbook 是指想要实现一个在浏览器里能看到的记事本的界面,用 html 语言来编写。
其后缀 .vm 是自己在配置文件里设定的,所以,你可以设置 .jsp 等等。
我的 html 代码是:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html xmlns= "http://www.w3.org/1999/xhtml" >
<head>
<meta http-equiv= "Content-Type" content= "text/html; charset=gb2312" />
<title>guestbook</title>
</head>
<body>
<center>
<ul>
#foreach ( $msg in $!msgList )
<table width= "825" height= "43" border= "0" >
<tr>
<td width= "64" ><li> $msg.getUsername ()</li></td>
<td width= "127" ><li> $msg.getTitle ()</li></td>
<td width= "620" > $msg.getContent ()</td>
</tr>
</table>
#end
</ul>
在这里把那个留言列表 列出来就可以了
<form action= "/Guestbook.aspx?msg=insert" method= "post" name= "loginform" >
<table bgcolor= "#B3B3FF" >
<caption> 欢迎访问留言板 </caption>
<tr>
<td> 用户名: </td>
<td><input type= "text" name= "username" size= "40" ></td>
</tr>
<tr>
<td> 主题: </td>
<td><input type= "text" name= "title" size= "40" ></td>
</tr>
<tr>
<td> 内容: </td>
<td>
<textarea name= "content" rows= "10" cols= "40" ></textarea>
</td>
</tr>
<tr>
<td><input type= "submit" value= " 提交 " ></td>
<td><input type= "reset" value= " 重填 " ></td>
</tr>
</table>
</form>
</center>
</body>
</html>
注 1 : #foreach .. .. #end 一段是用来显示留言,这是后话。
注 2 :这里深刻体会到 html 语言的重要性了。虽然公司分做前台交互页面和后台编程的,但是编程时如果你掌握了 html ,会大大加快你开发的速度。所也,还是学吧!而且是所见所得,符合我的特点。具体细节不解释了,这些标签你查了,记住了,就知道了,会用了。
注 3 :大学时也用 Dreamweaver 做过一段网页,后来由于感觉自己以后从事这个职业有点“大材小用”,于是放弃了(实际未必)。而 3 年后的今天,我又一次学起 html ,不知道是不是上天给我开了一个玩笑,戏谑我的尊严,不管怎么说,这三年我改变了好多。如今的妥协我相信不会遥远了。
注 4 :我把留言页面和留言后提交放在了同一个页面了,其实这只是页面跳转的问题,学完了 Java 编程就会觉得实现起来很简单。
第二部分: Java 程序
第一步:登录 mysql 数据库,创建 guest_book 表。用来存放留言信息。
CREATE TABLE `guest_book`
(
`id` int(10) NOT NULL AUTO_INCREMENT,
`title` char(50) NOT NULL,
`content` text NOT NULL,
`username` char(15) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
第二步:写函数,按常规顺序(注:后来的调用与书写时正好相反)
GuestBook.java 类
成员变量与数据库中 guest_book 表中项一一对应。成员方法就 get 和 set 方法。可由系统根据成员变量自动实现。
GuestBookDAO.java 接口类 由静态成员变量和抽象方法(没有方法体)组成。
抽象方法指出该留言板实现几种功能,比如
List getAllGusetBooks( int start_index, int end_index) 显示留言板内容
int getAllGusetBooksCount() 显示留言板内容条数
void insertGusetBook(GuestBook guestbook) 写入一条新留言
SqlMapGuestBookDAO.java 接口实现类 实现接口类中的抽象方法。
难点在于调用系统已经写好的类中的某些成员方法,完成操纵数据库的过程。
本例是 SqlMapGuestBookDAO extends SqlMapClientDaoSupport ,然后调用父类的成员方法:
getSqlMapClientTemplate().queryForList ( "getAllGuestBooks" ,map)
getSqlMapClientTemplate().queryForObject ( "getAllGuestBookCount" )
GuestBook.xml xml 文件
(1) ,实现 Java 程序与数据库的链接,完成增删改查。
(2) ,其里面的项数与接口实现类中的成员方法个数是一一对应的。传递是通过接口实现类中成员方法的返回值(函数参数)。
后面几个 Java 程序的顺序可由颠倒,但一般顺序是:
GuestbookController.java
控制层是客户端与服务器端直接的连接入口,所以肯定会在两者之间传一些参数。
此处既是重点又是难点。
1, 定义容器,存放数据,用来接收页面发来的数据。同时,也负责再显示到页面上。
2, 页面访问时的做何处理
3, 其具体实现调用服务层( service )的函数
4, 返回值(跳转)
GuestBookService.java 类
与接口实现类 SqlMapGuestBookDAO 的成员方法对应。
注:贯穿始终的是:
1, 异常处理。比如 DataAccessException 。
2, 实现系统已经写好的接口。如,在 GuestBook.java 中
public class GuestBook implements Serialzable{} 。
3, 重写系统已经写好的类中的部分成员方法。比如控制层。如,
4, 调用系统已经写好的类中的某一个成员方法。如在 SqlMapGuestBookDAO.java 中
当然前提是继承该方法所在的类:新类 extends SqlMapClientDaoSupport 。
5, haha
不难看出,系统已经写好了很多接口和类,这些为我们提供了方便,但是你最好记住常见的系统已经写好的接口和类。
现在总结一下:
当一个页面请求来临时,首先通过配置文件找到控制层( Controller ),在控制层经过处理后,调用服务层( Service ),服务层又调用接口实现类(),接口实现类调用系统函数进行处理,于是通过 .xml 配置文件,找到数据库指令,完成数据库的增删查改功能。
写好函数后,就可以开始配置了。
第三部分:配置
一、数据库配置
数据库映射客户端配置。
applicationContext-jdbc.xml
——接口类 (.DAO) 与接口实现类映射 (SqlMap**DAO)
guestBookDAO 映射到 SqlMapGuestBookDAO
源码:
< bean id = "sqlMapClient" class = "org.springframework.orm.ibatis.SqlMapClientFactoryBean" >
< property name = "dataSource" >< ref local = "dataSource" />
</ property >
< property name = "configLocation" >< value > WEB-INF/sql -map-config.xml </ value >
</ property >
</ bean >
增添:
< bean name = "guestBookDAO" class = "com.sg.xiyou.dao.ibatis.SqlMapGuestBookDAO" >
< property name = "sqlMapClient" > < ref local = "sqlMapClient" /> </ property >
</ bean >
sql-map-config.xml ——与实现增删查改数据库 (.xml) 相关联
实现接口类 SqlMapGuestBookDAO 里的几个函数与 GuestBook.xml 里的几个数据库操作一一对应。凭借的手段是通过 SqlMapGuestBookDAO 里的几个函数的参数分别传递。
注意每个函数里的参数都大于或等于一个。
< sqlMap resource = "com/sg/xiyou/dao/ibatis/maps/GuestBook.xml" />
二、服务层配置
对象 guestBookService 属于 类 GuestBookService ,这样的好处是不再以定义类的对象的方式进行调用,目的是提高效率。
applicationContext-services.xml
< bean name = "guestBookService"
class = "com.sg.xiyou.service.GuestBookService" autowire = "byName" ></ bean >
三、前台页面与后台【控制层】函数链接配置
点击页面,跳转到 xiyou-servlet.xml 的
<prop key="/Guestbook.aspx" >Guestbook </prop>
通过关键字 Guestbook ,找到其相关定义。如上
通过定义,找到其所在控制层函数,通过名字( autowire = byName )。里面的属性及其对应值是函数在执行完后的返回值与跳转到此处指定的页面。(一一对应)
xiyou-servlet.xml ——后台控制层函数
< prop key = "/Guestbook.aspx" > Guestbook </ prop >
< bean id = "Guestbook" class = "com.sg.xiyou.action.GuestbookController" autowire = "byName" >
< property name = "commandClass" >< value > com.sg.xiyou.domain.Guestbook </ value ></ property >
< property name = "formView" >< value > /login </ value ></ property >
< property name = "successView" >< value > /guestbook </ value ></ property >
</ bean >
guestbook.vm ——前台页面
<form action= "/Guestbook.aspx?msg=insert" method= "post" name= "loginform" >