第三章 Servlet和三层架构
一、Servlet
1. 概念
2. 使用步骤
方法一:配置xml
public class ServletDemo1 extends HttpServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("hello");
}
}
配置web.xml
<!-- 定义servlet-->
<servlet>
<!-- 与servlet-mapping中servlet-name一致-->
<servlet-name>demo1</servlet-name>
<!-- 实际处理Servlet的全类名-->
<servlet-class>cn.tedu.ServletDemo1</servlet-class>
</servlet>
<!-- 映射路径-->
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<!-- 请求的映射路径,如action地址,其中/表示项目的根路径-->
<url-pattern>/ServletDemo1</url-pattern>
</servlet-mapping>
方法二:使用注解(使用了注解就不需要配置xml文件了,注解中参数相当于xml文件的url-pattern)
@WebServlet("/ServletDemo2")
public class ServletDemo2 extends HttpServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("hello");
}
}
执行原理
具体的流程,当用户单击 index.jsp 中的“提交”按钮后,程序发现 action 请求地址是/ServletDemo1 ,然后就会在 web.xml 中<servlet-mapping> 内的 <url-pattemn> 里匹配/ServletDemo1 (检查 action 的值是否与url-pattem>中的值一致)。如果匹配成功,就会根据<servlet-mapping中的<servle-name>值 welcome 再去匹配<servlet>中的<servlet-name>值(检查<servlet-mappin中的<servlet-nam值,是否与<servlet>中的值一致)。如果仍然匹配成功,就会去执行<servlet>中的<servlet-class>里面的 Servlet 实现类 (如cn.tedu.ServletDemo1)。最后再根据请求方式来决定执行 Servlet 实现类中的doGe()或者 doPast()方法
2.执行流程
3. Servlet生命周期
加载和实例化:
// urlPatterns可以写成value 效果一样
@WebServlet(urlPatterns="/ServletDemo3",loadOnStartup = 1)
public class ServletDemo3 extends HttpServlet {
@Override
/**
* 初始化方法
* 调用时机:默认情况下,servlet被访问时调用一次
* 通过属性配置,修改调用实际 loadOnStartup:
* 调用次数:1次
*/
public void init() throws ServletException {
System.out.println("init~~~~");;
}
/**
* 提供服务
* 调用时机:每一次servlet被访问时调用
* 调用次数:多次
*
*/
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("hello servlet");
}
/**
* 销毁方法
* 调用时机:(两种情况)
内存释收或者服务器关闭的时候,servlet对象会被销毁
* 调用次数: 1次
* 重启一下服务器就可以
*/
@Override
public void destroy() {
System.out.println("destroy~~~");
}
}
另外一个方法
@WebServlet(urlPatterns="/ServletDemo3",loadOnStartup = 1)
public class ServletDemo4 extends HttpServlet {
private ServletConfig config;
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init~~~~");;
}
@Override
public ServletConfig getServletConfig() {
return config;
}
}
5. servlet体系结构
1. HttpServlet
**通过jsp想servlet动态提交数据**
```javascript
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>post</title>
</head>
<body>
<!-- 注意提交路径一定是web工程下的路径才能找到-->
<form action="/javaweb_war_exploded/ServletDemo2" method="post">
input
<input type="submit" value="提交">
</form>
</body>
</html>
思考
6.urlPattern配置
二、MVC模式和三层架构
1. MVC模式
控制器(serlvlet)用来接收浏览器发送过来的请求,控制器调用模型(JavaBean)来获取数据,比如从数据库查询数据;控制器获取到数据后再交由视图(JSP)进行数据展示。
2. 三层架构
数据访问层:对数据库的CRUD基本操作
业务逻辑层:对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑功能。例如 注册业务功能 ,我们会先调用 数据访问层 的 selectByName() 方法判断该用户名是否存在,如果不存在再调用 数据访问层 的 insert() 方法进行数据的添加操作
表现层:接收请求,封装数据,调用业务逻辑层,响应数据
而整个流程是,浏览器发送请求,表现层的Servlet接收请求并调用业务逻辑层的方法进行业务逻辑处理,而业务逻辑层方法调用数据访问层方法进行数据的操作,依次返回到serlvet,然后servlet将数据交由 JSP 进行展示
三层架构的每一层都有特有的包名称:
表现层: com.itheima.controller 或者 com.itheima.web
业务逻辑层:com.itheima.service
数据访问层:com.itheima.dao 或者 com.itheima.mapper
3. 框架扩展
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/dfc82cfd84784cabbd3b744be8a0a20e.png
4.三层架构和MVC区别
如上图上半部分是 MVC 模式,上图下半部分是三层架构。 MVC 模式 中的 C(控制器)和 V(视图)就是 三层架构 中的表现层,而 MVC 模式 中的 M(模型)就是 三层架构 中的 业务逻辑层 和 数据访问层。
可以将 MVC 模式 理解成是一个大的概念,而 三层架构 是对 MVC 模式 实现架构的思想。 那么我们以后按照要求将不同层的代码写在不同的包下,每一层里功能职责做到单一,将来如果将表现层的技术换掉,而业务逻辑层和数据访问层的代码不需要发生变化
三、案例-完成品牌数据的增删改查
准备工作
1. 准备数据库
DROP DATABASES javaweb2306;
CREATE DATABASE javaweb2306 CHARSET="UTF8";
DROP TABLE tb_brand;
CREATE TABLE tb_brand(
id INT PRIMARY KEY AUTO_INCREMENT,
brand_name VARCHAR(48),
company_name VARCHAR(48),
ordered INT,
description CHAR(255),
sta INT
);
INSERT INTO tb_brand(id,brand_name,company_name,ordered,description,sta) VALUE(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1)
INSERT INTO tb_brand(id,brand_name,company_name,ordered,description,sta) VALUE(2,"优衣库","优衣库",200,"优衣库,服适人生",0)
INSERT INTO tb_brand(id,brand_name,company_name,ordered,description,sta) VALUE(3,"小米","小米科技有限公司",1000,"为发烧而生",1)
2. 创建结构模块
作用:
web:web相关的包
service:服务器
dao:操作数据库的模块
pojo:放实体类
util:放工具类