第十周思维导图
Tomcat
目录分析
- bin 可执行文件
- conf 配置文件
- lib 依赖jar包
- logs 日志文件
- temp 临时文件
- webapps 存放
- work 存放运行时的数据
Tomcat 安装
- 官网下载压缩
- 解压到一个没有特殊符号的目录中(一般为纯英文即可)
- 不建议将服务器软件放在磁盘层次很多的文件夹
- 不建议放在中文路径下
- Tomcat 安装需要配置JAVA_HOME 环境变量
启动问题
-
启动Tomcat一闪而过
-
原因:没有配置JAVA_HOME
-
解决方式:配置JAVA_HOME
JAVA_HOME环境变量
C:\Java\jdk1.8.0_231path环境变量
%JAVA_HOME%\bin
-
-
启动报错
-
原因:端口号被占用、重复启动
-
解决方案
-
暴力:找到占用端口号,相应的进程,杀死进程
命令:netstat -ano
找到进程pid,强制关闭进程 -
温柔:修改Tomcat本身的端口号
扫描二维码关注公众号,回复: 11456395 查看本文章
-
-
关闭
- 正常关闭:bin目录下shutdown.bat;dos窗口下
ctrl+c,直接正常关闭。 - 强制关闭
配置
-
项目部署方式
-
1、直接把项目放在webapps文件夹下即可
- hello:项目的访问路径—>虚拟目录
- 简单部署:将项目打包成war包,war包放在文件夹中
-
2、配置server.xml文件部署项目
- 在文件中加入
- docbase:项目存放路径
- path:虚拟目录
-
3、在conf\Catalina\localhost创建任意名称的
xml文件(推荐)- docbase 项目存放的路径
- path 虚拟目录
-
-
java动态项目的结构
-
根目录
-
WEB-INF
- web.xml:web项目的核心配置文件
- classes目录:放置字节码文件的目录
- lib:放置依赖的jar包
-
-
-
IDEA与tomcat的相关配置
-
1、IDEA会为每一个项目单独建立一份配置文件
-
查看控制台
Using CATALINA_BASE:“C:\Users\14607.IntelliJIdea2019.1\system\tomcat\Unnamed_Web-Project_3”
-
-
2、工作空间项目 和 tomcat部署的web项目
-
tomcat真正访问的是"tomcat"部署的项目,"tomcat部署的web"对应的"工作空间"的web目录下的所有资源
-
WEB-INF 下的资源无法被浏览器直接访问
-
断点调试:使用小虫子debug启动
-
-
Servlet
概念:运行在服务器端的小程序
- Servlet是一个接口,定义了Java类被浏览器访问到(Tomcat识别)的规则。
简单入门
(Servlet2.0)
-
1、创建一个JavaEE项目
-
2、定义一个类,实现Servlet接口
-
3、实现接口的方法
-
4、配置Servlet(在web.xml)
demo1 com.qianfeng.ljf.servlet.ServletDemo1demo1 /demo1
-
原理
- 1:当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径。
- 2:查找web.xml文件,是否有对应的标签内容
- 3:如果有,则会找到对应的全类名
- 4:tomcat会将字节码文件加载进内场,并且创建其对象。
- 5:调用其方法
接口方法
- public void init(ServletConfig servletConfig)
【在Servlet被访问的时候。只会执行一次】 - public void service(ServletRequest servletRequest, ServletResponse servletResponse)
【每次Servlet被访问,执行。执行多次】 - public void destroy()
【在Servlet被杀死时执行,在服务器正常关闭时,执行,执行一次。】 - public String getServletInfo()
- public ServletConfig getServletConfig()
生命周期
-
创建
-
创建时机
-
1、被浏览器第一次访问时
-
2、配置创建时机
- 1、第一次被访问时,创建
值为负数 - 2、启动服务器时,创建
值为0或正整数
- 1、第一次被访问时,创建
-
-
注意:init方法只执行一次,Servlet是单例的,存在线程安
全问题,尽量不要在Servlet中定义成员变量(不要修改)
-
-
提供服务
- 多次执行service方法
-
销毁
- 执行一次destroy方法(服务器正常关闭,在对象销毁前执行)
Servlet3.0
-
好处:支持注解配置,可以不需要web.xml
-
步骤
-
1、创建一个JAVAEE项目,选择Servlet的版本
3.0以上,可以不创建web.xml -
2、定义一个类,实现Servlet接口
-
3、重写方法
-
4、在类上使用@WebServlet注解,进行配置
@WebServlet(“资源路径”)@WebServlet("/myservlet")
-
-
urlpattern 配置
-
1、可以定义多个路径:
@WebServlet({ “/d4” , “/dd4” , “/ddd4” }) -
2、路径定义规则
- 1、/xxx
- 2、/xxx/xxx
- 3、*.do
-
体系结构
-
Servlet(接口)
-
GenericServlet(抽象类)
- 将Servlet接口中其他方法做了默认空实现,只将service方法作为抽象方法作为抽象方法
- 继承GenericServlet类时,只需实现service()方法即可
-
HttpServlet(抽象类)
- 对http协议的一种封装,简化操作
- 1、定义类继承HttpServlet
- 2、腹泻doGet/doPost 方法
Request
请求消息数据
-
请求行
请求方式 请求url 请求协议/版本
GET /login.html HTTP/1.1-
获取方式
-
获取请求方式GET String getMethod()
-
获取Servlet路径 String getServletPath()
-
获取get方式请求参数 String getQueryString()
name=zhangsan&password=123456
-
获取协议及版本 String getProtocol()
HTTP/1.1
-
获取客户机的IP地址 String getRemoteAddr()
-
获取虚拟目录 String getContextpath()
/day14
-
获取请求的URI String getResquestURI()
- String getResquestURI()
/day14/demo1 URI 统一资源标识符
-
- StringBuffer getRequestURL()
http://loaclhost/day14/demo1URL
统一资源定位符
-
-
请求方式
-
get
- 1、请求参数在请求行中,在url后
- 2、请求的url长度有限制
- 3、不太安全
-
post
- 1、请求参数在请求体中
- 2、请求的url长度没有限制
- 3、相对安全
-
-
-
请求头
请求头名称:请求值
Host:localhost
User-Agent:Mozilla/5.0 (Windows NT 6.1;Win64;)…
Accept-Language:zh-Ch,zh;q=0.8;zh-TW…Accept-Encoding:gzip,deflate
Referer:http://loaclhost/login.html
Connect:keep-live
Upgrade-Insecure-Requests:1
-
获取方式
- String getHeader(String name)
通过请求头的名称获取请求头的值 - Enumeration getHeaderNames()
获取所有的请求头名称
- String getHeader(String name)
-
常见请求头
-
User-Agent
- 浏览器告诉服务器,我访问你使用的浏览器版本信息
- 可以在服务器端获取该头的信息
【解决浏览器兼容性问题】
-
Referer:http://localhost/login.html
-
告诉服务器,我(当前请求)从哪里来
-
作用
- 1、防盗链
- 2、统计工作
-
-
-
-
请求空行
- 作用:分割POST请求的 请求头、请求体
-
请求体
-
获取方式
-
获取流对象
- BufferedReader getReader()
获取字符输入流,只能操作字符数据 - ServletInputStream getInputStream()
获取字节输入流,可以操作所有的类型的
- BufferedReader getReader()
-
-
作用:封装POST请求消息的请求参数
-
其他功能
-
获取请求参数的通用方式
-
1、String getParameter(String name)
根据参数名称获取参数值 -
2、String[] getParameterValues(String names)
根据参数的名称获取参数值的数组 -
3、Enumeration getParameterNames()
获取所有请求的参数名称 -
4、Map<String,String[]> getParameterMap()
获取所有参数的map集合 -
解决中文乱码
- get方式:tomcat 8 已经将get方式的乱码问题解
决了 - post方式:会乱码。解决方式:获取参数前,设 置request的编码
request.setCharacterEncoding(“utf-8”);
- get方式:tomcat 8 已经将get方式的乱码问题解
-
-
请求转发
(forward)
- 步骤
- 通过request对象获取转发器对象RequestDispatcher
- 使用转发器对象进行转发forward(req,resp)
- 简洁代码
request.getRequestDispatcher("findUserServlet").forward(request,response);
- 特点
- 转发路径不变
- 转发只能访问当前服务器下的资源
- 转发只能是一次请求,可以使用request对象来共享数据
-
共享数据
-
域对象
-
域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求多个转发的多个资源中共享数据
- 1.void setAttribute(String name,Object obj)
存储数据 - 2.Object getAttitude(String name)
通过键获取值 - 3.void removeAttribute(String name)
通过键移除键值对
-
-
-
获取ServletContext()
- ServletContext getServletContext()
-
getPart() 用于文件上传
体系结构
- ServletRequest
- HttpServletRequest
- org.apache.catalina.connector.RequestFacade类(Tomcar)
Response
响应消息数据
HTTP/1.1 200 OK
Content-Type:text/html;charset=UTF-8
Content-Length:101
Date:Web,06 Jun 2019 07:08:43 GMT
<html>
<head></head>
<body>
<h1></h1>
</body>
</html>
-
响应行
协议版本 响应状态码 状态码描述
-
组成:协议版本 响应状态码 状态码描述
-
响应状态码
-
服务器告诉客户端本次请求和响应的一个状态
-
分类
- 1xx:服务器接收客户端消息,但是没有接收完
成,等待一段时间后,发送1xx多状态码 - 2xx:成功
- 3xx:302(重定向),304(访问缓冲)
- 4xx:客户端错误。
404(请求路径没有对应资源)
405(请求方式没有对应的doxxx方法) - 5xx:服务端错误。
500(服务器内部异常)
- 1xx:服务器接收客户端消息,但是没有接收完
-
-
设置响应行
- setStatus(int src) 设置状态码
-
-
响应头
-
组成:头名称:值
-
常见的响应头
-
content-type:服务器告诉客户端本次响应体数
据格式以及编码 -
content-disposition:服务器告诉客户端以什么
格式打开响应的数据- in-line 默认当前页面打开
- attachment;filename=xxx文件名
以附件的形式打开响应体。用于文件下载
-
content-length:字节的个数(了解)
-
-
设置响应头
- setHeader(String name,String value)
-
-
响应空行
-
响应体:传输的数据(HTML页面、图片等)
-
设置响应体
- 使用字符输出流 PrintWriter getWriter()
- 使用字节输出流 ServletOutputStream getOutputStream
- 使用上面两个输出流,将数据输出到客户端服务器
-
重定向
(redirect)
-
概念:资源的跳转方式
-
步骤
- 1、reponse.setStatus(302)
【设置资源的跳转方式】 - 2、response.setHeader(“loacation”,"/newServlet")
【设置响应头location,重定向的Servlet路径或url】 - 简单实现
response.setRedirect(“ul路径”)
- 1、reponse.setStatus(302)
-
特点
(与转发的区别)
- 地址栏发生变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是两次请求,不能使用request对象共享数据
ServletContext
概念:代表整个web应用,可以和程序的容器
(服务器)来通信
获取方式
-
1、通过request对象获取
- request.getServletContext()
-
2、通过HttpServlet获取
- this.getServletContext()
功能
-
1、获取MIME类型
- MIME:互联网在通信过程中定义的一种文件数
据类型
格式:大类型/小类型 text/html img/jpeg - 获取:String getMemeType(String file)
- MIME:互联网在通信过程中定义的一种文件数
-
2、域对象
-
作用:共享数据
-
设置、获取、移除域对象
- 1.setAttribute(String name,Object value)
- 2.getAttribute(String name)
- 3.removeAttribute(String name)
-
域对象范围:所有用户请求的数据
-
-
3、获取文件的真实(服务器)路径
-
方法:String getRealPath(String path)
-
获取WEB-INF目录的资源访问
- context.getRealPath("/b.txt")
-
获取web目录下的资源访问
- context.getRealPath("/WEB-INF/c.txt")
-
获取src目录下的资源访问
- context.getRealPath(“WEB-INF/classes/a.txt”)
-
Jsp
指令
-
作用:用于配置JSP页面,导入配置文件
-
格式
- <%@指令名称 属性名1=属性值1 属性名2=属性值2 …%>
-
分类
-
page
-
作用:配置JSP页面的
-
常见属性
-
contentType
-
等同于response.setContentType()设置编码
-
作用
- 设置想用题的mime类型以及字符集
- 设置当前jsp页面的编码(高级IDE生效,低级工具需设置pageEncoding属性)
-
-
import
- 作用:导包
-
errorPage
- 作用:当页面发生异常后,会自动跳珠到指定的错
误页面
- 作用:当页面发生异常后,会自动跳珠到指定的错
-
isErrorPage
- 作用:标识当前页面是否是错误页面
- true:是,可以使用内置对象exception
- false:否,默认值。不可以使用内置对象
exception
-
-
-
include
-
作用:页面包含的。导入页面的资源文件
-
<%@include file=“top.jsp”%>
-
附:与 <%jsp:inclue page="" > 区别
- include:先包含再编译
- jsp:include:先编译,再包含
-
-
taglib
- 作用:导入资源
- <%@taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%>
-
prefix:前缀,自定义,一般为c
-
了解:jsp:forward与jsp:param
<jsp:forward page=“forwarded.jsp”>
<jsp:param name=“username” value=“zhangsan”/>
</jsp:forward>jsp:forward指令的意思是直接跳转到page对应的页面,可以通过 jsp:param携带参数。而到被跳转的页面可以直接通过 request(jsp内置对象) 来获取参数的值,获取的方式如下:
<%
String name = request.getParameter(“username”);
%>
<%=name %>
注释
-
<%---- %>
-
与html注释区别
- html:
只能注释html代码片段,可以被前端页面查看 - jsp:<%-- --%>
可以注释所有,不能被前端页面查看
- html:
内置对象
-
概念:在jsp页面不需要创建,直接使用的对象
-
九个内置对象
-
变量名
-
真实类型
- 作用
-
-
pageContext
-
pageContext
- 当前页面共享数据,可以获取其他八个内置对象
-
-
request
-
HttpServletRequest
- 一次请求访问多个资源(转发)
-
-
session
-
HttpSession
- 一次会话的多个请求间
-
-
application
-
ServletContext
- 所有用户间共享数据
-
-
response
-
HttpServletResponse
- 响应对象
-
-
page
-
Object
- 当前页面(Servlet)的对象 this
-
-
out
-
JspWriter
- 输出对象,数据输出到页面上
-
-
config
-
ServletConfig
- Servlet的配置对象
-
-
exception
-
Throwable
- 异常对象
-
-
执行流程
- 1:用户发送请求到jsp
- 2:查找对应的jsp文件
- 3:是否找到;是,执行下一步;否404
- 4:是否为第一次访问或为修改
是,执行下一步;
否,执行第7步 - 5、调用JSP Parser将其编译成Servlet程序
- 6、调用JSDK将对应的Servlet程序编译成.class文件
- 7、执行(若为加载,先加载)对应的.class文件
- 8、结果页面
案例
用户注册
- 1、客户端用户登录,提交数据
- 2、Servlet接受用户数据,使用JDBC将数据添加
到MySQL数据库 - 3、使用jdbc,到数据库查询此用户的信息,
查询到后结果,提示“注册成功”,并将注册信
息使用 response将数据展示到网页中。否则
展示“注册失败”
用户登录
- 1、接受客户端数据
- 2、到数据库查询用户信息
- 3、查询到显示注册成功,跳转成功页面
- 4、未查询到,提示用户名或密码错误
文件上传
-
1、客户端发送文件上传POST请求
-
2、服务端获取Part对象
Part part = request.getPart(“filename”); -
3、上传的Servlet类需要加上
@MultipartConfig注解 -
4、使用Part对象,获取content-disposition值
String header = part.getHeader(“content-disposition”)
处理header字符串得到文件名 -
5、使用Part获取字节输入流
InputStream is = part.getInputStream();或者另一种方式
part.write(String path)
文件下载
- 1、定义页面,编辑超链接的href属性,指向
Servlet,传递filename - 2、定义Servlet,获取文件名称
- 3、使用字节输入流加载文件进内存
- 4、指定response的响应头
setHeader(“content-disposition”,
“attachment;filename=xxx文件名”) - 5、将文件写入response的输出流