一、HTTP请求:客户端向服务器提交的一个超文本文件(包含请求的URL路径)
请求方式:
(一)GET请求:
(1)格式
get /资源名?参数名=参数值&参数名=参数值... HTTP/1.1
请求头
(空行)
消息体(空的)
(2)特点:
请求的消息体(Key-Value)添加到URL结尾,不适合传输敏感信息。
请求URL串的总长不能超过1K
(3)总结:传输的长度有限制,并且不适合传输敏感信息(如密码)
(二)POST请求:
(1)格式
post /资源名 HTTP/1.1
请求头
(空行)
消息体(Key-Value)
(2)特点:
请求的内容放到了消息体中,这样不仅比GET请求更安全一些,而且解决了传输大小的限制
(3)总结:POST请求比GET请求安全一些,而且没有传输限制。
二、HTTP响应:
(1)响应代码:
200-----请求得到了正确的响应
404-----请求的网页不存在
500-----服务器异常
503-----服务器不可用(超载或服务器停机维护)
(2)格式:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html
空行
具体的内容
三、Java Web 的目录结构
根目录(上下文根)
|-- 动态网页:*.jsp
|-- 静态文件:*.html、*.gif、*.avi.....
|-- WEB_INF
|-- class目录:存放经过编译的源文件的字节码
|-- lib目录:存放本应用程序需要的jar包
|-- *.tld文件:标签描述文件
|-- web.xml 本应用程序的配置文件
四、Servlet
1、定义:运行在服务器端的小程序,专门用来接收客户端发提交的请求,并作出响应
2、创建一个Servlet
a)创建一个继承HttpServlet的类
b)重写该类的doGet()和doPost()方法
c)在web.xml中完成相应的配置信息
3、流程:
a)客户端提交请求URL路径
b)服务器接收到请求之后,截取请求的资源的路径
c)服务器到web.xml中区寻找能与该路径匹配的Servlet
d)如果存在,那么就创建该Servlet的实例,并为该请求启动一个线程
e)封装两个对象
HttpServletRequest 和 HttpServletResponse对象
HttpServletRequest 请求对象,用户提交的请求信息都保存在该对象中
HttpServletResponse 响应对象,服务器要返回的信息放在该对象中
f)根据请求方式,调用相应的处理方法doGet()或者doPost(); 或者直接调用service()方法
g)结束该线程,释放相应资源。
4、ServletConfig:每个Servlet对象都有自己的ServletConfig对象
ServletConfig config=this.getServletConfig();//获取ServletConfig对象
config.getInitParameter(/*参数名*/);//获取初始化参数
5、ServletContext:每个web应用程序都有自己的ServletContext对象(当Web应用运行之后,会为该Web应用程序创建一个ServletContext对象)
ServletContext context=this.getServletContext();//获取ServletContext对象
context.getInitParameter(/*参数名*/);//获取初始花参数
context.setAttribute(/*参数名*/,/*参数值*/);//添加参数到ServletContext对象中。
context.getAttribute(/*参数名*/);//获取相应参数的值
/*类似Session,都内置了一个Map对象*/
五、请求分派(服务器跳转)和重定向(客户端跳转)
1、区别:
a)请求分派在服务器端完成,重定向在客户端完成
b)请求分派会把请求对象和响应对象传递给下一个资源,请求信息不会丢失
c)重定向是由客户端发起的一次请求,会使请求信息丢失
/*请求对象和相应对象是存在于为该请求创建的线程中的,当该线程结束之后,对应的请求和响应对象也会销毁*/
d)对请求分派来说,浏览器地址栏只会显示第一次请求的地址,而重定向会显示最终请求的路径
六、JSP:HTML+java代码
1、JSP的组成:
a)静态内容: HTML ---展示结果
b)表达式: <%=/*java表达式*/ %> 在转译是作为 out.println() 的参数
c) Scriptlet代码段:<% /*java代码*/ %> 用来将java代码嵌入到JSP页面中
在转译时直接将该段代码放进service()中
d)声明:<%! /*声明变量或者方法*/ %>
转译为该Servlet的成员变量和成员方法
e)注释: <%-- /*注释的内容*/--%> 转译时会被忽略
f)指令:<%@ /*指令名 属性名="属性值" */%>
(1)page指令:<%@page language="java"
import="导入指定包下的类"
pageEncoding="指定页面内容的字符集编码"
contentType="内容的类型和编码"
errorPage="错误处理页面的路径"
isErrorPage="false | true" %>
(2) include: <%@include file="要包含的页面的路径" %> 静态包含:在转译过程中就把目标页面内容包含进来了。
(3) taglib: <%@taglib uri="标签描述符的路径" prefix="前缀" %> 用来导入要使用的自定义标签
g)动作:
(1) <jsp:useBean id="别名" class="包名.类名" scope=""></jsp:useBean>
(2) <jsp:setProperty name="要操作的实例别名" property="属性" value="值" [param=""] />
(3) <jsp:getProperty name="" property="属性" />
配合JavaBean来使用的,JavaBean就一个类:公有类,不带参的构造方法,私有属性,公开get和set方法。
这个类必须要有包。属性名至少要是两个小写字母开头。
scope(域): page --> PageContext 页面上下文
request --> HttpServletRequest 请求
session --> HttpSession 会话
application --> ServletContext 应用上下文
(4) <jsp:include page="要包含的文件的路径" flush="true | false" /> 动态包含:在真正执行到这行代码时才把目标文件的内容包含进来。
(5) <jsp:param name="" value="" /> 传参数
(6) <jsp:forward page="目标页面" flush="true" />
相当于request.getRequestDispatcher("目标").forward(request, response);
h)内置对象:
输入输出对象: out、request、response
通信对象: pageContext、session、application
servlet对象: page、config
异常对象: exception 只有在页面的page指令中指定isErrorPage=true时才可以使用
2、JSP的执行过程: JSP--->转译为java代码--->编译--->Servlet实例
客户端--请求-->index.jsp
--->Web服务器(Tomcat)-->找这个页面对应的Servlet实例是否存在
--->该页面的实例还不存在时 ,将index.jsp转译index_jsp.java (成为一个Servlet) -->编译
--> 创建一个此Servlet的实例
--> 用这个实例来处理用户的请求并作出响应
3、EL表达式:
a)语法: ${ /*表达式*/ } EL可用于所有HTML和JSP标签中
b)有效表达式可以包含变量、文字常量、操作符、函数调用
(1) 变量用于存储和访问JSP程序中的值。EL表达式中的变量可以引用存储在标准范围(page,request,session,application)中的属性。
变量在标准范围中的搜索顺序是page、request、session、application。
隐式对象:
pageContext: ${pageContext.request.contextPath}
相当于<%= request.getContextPath%> 获取Web应用路径,以/开头
pageScope:
pageContext.setAttribute("name", "Test");
${pageScope.name}或${pageScope["name"]}
requestScope:
request.setAttribute("name", "Test");
${requestScope["name"]}
sessionScope:
session.setAttribute("name", "Test");
${sessionScope.name}
applicationScope:
${name}
param:
${param.pwd} <---> request.getParameter("pwd");
paramValue:
${paramValue.Test} <---> request.getParameterValues("Test");
initParam:
${initParam.count} <---> servletConfig.getInitParameter("count");
head:
${head.name}<---> request.getHeader("name")
headValues:
${headValues.name}<---> request.getHeaderValues("name")
cookie:
${cookie.SESSIONID}
(2)常量: 布尔 , 整型 , 浮点 , 字符串 , null
c)运算符:
算术: + 、- 、* 、/(DIV)、 %(MOD)
逻辑:&&(and) 、 ||(or)、 !(not)
比较:>(gt) 、>=(ge) 、<(lt) 、<=(le)、 ==(eq) 、!=(ne)
条件:表达式 ? 值1 : 值2
empty: 判断空值或null ${empty null} ${empty ''} ${empty ""} ${!empty null}
4、JSTL:JSP标准标签库
1. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 完成一些通用的功能
1). <c:out value="${}" /> 会把一些HTML的特殊字符进行转换
2). <c:set value="..." var="变量" scope=""/>
3). <c:if test="布尔表达式" var="">....</c:if>
4). <c:choose>
<c:when test="">...</c:when>
<c:when test="">...</c:when>
<c:otherwise>...</c:otherwise>
</c:choose>
5). <c:forEach var="i" begin="1" end="100" step="1">${i}</c:forEach>
<c:forEach var="str" items="${requestScope.list}"> ${str}</c:forEach>
<c:forEach var="str" items="${requestScope.list}" varStatus="s">
${s.index}-${s.count}-${str}
</c:forEach>
6). <c:forTokens />
7). <c:url value="URL路径" var="" scope="">
<c:param name="名" value="值"/>
</c:url> --> URL路径?名=值 ;不支持Cookie: URL路径;sessionid=xxxx?名=值
5、相关管理
会话管理:
(1)原理:WEB服务器将会话ID作为响应的一部分返回给客户端,客户端必须把会话ID作为请求的一部分提交给服务器。
(2)会话状态是服务器端保存的。HttpSession对象,也叫会话作用域。
(3)HttpSession:
1) 获取:request.getSession(); //getSession(boolean flag);
2) boolean isNew(); //是否为新建的会话
3) String getId(); //会话ID
4) long getCreationTime(); //得到会话创建的时间
5) void setAttribute(/*name*/,/*value*/);
6) Object getAttribute(/*name*/);
7) void removeAttribute(/*name*/);
8) public long getLastAccessedTime(); //得到最后一次访问此会话的时间毫秒值
9) void invalidate(); //使会话失效