第四周预习-MVC+Servlet、jar包介绍、如何导包与使用
1.MVC
MVC:模型-视图-控制器(Model-View-Controller)
MVC 是一种先进的设计结构,其目的是以会话形式提供方便的GUI支持。
MVC是一种通过3个不同部分构造一个软件或组件的理想办法
- 模型用于存储数据的对象,负责处理数据逻辑
- 视图为模型提供数据显示的对象
- 控制器处理用户的交互操作,对于用户的操作作出响应,让模型与视图进行必要的交互,即通过视图修改,获取模型中的数据;当模型中的数据变化时,让视图更新显示。
可以将某个对象看作“模型”,然后为“模型”提供恰当的显示组件,即“视图”。
为了对用户操作作出响应,可以选择某个组件做“控制器”,当触发事件时,通过“视图”修改或得到“模型”中维护着的数据,让“视图”更新显示。
MVC设计模式可以提高代码的可复用性,降低代码之间的耦合度
2. JavaWeb技术栈
- B/S架构:Browser/Server,浏览器服务器架构模式,客户只需要浏览器,应用程序的逻辑和数据存储在服务器端。浏览器只需要请求服务器,获取 Web资源,服务器把Web资源发送给浏览器即可。好处是易于维护升级:服务器升级后,客户端无需任何部署就可以使用到最新的版本(对比C/S架构:服务器的软件和功能进行升级,客户端也必须升级,不利于维护)。
- 静态资源:HTML、CSS、JavaScript、图片等。负责页面展现,所有人看到的页面内容相同
- 动态资源:Servlet、JSP等。负责逻辑处理,指Web页面中供人们浏览的数据是由程序产生的,Web页面能够根据用户的请求和服务器上的数据动态生成内容,不同时间点,不同设备访问Web页面看到的内容 不同
- 数据库:存储和管理应用程序所需的数据
- HTTP协议:负责定义浏览器和服务器之间的通信规则
- Web服务器:负责解析HTTP协议,解析请求数据,并发送响应数据
3.HTTP
HyperText Transfer Protocal,超文本传输协议,规定了浏览器和服务器之间数据传输的规则
HTTP协议特点:
-
支持客户/服务器模式
-
基于TCP协议:面向连接,安全
-
基于请求-响应模型的:一次请求对应一次响应,HTTP1.1版本之后支持可持续连接
-
无状态:对于事务处理没有记忆能力,每次请求-响应都是独立的。速度快,但多次请求之间不能共享数据(Java中使用会话技术(Cookie、Session)来解决这个问题)
HTTP报文
- 请求报文
- 请求行:请求数据的第一行 例:GET / HTTP/1.1,GET表示请求方式, /表示请求资源路径,HTTP/1.1表示版本协议
- 请求头:第二行开始,格式为key:value形式。
Host : 表示请求的主机名
User-Agent : 浏览器版本
Accept : 表示浏览器能接收的资源类型,text/* ,image/ *, * / *(表示所有)
Accept-Language : 表示浏览器偏好的语言,服务器可以据此返回不同语言的网页
Accept-Encoding : 表示浏览器可以支持的压缩类型,例如gzip,deflate等
- 请求体:POST请求的最后一部分,存放请求参数
GET请求和POST请求区别:
- GET请求请求参数在请求行中,没有请求体;POST请求请求参数在请求体中
- GET请求请求参数大小有限制,POST没有
- 响应报文
- 响应行:例:HTTP/1.1 200 OK,HTTP/1.1表示协议版本,200表示状态码(状态码大全),OK表示状态描述
状态码分类 | 说明 |
---|---|
1xx | 响应中:临时状态码,表示请求已经接受,告诉客户端应该继续请求或者它已经完成则忽略它 |
2xx | 成功:表示请求已经被成功接收,处理已完成 |
3xx | 重定向:重定向到其它地方:它让客户端再发起一个请求以完成整个处理 |
4xx | 客户端错误:处理发生错误,责任在客户端,如客户端请求一个不存在的资源(404),客户端未被授权,禁止访问等 |
5xx | 服务器端错误:处理发生错误,责任在服务器,如服务端抛出异常,路由出错,HTTP版本不支持等 |
- 响应头:第二行开始,格式为key:value形式。
Content-Type :表示该相应内容的类型,例如text/html,image/jpeg
Content-Length :表示该相应内容的长度(字节数)
Content-Encoding :表示该相应压缩算法,例如gzip
Cache-Control :指示客户端应如何缓存,例如max-age=300表示最多可以缓存300秒
- 响应体:包含服务器返回给客户端的实际数据
4.Tomcat
- 对HTTP操作协议进行封装,不必直接对协议进行操作,简化开发
- 可以将web项目部署到服务器中,对外提供网上浏览服务
5. Servlet
Servlet时Java提供的一门动态web资源开发技术,Servlet接口是JavaEE规范之一,需要定义Servlet类实现Servlet接口,并由Web服务器运行Servlet
作用:接收客户端请求完成操作,生成动态网页,将包含操作结果的动态网页响应给客户端
方法 | 说明 |
---|---|
void init (ServletConfing config) | 初始化方法,在Servlet被创建时执行,只执行一次 |
void service(ServletRequst req,ServletResponse res) | 提供服务方法,每次Servlet被访问,都会调用该方法 |
void destory() | 销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet |
ServletConfig getServletConfig() | 获取ServletConfig对象 |
String getServletInfo() | 获取Servlet信息 |
编写servlet
- 创建web项目,导入Servlet依赖坐标
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>
- 创建:定义一个类,实现Servlet接口,并重写接口中的所有方法,并在service方法中输出一句话
- 配置:在类上使用@WebServlet注解,配置该Servlet的访问路径
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/demo1")
public class ServletDome implements Servlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello world!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
}
- 访问:启动Tomcat,浏览器输入URL访问该Servlet
- Servlet执行流程
URL:http://localhost:8080/web项目/Servlet的访问路径,由协议、主机、端口、资源路径四部分组成
Tomcat创建Servlet对象并调用方法
- Servlet生命周期
Servlet运行在Servlet容器web服务器中,其生命周期由容器来管理
- 加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象
- 初始化:在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次
- 请求处理:每次请求Servlet时,Servlet容器就会调用Servletd的service()方法对请求进行处理
- 服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destory()方法完成资源的释放。在destory()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收
- HttpServlet:Servlet接口的一个实现类,是一个抽象类,在servlet.http包中,专门用于处理采用HTTP通信协议的请求和响应。需要重写doGet()和doPost()等方法来处理GET和POST请求。
6.Cookie、Session
Cookie
服务器以响应的方式告诉浏览器将常用的数据存储起来,操作Cookie的类java.servlet.http.Cookie,在服务器端创建,随着服务器的响应发送给客户端,保存在浏览器,下次访问服务器时把Cookie带回服务器;存储数据不超过4KB,不适合大数据的存储;不安全,从浏览器中可以看到Cookie
方法 | 说明 |
---|---|
Cookie(name,value) | 构造方法 |
addCookie(cookie) | 添加Cookie |
getCookies() | 获取请求发送时Cookie对象的数组 |
getName | 获取Cookie名称 |
getValue | 获取Cookie值 |
setMaxAge(int espiry) | 设置Cookie的有效期,以秒为单位,默认为-1,永久存活,在浏览器关闭时被删除,0为删除 |
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("demo02")
public class SetCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("fpl","fpl1116");
cookie.setMaxAge(60*60*24);
resp.addCookie(cookie);
}
}
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
@WebServlet("demo03")
public class GetCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
for(Cookie cookie : cookies){
System.out.println(cookie.getName());
System.out.println(cookie.getValue());
}
}
}
Session
Session对象由服务器保存,基于Cookie实现,服务器会给每个用户的浏览器创建一个Session对象
方法 | 说明 |
---|---|
getSession() | 获取Session |
setAttribute() | 给Session设置键值对数据 |
getAttribute() | 通过键获取session中的值 |
removeAttribute() | 通过键移除session中的值 |
getId() | 获取session的id |
invalidate() | session失败,再次进入会重置Session的值 |
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/demo04")
public class SessionExampleServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
// 获取Session对象
HttpSession session = request.getSession();
// 检查Session中是否存储了用户名
String username = (String) session.getAttribute("username");
if (username != null) {
out.println("<h1>欢迎回来," + username + "!</h1>");
} else {
out.println("<h1>请输入您的用户名:</h1>");
out.println("<form method='post' action='" + request.getContextPath() + "/set-session'>");
out.println("<input type='text' name='username' />");
out.println("<input type='submit' value='设置Session' />");
out.println("</form>");
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
// 获取用户输入的用户名
String username = request.getParameter("username");
// 获取Session对象
HttpSession session = request.getSession();
// 将用户名存储到Session中
session.setAttribute("username", username);
}
}
}
7. jar包
JAR包(Java Archive)可以将多个Java类文件、相关的元数据和资源(如文本、图片等)文件聚合到一个文件中,以便于开发Java平台应用软件或库。JAR包本质上就是ZIP包,但JAR文件的内容中包含了一个META-INF/MANIFEST.MF文件。这个文件是在生成JAR文件时自动创建的,作为JAR包内的“详情单”,包含了该JAR包的版本、创建人和类搜索路径(Class-Path)等信息。如果是可执行JAR包,还会包含Main-Class属性,表明Main方法入口。它提供了一种有效的方式来组织和分发Java应用程序和库。通过将相关的类文件和资源文件打包到一个JAR文件中,可以简化项目的部署和分发过程。