用Servlet+Velocity实现最傻的登录、注册,还有登录验证:如果检查发现没有登录那么不准许查看某个web页面
遇到的问题是:
1.怎样获得session
request.getSession()和request.getSession(isNew)两种方式。google了一下发现有人认为request.getSession(false)才是稳妥,理由是能避免重复创建session节省内存。
我按这种方式写了测试代码,直接访问页面,发现在不同浏览器表现不一样,而且HttpServlet和VelocityViewServlet的表现也不一样:-
#VelocityViewServlet
chrome:org.apache.catalina.session.StandardSessionFacade@27675d26
ie:直接报空指针错
vivaldi:org.apache.catalina.session.StandardSessionFacade@6bfb4540
firefox:直接报空指针错
#HttpServlet
chrome\firefox\vivaldi正常
ie还是报空指针错误
后来看了so上一个问题的解答,说带false参数的方法一般是在filter中使用,而登录的servlet中用不带参数的就好了,ref:
把so这个问题答案中代码复制并修改,实现了注册、登录、查看个人信息(通过filter验证是否登录)、注销功能。
2.VelocityViewServlet类分别处理Get和Post请求
其实既然使用了VelocityViewServlet,就没有必要使用原来的HttpServlet了。
因为VelocityViewServlet是继承了HttpServlet的,需要修改的地方override方法就好了。
默认doGet和doPost方法都调用doRequest方法,它会调用handleRequest方法。因此无论是get还是post方式的请求,默认都要调用handleRequest方法。只要override这个方法,就能处理自己的业务逻辑了。
但是有时候同一个页面,比如登录页面,get方式和post方式得到的内容应该是不一样的,也就是需要分开处理。因为post处理成功的话,url会改变,而handleRequest不会改变url,因此要重写post方法,改变url的操作使用request.sendRedirect(request.getContextPath()+relatetive_path)。
也即是说:对于一个VelocityViewServlet,它处理请求的时候,哪种请求方式需要改变url,就override那种请求方法。(一般都是重写doPost方法)
如果说doPost方法中有「不需要改变url」的情况,那么就调用doGet方法好了,比如登录失败,那么在request中设定某个attribute为错误提示,然后转交给doGet方法;doGet方法中取出这个attribute然后放入ctx,然后在模版文件中使用。
当然前期好多代码还是看了博客园的一篇教程改出来的:http://www.cnblogs.com/tzhz/archive/2013/05/18/3085512.html