1.MVC概述

Model、view、Controller即模型、视图、控制器。是软件的一种架构模式(Architecture pattern)。MVC要实现的目标是将软件的用户界面和业务逻辑分离,可提高代码可扩展性、可复用性、可维护性、以及灵活性。

  • View(视图):用户的操作界面。如:html、jsp。

  • Model(模型):具体的业务模型与数据模型。如:service、dao、pojo

  • Controller(控制):处理从视图层发送的请求,并选取模型层的业务模型完成响应的业务实现,并产生响应。如:Servlet

首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。实现人机数据之间的交互;

  1. 为什么要使用MVC模式

搞清楚MVC到底都代表什么之后,我们要考虑的是我们为什么要用MVC或是类似于这种模式的架构思想。

  1. 各施其职,互不干涉

在MVC模式中,三个层各施其职,所以如果一旦哪一层的需求发生了变化,就只需要更改相应的层中的代码而不会影响到其它层中的代码。

  1. 有利于开发中的分工

在MVC模式中,由于按层把系统分开,那么就能更好的实现开发中的分工。网页设计人员可以进行开发视图层中的JSP,对业务熟悉的开发人员可开发业务层,而其它开发人员可开发控制层。

  1. 有利于组件的重用

分层后更有利于组件的重用。如控制层可独立成一个能用的组件,视图层也可做成通用的操作界面。一句话总结就是”高内聚,低耦合"

3.在javaweb开发中MVC分别指的是谁

  • M:HavaBean (Model) 的职责

  • 封装数据一一值javaBean

  • 封装业务一-工具avaBean

  • C: Servlet (Controller) 的职责

  • 控制流程,接受请求参数,调用lavaBean,获取结果数据,并将数据存储在某个作用域范围之中,最后选择页面显示

  • JSP(View)的职责

  • 获取Servlet存储在某个作用域之中的数据,进行显示

4.javaweb应用的结合MVC模式是怎样开发的

开发步骤(不是绝对的,只是作一个参考),做适当了解,后期案例中会参考此步骤

  1. 开发javaBean来表示数据和业务。

  1. 通过Servlet处理请求,读取请求参数。

  1. Servlet调用JavaBean,实现业务逻辑,获取结果数据。

  1. Servlet调用请求、会话等对象的setAttribute方法,将结果数据存储在某个作用域范围之中。

  1. Servlet选择合适的SP页面,通过RequestDispatcher的forward方法跳转至该页面。

  1. .JSP页面获取Servlet存储的结果数据,进行展示。

5.JSP简介

  1. JSP是什么

  • JSP (Java Server Pages)是一种动态网页开发技术JSP文件就是在传统的 HTML文件中插入Java 代码和JSP 标签,后缀名为.jsp。

  • JSP 使用JSP 标签在 HTML 网页中插入Java 代码,标签通常以<%开头,以 %>结束,JSP 标签有多种功能,比如访问数据库和JavaBean组件等,还可以在不同的网页之间传递和共享信息。

JSP表达式

<!--这个表达式是用来输出的  --><%= new Date().toLocaleString()%>

效果:在网页上打印当前时间

JSP脚本片段

  1. 简单的脚本片段

<!--在脚本里写Java代码--><%//int a=10/0;/* 故意出错 */int x=10;out.print(new Date().toLocaleString());%>
  1. 分开写:分开写,单个脚本中的语句可以是不完整的,但是多个脚本片段组合后的结果必须是完整的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 三种指令

  1. 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:当前页面是一个处理错误的页面

  1. .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

  1. 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标签

  1. <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详解


  1. 什么是Session:

  1. 服务器会给每一个用户(浏览器)创建一个Session对象

比如我们现在都去访问百度,我们使用双核浏览器和谷歌浏览器同时访问百度这个网址,百度那边会有两个session,因为浏览器不一样,但是只要在一个浏览器里面一直用百度的话,就没有区别。我们用两个浏览器相当于是模拟两个客户端。

  1. 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在。

  1. 用户登录之后,整个网站它都可以访问。(保存用户的信息、保存购物车的信息)

