JSP Model2案例
一、案例分析
JSP Model2 模型是一种 MVC 模式。由于 MVC 模式中的功能模块相互独立,并且使用该模式的软件具有极高飞可维护性、可拓展性和可复用性,因此,使用 MVC 开发模式的 Web 应用越来越受欢迎。接下来,按照 JSP Model2 的模型思想编写一个用户注册的程序,该程序中包含
两个 JSP 页面 register.jsp 和 logSuccess.jsp
一个 Servlet 类 ControllerServlet.java
两个 JavaBean 类 RegisterFormBean.java 和 Userbean.java
一个访问数据库的辅助类 DbUtil.java
关于各个程序组建的功能和相互之间工作关系如下所示:
(1) UserBean 是代表用户信息的 JavaBean,ControllerServlet 根据用户注册信息创建出一个 UserBean 对象中提取用户信息进行显示。
(2) RegisterFormBean 是封装注册表单信息的的 JavaBean,其内部定义的方法用于对从 ControllerServlet 中获取到的注册表单信息中的各个属性(也就是注册表单内的各个字段中所填写的数据)进行校验。
(3) DbUtil 是用于访问数据库的辅助类,它相当于一个 DAO (数据访问对象),在 DbUtil 类中封装一个 HashMap 对象来模拟数据库,HashMap 对象中的每一个元素即一个 UserBean 对象。
(4) ControllerServlet 是控制器,它负责处理用户的注册请求。如果注册成功,就会跳到 loginSuccess.jsp 页面;如果注册失败,重新跳回到 register.jsp 页面并显示错误信息。
(5) register.jsp 是显示用户注册表单的页面,它将注册请求的提交给 ControllerServlet 程序处理。
(6) loginSuccess.jsp 是用户登录成功后进入的页面,新注册成功的用户自动完成登录,直接进入 loginSuccess.jsp 页面
二、案例实现
1、编写 UserBean 类
packagecom.liuyanzhao;
/*
*@authorLiuYanzhao
*/
publicclassUserBean{
privateStringname;
privateStringpassword;
privateStringemail;
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
publicStringgetEmail(){
returnemail;
}
publicvoidsetEmail(Stringemail){
this.email=email;
}
}
2、编写 RegisterFormBean 类
packagecom.liuyanzhao;
importjava.util.HashMap;
importjava.util.Map;
/*
*@authorLiuYanzhao
*/
publicclassRegisterFormBean{
privateStringname;
privateStringpassword;
privateStringpassword2;
privateStringemail;
privateMaperrors=newHashMap();
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
publicStringgetPassword2(){
returnpassword2;
}
publicvoidsetPassword2(Stringpassword2){
this.password2=password2;
}
publicStringgetEmail(){
returnemail;
}
publicvoidsetEmail(Stringemail){
this.email=email;
}
publicvoidsetErrors(Maperrors){
this.errors=errors;
}
publicbooleanvalidate(){
booleanflag=true;
if(name==null||name.trim().equals("")){
errors.put("name","请输入姓名");
flag=false;
}
if(password==null||password.trim().equals("")){
errors.put("password","请输入密码");
flag=false;
}elseif(password.length()>12||password.length()
errors.put("password","请输入6-12个字符");
flag=false;
}
if(password!=null&&!password.equals(password2)){
errors.put("password2","两次输入的密码不匹配");
flag=false;
}
if(email==null||email.trim().equals("")){
errors.put("email","请输入邮箱");
flag=false;
}elseif(!email.matches("[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9]+)+")){
errors.put("email","邮箱格式错误");
flag=false;
}
returnflag;
}
//向Map集合error中添加错误信息
publicvoidsetErrorMsg(Stringerr,StringerrMsg){
if((err!=null)&&(errMsg!=null)){
errors.put(err,errMsg);
}
}
//获取errors集合
publicMapgetErrors(){
returnerrors;
}
}
3、编写 DBUtil 类
packagecom.liuyanzhao;
importjava.util.HashMap;
/*
*@authorLiuYanzhao
*/
publicclassDBUtil{
//单例模式
privatestaticDBUtilinstance=newDBUtil();
privateHashMapusers=newHashMap();
privateDBUtil(){
//向数据库(users)中存入两条数据
UserBeanuser1=newUserBean();
user1.setName("Tom");
user1.setPassword("123456");
user1.setEmail("tom@");
users.put("Tom",user1);
UserBeanuser2=newUserBean();
user2.setName("jerry");
user2.setPassword("666666");
user2.setEmail("jerry@");
users.put("jerry",user2);
}
publicstaticDBUtilgetInstance(){
returninstance;
}
//获取数据库中(users)
publicUserBeangetUser(StringuserName){
UserBeanuser=(UserBean)users.get(userName);
returnuser;
}
//向数据库(users)插入数据
publicbooleaninsertUser(UserBeanuser){
if(user==null){
returnfalse;
}
StringuserName=user.getName();
if(users.get(userName)!=null){
returnfalse;
}
users.put(userName,user);
returntrue;
}
}
4、编写 ControllerServlet 类
packagecom.liuyanzhao;
importjava.io.IOException;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/*
*@authorLiuYanzhao
*/
publicclassControllerServletextendsHttpServlet{
@Override
protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
//TODOAuto-generatedmethodstub
this.doPost(request,response);
}
@Override
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
//防止中文乱码
response.setContentType("text/html;charset=UTF-8");
Stringname=request.getParameter("name");
Stringpassword=request.getParameter("password");
Stringpassword2=request.getParameter("password2");
Stringemail=request.getParameter("email");
RegisterFormBeanformBean=newRegisterFormBean();
formBean.setName(name);
formBean.setPassword(password);
formBean.setPassword2(password2);
formBean.setEmail(email);
if(!formBean.validate()){
request.setAttribute("formBean",formBean);
request.getRequestDispatcher("/register.jsp").forward(request,response);
return;
}
UserBeanuserBean=newUserBean();
userBean.setName(name);
userBean.setPassword(password);
userBean.setEmail(email);
booleanb=DBUtil.getInstance().insertUser(userBean);
if(!b){
request.setAttribute("DBMes","你注册的用户已存在");
request.setAttribute("formBean",formBean);
request.getRequestDispatcher("/register.jsp").forward(request,response);
return;
}
response.getWriter().print("恭喜你注册成功,3秒钟自动跳转");
request.getSession().setAttribute("userBean",userBean);
response.setHeader("refresh","3;url=loginSuccess.jsp");
}
}
5、在 web.xml 添加映射
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/javaee
/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
ControllerServlet
com.liuyanzhao.ControllerServlet
ControllerServlet
/ControllerServlet
6、编写 register.jsp
pageEncoding="UTF-8"%>
htmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/TR/html4/loose.dtd">
用户注册
h3{
margin-left:100px;
}
#outer{
width:750px;
}
span{
color:#ff0000;
}
div{
height:20px;
margin-bottom:10px;
}
.ch{
width:80px;
text-align:right;
float:left;
padding-right:5px;
}
.ip{
width:500px;
float:left;
}
.ip>input{
margin-right:20px;
}
#bt{
margin-left:50px;
}
#bt>input{
margin-right:30px;
}
用户注册
姓名:${formBean.errors.name}${DBMes}
密码:
${formBean.errors.password}
确认密码:
${formBean.errors.password2}
邮箱:
${formBean.errors.email}
7、编写 loginSuccess.jsp 类
pageEncoding="UTF-8"%>
htmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/TR/html4/loose.dtd">
登录成功
if(session.getAttribute("userBean")==null){
%>
return;
}
%>
恭喜你,登录成功
你的信息
您的姓名:${userBean.name}您的邮箱:${userBean.email}三、运行程序
启动 Tomcat 服务器
1、在地址栏输入http://localhost:8080/JspModel2Demo/register.jsp
可以看到如下图所示
2、测试 未填
3、测试两次密码不一致
4、测试 账号已存在
5、在地址栏输入http://localhost:8080/JspModel2Demo/loginSuccess.jsp
直接访问登录成功页面,因为我们的 loginSuccess.jsp 里判断了是否有 session,如果没有的话,会转发 register.jsp 里的内容,如图
6、如果输入正确的话
点击注册按钮,可以看到如下页面
3秒钟后出现如下页面