简单留言板 Simple Guest Book
==
开发环境:Win7 32bit + Eclipse for Javaweb Indigo 3.72 + tomcat6 + sqlite3
采用MVC模式开发
实现分发器DispatchServlet来对拦截所有*.xx(web.xml中配置)的请求,然后分发给不同的控制器执行后对不同结果进行渲染。
分发器实现流程
在初始化时需要将URL映射到具体控制器的方法上
拦截所有一定规则的请求 如: *.do 这个在wel.xml配置
在URL映射中查找拦截的URL请求,根据URL请求找到具体的控制器和其方法
实例化该控制,然后执行该方法
对返回结果进行处理然后渲染
怎么实现呢?
要映射URL到控制器需要一个Controller类来记录类名和方法,还要一个Map集合存储映射 URL -> Controller
在分发器初始化时通过反射读取控制器和其方法上指定URL添加到Map集合中.这需要一个注解@Mapping来指定URL
依次查看一下Controller -> Map mapping -> @Mappting
实现参照 void inti() void requestMapping() 两个方法
参数的注入实现
提供一个注解@Parameter来标注控制器中那些需要注入的字段
取得浏览器传入的参数通过反射注入到控制中
实现参照 void injectPrarameter() void doInject() 两个方法
...
控制器是一个普通的JavaBean.
@Mapping("/user")
public class UserController {
@Parameter
private User user;
private JsonModel json = new JsonModel();
private UserService userService = new UserService();
@Mapping("/register")
public String register() {
if (Utils.isEmpty(user.getUsername())
|| Utils.isEmpty(user.getPassword())) {
json.setMsg("请将项目填写完整!");
return Json.toJson(json);
}
try {
boolean exist = userService.isExist(user.getUsername());
if (exist) {
json.setMsg("用户名已经存在!");
return Json.toJson(json);
}
user.setPassword(Utils.md5(user.getPassword()));
boolean f = userService.register(user);
json.setSuccess(f);
json.setMsg(f ? "注册成功" : "注册失败");
} catch (ServiceException e) {
System.out.println(e.getMessage());
json.setSuccess(false);
json.setMsg(e.getMessage());
}
return Json.toJson(json);
}
... 其他 ....
}
以上代码 将"/user/register" 绑定到了用户控制器的注册方法上。
访问http://localhost:8080/guest/user/register.do时将执行 String register()方法
==
@Parameter
private User user;
==
将会自动把浏览器提交的数据注入到user实体中,比如userid,username等...
事务的实现,参照Nutz的事务简化实现.
...
public boolean delete(final int mid) throws ServiceException {
final String sql = SqlMapping.get("sql.msg.delete");
final int[] re = new int[1];
try {
// Sqlite只支持TRANSACTION_SERIALIZABLE事务级别
int level = java.sql.Connection.TRANSACTION_READ_COMMITTED;
String dbType = Guest.get("DB.TYPE", "0");
if ("0".equals(dbType)) {
level = java.sql.Connection.TRANSACTION_SERIALIZABLE;
}
// 匿名类中使用的变量必须是final类型的
Trans.exec(level, new Runnable() {
@Override
public void run() {
try {
re[0] = gdao.update(sql, mid);
// 删除该留言的评论
gdao.update(SqlMapping.get("sql.comment.delmsg"), mid);
} catch (SQLException e) {
throw new TransException(e);
}
}
});
} catch (TransException e) {
throw new ServiceException(e.getMessage());
}
return re[0] > 0;
}
...
前端对JS的封装。。
// 退出
function logout() {
$.get($.bp() + '/user/logout.do', function(data) {
$('msg-content').html("退出成功!");
$('msg').fadeIn();
if (data && data.success) {
setTimeout(function() {
location.href = $.bp();
}, 2000);
}
setTimeout(function() {
$('msg').fadeOut();
}, 1500);
}, 'json');
}
仿jQuery选择器 取值设值val,html函数,show,hidden显示隐藏函数,fadeIn,fadeOut淡出函数,ajax简单封装,表单序列化...
==
如何使用sqlite?
如何实现事务处理?
如何实现URL映射?
如何实现参数注入?
如何实现对象转json字符串?
如何实现$选择器和Ajax封装?
源码注释挺详细的,主要是给新同学看的,大牛请无视.
感兴趣的话更多内容请下载后请行查看....
1