项目:https://download.csdn.net/download/qq_40223688/10463436

项目

功能:
*注册
*登录

------------------------------------------------------------------

JSP:
*login.jsp --> 登录表单
*regist.jsp --> 注册表单
*index.jsp --> 主页(只有登入成功才能看见)

Servlet:
*LoginServlet
*RegistServlet

Service:
*UserService --> 与用户相关的业务类

Dao:
*UserDao --> 与用户相关的数据类

Domain:
*User(对应数据库,还要对应所有表单)
**username
**password
*verifyCode

------------------------------------------------------------------

数据库设计:
*users.xml
<users>
<user username="xxx" password="xxx"/>
<user username="xxx" password="xxx"/>
</users>

-------------------------------------------------------------------

步骤:
1.创建空项目
2.导包:
*CommonUtils
*commons-beanutils.jar
*commons-logging.jar
*dom4j
3.建包
*com.changeyd.user.domain
**User
*com.changeyd.user.dao
**UserDao
*com.changeyd.user.service
**UserService
*com.changeyd.user.web.servlet
**LoginServlet
**RegistServlet

4.jsp
*login.jsp
*regist.jsp
*index.jsp

5.在D盘下创建一个user.xml文件
*添加根元素<users>
*保证文件格式为utf-8

------------------------------------------------------------------

注册:
regist.jsp
*第一步:完成regist.jsp的基本功能

RegistServlet
*封装表单数据,封装到User对象中。
*调用service的regist()方法
**如果这个方法没有出问题,则输出“注册成功”
**如果这个方法抛出了异常,把错误信息保存到request域,转发到regist.jsp(显示错误信息)

UserRervice#regist()
*没有返回值,但注册失败抛出一个自定义的异常,可以在异常中添加异常信息(自定义一个异常类)
*校验用户名是否已被注册(通过用户名查询用户),如果已被注册,抛出异常,异常信息为“用户名已被注册”
*添加用户

UserDao:通过业务分析,得到结果:需要提供两个方法
*按用户名查询用户对象:User findByUsername(String username)
*插入一个用户到数据库中:void add(User user)

工作:
1.在service层添加一个UserException
2.dao:
*User findByUsername(String username)
*void add(User user)
3.service
*void regist() throws UserException

4.servlet
(1)封装表单数据到User对象中
(2)使用user调用service的regist()方法
(3)如果得到UserException,那么吧异常信息保存到request域中,转发回regist.jsp,(用于数据的回显)
(4)输出“注册成功”

--------------------------------------------------------------------------

给注册添加验证码
1.VerifyCode类
*BufferedImage getImage() --> 获取随机的验证码图片
*String getText() --> 获取图片上的文本
*static output(BufferedImage, OutputStream) -->吧图片写入到指定的输出流中。

2.VerifyCodeServlet
*获取随机验证码图片
*把验证码图片上的文本保存到session中
*把图片响应到response的outputStream中

3.regist.jsp
*添加<img src="指向Servlet" />
*添加一个文本框,用了输入验证码
*“看不清,换一张”,是一个超链接。把上面的<img>的src重新再次指向Servlet!为了处理浏览器缓存,需要使用时间来做参数!

4.修改RegistServlet
*校验验证码:
*错误:保存表单数据到Requset域、保存错误系到request域,转发回regist.jsp
*正确:什么都不用做,向下执行原来的代码。

-----------------------------------------------------------------------------

服务器段表单(输入)校验
对此表单校验,应位于获取表单数据之后,验证码校验之前:
1.使用Map类型来壮哉错误信息 ;
*key:表单项名称,例如:username、password、verifyCode
*value:
**非空:用户名不能为空,或者密码不能为空
**字符长度:用户名长度必须在6~16位之间,密码长度必须在6~16位之间

2.在校验失败时,向map添加错误信息,哪个字段出错,那么就向哪个字段添加错误信息,
3.判断map是否为空(长度是否为0),如果不为空,那么说明有错误存在,保存map到request域中,保存from到request域中(用于回显),转发回resist.jsp
4.在resist.jsp页面中,显示map中的错误信息。${map.username},且将from中的错误信息回显到表单中的输入框。

==========================================================================
===========================================================================

登入功能
页面:login.jsp --> 登入表单

LoginServlet -->
1.获取表单数据,封装到User中
2.调用service中的login()方法,传递form。
3.如果service中的login()方法,没有抛出异常,返回一个User对象,
4.如果存在异常:那么就获取异常信息,保存到request域中,保存form,转发到login.jsp
5.如果没有异常:保存返回的user对象到session中,重定向到welcome.jsp(显示当前用户信息!)

