JavaWeb-尚硅谷
Tomcat 目录介绍
bin 专门用来存放 Tomcat 服务器的可执行程序
conf 专门用来存放 Tocmat 服务器的配置文件
lib 专门用来存放 Tomcat 服务器的 jar 包
logs 专门用来存放 Tomcat 服务器运行时输出的日记信息
temp 专门用来存放 Tomcdat 运行时产生的临时数据
webapps 专门用来存放部署的 Web 工程。
work 是 Tomcat 工作时的目录, 用来存放 Tomcat 运行时 jsp 翻译为 Servlet 的源码, 和 Session 钝化的目录。
启动Tomcat服务器
Tomcat 目录下的 bin 目录下的 startup.bat 文件, 双击, 就可以启动 Tomcat 服务器。
测试 Tomcat 服务器启动成功? ? ?
打开浏览器, 在浏览器地址栏中输入以下地址测试:
1、 http://localhost:8080
2、 http://127.0.0.1:8080
3、 http://真实 ip:8080
出现界面说明启动成功!
修改Tomcat的端口号
mysql默认端口号:3306
tomca默认端口号:8080,在conf目录中的server.xml文件中修改(修改完重启tomcat)。
http默认端口号:80
部署web工程到tomcat
把web工程的目录拷贝到tomcat的webapps目录下。
一个文件夹就是一个工程。
访问tomcat下的web工程
http://localhost:8080/book/static/img/default.jpg
Servlet
javaweb三大组件(Servlet,Filter,Listener)之一。
servlet是运行在服务器上的一个java小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
生命周期:
1、执行Servlet构造器方法
2、执行init方法
一二步只在第一次访问的时候创建
3、执行service方法
第三步每次访问都会调用
4、执行destroy方法
web工程停止的时候调用
ServletConfig
servlet程序的配置信息类。
在每个servlet程序创建时,就创建一个对应的ServletConfig对象。
作用:
- 获取Servlet程序的别名Servlet-name的值
servletConfig.getServletName()
- 获取初始化参数init-param
servletConfig.getInitParameter("username")
- 获取ServletContext对象
servletConfig.getServletContext()
ServletContext
一个接口,表示Servlet上下文对象。
一个工程只有一个servletContext上下文对象, 多次调用,不同的类调用,均调用的同一个对象。
Servlet对象是一个域对象。
在web工程部署启动的时候创建。在web工程停止的时候销毁。
域对象?
可以向Map一样存取数据的对象,叫域对象。
这里的域指的是存取数据的操作范围,整个web工程。
作用:
- 获取web.xml中配置的上下文参数context-param
- 获取工程路径,/工程路径
- 获取工程在服务器的上的绝对路径
- 像Map一样存取数据(存取的数据在工程重新部署后会丢失)
ServletContext context = getServletConfig().getServletContext();
context.getInitParameter("username"); // context-param参数
context.getContextPath(); // 当前工程路径
// 当前工程路径:/06_servlet
context.getRealPath("/"); // 工程部署路径
//工程部署的路径是:D:\5_JavaWebProjects\JavaWeb\out\artifacts\06_servlet_war_exploded\
context.getRealPath("/css"); // 工程下css目录的绝对路径
//工程下css目录的绝对路径是:D:\5_JavaWebProjects\JavaWeb\out\artifacts\06_servlet_war_exploded\css
HTTP协议
客户端和服务端之间通信需要遵守的规则。
HTTP协议中的数据又叫报文。
- 客户端 -> 发送数据 -> 服务端:请求
-
GET请求
-
请求行 GET /06_servlet/a.html HTTP/1.1
-
请求头
Refer:http://localhost:8080/06_servlet/a.html,请求发起时,浏览器地址栏中的地址
Accept:客户端可以接收的数据类型
Accept-Encoding
Accept-Language
User-Agent:浏览器的信息
Host:请求的服务器ip和端口号
connection:告诉服务器请求连接如何处理
Keep-Alive:告诉服务器回传数据不要马上关闭,保持一小段时间的连接
Closed:马上关闭
-
-
POST请求
-
请求行:POST /06_servlet/hello HTTP/1.1
-
请求头
Content-Type:表示发送的数据类型。两种
application/x-www-form-urlencoded:表示提交的数据格式 是:name=value&name=value,然后对其进行url编码。
multipart/form-data:表示以多段的形式提交数据给服务器 (以流的形式提交,用于上传)
Content-Length:表示发送的数据的长度。
Cache-Control:表示如何控制缓存。
-
-
请求体
发送给服务器的数据(Payload)
- 客户端 <- 发送数据 <- 服务端:响应
-
响应行
-
响应协议和版本号
-
响应状态码
200:请求成功
302:请求重定向
404:服务器已收到请求,但是需要的数据不存在(请求地址错误)
500:服务器已收到请求,服务器内部错误(代码错误)
-
响应状态描述符
-
-
响应头
- key:value
-
响应体:回传给客户端的数据
HttpServletRequest
客户端发送请求后,tomcat服务器会把请求过来的http协议信息进行解析并封装到Reuqest对象中,然后传递到service方法(doGet,doPost)中给我们使用。可以通过HttpServletReuqest对象获取到所有请求的信息。
常用方法
i. getRequestURI() 获取请求的资源路径
ii. getRequestURL() 获取请求的统一资源定位符(绝对路径)
iii. getRemoteHost() 获取客户端的 ip 地址
iv. getHeader() 获取请求头
v. getParameter() 获取请求的参数
vi. getParameterValues() 获取请求的参数(多个值的时候使用)
vii. getMethod() 获取请求的方式 GET 或 POST
viii. setAttribute(key, value); 设置域数据
ix. getAttribute(key); 获取域数据
x. getRequestDispatcher() 获取请求转发对象
/**
输出
URI => /07_servlet/requestAPIServlet
URL => http://localhost:8080/07_servlet/requestAPIServlet
客户端 ip地址 => 127.0.0.1
请求头User-Agent ==>> Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34
请求的方式 ==>> GET
/
// 设置请求体的字符集为UTF-8,从而解决post请求的中文乱码问题
// 也要在获取请求参数之前调用才有效
req.setCharacterEncoding("UTF-8");
Get请求和Post的区别:
get请求会将提交参数放在url中。
请求转发:
服务器收到请求后,从一个资源跳转到另一个资源的操作叫请求转发。
/**
请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到IDEA代码的web目录<br/>
*/
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
//RequestDispatcher requestDispatcher = req.getRequestDispatcher("http://www.baidu.com");
// 走向Sevlet2(柜台 2)
requestDispatcher.forward(req,resp);
通过请求转发跳转后,浏览器地址变了。
要想调回首页,可以在html文件中通过base标签设置跳转参照路径。
HTTPResponse
需要返回给客户端的信息,通过HttpServletResponse对象来进行设置。
getOutputStream(); //字节流,常用于下载
getWriter(); //字符流,常用于回传字符串
两个输出流只能使用一个。
JSP
java server pages。java的服务器页面。
主要作用是代替Servlet程序回传html页面的数据。
内置对象:
request 请求对象
response 响应对象
pageContext jsp的上下文对象
session 会话对象
application ServletContext对象
config ServletConfig对象
out jsp输出流对象
page 指向当前jsp的对象
exception 异常对象
四个域对象分别是:
pageContext (PageContextImpl 类) 当前 jsp 页面范围内有效
request (HttpServletRequest 类)、 一次请求内有效
session (HttpSession 类)、 一个会话范围内有效(打开浏览器访问服务器, 直到关闭浏览器)
application (ServletContext 类) 整个 web 工程范围内都有效(只要 web 工程不停止, 数据都在)
EL
Expression Language。 是表达式语言。
EL 表达式主要是代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出。
文件上传
客户端(浏览器)向服务器发出post请求,上传文件。(如图片等。)
文件下载
业务逻辑
1.使用静态包含,动态包含,对jsp页面中共同的内容进行抽取
2.在静态包含中对basepath进行设置
3.BaseServlet的抽取
jsp页面post请求,添加隐藏域和修改请求地址action=“userServlet,value=’'login” ;
BaseServlet获取action业务鉴别字符串,获取相应的业务 方法反射对象。调用目标业务方法;
UserServlet方法继承了BaseServlet方法,业务方法login,实现了对应的业务功能。
MVC
Model 模型,View 视图,Control 控制器
View 视图:只负责数据和页面的显示,不接受任务与显示数据无关的代码——JSP,HTML
Controller控制器:只负责接收请求,调用业务层的代码处理请求,然后派发页面,是一个"调度者"的角色——Servlet
Model 模型:将与业务逻辑相关的数据封装为具体的JavaBean类,不掺杂任何与数据处理相关的代码——JavaBean/Domain/entity/pojo.
MVC:将软件代码拆分称为组件,单独开发,组合使用,降低耦合度。
工程添加模块步骤:
1.编写数据库表
2.编写JavaBean
3.编写Dao和测试Dao
4.编写Service和测试Service
5.编写web层,和页面联调测试
前台后台权限
实现添加图书,表单提交功能时,如果使用请求转发,用户每次刷新页面都会发起新的请求,会导致表单的重复提交。
解决:使用请求重定向。点击提交表单之后,在servlet中请求重定向,则该次请求已结束。
Cookie
Cookie是服务器通知客户端保存键值对的一种技术
客户端有了Cookie后,每次请求都发送给服务器。
每个Cookie的大小不能超过4kb。
生命控制
setMaxAge()
正数:表示在指定的秒数后过期
负数,表示浏览器一关,Cookie就会被删(默认值是-1)
零,表示马上删除Cookie。
Cookie有效路径Path的设置
Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器,哪些不发。
CookieA :path=/工程路径
CookieB :path=/工程路径/abc
请求地址如下:
http://ip:port/工程路径/a.html
CookieA 发送
CookieB 不发送
http://ip:port/工程路径/abc/a.html
CookieA 发送
CookieB 发送
可以实现自动填充用户名和密码。
在第一次登陆时,表单提交,用户名密码发送给服务器Servlet,通过setCookie,通知服务器保存cookie信息(信息和有效时长);
第二次登陆时,浏览器发起请求,将cookie信息一同发送给服务器,jsp页面通过隐藏域读取cookie信息,获取用户名并显示到浏览器。
Session
一个接口,HttpSession。
会话,用来维护一个客户端和服务器之间关联的技术。
每个客户端都有自己的一个Session会话。
Session会话中,经常用来保存用户登录之后的信息。
每个会话都有一个身份证号。 也就是 ID 值。 而且这个 ID 是唯一的。
getId() 得到 Session 的会话 id 值。
Session的超时指的是客户端两次请求的最大间隔时长。每次发起请求,时超时时间会被重置。
session值的设置:
正数:超时时长
负数:永不超时。
invalidata(),马上超时
表单重复提交
表单重复提交有三种常见的情况:
一: 提交完表单。 服务器使用请求转来进行页面跳转。 这个时候, 用户按下功能键 F5, 就会发起最后一次的请求。造成表单重复提交问题。 解决方法: 使用重定向来进行跳转
二: 用户正常提交服务器, 但是由于网络延迟等原因, 迟迟未收到服务器的响应, 这个时候, 用户以为提交失败,就会着急, 然后多点了几次提交操作, 也会造成表单重复提交。
三: 用户正常提交服务器。 服务器也没有延迟, 但是提交完成后, 用户回退浏览器。 重新提交。 也会造成表单重复提交。
Filter过滤器
- Filter过滤器是JavaEE的规范,也即是接口。
作用:拦截请求,过滤响应。
Filter 的生命周期包含几个方法:
1、 构造器方法
2、 init 初始化方法
第 1, 2 步, 在 web 工程启动的时候执行(Filter 已经创建)
3、 doFilter 过滤方法
第 3 步, 每次拦截到请求, 就会执行
4、 destroy 销毁
第 4 步, 停止 web 工程的时候, 就会执行(停止 web 工程, 也会销毁 Filter 过滤器)
- FilterConfig 类
FilterConfig 类见名知义, 它是 Filter 过滤器的配置文件类。
Tomcat 每次创建 Filter 的时候, 也会同时创建一个 FilterConfig 类, 这里包含了 Filter 配置文件的配置信息。
FilterConfig 类的作用是获取 filter 过滤器的配置内容
1、 获取 Filter 的名称 filter-name 的内容
2、 获取在 Filter 中配置的 init-param 初始化参数
3、 获取 ServletContext 对象
- FilterChain 过滤器链
在chain.doFilter中套接过滤器。
多个Filter共同执行时,默认在同一个线程中,使用同一个Request对象。他们执行的优先顺序是由在web.xml中从上到下配置的顺序决定。
- Filter 的拦截路径
--精确匹配
<url-pattern>/target.jsp</url-pattern>
以上配置的路径, 表示请求地址必须为: http://ip:port/工程路径/target.jsp
--目录匹配
<url-pattern>/admin/*</url-pattern>
以上配置的路径, 表示请求地址必须为: http://ip:port/工程路径/admin/*
--后缀名匹配
<url-pattern>*.html</url-pattern>
以上配置的路径, 表示请求地址必须以.html 结尾才会拦截到
<url-pattern>*.do</url-pattern>
以上配置的路径, 表示请求地址必须以.do 结尾才会拦截到
<url-pattern>*.action</url-pattern>
以上配置的路径, 表示请求地址必须以.action 结尾才会拦截到
- 过滤器与ThreadLocal实现数据库操作的事务管理。
ThreadLocal conns = new ThreadLocal();
一次请求发起时,对一个数据库事务的操作都是在一个线程中完成的,也就是使用的都是同一个connection,那么就允许我们在整个事务处理过程结束的时候,对这个事务进行提交或者回滚。(connection.commit())
在servlet中,如果出现错误,将错误抛出给service,service再将错误抛出,一直到过滤器中,对错误进行捕获,对事务进行提交或关闭。
- tomcat展示友好的错误信息页面
Json
json 是一种轻量级的数据交换格式。
轻量级指的是跟 xml 做比较。
数据交换指的是客户端和服务器之间业务数据的传递格式。
在java中的使用,
javaBean和json的互转
List和json的互转
map和json的互转
map转字符串,字符串转json对象。
需要用高gson包,转换的时候提供匿名内部类。
// 1.2.3、 map 和 json 的互转
@Test
public void test3(){
Map<Integer,Person> personMap = new HashMap<>();
personMap.put(1, new Person(1, "国哥好帅"));
personMap.put(2, new Person(2, "康师傅也好帅"));
Gson gson = new Gson();
// 把 map 集合转换成为 json 字符串
String personMapJsonString = gson.toJson(personMap);
System.out.println(personMapJsonString);
// Map<Integer,Person> personMap2 = gson.fromJson(personMapJsonString, new PersonMapType().getType());
Map<Integer,Person> personMap2 = gson.fromJson(personMapJsonString,new TypeToken<HashMap<Integer,Person>>(){}.getType());
System.out.println(personMap2);
Person p = personMap2.get(1);
System.out.println(p);
}
AJAX
AJAX 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML) , 是指一种创建交互式网页应用的网页开发技术。
ajax 是一种浏览器通过 js 异步发起请求, 局部更新页面的技术。
Ajax 请求的局部更新, 浏览器地址栏不会发生变化。
局部更新不会舍弃原来页面的内容 。