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;
}
@Override
public 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.执行sql
rs = 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;
}
@Override
public 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 {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected 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 {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
@Override
protected 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");
}
}
}