UserService#login()
public User login(User form){
...
}
1.使用用户名查询数据库,得到返回的User
*返回为null,抛出异常,异常信息委(用户名不存在)
*返回不为null,获取查询出来的user的password与form的password进行比较
**如果不同:抛出异常(密码错误)
**如果相同,返回查询结果

UserDao
*通过用户名查询用户(与注册所用方法一致)

Javaweb学习笔记——(十四)—————— 服务器端验证注册登入表单项目的更多相关文章

  1. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  2. HTML+CSS学习笔记(5)- 与浏览者交互,表单标签

    HTML+CSS学习笔记(5)- 与浏览者交互,表单标签 1.使用表单标签,与用户交互 网站怎样与用户进行交互?答案是使用HTML表单(form).表单是可以把浏览者输入的数据传送到服务器端,这样服务 ...

  3. 自制“低奢内”CSS3登入表单,包含JS验证,请别嫌弃哦。

    要求 必备知识 基本了解CSS语法,初步了解CSS3语法知识.和JS/JQuery基本语法. 开发环境 Adobe Dreamweaver CS6 演示地址 演示地址 预览截图(抬抬你的鼠标就可以看到 ...

  4. python 学习笔记十四 jQuery案例详解(进阶篇)

    1.选择器和筛选器 案例1 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  5. (C/C++学习笔记) 十四. 动态分配

    十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...

  6. HTML5 学习笔记(二)——HTML5新增属性与表单元素

    目录 一.HTML5新增属性 1.1.contextmenu 1.2.contentEditable 1.3.hidden 1.4.draggable 1.5.data-* 1.6.placehold ...

  7. Netty学习笔记(一):接收nodejs模拟表单上传的文件

    好久不写博客了,也好久不写代码了,这两天临时遇上一个事情,觉得不难,加上觉得手有些生,就动手做了一下,结果遇上了不少坑,有新坑,有老坑,痛苦无比,现在总算差不多了,赶紧记录下来,希望以后不再重复这种痛 ...

  8. JavaWeb学习总结(十一):Session解决form表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  9. JavaWeb学习 (二十四)————Filter(过滤器)常见应用

    一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import ja ...

随机推荐

  1. day15-集合

    快捷键: 先定义name,age再利用快捷键生成,Alt+shift+s +c:空参 Alt+shift+s +o:有参 Alt+shift+s +r:set&get方法Ctrl+shift+ ...

  2. Codeforces 1051E. Vasya and Big Integers

    题意:给你N个点M条边,M-N<=20,有1e5个询问,询问两点的最短距离.保证没有自环和重边. 题解:连题目都在提示你这个20很有用,所以如果是颗树的话那任意两点的最短距离就是求一下lca搞一 ...

  3. Linux系统状态监控小工具 - Linux Dash

    Linux Dash是一个简单易用的Linux系统状态监控工具,项目地址:https://github.com/afaqurk/linux-dash 1.安装Apache服务: [root@local ...

  4. Python中Scrapy框架元素选择器XPath的简单实例

    原文标题:<Python网络爬虫-Scrapy的选择器Xpath> 对原文有所修改和演绎 优势 XPath相较于CSS选择器,可以更方便的选取 没有id class name属性的标签 属 ...

  5. tyvj/joyoi 1374 火车进出栈问题(水水版)

    我受不了了. Catalan数第100项,30000项,50000项,cnm 这tm哪里是在考数学,分明是在考高精度,FFT...... 有剧毒! 我只得写高精度,只能过100的那个题,两个进化版超时 ...

  6. WebService 及 CXF 的进阶讲解

    4.2. WebService请求深入分析 1). 分析WebService的WSDL文档结构 1.1). 实例截图 <definitions> <types> <sch ...

  7. c#反射(1)

    反射可以读取程序集中代码的内容,程序集一般指(dll或exe文件). 反射中Type类,这个类太强大了,可以获取到另一个类的名称,命名空间,程序集,以及这个类中的字段,属性,方法.可以方便我们查看某个 ...

  8. 免费馅饼 HDU - 1176 (动态规划)

    都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内.馅饼如果掉在了地上当然就 ...

  9. okhttp 内网可以有,但外网访问数据返不回来,代码一样

    :1.问题点在于 下图红框里写成 text/html了,需要改成application/json,造成的问题有:unexpected end of stream  这个是406错误:加上日志之后okh ...

  10. 自定义数据类型 typedef

    其实就是为数据类型起一个别名. typedef unsigned char AGE; //字符类型AGE x; //等价于 unsigned char x; typedef int * IPointe ...