一开始先把我博客的地址发出来,各位可以看看点击打开链接
首先介绍下整个网站使用的技术:
整体架构Spring Springmvc Mybatis 后台管理 DWZ 编辑器Ueditor,这个编辑器是百度的,可以支持代码高亮,单图上传与多图上传,截图与音频视频插入等。
前端Bootstrap3 (这个框架很好学,我花了两个小时就学了,然后做前端时没写一个css文件,而且样式还不错,所以推荐还没学的人学学)
全文搜索Lucene 这个我只停留在基本会用的级别上,至于原理还不太清楚,做网站时现学现用的。
然后开始详细介绍这个项目开发过程。
一开始,使用bootstrap3框架做好了界面。(这个真没啥好讲的,我是参照别人的博客去做的界面)
这时需求基本上已经确定好了。
然后开始设计数据库
这个也就略过了,这个不难,我等会儿会上传数据库文件。
写好po类。每个po类对应一个数据库中表。
先组合进mybatis,然后组合springmvc。
导入mybatis+springmvc等jar,此外还有javaEE6 JDK相关Jars
组合mybatis 使用mapper代理模式。
mybatis/SqlMapConfig.xml如下
记得在源文件夹下面家里db.peroperties 与 log4j.properties
在po包下,建立每个po类的Custom类(包装类,继承原类) 和 QueryVo类(查询时封装参数用)。
写Service接口类与Service实现类。ArticleService
在Service接口类中写在controller中可能用到的接口方法。比如新增文章,查找文章,删除文章,修改文章。
然后在 com.mapper 包下建立 ArticleCustomMapper.java 与 ArticleCustomMapper.xml
在Mapper.java接口中写(Service实现类中的实现方法会用到的)mapper层的方法。
并且在Mapper.xml 中对每个方法进行配置。
建立测试类,测试每个方法。
测试类这样写:
private SqlSessionFactory factory;
@Before
public void Init() throws Exception{
String res="mybatis/SqlMapConfig.xml";
SqlSessionFactoryBuilder builder= new SqlSessionFactoryBuilder();
factory = builder.build(Resources.getResourceAsStream(res));
}
@Test
public void testSaveType(){
SqlSession session= factory.openSession();
TypeCustomMapper typeCustomMapper=session.getMapper(TypeCustomMapper.class);
Type type=new Type();
type.setTypename("JavaEE");
typeCustomMapper.saveType(type);
session.commit();
}
查看mapper接口中方法是否正常运作。
若有错误,则进行修改,直至没有漏洞。
然后,注意,配置文件中SqlMapConfig.xml 最后已经配置mapper了,所以可以将mapper自动注入到service的实现类中。
然后开始写service的实现类方法。使用@Autowired注解将mapper对象注入。这个不难。
然后写三个配置文件,
applicationContext-dao.xml
applicationContext-service.xml
applicationContext-transaction.xml
springmvc.xml
记得要将这些配置文件全部在web.xml中加载。
contextConfigLocation
/WEB-INF/classes/spring/applicationContext-*.xml
applicationContext-dao.xml 中配置数据源,因此SqlMapConfig.xml中配置的 environment 就可以删去。(不过若是删除了,就没法再测试mapper接口了,mapper是仅属于mybatis,删了mybatis配置当然没法单独测试mybatis,可能你以后mapper接口还会变化,你又要测试mappers,所以建议你别删)。
applicationContext-service.xml配置几个bean,bean 的id为你自己定义,不过建议是service接口类名首字母小写,class为service实现类。
这样配置好了后,就可以在Controller中自动注入service,注入时,类为接口类,名字为这个bean的id。
applicationContext-transaction.xml 配置事务管理器。
springmvc.xml中配置前端控制器,视图解析器(这两者直接写mvc:annotation-driven),controller包,拦截器等。
使用注解的方式写Controller类,
Controller类自动注入Serivce类,Service实现类自动注入Mapper类。
然后在Controller中写方法,并进行配注解。
在jsp页面中,form的action 或者url的 action都是 匹配到注解的。
这个是大体的开发过程。
最后说下开发过程中遇到的问题,以及解决方案:
遇到的问题以及解决方案:
1.
想要提高用户体验,登录时采用异步登录,先将请求提交到服务器端进行验证,然后服务器若是找到了这个登录对象,就会将数据放入session属性中,然后将查询到的User返回给客户端,客户端的页面没有整体刷新,因此session没有更新,没有测试到这个属性。
只有当刷新页面后才会检测到session中此属性值。
解决:在jsp中定义了一个 input 组件,登录成功后,改变input的value属性为登录成功的用户姓名,然后此页面查询是否用户登录时,会先看session中是否有相应属性值,若没有,再看这个input组件中value值是否为空,若为空,则表明未登录,只要有一个条件满足,那么就算登录成功。等离开此页面,虽然这个input的value属性为空,但是session的值已经刷新,则依然算是登录成功。
后来改为登录成功直接跳转至写博客界面。
2.
在修改文章时,加载编辑器需要一段时间,而在加载编辑器时,不能给编辑器赋初始值。
而加载完编辑器后,却找不到文章的内容(会阻塞下去)。
所以说,要把文章内容放入编辑器,首先应该把文章内容,放入一个标签中。一开始是把内容放入input标签,display:none,使其隐藏,但是不可以。
因为将这个input标签的 value 属性,是用双引号括起来的。而文章正文中很可能也有双引号,所以很可能会提前结束value属性,然后这个input标签后面会直接显示文章正文内容。
最后的解决方案:
写一个DIV,使DIV的html为文章正文,然后使DIV隐藏。
文章正文是 HTML 结构,因此,可以使用
而不必担心div提前结束,因为即使文章内容中有
但这个
标签依然不会导致div提前结束,原因是文章正文会被百度编辑器转义。不可能在内容中出现"