基于MVC模型和分层模式完成登录和注册
1.MVC概述
Model、view、Controller即模型、视图、控制器。是软件的一种架构模式(Architecture pattern)。MVC要实现的目标是将软件的用户界面和业务逻辑分离,可提高代码可扩展性、可复用性、可维护性、以及灵活性。
View(视图):用户的操作界面。如:html、jsp。
Model(模型):具体的业务模型与数据模型。如:service、dao、pojo
Controller(控制):处理从视图层发送的请求,并选取模型层的业务模型完成响应的业务实现,并产生响应。如:Servlet
首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。实现人机数据之间的交互;
为什么要使用MVC模式
搞清楚MVC到底都代表什么之后,我们要考虑的是我们为什么要用MVC或是类似于这种模式的架构思想。
各施其职,互不干涉
在MVC模式中,三个层各施其职,所以如果一旦哪一层的需求发生了变化,就只需要更改相应的层中的代码而不会影响到其它层中的代码。
有利于开发中的分工
在MVC模式中,由于按层把系统分开,那么就能更好的实现开发中的分工。网页设计人员可以进行开发视图层中的JSP,对业务熟悉的开发人员可开发业务层,而其它开发人员可开发控制层。
有利于组件的重用
分层后更有利于组件的重用。如控制层可独立成一个能用的组件,视图层也可做成通用的操作界面。一句话总结就是”高内聚,低耦合"
3.在javaweb开发中MVC分别指的是谁
M:HavaBean (Model) 的职责
封装数据一一值javaBean
封装业务一-工具avaBean
C: Servlet (Controller) 的职责
控制流程,接受请求参数,调用lavaBean,获取结果数据,并将数据存储在某个作用域范围之中,最后选择页面显示
JSP(View)的职责
获取Servlet存储在某个作用域之中的数据,进行显示
4.javaweb应用的结合MVC模式是怎样开发的
开发步骤(不是绝对的,只是作一个参考),做适当了解,后期案例中会参考此步骤
开发javaBean来表示数据和业务。
通过Servlet处理请求,读取请求参数。
Servlet调用JavaBean,实现业务逻辑,获取结果数据。
Servlet调用请求、会话等对象的setAttribute方法,将结果数据存储在某个作用域范围之中。
Servlet选择合适的SP页面,通过RequestDispatcher的forward方法跳转至该页面。
.JSP页面获取Servlet存储的结果数据,进行展示。
5.JSP简介
JSP是什么
JSP (Java Server Pages)是一种动态网页开发技术JSP文件就是在传统的 HTML文件中插入Java 代码和JSP 标签,后缀名为.jsp。
JSP 使用JSP 标签在 HTML 网页中插入Java 代码,标签通常以<%开头,以 %>结束,JSP 标签有多种功能,比如访问数据库和JavaBean组件等,还可以在不同的网页之间传递和共享信息。
JSP表达式
<!--这个表达式是用来输出的 --><%= new Date().toLocaleString()%>
效果:在网页上打印当前时间
JSP脚本片段
简单的脚本片段
<!--在脚本里写Java代码--><%//int a=10/0;/* 故意出错 */int x=10;out.print(new Date().toLocaleString());%>
分开写:分开写,单个脚本中的语句可以是不完整的,但是多个脚本片段组合后的结果必须是完整的Java 语句
<%for(int i=0;i<10;i++){%><h1>yyy</h1><br><% }%>
JSP声明
<!--用来声明变量,方法,声明的是全局变量 --><%!String name; %><!--在这里声明的变量是局部变量--><%int a=9;%>
JSP注释
<%--这是注释内容--%>1.需要注意的是:JSP 页面中格式为<%-- 注释信息 --%> 内容不会发布到客户端
2.JSP指令
包括page、include、taglib 三种指令
page指令
格式:
<%@ page 属性名 1= "属性值 1" 属性名 2= "属性值 2" ...%>
常见属性:
language: jsp 脚本中可以嵌入的语言种类
pageEncoding:当前 jsp 文件的本身编码
contentType: response.setContentType(text/html;charset=UTF-8)
import:指定JSP 页面翻译成 Servlet 资源文件中导入的包或者类
session: 是否jsp 在翻译时自动创建 session
errorPage:当当前页面出错后跳转到哪个页面
isErrorPage:当前页面是一个处理错误的页面
.include 指令
需要在 JSP 页面静态包含一个文件,例如 HTML 文件、文本文件等,这时,可以通 过 include 指令来实现
格式:
<%@ include file="被包含的文件地址"%>
<!--包含指令,如果确定某个页面是包含页面,那么只需要写body里面的内容,上面包含的编码要写-->
<!--在哪个地方写的包含指令,那么包含的页面显示的内容就相应的显示在那个位置,他是把该页面的所有代码拿过来-->
<%@include file="/404.jsp” %>
3.JSP隐式对象
一共有九个隐式对象
名称 |
类型 |
描述 |
out |
javax.servlet.jsp.JspWriter |
用于页面输出 |
request |
javax.servlet.http.HttpServletRe quest |
得到用户请求信息 |
response |
javax.servlet.http.HttpServletRe sponse |
服务器向客户端的回应信息 |
config |
javax.servlet.ServletConfig |
服务器配置,可以取得初始化参数 |
session |
javax.servlet.http.HttpSession |
用来保存用户的信息 |
application |
javax.servlet.ServletContext |
所有用户的共享信息 |
page |
java.lang.Object |
指当前页面转换后的 Servlet 类的实例 |
pageContext |
javax.servlet.jsp.PageContext |
JSP 的页面容器 |
exception |
java.lang.Throwable |
表示 JSP 页面所发生的异常,在错误页中 才起作用 |
五个比较重要的,四个域对象范围从大到小是application>session>request>pageContext
PageContext常量名 |
描述 |
作用域名称 |
域对象类型 |
PageScope |
当前页面中有效 |
pageContext |
PageContext |
RequestScope |
一次请求范围 |
request |
HttpServletRequest |
Sessionscope |
一次会话范围 |
session |
HttpSession |
Applicationscope |
应用范围 |
application |
ServletContext |
pageContext对象
在JSP 中,想要获取 JSP 隐式对象,可以使用 pageContext 对象,pageContext 对象时 Javax.servlet,isp.PageContext 类的实它代表当前JSP 页面的运行环境,并提供了一些 列用于获取其他隐式对象的方法。
方法 |
功能 |
JspWriter getOut() |
获取out 隐式对象 |
Object getPage() |
获取 page 隐式对象 |
ServletRequest getRequest() |
获取request隐式对象 |
ServletResponse getResponse( ) |
获取response隐式对象 |
HttpSession getSession() |
获取 session 隐式对象 |
ServletConfig getServletConfig() |
获取 config |
ServletContext getServletContext( ) |
获取application 隐式对象 |
Exception getException() |
获取exception隐式对象 |
示例: 使用 pageContext 获取 request 对象
<!--pageContext,代表当前jsp页面的运行环境-->
/*不能从子类转成父类对象,所以需要强制转换*/
HttpServletRequest request1=(HttpServletRequest)pageContext.getRequest();
String ip=request1.getRemoteAddr();
out .print(ip);
pageContext操作属性
方法名 |
功能 |
void setAttribute(String name, Object value, intscope) |
设置 pageContext 对象的属性 |
Object getAttribute(String name,int scope) |
获取pageContext对象的属性 |
void removeAttribute(String name,int scope) |
删除指定范围内名称为name的属性 |
void removeAttribute(String name) |
删除所有范围内名称为name的属性 |
Object findAttribute(String name) |
从4个域对象中查找名称为name的属性 |
pageContext 对象的作用范围有 4 个值
pageContext.PAGE SCOPE: 表示页面范围
pageContext.REQUEST SCOPE: 表示请求范围
pageContext.SESSION SCOPE: 表示会话范围
pageContext.APPLICATION SCOPE: 表示 Web 应用程序范围
<!--pageContext里的方法findAtrribute(name)-->
/*查找是从最小范围的域对象开始找,如果找到了,就不继续往下找了,没有找到,则向范围更大的域对象中去找,找不到
则返回null*/
Object namel=pageContext.findAttribute("name");
out .print(name1);
//输出的是yyy
4.jsp标签
<jsp:include>标签
作用: 为了把其他资源的输出内容插入到当前 JSP 页面的输出内容中
示例:
<body>
<h1>include.isp中的内容: this is include.jsp</h1><br>
<!--在同一级目录,相对路径就直接是文件名-->
<!--flush属性是false的时候,目标页面有一个睡眠5s的线程整个页面都会去等待5s,true时,先显示当前页面的内容等待5s后再显示目标页面-->
<jsp:include page="/0301-target.jsp" flush="true"/>
<!--页面引用这个用的相对比较广泛-->
</body>
注意: include 指今和<isp:include>标签的区别
< jsp:include>标签中要引入的资源和当前 JSP 页面是两个彼此独立的执行实体,即被动 态引入的资源必须能够被 Web 容器独行,而include 指令只自引入循JSP 格式 的文件,被引入文件5当前JSP 文件需要共同合并才翻译成一个 Serlet 源文件
<jsp:include>标签中引入的资源是在运行时才包含的,而且只包含运行结果。而 incude 指今引入的资源是在编译时期包含的是源代码
<jsp:include>标签运行原理与 RequestDispatcher.include)方法类似,即被包合的页面不 能改变响应状态码或者设置响应头,include 指令没有这方面的限制。
Session详解
什么是Session:
服务器会给每一个用户(浏览器)创建一个Session对象
比如我们现在都去访问百度,我们使用双核浏览器和谷歌浏览器同时访问百度这个网址,百度那边会有两个session,因为浏览器不一样,但是只要在一个浏览器里面一直用百度的话,就没有区别。我们用两个浏览器相当于是模拟两个客户端。
一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在。
用户登录之后,整个网站它都可以访问。(保存用户的信息、保存购物车的信息)
比如我们登录csdn之后,csdn网站上的内容都可以进行点击,不用重复登录。可以访问该用户权限下的所有网页。
如果退出用户之后,其中的好多页面都需要我们进行登录之后才可以使用。
分层模式完成登录和注册
创建数据库:
-- 判断存在即删除数据库
drop database if exists mydb;
-- 创建数据库
create database mydb;
-- 使用数据库
use mydb;drop table if exists t_user;
-- 创建表
create table t_user(
uid int primary key auto_increment,
username varchar(20),
password varchar(20),
phone varchar(11),
address varchar(50)
);insert into t_user(username,password,phone,address) values('张三','666','18965423548','南阳');
insert into t_user(username,password,phone,address) values('李四','333','18754263548','许昌');
insert into t_user(username,password,phone,address) values('小美','123','18565234759','信阳');select * from t_user where username=? and password=?;
select * from t_user;create table t_goods(
gid int primary key auto_increment,
gname varchar(20),
price double,
mark varchar(100)
);insert into t_goods(gname,price,mark) values('泡面',4.5,'够香够辣就是这个味!');
insert into t_goods(gname,price,mark) values('火腿',8.5,'肉质细腻Q弹!');
insert into t_goods(gname,price,mark) values('雪碧',3.5,'清爽冰凉随心爽!');select * from t_goods;
第一步:创建需要跳转的页面,完成对应页面内容
第二步:编写Java内容,然后进行分层
2.1创建实体类
package com.zhao.bean;public class User {private Integer uid;private String username;private String password;private String phone;private String address;public User() {}public Integer getUid() {return uid;}public void setUid(Integer uid) {this.uid = uid;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "User{" +"uid=" + uid +", username='" + username + '\'' +", password='" + password + '\'' +", phone='" + phone + '\'' +", address='" + address + '\'' +'}';}
}
2.2创建jdbc工具类
package com.zhao.util;import java.sql.*;public class JDBCUtil {private static String driver="com.mysql.cj.jdbc.Driver";private static String url="jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";private static String user="root";private static String password="root";private static Connection con=null;/*** 获得数据库链接对象**/public static Connection getCon(){try {//1.加载驱动包Class.forName(driver);//2.获得数据库连接对象con=DriverManager.getConnection(url,user,password);} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();}return con;}//方法重载public static void close(ResultSet rs, PreparedStatement pstm,Connection con){try {if (rs!=null){rs.close();}if (pstm!=null){pstm.close();}if (con!=null){con.close();}} catch (Exception e) {e.printStackTrace();}}public static void close(PreparedStatement pstm,Connection con){try {if (pstm!=null){pstm.close();}if (con!=null){con.close();}} catch (Exception e) {e.printStackTrace();}}}
2.3创建接口
package com.zhao.Dao;import com.zhao.bean.User;import javax.jws.soap.SOAPBinding;public interface UserDao {/*** 完成用户的登录操作* @param username* @param password* @return数据库中查询到完整用户信息*/User login(String username,String password);/*** 完成用户信息注册* @param user* @return 插入**/int register(User user);}
2.4实现接口
package com.zhao.Dao.impl;import com.zhao.Dao.UserDao;
import com.zhao.bean.User;
import com.zhao.util.JDBCUtil;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;public class UserDaoImpl implements UserDao {private Connection con=null;private PreparedStatement pstm=null;private ResultSet rs=null;//结果集对象private int row=0;User login=null;public User login(String username,String password){try {con= JDBCUtil.getCon();//3.定义sql语句String sql = "select * from t_user where username=? and password=?";//4.获取预处理对象pstm = con.prepareStatement(sql);//5.传参pstm.setObject(1, username);pstm.setObject(2, password);//6.执行sqlrs = pstm.executeQuery();//7.结果集处理if (rs.next()) {login = new User();//从结果集中获取数据,然后封装到实体类对象中int uid = rs.getInt("uid");login.setUid(uid);login.setUsername(rs.getString("username"));login.setPassword(rs.getString("password"));login.setPhone(rs.getString("phone"));login.setAddress(rs.getString("address"));}} catch (Exception e) {e.printStackTrace();} finally {//8.关闭资源JDBCUtil.close(rs, pstm, con);}return login;}@Overridepublic int register(User user) {try {con=JDBCUtil.getCon();//定义sql语句String sql="insert into t_user(username,password,phone,address)values(?,?,?,?)";//获取预处理对象pstm=con.prepareStatement(sql);//传参pstm.setObject(1,user.getUsername());pstm.setObject(2,user.getPassword());pstm.setObject(3,user.getPhone());pstm.setObject(4,user.getAddress());//执行sql语句row=pstm.executeUpdate();} catch (Exception e) {e.printStackTrace();}finally {JDBCUtil.close(pstm,con);}return row;}
}
2.5完成登录页面
package com.zhao.servlet;import com.zhao.Dao.UserDao;
import com.zhao.Dao.impl.UserDaoImpl;
import com.zhao.bean.User;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class Login extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.设置请求和响应的编码request.setCharacterEncoding("utf-8");//设置请求的编码response.setCharacterEncoding("utf-8");//设置响应的编码response.setContentType("text/html;charset=UTF-8");//设置响应的文本格式和编码//2.获取请求参数String username = request.getParameter("username");String password = request.getParameter("password");System.out.println(username);System.out.println(password);//3.业务处理--JDBC操作UserDao userDao=new UserDaoImpl();User login = userDao.login(username, password);//4.判断业务处理结果,给前端做出响应if (login!= null) {//登录成功response.sendRedirect("zhuye.jsp");} else {//登录失败response.sendRedirect("error.jsp");}}
}
2.6完成注册页面
package com.zhao.servlet;import com.zhao.Dao.UserDao;
import com.zhao.Dao.impl.UserDaoImpl;
import com.zhao.bean.User;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/register")
public class Register extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.设置请求和响应的编码request.setCharacterEncoding("utf-8");request.setCharacterEncoding("utf-8");//2.获取请求参数String username = request.getParameter("username");String password = request.getParameter("password");String phone = request.getParameter("phone");String address = request.getParameter("address");//封装到User对象中User user=new User();user.setUsername(username);user.setPassword(password);user.setPhone(phone);user.setAddress(address);System.out.println(user);//JDBC操作UserDao userDao=new UserDaoImpl();int row = userDao.register(user);//3.做出响应if (row>0){//注册成功response.sendRedirect("login.jsp");}else {response.sendRedirect("register.jsp");}}
}
页面展示效果:
基于MVC模型和分层模式完成登录和注册相关推荐
- 基于MVC模型和分层模式完成登录和注册以及登录后展示商品和增删改
一.代码的分层 1.概述 一个好的层次划分不仅可以能使代码结构更加清楚,还可以使项目分工更加明确,可读性大大提升,跟回家有利于后期的维护和升级.从另一个角度来看,好的代码分层架构,应该使可以很好的匹配 ...
- 干货 | DDD实战:基于洋葱模型的分层代码架构设计
点击上方"中兴开发者社区",关注我们 每天读一篇一线开发者原创好文 ▎作者简介 作者冯丹是一名非常有激情的一线程序员,喜欢java强大的面向对象能力,scala简洁的函数式编程范式 ...
- 基于springboot+thymeleaf+mybatis的员工管理系统 —— 登录与注册
员工管理系统 - 登录与注册功能 创建项目 pom.xml 数据库表设计和环境准备 建表SQL application.properties 用户注册与登录功能 entity dao service ...
- Python语言基于Socket实现聊天室(包含登录、注册功能)
一.聊天室的整体架构 1.twisted:实现服务端,以及事件驱动 Twisted是用Python实现的基于事件驱动的网络引擎框架. 2.socket:实现客户端,以及事件驱动 3.tkinter:实 ...
- 基于IO流读取的 完成 用户登录,注册,修改,查看所有用户,删除功能
Controller import java.util.Scanner;/*** 视图层* 完成用户登录,注册,修改,删除功能*/ public class Controller {/*** 字符输入 ...
- 基于 MVC 模型框架之:SpringMVC
SpringMVC 的执行过程分析 首先,我们先来看一下 springmvc 官方文档中提供的执行过程图. 通过此图,我们可以看到其实都是由前端控制器负责找到要执行的控制器方法.这个前端控制器就是Sp ...
- 【C++实训】基于MVC模型开发的高校教务管理系统【附完整报告+示例程序+日记+源码】
此项目为博主大一所作,现在看来技术较为幼稚(作为大作业足够),大神请绕路 文章目录 一.需求分析 二.系统主要任务 三.部分功能截图 四.项目体验 五.文档结构 完整项目下载地址 一.需求分析 高校教 ...
- 基于Servlet的MVC模式用户登录实例
关于MVC模式的简单解释 M Model,模型层,例如登录实例中,用于处理登录操作的类: V View,视图层,用于展示以及与用户交互.使用html.js.css.jsp.jQuery等前端技术实现: ...
- 基于Servlet+JSP+JavaBean开发模式的用户登录注册
基于Servlet+JSP+JavaBean开发模式的用户登录注册 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复 ...
最新文章
- oracle home 命令,$ORACLE_HOMEbin目录下所有命令的使用方法及命令详解
- R语言限制性立方样条(RCS, Restricted cubic spline)分析:基于logistic回归模型、南非心脏病数据集(South African Heart Disease)
- Myeclipse常用快捷键
- Javascript - 栈 和 单链表
- directly to phd is good for laying a solid foundation for future career
- 把十进制的n转化成r进制的数的模板
- 软件测试框架课程考试_那考试准备课程值得吗?
- Python 真的勒死 R 了吗?
- 【NLP保姆级教程】手把手带你RNN文本分类(附代码)
- Google提供的超强圆角效果
- 汽车门店管理系统 php,大型汽车4s店维修管理系统多门店版(源码+数据库+截图)...
- 分治算法求螺丝螺母匹配问题
- 实验2-1-2 温度转换 (5 分)
- 数据优化——分库分表(三)中间件讲解
- 计算机硬盘损坏修复软件,电脑硬盘损坏如何修复?自己动手就能解决
- 从这三个维度说一说,如何做一名具有产品思维的UI设计师?
- 项目管理模型总结---原型模型、迭代模型
- arcpy实现注记合并
- springbooot使用google验证码
- 荣耀路由2 虚拟服务器,华为荣耀路由器2怎么设置? | 192路由网