目录
当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示,经历了什么?
什么是JavaWeb
web开发:
web:网页的意思
静态web
heml,css
提供给所有人看的数据,不会发生变化
动态web
提供给每个人的数据可能不一样
相关技术:Servlet/JSP,ASP,PHP
WEB应用程序
指可以提供浏览器访问的程序;
如 a.html 。。。。多个web资源,可以被外界访问。对外界提供服务
静态web
*.html是网页后缀,如果服务器上一直存在,就可以进行访问
请求(Request)
相应(Response)
静态web的缺点:
无法动态更新
无法和数据库交互
动态web
可以与数据库交互
web服务器
ASP:
微软:国内最早流行;
PHP
开发速度很快,功能很强大,跨平台,代码很简单
无法承载大访问量的情况(高并发)
JSP/SERVLET:
sun公司主推的B/S架构
B/S:浏览器-服务器
C/S:客户端-服务器
基于JAVA,
可以承载高并发,高可用,高性能(三高问题)
服务器类:
服务器是一种被动的操作,用来处理用户的一些请求和给用户一些信息响应
IIS
微软的;Windows自带
Tomcat:
轻量级应用服务器
下载tomcat,
1.安装解压
2.了解配置文件及目录结构
3.这个东西的作用
bin包:启动关闭的脚本文件
config:配置文件
lib:插件,依赖的jar包
logs:日志,输出
webapps:放网站
启动:bin/startup.bat
访问:默认端口:http://localhost:8080
http:80
https:443
配置:
服务器核心配置文件:
默认端口修改
配置主机名称:(若修改,则windows的配置文件也要修改才能正常访问)
修改windows配置文件
网站是如何进行访问的?
先检查本机hosts里有没有域名映射,
有的话直接返回对应的ip地址,直接访问本机资源
没有,则去访问DNS服务器,找到就返回,找不到就提示404
网站应该有的结构:
-root
-songyi:网站目录名
-web-INF
-classes:java程序
-lib:web应用所依赖的jar包
-web.xml:网站配置文件
-index.html:默认的首页
-static
-css
-style.css
-js
-img
-.....
HTTP
什么是http
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。
默认端口:80
http请求:
客户端---->服务器
百度:
Request URL:https://www.baidu.com : 请求地址
Request Method:GET GET/POST
Status Code:200 OK 状态码
Remote Address:39.156.66.18:443 访问的真实地址
Accept:text/html
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.9 语言
Cache-Control:max-age=0
Connection:keep-alive
1.请求行
请求方式:GET
GET/POST
get:一次请求能够携带的参数比较少,有大小限制,会在浏览器url地址栏显示数据,不安 全,但高效
post:请求携带的参数没有限制,大小没有限制,不会在浏览器url显示内容,安全,不高效
2.消息头
Accept:告诉浏览器,他所支持的数据类型
Accept-Encoding:支持那种编码格式 GBK utf8 GB2312 ISO8859-1
Cache-Control:缓存控制
Connection:告诉浏览器,完成请求后是断开还是保持链接
Host:主机
http响应
服务器---->客户端
百度:
Bdpagetype:
2
Bdqid:
0xb019be350036babc
Cache-Control:private 缓存控制
Connection:keep-alive 连接:保持
Content-Encoding:gzip 编码
Content-Type:text/html;charset=utf-8 类型
Date:Thu, 12 Aug 2021 02:25:14 GMT 当前时间
Expires:Thu, 12 Aug 2021 02:25:14 GMT 当前时间
1.响应体
Accept:告诉浏览器,他所支持的数据类型
Accept-Encoding:支持那种编码格式 GBK utf8 GB2312 ISO8859-1
Cache-Control:缓存控制
Connection:告诉浏览器,完成请求后是断开还是保持链接
Host:主机
Refrush:告诉客户端,多久刷新一次网站
Location:让网页重新定位;
2.响应状态码
200:响应成功
3XX:请求重定向
404:未找到资源
5XX:服务器代码错误
500:
502:网关错误
当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示,经历了什么?
Maven(项目架构管理工具)
不需要手动导入jar包
自动导入和配置
目前用它来就是方便导入jar包的
核心思想:约定大于配置
有约束不要去违反
maven会规定好你该如何去编写java代码,必须要按照这个规范来;
下载安装maven:
解压即可
1环境变量配置
M2_HOME bin目录(如:D:\apache-maven-3.8.1-bin\apache-maven-3.8.1\bin)
MAVEN_HOME maven的目录如(D:\apache-maven-3.8.1-bin\apache-maven-3.8.1)
PATH: %MAVEN_HOME%\bin
测试:cmd mvn -version
2阿里云镜像
镜像:mirrors
加速国内下载
在conf文件夹的setting内的<mirrors></mirrors>标签内加入
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public </url>
</mirror>
3本地仓库
建立本地仓库,远程仓库;
建立一个仓库(本地):
在setting中添加
IDEA中使用MAVEN
1启动idea
2创建一个mavenWeb项目
3.等待项目搭建
4.观察maven仓库中多了什么东西
5.idea中的maven设置
创建成功后,看一眼配置
6.Maven在IDEA中的配置和使用就OK了
Maven创建一个普通的maven项目
不使用maven的模板,
最简单的maven项目
在idea中标记文件夹功能
或者
在idea中配置Tomcat
解决警告问题 (必须需要指定一个文件夹名字,)
pom文件
pom.xml是maven的核心配置文件
内容
加入jar包例子
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
maven由于约定大于配置,就会出现问题
idea操作:
生成目录树,代表了maven中jar包的联系体系
Servlet
Servlet在SUN公司有两个默认的实现类(HttpServlet和 )
开发动态web的技术
1.编写一个类实现servlet接口
2.部署到web服务器中
把实现了servlet接口的java程序叫做Servlet
1.构建一个新Maven项目
删掉src目录,这个空的工程就是maven主工程
关于maven父子工程的理解
父项目中会有一个module
子项目中有
父项目的java子项目可以直接使用
3.Maven环境优化
1.修改web.xml为最新的
2.将maven的结构搭建完整
4.编写servlet程序
1.编写一个普通类
2.实现Servlet接口(直接继承HttpServlet)
package com.kuang.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet 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 {
super.doPost(req, resp);
}
}
5.编写Servlet的映射
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
6.配置tomcat
7.启动测试
Servlet原理
Mapping问题
一个servlet可以指定多个请求路径
也可以指定通用路径
可以自定义后缀实现请求映射
*号前边不能加映射路径
优先级问题:
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
ServletContext
web容器启动的时候,他会为每一个web程序都创建一个context对象,代表了当前的web应用
作用:
- 共享数据:Servlet间的数据传递
放数据
取数据
请求转发
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
ServletContext sc=this.getServletContext();
RequestDispatcher rd=sc.getRequestDispatcher("转发请求路径");
rd.forward(req,resp);//请求转发
}
读取资源文件
使用Properties对象
在java目录下新建properties
在resurces目录下新建properties
发现 :两个文件都被打包到了同一个路径下:classes,我们俗称这个路径为classpath:
需要一个文件流
HttpServletResponse(响应)
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象和代表响应的HttpServletResponse对象。
简单分类:
负责发送数据的方法
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;//发送中文一般用这个
负责向浏览器发送响应头的方法:
常见应用:
1.向浏览器输出消息
2.下载文件
1获取下载文件的路径
2下载的文件名
3让浏览器支持我们下载
4获取下载文件的输入流
5.创建缓冲区
6获取OutputStream对象,
7.将FileOutoutStream流写入到buffer缓冲区
8.使用OutputStream将缓冲区中的数据输出到客户端
验证码实现:
生成随机数方法
主业务
请求重定向
//请求重定向
resp.sendRedirect("index.html");
JSP中定位到本项目路径 ${pageContext.request.contextPath}
重定向和转发的区别
相同点:实现跳转页面
不同点:
转发:url不发生变化 307
重定向:url发生变化 302
HttpServletRequest(请求)
http请求中的所有信息,会被封装到HttpServletRequest对象中
req.getContextPath();//获取上下文路径
req.getHeader("头属性名");//获取头信息
req.getParameter("参数名");//获取传递的参数值
请求转发:
//请求转发
req.getRequestDispatcher("转发地址").forward(req,resp);
例子:
请求:
转发地址中的 / 代表当前web应用
页面:
cookie(曲奇饼干)
可长久保留的用户访问web资源的信息,留在用户端
例子:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服务器告诉你你来的时间,把这个时间封装成一个信件,下次带来,就知道你来了
//解决乱码
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out=resp.getWriter();
//Cookie,服务器端从客户端获取
Cookie[] cookies =req.getCookies();//返回数组,说明cookie存在多个
//判断cookie是否存在
if(cookies!=null){
//存在
out.write("上一次访问的时间是:");
for (int i = 0; i <cookies.length ; i++) {
Cookie cookie =cookies[i];
//获取Cookie名字
if (cookie.getName().equals("lastLoginTime")){
//获取值
long time =Long.parseLong(cookie.getValue());
Date date =new Date(time);
out.write(date.toLocaleString());
}
}
}else {
out.write("这是你第一次访问本站");
}
//服务器给客户端响应一个cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
//设置cookie有效期(单位:秒)
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
}
cookie保存在用户目录的appdata下
session(会话)
服务器技术,保存用户的会话信息。可以吧信息或者数据放在session中
用户:打开浏览器----访问web资源---关闭浏览器
这个过程即为会话
什么是session
服务器给每一个用户(浏览器)创建一个session对象,
一个Seesion独占一个浏览器,只要浏览器没有关闭,session就存在
作用:保存用户信息,购物车信息
例子:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out=resp.getWriter();
//得到session
HttpSession session = req.getSession();
//在session中存东西
session.setAttribute("name","宋燚");
//获取sessionID
String id = session.getId();
//判断session是不是新创建
if(session.isNew()){
resp.getWriter().write("创建成功id:"+id);
}else {
resp.getWriter().write("已经存在id:"+id);
}
//创建session时做的事情
Cookie cookie =new Cookie("JSSESSION",id);
resp.addCookie(cookie);
//取消sesison
session.removeAttribute("名");
//手动注销Session
session.invalidate();
}
Session的销毁:
自动销毁:设置自动销毁时间
手动销毁:重启服务器
设置session自动失效时间,在web.xml内
单位为分钟(下例为15分钟)
<session-config>
<session-timeout>15</session-timeout>
</session-config>
Session,cookie区别
Cookie:把用户的数据写给浏览器,浏览器保存可以保存多个
session:把用户数据写到用户独占session中,服务器保存
session由服务器创建
使用场景
保存一个登录用户的信息;
购物车信息;
网站中经常使用的数据,我们将它保存在session中
JSP
JavaServerPags(java服务器端页面)
内置对象
3.输出页面前增加的代码
4. 这些对象在JSP中可以直接使用
JSP基础语法
<%%> 代码
<%=%> 显示数据
<%!%> 编译在类中的代码
<%----%>注释
<%-- JSP表达式
作用:将程序的输出,输出到客户端
<%=变量或表达式%>
--%>
<%=new java.util.Date()%>
JSP声明(会被编译到JSP生成的java类的类中,其他的就会被生成到jspService方法中)
<%!
static { System.out.println("loaging Servlet!"); }
%>
EL表达式
${ }
<form action="500.jsp" method="get">
EL表达式获取表单中的数据
${param.参数名}
<input type="text" name="username" value="${param.username}">
</form>
定制错误页面:
声明这是一个错误页面
//显式地声明这是一个错误页面 <%@page isErrorPage="true" %>
在JSP中
<%@page errorPage="500.jsp" %>
在web.xml中
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
在一个SJP页面中加入另一个页面(比如独立写一个网站头和尾,在所有的网页中直接调用,就不用重复打多余的代码)
<%@include file="index.jsp"%>
//这两种效果一样,但是下面这面这一种的路径前需要加 / 即在当前项目目录下
<jsp:include page="/index.jsp">
9大内置对象
PageContext 存东西
Request 存东西
Response
Session 存东西
Application【ServletContext】存东西
config
out
page
exception
数据存取
<%
//设置值
pageContext.setAttribute("name1","sy1");//保存的数据只在一个页面中有效
request.setAttribute("name2","sy2");//数据在一次请求总有效
session.setAttribute("name3","sy3");//数据在一次会话中有效
application.setAttribute("name4","sy4");//数据在服务器中有效,从打开服务器到关闭服务器
%>
<%
//从pageContext通过寻找的方式取出
String a=(String)pageContext.findAttribute("name1");
String b=(String)pageContext.findAttribute("name2");
String c=(String) pageContext.findAttribute("name3");
String d=(String) pageContext.findAttribute("name4");
%>
取出值
使用EL表达式取值时,若没有找到该值则不显示,若使用<%=%>显示,未找到时显示null
<a>${name1}</a>
<a>${name2}</a>
<a>${name3}</a>
<a>${name4}</a>
JSP标签、JSTL标签、EL表达式
需要的包:
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
EL表达式 ${ }
- 获取数据
- 执行运算
- 获取web开发的常用对象
- 在TOMcat中也要有JSTL包,否则会报错
JSP标签
JSTL表达式:
JSTL的标签库的使用就是为了弥补HTML标签的不足
标签的功能和java代码一样
引用标签:引入之后才可以使用JSTL
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
核心标签
使用教程:https://www.runoob.com/jsp/jsp-jstl.html
JavaBean
实体类
JavaBean有特定的写法
- 必须要有一个无参构造
- 必须有对应的get、set方法
- 属性必须私有化
一般用来和数据库的字段做映射ORM;
ORM:对象关系映射
- 表-- 类
- 字段-- 属性
- 行记录--- 对象
MVC三层架构
Model(模型)
view(视图)
controller(控制器)
Model
- 业务处理:业务逻辑(Service)
- 数据持久层:CRUD(Dao)
View
展示数据
提供链接发起Servlet请求(a,from,img)
Controller
接受用户的请求:(request,Session)
交给业务层处理对应的代码
控制视图的跳转
登录--->接受用户登录请求---》处理用户的请求(获取用户登录的参数,账号密码)——》交给业务层处理登录业务(判断用户名密码是否正确)——》Dao层查询用户名和密码是否正确
Filter(过滤器)
用来过滤网站的数据,减少程序员的代码量,
开发步骤:
1.编写Filter类(继承Servlet的Filter接口)
2.重写方法
package com.kuang.servlet.Filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
//初始化
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化");
}
//Chain链
//所有代码在过滤特定请求时都会执行
//必须让过滤器继续通行
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charst=utf-8");
System.out.println("执行前");
//链,让请求继续走,否则程序到这里就停止了
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("执行后");
}
//销毁
public void destroy() {
System.out.println("销毁");
}
}
配置web.xml
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.kuang.servlet.Filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!--只要是servlet下的任何请求都会经过这个过滤器-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
监听器
实现一个监听器的接口:很多种接口
package com.kuang.servlet.Filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
//初始化
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化");
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charst=utf-8");
System.out.println("执行前");
//链,让请求继续走,否则程序到这里就停止了
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("执行后");
}
//销毁
public void destroy() {
System.out.println("销毁");
}
}
配置XML
<listener>
<listener-class>com.kuang.servlet.Filter.Lintencer</listener-class>
</listener>