这是学习Java2个月以来第一次接触三重架构
总的来说MVC就是Model,View,Controller,
1.View:就是前端的页面展示,布局,交互作业,jsp/js/html/css等
2.Model:就是负责各个模块功能的实现,目前接触到的方法是BeanUtils
3.Controller:负责把模型和页面连接起来,接发请求,跳转,获取客户端数据等。Servlet
三重架构:就是把代码分成3个部分编写
1.界面层:jsp,servlet
2.业务逻辑层:service层,组合dao(Data Access Object)层的简单方法,形成复杂功能
3.数据访问层:dao层,定义对数据库的CRUD的操作
接下来就是把我学习MVC和三重架构的实例方法以及其中的遇到的问题和大家分享下
day1--登陆功能和验证码
验证码的制作和刷新,页面展示
前端的代码就不在这里展示了,大家自己理解就行
1.我们需要先写一个简单的验证码出来
使用BufferedImage对象,这个也是一个新学的方法,主要作用就是将一副图片加载到内存中。
然后就是设置这个图片的过程,上面width为图片的长度,height为图片的高度
new BufferedImage参数分别是(宽,长,调色的参数)type_int_rgb我也不太懂,不过不影响。
这里又是一个新知识点,编辑BufferImage需要用到getGraphics(画笔)。
每次使用前,都需要对其颜色进行设置,否则将会是上一个设定的画笔颜色
填充图片用 new getGrapics.fillRect,这个很好理解,和英文字面意思一样,里面的参数
(x,y,width,height)x,y表示从图片的哪个坐标点开始(左上角的点为0,0),widh代表x的值,height代表y的值
然后解释String checkCode=getCheck();我们定义一个产生随机字母和数字的方法
这里random方法没啥好说的,nextInt获取index就行
重点的是会调用StringBuffer中的append方法,可以拼接获取到的随机字母/数字
然后利用.toString方法,返回表示此顺序中的数据的字符串。这样就得到了checkcode
剩下两个步骤
1.怎么让验证码刷新(点击图片刷新)
2.得到checkcode后怎么让它显示在图片上
我们解决第二个问题
调用Graphics中的drawString即可
g.drawString(checkCode,15,25);
这里15和25就是图片上的x,y值。
本来还需要给验证码加一些干扰线的,这里为了方便就没加,可以参照一下代码
graphics.setColor(Color.green);
for (int i = 0; i < 6; i++) {
int x1=random.nextInt(width);
int y1=random.nextInt(height);
int x2=random.nextInt(width);
int y2=random.nextInt(height);
graphics.drawLine(x1,y1,x2,y2);
}
我们还需要调用Image的IO流,将图片输出到页面上去
ImageIO.write(image,"PNG",response.getOutputStream());
这就是结果,当然还差一步才能把图片如期的展示到浏览器上,就是在jsp页面输入图片的地址,这个我将和图片的刷新一起分享
接下来就要解决第一个问题,怎么让验证码,刷新,点击一下就刷新
我们需要先在自己的jsp文件中(注意,这里jsp文件需要建在web下的WEB-INF文件中)找到验证码的input表单
我们可以把img标签用链接a标签包起来,这样就可以实现图片本身就是链接的问题
在src中输入我们要传的图片地址,这里也需要说一下,一般情况下我们传的是localhost/自定义的Application conext(在tomcat设置中)/@webservlet的名字,但这里我们用的是动态默认地址,${pageContext.request.contextPath}。$是el语法,不懂的小伙伴要自行补习哦,pageContext是jsp的内置对象,可以调用剩余其他的8个内置对象,这里的request就是其中一个,再获取contextPath,就是默认路径,再加上我们验证码的@websevrlet地址,就可以了,src记得加双引号哦。
这样我们就完成了图片在页面上的显示
在用a标签把图片包起来后,我们就需要为a标签定义href地址值,这里我们用了jsp中特定的方法,可以在href中写javascript:function()方法,
先用document.getElementById根据id获取到图片的参数
然后把src改成我们上面验证码的地址,唯一不同的就是我们需要保证刷新出新的图片,就要保证每一张图片的不同性,这样我们就需要给路径加上一个永恒不相等的元素,就是事时间。
这里checkcode后的问号?,就是后续不确定参数的前缀(不是官方解释,个人理解)
这样就可以保证我们的验证码没刷新一次就换一张图片
接下来我们就需要进行如何让我们在登陆页面输入的账号密码和验证码可以和数据库中的验证码匹对,正确的话就进入我们的页面,不正确就提示错误信息
首先我们需要创建一个loginServlet的servlet类,来控制模型和页面
1.我们先判断我们输入的验证码是否和图片上的验证码是否一样,如果一样,再进行账号和密码的验证,如果不一样,就不需要浪费资源去验证账号和密码
首先,最重要的,因为是初学者我刚开始也忘了,就是设置编码,让浏览器和java编写的代码编译一样,在servlet页面中先写下这一行
request.setCharacterEncoding("utf-8");
我们需要获取我们输入的验证码和图片本身的验证码,顺序随便,先获取哪个都可以
我们的验证码输入框input的name为"verifycode"
通过sevrlet中的request.getParameter获取input中的参数值(就是我们输入的验证码)
之前我们在写验证码图片的时候,已经把验证码的字存入了session中
现在我们要把验证码生成的字拿出来getSession.getAttribute即可
并且注意存入的是char类型,拿出来需要转成String类型,因为我们输入的是String型
在if语句中我们需要先判断输入的验证码和生成的验证码是否相同,并且判断生成的验证码是否为空(防止空指针异常)
checkcode_server.equalsIgnoreCase(verifycode)&&verifycode!=null
如果一样,我们就需要一个request.getParamterMap(),来获取login.jsp中所有带有name属性标签的属性值,也就是我们在登陆页面输入账号密码,验证码的值
使用
BeanUtils.populate(user,parameterMap); 把parameterMap中的所有属性值都存入user对象中 这里需要注意user中定义的参数,都必须和login.jsp中的name值一一对应 看下图
这里我犯过一个错误,就是没有对应,那么就会导致,获取到的name="xxx"不能赋值到user中的xxx上。
之后,我们需要调用serviceImpl实现类中的方法,也就是我们的业务逻辑层
再之后,serviceImpl调用daoImpl(数据访问层)中的方法
三重框架就是这种层层递进的过程,我还没怎么弄明白,反正目前的理解就是在servlet中调用serviceImpl,在serviceImpl中调用dao实现,dao中的链接数据库,以及用到的druid在这里就不多说了。
值得说一点的是,BeanPropertyRowMapper,它可以将查询语句封装成自定义的对象,返回。
到这里,也就是我们把我们输入的账号和密码,在数据库中执行查询语句,这里也需要注意,我们这里写的username和password也需要和数据空中的对应起来
select *from user where username=? and password=?
如果查到了我们的账户和密码,就说明可以登录,如果登陆成功,我们需要把页面跳转到显示页面,这里我们把loginuser存入session的目的是,在下一个页面确定是哪个用户登陆的(可以不设置)
最后我们来展示下验证码错误和账户密码错误的解决方法
如果他们俩错误了,就不能把页面跳转到登陆成功后的页面,应该还是保持在登陆页面,并且给出提示,是哪个输入错误了
先把错误信息存入setAttribute中,然后调用el语句获取到我们存取的login_msg即可
下一篇博客我们将分享下
request.setAttribute和request.getSession.get.setAttribute两种方法之间的区别和联系
因为我发现,这两种都可以储存参数和获取对象