比如我们登录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模型和分层模式完成登录和注册相关推荐

  1. 基于MVC模型和分层模式完成登录和注册以及登录后展示商品和增删改

    一.代码的分层 1.概述 一个好的层次划分不仅可以能使代码结构更加清楚,还可以使项目分工更加明确,可读性大大提升,跟回家有利于后期的维护和升级.从另一个角度来看,好的代码分层架构,应该使可以很好的匹配 ...

  2. 干货 | DDD实战:基于洋葱模型的分层代码架构设计

    点击上方"中兴开发者社区",关注我们 每天读一篇一线开发者原创好文 ▎作者简介 作者冯丹是一名非常有激情的一线程序员,喜欢java强大的面向对象能力,scala简洁的函数式编程范式 ...

  3. 基于springboot+thymeleaf+mybatis的员工管理系统 —— 登录与注册

    员工管理系统 - 登录与注册功能 创建项目 pom.xml 数据库表设计和环境准备 建表SQL application.properties 用户注册与登录功能 entity dao service ...

  4. Python语言基于Socket实现聊天室(包含登录、注册功能)

    一.聊天室的整体架构 1.twisted:实现服务端,以及事件驱动 Twisted是用Python实现的基于事件驱动的网络引擎框架. 2.socket:实现客户端,以及事件驱动 3.tkinter:实 ...

  5. 基于IO流读取的 完成 用户登录,注册,修改,查看所有用户,删除功能

    Controller import java.util.Scanner;/*** 视图层* 完成用户登录,注册,修改,删除功能*/ public class Controller {/*** 字符输入 ...

  6. 基于 MVC 模型框架之:SpringMVC

    SpringMVC 的执行过程分析 首先,我们先来看一下 springmvc 官方文档中提供的执行过程图. 通过此图,我们可以看到其实都是由前端控制器负责找到要执行的控制器方法.这个前端控制器就是Sp ...

  7. 【C++实训】基于MVC模型开发的高校教务管理系统【附完整报告+示例程序+日记+源码】

    此项目为博主大一所作,现在看来技术较为幼稚(作为大作业足够),大神请绕路 文章目录 一.需求分析 二.系统主要任务 三.部分功能截图 四.项目体验 五.文档结构 完整项目下载地址 一.需求分析 高校教 ...

  8. 基于Servlet的MVC模式用户登录实例

    关于MVC模式的简单解释 M Model,模型层,例如登录实例中,用于处理登录操作的类: V View,视图层,用于展示以及与用户交互.使用html.js.css.jsp.jQuery等前端技术实现: ...

  9. 基于Servlet+JSP+JavaBean开发模式的用户登录注册

    基于Servlet+JSP+JavaBean开发模式的用户登录注册 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复 ...

最新文章

  1. oracle home 命令,$ORACLE_HOMEbin目录下所有命令的使用方法及命令详解
  2. R语言限制性立方样条(RCS, Restricted cubic spline)分析:基于logistic回归模型、南非心脏病数据集(South African Heart Disease)
  3. Myeclipse常用快捷键
  4. Javascript - 栈 和 单链表
  5. directly to phd is good for laying a solid foundation for future career
  6. 把十进制的n转化成r进制的数的模板
  7. 软件测试框架课程考试_那考试准备课程值得吗?
  8. Python 真的勒死 R 了吗?
  9. 【NLP保姆级教程】手把手带你RNN文本分类(附代码)
  10. Google提供的超强圆角效果
  11. 汽车门店管理系统 php,大型汽车4s店维修管理系统多门店版(源码+数据库+截图)...
  12. 分治算法求螺丝螺母匹配问题
  13. 实验2-1-2 温度转换 (5 分)
  14. 数据优化——分库分表(三)中间件讲解
  15. 计算机硬盘损坏修复软件,电脑硬盘损坏如何修复?自己动手就能解决
  16. 从这三个维度说一说,如何做一名具有产品思维的UI设计师?
  17. 项目管理模型总结---原型模型、迭代模型
  18. arcpy实现注记合并
  19. springbooot使用google验证码
  20. 荣耀路由2 虚拟服务器,华为荣耀路由器2怎么设置? | 192路由网

热门文章

  1. Windows 系统上安装 CUDA Toolkit 10.1
  2. 树莓派安装Tensorflow
  3. 刚性防水套管止水环 通风穿墙套管
  4. 被羞辱的Overflow
  5. Android学习——地图(百度地图)
  6. JS实现选项卡的切换
  7. 网络信息安全与防范研究
  8. 实现QQ、微信、新浪微博和百度第三方登录(Android Studio)
  9. WebDAV之π-Disk派盘+WPS
  10. [mfc] SetWindowPos函数