概念——————
周期
init->serve(执行多次)->destroy
子类
GenericServlet(抽象子类)
HttpServlet(抽象孙子类)
服务器端口
web(HTTP):Tomcat:8080
SQL:MySQL:3306
http:get/post
request数据格式
web浏览器向服务器
请求行
请求方式 请求URL 请求协议/版本
get /log.html http/1.1(复制性)
请求方式:
-
get:请求参数在请求行中,URL之后,长度有限
将请求的编码信息添加在网址后面,网址与编码信息通过"?"号分隔
-
post:请求参数在请求体中,URL长度没有限制
提交数据是不可见的,隐式的
请求头
(客户端告诉浏览器的一些信息)
格式:
- 请求名称:请求头值(name:you)
请求头:
- user-agency:告诉访问浏览器使用的版本信息
- referer:告诉服务器,请求地址(例:https://www.runoob.com/servlet/servlet-form-data.html)
请求空行(空行)
请求体(正文):
封账post请求消息请求参数(体)
相应请求数据格式
响应行
- 组成:协议/版本 响应状态码 响应码描述http/1.1 404 ok
- 状态码:
- 1**:服务器接收客户端信息,但接受没有完成需要等待一段时间
- 2**:成功200
- 3**:重定向:302,访问缓存:304
- 4**:客户端错误(路径错误404,没有对应的dopost方法405)
- 5**:服务器错误。代码错误505
响应头
-
格式:头名称:值Content-type:text/html;charset=UTF-8
-
头名称:Content-type响应体数据格式及编码格式
Content-disposition打开响应体的格式(in-line默认:用浏览器打开,attachment;filename=;以附件打开(文件下载))
r.setHeader(String name,String value);
响应空行
响应体
传输的数据
request
与response是由浏览器创建,程序员使用的
- 获取请求行数据
getParameterNames():取得客户端所发出的请求参数名称.
getParameter():可以让您指定请求参数名称,以取得对应的设定值.
getServerName():请求的服务器.
getProtocol():使用协议.
getMethod():请求方法.
getServerPort():请求端口号.
getContextPath():Context路径. context理解为上下文比较好(也就是一个项目)
getServletPath(): Servlet路径.
getRequestURI():URI路径.
getQueryString():查询字符串.
getRemoteAddr():使用者主机IP.
getRemotePort():使用者使用端口号.
例子:
http://localhost:8080/myjsp/requestdemo.jsp?name=john&nick=johncn
对应的信息为:
请求的服务器: localhost
使用协议: HTTP/1.1
请求方法: GET
请求的端口号: 8080
Context路径: /myjsp
Servlet路径: /requestdemo.jsp
URI路径: /myjsp/requestdemo.jsp
查询字符串: name=john&nick=johncn
使用者主机IP: 127.0.0.1
使用者使用端口号: 1060
- 获取请求头数据
String getHeader();//通过请求头获取请求值
Enumeration<String> getHeaderNames();//获取所有请求头名称
- 获取请求体数据
response
方法
setHeader():是一个通用的标头设定方法,您可以用它来设定任何「名称/值」的标头.
setIntHeader():是专门用来设定整数值标头的版本.
setDateHeader():是setHeader()的Date设定版本,第二个参数是设定Date的Long数值,0表示GMT 1970/1/1 00:00。
(Note:以上3个函数用来设置HTTP协议的表头,必须对HTTP协议有些了解才能正确使用,我现在也不清楚).
setStatus():是用来设定回应的状态码,例如404 Not Found,HttpServletResponse类中提供了一些助忆常数设定,例 如SC_NOT_FOUND就是表示404状态码(可以在Servlet API文件中查询相关的助忆常数).
sendError():会根据服务器的预设错误网页回报方式显示错误讯息.
sendRedirect():设置重定向页面.
getWriter():取得PrintWriter对象,由它来写出响应至服务器的本体信息.
重定向
forward重定位和direct转发区别:
- 前者地址栏发生变化
- 访问其他站点
- 两次请求
路径写法:
- 相对路径
- 绝对路径(规则:判断路径是谁给的)
- 浏览器使用的,需要加虚拟路径
- 服务器使用,不需要加虚拟路径
数据输出:
中文乱码:
response.setContentType("text/html;charset=utf-8");
servletContext
功能
获取mime类型
-
定义:互联网通信过程中定义的一种文件数据类型标准
-
格式:大文件/小文件 text/html
-
获取方式:
context.getMimeType("a.jpg");
域对象(共享数据)
-
context.setAttribute("a","b"); context.getAttribute("b"); removeAttribute("b");
获取文件的(服务器)真实路径
System.out.println(context.getRealPath("/b.text"));
获取方式
request.getServletContext();//通过request对象获取
this.getServletContext();//通过HttpServlet获取
回话技术
一次会话(包含多次请求和响应)中共享数据
区别:
客户端回话技术:cookie;服务器端:session
session没有数据大小限制
session数据安全
cookie
实现逻辑:
new Cookie(String name,String value);//创建cookie对象,绑定数据
response.addCookie(Cookie c);//发送cookie对象
Cookie[] request.getCookies();//获取cookie,拿到数据
cookie细节:
cookie保存时长:
-
浏览器关闭后销毁(默认)
-
持久化存储
setMaxAge(int seconds);//second>0,指定存活时间,《0默认值,=0删除cookie信息
cookie共享:
setDomain(".baidu.com");//设置一级域名,则其下多个服务器间可共享
setPath("/");//设置cookie获取范围,默认为当前虚拟目录(不能共享),设置/则可以共享
特点
cookie存在客户端浏览器(安全)
浏览器对单个cookie大小有限制,对同一域名下cookie数量有限制
作用
cookie存少量不敏感数据
不登录情况下,服务器对客户端身份识别,及相应设置
session
服务器端会话技术,将数据存在服务器端对象中
使用
//获取HttpSession对象:
HttpSession request.getSession();
//使用HttpSession对象:
Object getAttribute(String name);
void setAttribute(String name,Object value);
void removeAttribute(String name);
原理
依赖于cookie的(cookie:JSessionId:153434554;)
细节
-
客户端关闭,服务器不关闭,两次获得的session不是同一个,如果需要相同可以:
Cookie c=new Cookie("JSESSIONID",session.getId()); c.setMaxAge(60*60);//设置最长存活时间 response.addCookie(c);
-
客户端不关闭,服务器关闭,两~同一个吗?
不是,但要保证数据不丢失,Tomcat自动完成以下工作:
- session的钝化:服务器正常关闭前,将session对象系统化到硬盘上
- session的活化:启动后,将硬盘上内容文件转化为session对象即可
-
session销毁情况
-
服务器关闭
-
session.invalidate();
-
session默认失效30分钟
<session-config><session-timeout>30
-
MVC
M:JavaBean完成具体的业务操作(查询数据库、封装对象)
V:JSP展示数据(少量Java代码用el表达式、jstl标签替代)
C: Servlet获取用户输入、调用模型、将数据交给视图层进行展示
优点:重用性高、方便维护、耦合性低、易于分配工作
缺点:项目架构变得复杂、对开发人员要求更高
三层架构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kuwWgqzW-1577074485899)(F:\TyporaWorkplace\文件\图片\you.JPG)]
EL表达式(表达语言)
作用:替换和简化jsp页面中的java代码的编写
注意
<%@page isELIgnored="false";%@>//是否忽略所有es表达式(false),则显示为字符串,而非表达式
\${3>4}//忽略单个表达式(用\)
运算符:
算数:+ - * /(div) %(mod)
比较:> < = <= !=
逻辑:&&(and) ||(or) !(not)
空:empty判断字符串、集合、数组对象是否为null并且长度为0
${empty list}//判断是否为空,返回boolean值
${not empty list}//判断是否不为空,返回boolean值
获取值:
${域名称.键名}//从域中获取键名
<%request.setAttribute("name","张三");%>
${requestScope.name}//输出,写在HTML内
张三
隐式对象
el有11个隐式对象,pageContext可以获取其他八个内置对象
${pageContext.request.contextPath}//获取文件虚拟路径
JSTL标签
Javaserver page tag library jsp标准标签库
作用:用于简化或替换jsp页面上的java代码
使用步骤:导入jstl相关jar包——引入标签库:taglib指令——
常用标签:if/choose(相当于switch)/foreach(for)
jsp————————
java服务器端页面,一个特殊的页面,本质是一个servlet文件
脚本
<% out.println("输出")%>//定义的java代码,在service方法里
<%!int i=0;%>//定义的Java代码,以局部变量呈现
<%= i%>//定义的java代码,在service方法里的输出语句里
正常显示中文
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
jsp指令
<%@ page … %> | 配置jsp页面,定义网页依赖属性,比如脚本语言、error页面、缓存需求等等 |
---|---|
<%@ include … %> | 包含其他文件(导入页面的资源文件) |
<%@ taglib … %> | 引入标签库的定义(导入资源) |
<%@ page attribute="value" %>
=
<jsp:directive.page attribute="value" />//xml格式
page
- contentType:等同于response.setContentType();
- 设置响应体的mime类型(text/html)及字符集
- 设置当天页面编码(低级工具则用:pageEncoding="UTF-8"或gbk)
- language=“java"
- import导包
- errorPage:当页面发生异常后,会自动跳转到指定的错误页面
- isErrorPage:标识当前页面是否为错误页面。(若为否,则不可使用内置对象Exception)
include
插入一个页面(
例:将1.jsp内容通过2.jsp插入
<%@include file="1.jsp"%>
taglib
导入资源,prefix:前缀,自定义的
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
jsp行为
用xml语法写的
所有
jsp:include | 用于在当前页面中包含静态或动态资源(向下插入jsp内容) |
---|---|
jsp:useBean | 寻找和初始化一个JavaBean组件 |
jsp:setProperty | 设置 JavaBean组件的值 |
jsp:getProperty | 将 JavaBean组件的值插入到 output中 |
jsp:forward | 从一个JSP文件向另一个文件传递一个包含用户请求的request对象(覆盖jsp内容) |
jsp:plugin | 用于在生成的HTML页面中包含Applet和JavaBean对象 |
jsp:element | 动态创建一个XML元素 |
jsp:attribute | 定义动态创建的XML元素的属性 |
jsp:body | 定义动态创建的XML元素的主体 |
jsp:text | 用于封装模板数据 |
其共有的属性:
- id:动作元素的唯一标识
- scope:动作元素的生命周期(a) page, (b)request, ©session, 和 (d) application
include
<jsp:include page="date.jsp" flush="true" />//page包含在页面中的相对URL地址
jsp隐含对象
可以直接拿来用,不用定义的对象
request | HttpServletRequest类的实例,一次请求的多个资源转发 |
---|---|
response | HttpServletResponse类的实例 |
out | PrintWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问,当前页面共享数据,可以获得其他八个内置对象 |
page | 类似于Java类中=this(servlet对象) |
Exception | Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |
response.getWriter()与out.write的区别:
response比out限制性
服务器请求request
当浏览器请求一个网页时,HTTP信息头的数据
Enumeration headerNames = request.getHeaderNames();//返回所有HTTP头的名称集合:host、cookie
服务器响应
- Response响应对象主要将JSP容器处理后的结果传回到客户端,可以通过response变量设置HTTP的状态和向客户端发送数据,如Cookie、HTTP文件头信息等。
- response对象定义了处理创建HTTP信息头的接口
response.setIntHeader("Refresh", 5);//添加指定名称的响应头和int值
// 设置每隔5秒自动刷新