日期:2014-05-16  浏览次数:20403 次

初涉jsp和servlet之博客小练习
本来是想把servlet与jsp这部分的知识全部学完了才开始做的,后来发现内容太多,只好先根据已学的练一下手。让我没想到的是,自以为简单的程序居然做得如此的磕磕碰碰,每添加一个类做测试的时候,几乎没有一次就能通过的。发现自己的基础很有缺漏,运用的时候也不求甚解。还好,还是有所收获的。

练习基本上实现了对文章的增删改,对某一用户的留言,对某一文章的评论。先看看效果:
登录后首页:

点击博客后上半部分是:

下半部分根据点击的用户来显示不同内容,如果是自己可以发表文章,如果不是可发表留言。
点击用户文章后,上半部分是:

下半部分如果点击用户是自己则显示修改文章和删除文章,如果是别人则可以发表评论。
最重要的思想就是通过判断登录用户和访问用户是否一致来显示不同的内容。困惑的是不知道这样写是好还是不好。

经验和教训:
1.文章数据表我是用了一个特殊的id来做主键,到后来发现一个问题,就是一个用户可以发多个同名文章,这显然不符合事实,应该将用户名和文章名作为一个联合主键来定义。primary key(article_name,user_name)

2.每次登录、发表文章、评论、留言都会记录一个时间,我用的是date,但用datetime会更好,记录时间的好处就在于当我们显示用户、文章、评论、留言进行查询的时候,可以通过order by datetime desc来显示最新消息。附:当元素中含有NULL时,order by会把null当成是最小。

3.考虑刷新的问题 刷新会带来很多问题,有的时候页面会报错,最常看到的是数据的重复提交。这里为了避免重复提交可以通过判断保存的值是否为null来实现。

4.当以非session的方式改变session里保存的值后,还要根据情况来考虑是否要通过session来同步你所改变的值,有的时候不同步会导致一下莫名奇妙的错误出现。

5.jsp中的要得到session保存的基本数据类型的值,要通过基本数据类型的包装类来实现,比如说要得到一个保存在session里的boolean类的值:
Boolean b = (Boolean)session.getAttribute("XXX");

6.写之前还是画好流程图,设计好数据库,要细心
由于是练习,都是走一步算一步,磕磕碰碰很多,部分是单词错误,部分是sql语法错误……有细枝末节的错误,也有一些设计的错误,比如说怎么判断一个值是否该放在session里面。

7.未实现的地方,当数据多了之后必然需要的分页的功能。

8.关于书本上ActionFactory单例类的改进,书上也说了Servlet默认使用的是单线程模型,而书上用的ActionFactory单例类用的是普通的懒汉模式,上次跟大家介绍单例类的时候也说过(后面的博客会好好总结的):这种模式只适合在单线程使用,否则有可能同时执行getInstance()方法,会创建俩个ActionFactory类,这里可以改成这种形式:
public class ActionFactory {

	private static class Instance{
		static final ActionFactory ac = new ActionFactory();
	}
	
	private ActionFactory(){}
	
	public static ActionFactory getInstance(){
		return Instance.ac;
	}
	
	public Action getAction(String actionName){
		Action action = null;
		try {
			Class c = Class.forName(actionName);
			action  = (Action) c.newInstance();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return action;
	}
}

因为内部类(Instance)只会被装载一次,所以只会创建一个对象

附:当我们想要复制一个web项目并把它添加到server的时候会报错,这个时候需要修改server的配置文件server.xml,ctrl+f找到你粘贴后的项目名字,然后做出对应的修改,比如说我的TestGBK是复制Test过来的,找到后发现path还是原来的Test:
docBase="TestGBK" path="/Test" reloadable="true" source="org.eclipse.jst.jee.server:TestGBK"/>修改后重新启动即可。

最近学的东西又杂又多又乱,一时之间突然就不想搞了。还好有胡_总提醒我不能前功尽弃。这次的小练习让我感觉到了jsp+servlet的知识实在不是一时半会能学的会,就算学了,也不一定懂真正的意思,所以还是得重头开始好好打基础啊。。
1 楼 wuanjunbaiqi 2011-08-21  
好好好
2 楼 fen9ye 2011-08-21  
wuanjunbaiqi 写道
好好好

嘿嘿,你是……?